@eqproject/eqp-dynamic-module 2.11.5 → 2.11.7

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 (37) hide show
  1. package/README.md +4 -0
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +3 -3
  3. package/esm2020/lib/components/private/dynamic-module-field-extra-fix/dynamic-module-field-extra-fix.component.mjs +3 -3
  4. package/esm2020/lib/components/private/field-graphics-editor/field-graphics-editor.component.mjs +115 -27
  5. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +28 -6
  6. package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +25 -5
  7. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +12 -3
  8. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +26 -4
  9. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +28 -6
  10. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +27 -5
  11. package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +1 -1
  12. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +1 -1
  13. package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +1 -1
  14. package/esm2020/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.mjs +3 -3
  15. package/esm2020/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.mjs +3 -3
  16. package/esm2020/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.mjs +3 -3
  17. package/esm2020/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.mjs +3 -3
  18. package/esm2020/lib/directives/speech-to-text/speech-to-text.directive.mjs +7 -2
  19. package/esm2020/lib/utils/css-property-catalog.mjs +45 -2
  20. package/esm2020/lib/utils/field-style-catalog.mjs +45 -19
  21. package/esm2020/lib/utils/floating-label-styles.mjs +155 -0
  22. package/esm2020/lib/utils/refresh-outline-notch.mjs +38 -0
  23. package/fesm2015/eqproject-eqp-dynamic-module.mjs +799 -339
  24. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  25. package/fesm2020/eqproject-eqp-dynamic-module.mjs +779 -325
  26. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  27. package/lib/components/private/field-graphics-editor/field-graphics-editor.component.d.ts +19 -1
  28. package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +6 -2
  29. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +6 -2
  30. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +6 -2
  31. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +6 -2
  32. package/lib/directives/speech-to-text/speech-to-text.directive.d.ts +3 -1
  33. package/lib/utils/css-property-catalog.d.ts +25 -0
  34. package/lib/utils/field-style-catalog.d.ts +5 -0
  35. package/lib/utils/floating-label-styles.d.ts +73 -0
  36. package/lib/utils/refresh-outline-notch.d.ts +15 -0
  37. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { FieldTypeEnum } from '../models/baseField.model';
2
2
  import { ListPresentationEnum } from '../models/fields/listValueField.model';
3
3
  import { getCssDeclaration, parseCssDeclarations, setCssDeclaration } from './css-declarations';
4
+ import { CSS_PROFILE_FLOATING_LABEL, CSS_PROFILE_LABEL, CSS_PROFILE_VALUE, } from './css-property-catalog';
4
5
  const STATE_NORMALE = { key: 'Normale', label: 'Normale' };
5
6
  const STATE_MOUSEOVER = { key: 'Mouseover', label: 'Mouse sopra' };
6
7
  const STATE_FOCUSED = { key: 'Focused', label: 'Selezionato' };
@@ -11,18 +12,21 @@ const FULL_STATES = [STATE_NORMALE, STATE_MOUSEOVER, STATE_FOCUSED, STATE_NOTVAL
11
12
  /** Elementi del campo "Elenco generico", che cambiano in base alla modalità di presentazione */
12
13
  const LIST_VALUE_COMBO_ELEMENTS = [
13
14
  { key: 'Container', label: 'Contenitore' },
14
- { key: 'Label', label: 'Etichetta' },
15
+ // Stessa label: "Label" è la grafica base, sempre valida; "LabelSollevata" (virtuale,
16
+ // salvata dentro Label) sovrascrive quando è sul bordo
17
+ { key: 'Label', label: 'Etichetta nel contenitore', profile: CSS_PROFILE_FLOATING_LABEL },
18
+ { key: 'LabelSollevata', label: 'Etichetta sul bordo', profile: CSS_PROFILE_FLOATING_LABEL },
15
19
  { key: 'CasellaTrigger', label: 'Casella Select' },
16
20
  { key: 'BottoneCancella', label: 'Bottone Cancella' },
17
21
  ];
18
22
  const LIST_VALUE_RADIO_ELEMENTS = [
19
23
  { key: 'Container', label: 'Contenitore' },
20
- { key: 'Label', label: 'Etichetta' },
24
+ { key: 'Label', label: 'Etichetta', profile: CSS_PROFILE_LABEL },
21
25
  { key: 'Opzione', label: 'Opzione' },
22
26
  { key: 'Selezione', label: 'Selezione (radio)' },
23
27
  ];
24
28
  const LIST_VALUE_BUTTON_ELEMENTS = [
25
- { key: 'Label', label: 'Etichetta' },
29
+ { key: 'Label', label: 'Etichetta', profile: CSS_PROFILE_LABEL },
26
30
  { key: 'Bottone', label: 'Bottone' },
27
31
  ];
28
32
  export const FIELD_STYLE_CATALOG = [
@@ -33,7 +37,8 @@ export const FIELD_STYLE_CATALOG = [
33
37
  elements: [
34
38
  { key: 'Container', label: 'Contenitore' },
35
39
  { key: 'Input', label: 'Casella di testo' },
36
- { key: 'Descrizione', label: 'Descrizione (label)' },
40
+ { key: 'Descrizione', label: 'Etichetta nel contenitore', profile: CSS_PROFILE_FLOATING_LABEL },
41
+ { key: 'DescrizioneSollevata', label: 'Etichetta sul bordo', profile: CSS_PROFILE_FLOATING_LABEL },
37
42
  { key: 'Icona', label: 'Icona' },
38
43
  { key: 'Microfono', label: 'Microfono' },
39
44
  { key: 'Errore', label: 'Testo errore' },
@@ -47,7 +52,8 @@ export const FIELD_STYLE_CATALOG = [
47
52
  elements: [
48
53
  { key: 'Container', label: 'Contenitore' },
49
54
  { key: 'Input', label: 'Area di testo' },
50
- { key: 'Descrizione', label: 'Descrizione (label)' },
55
+ { key: 'Descrizione', label: 'Etichetta nel contenitore', profile: CSS_PROFILE_FLOATING_LABEL },
56
+ { key: 'DescrizioneSollevata', label: 'Etichetta sul bordo', profile: CSS_PROFILE_FLOATING_LABEL },
51
57
  { key: 'Icona', label: 'Icona' },
52
58
  { key: 'Microfono', label: 'Microfono' },
53
59
  { key: 'Errore', label: 'Testo errore' },
@@ -61,7 +67,8 @@ export const FIELD_STYLE_CATALOG = [
61
67
  elements: [
62
68
  { key: 'Container', label: 'Contenitore' },
63
69
  { key: 'Input', label: 'Casella numerica' },
64
- { key: 'Descrizione', label: 'Descrizione (label)' },
70
+ { key: 'Descrizione', label: 'Etichetta nel contenitore', profile: CSS_PROFILE_FLOATING_LABEL },
71
+ { key: 'DescrizioneSollevata', label: 'Etichetta sul bordo', profile: CSS_PROFILE_FLOATING_LABEL },
65
72
  { key: 'Icona', label: 'Icona' },
66
73
  { key: 'Errore', label: 'Testo errore' },
67
74
  ],
@@ -74,7 +81,7 @@ export const FIELD_STYLE_CATALOG = [
74
81
  elements: [
75
82
  { key: 'Container', label: 'Contenitore' },
76
83
  { key: 'Scelta', label: 'Controllo (toggle / checkbox / radio)' },
77
- { key: 'Descrizione', label: 'Descrizione (label)' },
84
+ { key: 'Descrizione', label: 'Descrizione (label)', profile: CSS_PROFILE_LABEL },
78
85
  ],
79
86
  states: [STATE_NORMALE, STATE_MOUSEOVER, STATE_FOCUSED, STATE_READONLY],
80
87
  },
@@ -84,7 +91,8 @@ export const FIELD_STYLE_CATALOG = [
84
91
  styleProp: 'DateFieldStyleCSS',
85
92
  elements: [
86
93
  { key: 'Container', label: 'Contenitore esterno' },
87
- { key: 'Descrizione', label: 'Descrizione (label)' },
94
+ { key: 'Descrizione', label: 'Etichetta nel contenitore', profile: CSS_PROFILE_FLOATING_LABEL },
95
+ { key: 'DescrizioneSollevata', label: 'Etichetta sul bordo', profile: CSS_PROFILE_FLOATING_LABEL },
88
96
  { key: 'ContenitoreInterno', label: 'Contenitore interno' },
89
97
  { key: 'CampoData', label: 'Casella di testo' },
90
98
  { key: 'IconaCalendario', label: 'Bottone calendario' },
@@ -100,7 +108,7 @@ export const FIELD_STYLE_CATALOG = [
100
108
  styleProp: 'AttachmentFieldStyleCSS',
101
109
  elements: [
102
110
  { key: 'Container', label: 'Contenitore' },
103
- { key: 'Label', label: 'Label / intestazione' },
111
+ { key: 'Label', label: 'Label / intestazione', profile: CSS_PROFILE_LABEL },
104
112
  { key: 'BottoneAggiungi', label: 'Bottone Aggiungi' },
105
113
  { key: 'BottoneDownload', label: 'Bottone Download' },
106
114
  { key: 'BottoneElimina', label: 'Bottone Elimina' },
@@ -115,7 +123,7 @@ export const FIELD_STYLE_CATALOG = [
115
123
  styleProp: 'ImageFieldStyleCSS',
116
124
  elements: [
117
125
  { key: 'Container', label: 'Contenitore' },
118
- { key: 'Descrizione', label: 'Descrizione (label)' },
126
+ { key: 'Descrizione', label: 'Descrizione (label)', profile: CSS_PROFILE_LABEL },
119
127
  { key: 'BottoneDisegna', label: 'Bottone Disegna' },
120
128
  ],
121
129
  states: [STATE_NORMALE, STATE_MOUSEOVER],
@@ -134,7 +142,8 @@ export const FIELD_STYLE_CATALOG = [
134
142
  elements: [
135
143
  { key: 'Container', label: 'Contenitore' },
136
144
  { key: 'CasellaSelezione', label: 'Casella di selezione' },
137
- { key: 'Descrizione', label: 'Descrizione (label)' },
145
+ { key: 'Descrizione', label: 'Etichetta nel contenitore', profile: CSS_PROFILE_FLOATING_LABEL },
146
+ { key: 'DescrizioneSollevata', label: 'Etichetta sul bordo', profile: CSS_PROFILE_FLOATING_LABEL },
138
147
  { key: 'Selezioni', label: 'Selezioni (checkbox)' },
139
148
  ],
140
149
  states: [STATE_NORMALE, STATE_MOUSEOVER, STATE_SELEZIONATO, STATE_NOTVALID, STATE_READONLY],
@@ -154,7 +163,7 @@ export const FIELD_STYLE_CATALOG = [
154
163
  styleProp: 'ImageWithMarkersFieldStyleCSS',
155
164
  elements: [
156
165
  { key: 'Container', label: 'Contenitore' },
157
- { key: 'Descrizione', label: 'Descrizione (label)' },
166
+ { key: 'Descrizione', label: 'Descrizione (label)', profile: CSS_PROFILE_LABEL },
158
167
  { key: 'BottoneMarca', label: 'Bottone Marca' },
159
168
  ],
160
169
  states: [STATE_NORMALE, STATE_MOUSEOVER],
@@ -166,7 +175,7 @@ export const FIELD_STYLE_CATALOG = [
166
175
  elements: [
167
176
  { key: 'Container', label: 'Bottone' },
168
177
  { key: 'Icona', label: 'Icona' },
169
- { key: 'Descrizione', label: 'Etichetta (label)' },
178
+ { key: 'Descrizione', label: 'Etichetta (label)', profile: CSS_PROFILE_LABEL },
170
179
  ],
171
180
  states: [STATE_NORMALE, STATE_MOUSEOVER, { key: 'Selezionato', label: 'Selezionato (click)' }],
172
181
  },
@@ -291,25 +300,42 @@ export const GLOBAL_STYLE_ELEMENTS = [
291
300
  },
292
301
  },
293
302
  {
294
- key: 'Etichetta',
295
- label: 'Etichetta / descrizione',
303
+ key: 'EtichettaRiposo',
304
+ label: 'Etichetta nel contenitore',
305
+ profile: CSS_PROFILE_FLOATING_LABEL,
306
+ // Grafica base della label di ogni tipologia (per chi ha la label che si solleva,
307
+ // vale anche sul bordo salvo override)
296
308
  perType: {
297
309
  [FT['Campo di testo']]: ['Descrizione'],
298
310
  [FT['Area di testo']]: ['Descrizione'],
299
311
  [FT['Campo numerico']]: ['Descrizione'],
300
- [FT['Booleano']]: ['Descrizione'],
312
+ [FT['Elenco immagini']]: ['Descrizione'],
301
313
  [FT['Data e/o ora']]: ['Descrizione'],
314
+ [FT['Elenco generico']]: ['Label'],
315
+ [FT['Booleano']]: ['Descrizione'],
302
316
  [FT['Allegato']]: ['Label'],
303
317
  [FT['Immagine']]: ['Descrizione'],
304
- [FT['Elenco generico']]: ['Label'],
305
- [FT['Elenco immagini']]: ['Descrizione'],
306
318
  [FT['Immagine con markers']]: ['Descrizione'],
307
319
  [FT['Bottone']]: ['Descrizione'],
308
320
  },
309
321
  },
322
+ {
323
+ key: 'EtichettaSollevata',
324
+ label: 'Etichetta sul bordo',
325
+ profile: CSS_PROFILE_FLOATING_LABEL,
326
+ perType: {
327
+ [FT['Campo di testo']]: ['DescrizioneSollevata'],
328
+ [FT['Area di testo']]: ['DescrizioneSollevata'],
329
+ [FT['Campo numerico']]: ['DescrizioneSollevata'],
330
+ [FT['Elenco immagini']]: ['DescrizioneSollevata'],
331
+ [FT['Data e/o ora']]: ['DescrizioneSollevata'],
332
+ [FT['Elenco generico']]: ['LabelSollevata'],
333
+ },
334
+ },
310
335
  {
311
336
  key: 'Valore',
312
337
  label: 'Area del valore',
338
+ profile: CSS_PROFILE_VALUE,
313
339
  perType: {
314
340
  [FT['Campo di testo']]: ['Input'],
315
341
  [FT['Area di testo']]: ['Input'],
@@ -488,4 +514,4 @@ export function buildGlobalInheritedMap(field, sources) {
488
514
  return result;
489
515
  }
490
516
  //#endregion Grafica di default ereditata
491
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtc3R5bGUtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3V0aWxzL2ZpZWxkLXN0eWxlLWNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBa0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTBCaEcsTUFBTSxhQUFhLEdBQXVCLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDL0UsTUFBTSxlQUFlLEdBQXVCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDdkYsTUFBTSxhQUFhLEdBQXVCLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDbkYsTUFBTSxpQkFBaUIsR0FBdUIsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUMzRixNQUFNLGNBQWMsR0FBdUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUNwRixNQUFNLGNBQWMsR0FBdUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUV0RixNQUFNLFdBQVcsR0FBRyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVwRyxnR0FBZ0c7QUFDaEcsTUFBTSx5QkFBeUIsR0FBOEI7SUFDekQsRUFBRSxH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LEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQ25DLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUUxRSxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRTFDLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztZQUVuQixrRUFBa0U7WUFDbEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQUUsT0FBTztpQkFBRTtnQkFDcEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLE1BQU0sRUFBRTtnQkFBRSxNQUFNO2FBQUU7U0FDekI7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCx5Q0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRmllbGQsIEZpZWxkVHlwZUVudW0gfSBmcm9tICcuLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgTGlzdFByZXNlbnRhdGlvbkVudW0sIExpc3RWYWx1ZUZpZWxkIH0gZnJvbSAnLi4vbW9kZWxzL2ZpZWxkcy9saXN0VmFsdWVGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IGdldENzc0RlY2xhcmF0aW9uLCBwYXJzZUNzc0RlY2xhcmF0aW9ucywgc2V0Q3NzRGVjbGFyYXRpb24gfSBmcm9tICcuL2Nzcy1kZWNsYXJhdGlvbnMnO1xyXG5cclxuLyoqXHJcbiAqIENhdGFsb2dvIGNlbnRyYWxpenphdG8gZGVsbGEgZ3JhZmljYSBkZWkgY2FtcGkuXHJcbiAqXHJcbiAqIE9nbmkgdGlwb2xvZ2lhIGRpIGNhbXBvIGVzcG9uZSB1bmEgbWFwcGEgcGlhdHRhIFwiRWxlbWVudG8gKyBTdGF0b1wiIC0+IHN0cmluZ2EgQ1NTXHJcbiAqIChlcy4gVGV4dEZpZWxkU3R5bGVDU1MuSW5wdXRGb2N1c2VkID0gXCJjb2xvcjogcmVkO1wiKS4gUXVpIHN0YW5ubywgaW4gdW4gdW5pY28gcG9zdG8sXHJcbiAqIGkgbWV0YWRhdGkgZGkgcXVhbGkgZWxlbWVudGkgZSBxdWFsaSBzdGF0aSBlc2lzdG9ubyBwZXIgb2duaSB0aXBvbG9naWEsIGluc2llbWUgYWdsaVxyXG4gKiBhY2Nlc3NvciBnZW5lcmljaSBwZXIgbGVnZ2VyZS9zY3JpdmVyZSBxdWVsbGUgbWFwcGUgc2VuemEgZHVwbGljYXJlIGNvZGljZSBwZXIgdGlwby5cclxuICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkU3R5bGVFbnRyeURlZiB7XHJcbiAgICBrZXk6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRTdHlsZVR5cGVEZWYge1xyXG4gICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtO1xyXG4gICAgLyoqIEV0aWNoZXR0YSBkZWxsYSB0aXBvbG9naWEgbW9zdHJhdGEgYSB2aWRlbyAqL1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGxhIG1hcHBhIGRlZ2xpIHN0aWxpIHN1bCBmaWVsZCAqL1xyXG4gICAgc3R5bGVQcm9wOiBzdHJpbmc7XHJcbiAgICBlbGVtZW50czogQXJyYXk8RmllbGRTdHlsZUVudHJ5RGVmPjtcclxuICAgIHN0YXRlczogQXJyYXk8RmllbGRTdHlsZUVudHJ5RGVmPjtcclxufVxyXG5cclxuY29uc3QgU1RBVEVfTk9STUFMRTogRmllbGRTdHlsZUVudHJ5RGVmID0geyBrZXk6ICdOb3JtYWxlJywgbGFiZWw6ICdOb3JtYWxlJyB9O1xyXG5jb25zdCBTVEFURV9NT1VTRU9WRVI6IEZpZWxkU3R5bGVFbnRyeURlZiA9IHsga2V5OiAnTW91c2VvdmVyJywgbGFiZWw6ICdNb3VzZSBzb3ByYScgfTtcclxuY29uc3QgU1RBVEVfRk9DVVNFRDogRmllbGRTdHlsZUVudHJ5RGVmID0geyBrZXk6ICdGb2N1c2VkJywgbGFiZWw6ICdTZWxlemlvbmF0bycgfTtcclxuY29uc3QgU1RBVEVfU0VMRVpJT05BVE86IEZpZWxkU3R5bGVFbnRyeURlZiA9IHsga2V5OiAnU2VsZXppb25hdG8nLCBsYWJlbDogJ1NlbGV6aW9uYXRvJyB9O1xyXG5jb25zdCBTVEFURV9OT1RWQUxJRDogRmllbGRTdHlsZUVudHJ5RGVmID0geyBrZXk6ICdOb3RWYWxpZCcsIGxhYmVsOiAnTm9uIHZhbGlkbycgfTtcclxuY29uc3QgU1RBVEVfUkVBRE9OTFk6IEZpZWxkU3R5bGVFbnRyeURlZiA9IHsga2V5OiAnUmVhZG9ubHknLCBsYWJlbDogJ1NvbGEgbGV0dHVyYScgfTtcclxuXHJcbmNvbnN0IEZVTExfU1RBVEVTID0gW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUiwgU1RBVEVfRk9DVVNFRCwgU1RBVEVfTk9UVkFMSUQsIFNUQVRFX1JFQURPTkxZXTtcclxuXHJcbi8qKiBFbGVtZW50aSBkZWwgY2FtcG8gXCJFbGVuY28gZ2VuZXJpY29cIiwgY2hlIGNhbWJpYW5vIGluIGJhc2UgYWxsYSBtb2RhbGl0w6AgZGkgcHJlc2VudGF6aW9uZSAqL1xyXG5jb25zdCBMSVNUX1ZBTFVFX0NPTUJPX0VMRU1FTlRTOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+ID0gW1xyXG4gICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgeyBrZXk6ICdMYWJlbCcsIGxhYmVsOiAnRXRpY2hldHRhJyB9LFxyXG4gICAgeyBrZXk6ICdDYXNlbGxhVHJpZ2dlcicsIGxhYmVsOiAnQ2FzZWxsYSBTZWxlY3QnIH0sXHJcbiAgICB7IGtleTogJ0JvdHRvbmVDYW5jZWxsYScsIGxhYmVsOiAnQm90dG9uZSBDYW5jZWxsYScgfSxcclxuXTtcclxuY29uc3QgTElTVF9WQUxVRV9SQURJT19FTEVNRU5UUzogQXJyYXk8RmllbGRTdHlsZUVudHJ5RGVmPiA9IFtcclxuICAgIHsga2V5OiAnQ29udGFpbmVyJywgbGFiZWw6ICdDb250ZW5pdG9yZScgfSxcclxuICAgIHsga2V5OiAnTGFiZWwnLCBsYWJlbDogJ0V0aWNoZXR0YScgfSxcclxuICAgIHsga2V5OiAnT3B6aW9uZScsIGxhYmVsOiAnT3B6aW9uZScgfSxcclxuICAgIHsga2V5OiAnU2VsZXppb25lJywgbGFiZWw6ICdTZWxlemlvbmUgKHJhZGlvKScgfSxcclxuXTtcclxuY29uc3QgTElTVF9WQUxVRV9CVVRUT05fRUxFTUVOVFM6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4gPSBbXHJcbiAgICB7IGtleTogJ0xhYmVsJywgbGFiZWw6ICdFdGljaGV0dGEnIH0sXHJcbiAgICB7IGtleTogJ0JvdHRvbmUnLCBsYWJlbDogJ0JvdHRvbmUnIH0sXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgRklFTERfU1RZTEVfQ0FUQUxPRzogQXJyYXk8RmllbGRTdHlsZVR5cGVEZWY+ID0gW1xyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnQ2FtcG8gZGkgdGVzdG8nXSxcclxuICAgICAgICBsYWJlbDogJ0NhbXBvIGRpIHRlc3RvJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdUZXh0RmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0lucHV0JywgbGFiZWw6ICdDYXNlbGxhIGRpIHRlc3RvJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdEZXNjcml6aW9uZSAobGFiZWwpJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hJywgbGFiZWw6ICdJY29uYScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdNaWNyb2Zvbm8nLCBsYWJlbDogJ01pY3JvZm9ubycgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdFcnJvcmUnLCBsYWJlbDogJ1Rlc3RvIGVycm9yZScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogRlVMTF9TVEFURVMsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnQXJlYSBkaSB0ZXN0byddLFxyXG4gICAgICAgIGxhYmVsOiAnQXJlYSBkaSB0ZXN0bycsXHJcbiAgICAgICAgc3R5bGVQcm9wOiAnVGV4dGFyZWFGaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSW5wdXQnLCBsYWJlbDogJ0FyZWEgZGkgdGVzdG8nIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0Rlc2NyaXppb25lIChsYWJlbCknIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSWNvbmEnLCBsYWJlbDogJ0ljb25hJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ01pY3JvZm9ubycsIGxhYmVsOiAnTWljcm9mb25vJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Vycm9yZScsIGxhYmVsOiAnVGVzdG8gZXJyb3JlJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBGVUxMX1NUQVRFUyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydDYW1wbyBudW1lcmljbyddLFxyXG4gICAgICAgIGxhYmVsOiAnQ2FtcG8gbnVtZXJpY28nLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ051bWVyaWNGaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSW5wdXQnLCBsYWJlbDogJ0Nhc2VsbGEgbnVtZXJpY2EnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0Rlc2NyaXppb25lIChsYWJlbCknIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSWNvbmEnLCBsYWJlbDogJ0ljb25hJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Vycm9yZScsIGxhYmVsOiAnVGVzdG8gZXJyb3JlJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBGVUxMX1NUQVRFUyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydCb29sZWFubyddLFxyXG4gICAgICAgIGxhYmVsOiAnQm9vbGVhbm8nLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0Jvb2xlYW5GaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnU2NlbHRhJywgbGFiZWw6ICdDb250cm9sbG8gKHRvZ2dsZSAvIGNoZWNrYm94IC8gcmFkaW8pJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdEZXNjcml6aW9uZSAobGFiZWwpJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSLCBTVEFURV9GT0NVU0VELCBTVEFURV9SRUFET05MWV0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnRGF0YSBlL28gb3JhJ10sXHJcbiAgICAgICAgbGFiZWw6ICdEYXRhIGUvbyBvcmEnLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0RhdGVGaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUgZXN0ZXJubycgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdEZXNjcml6aW9uZScsIGxhYmVsOiAnRGVzY3JpemlvbmUgKGxhYmVsKScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250ZW5pdG9yZUludGVybm8nLCBsYWJlbDogJ0NvbnRlbml0b3JlIGludGVybm8nIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ2FtcG9EYXRhJywgbGFiZWw6ICdDYXNlbGxhIGRpIHRlc3RvJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hQ2FsZW5kYXJpbycsIGxhYmVsOiAnQm90dG9uZSBjYWxlbmRhcmlvJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hT3JvbG9naW8nLCBsYWJlbDogJ0JvdHRvbmUgb3JvbG9naW8nIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSWNvbmFDYW5jZWxsYXppb25lJywgbGFiZWw6ICdCb3R0b25lIGNhbmNlbGxhemlvbmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnVG9vbHRpcCcsIGxhYmVsOiAnVG9vbHRpcCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogRlVMTF9TVEFURVMsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnQWxsZWdhdG8nXSxcclxuICAgICAgICBsYWJlbDogJ0FsbGVnYXRvJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdBdHRhY2htZW50RmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0xhYmVsJywgbGFiZWw6ICdMYWJlbCAvIGludGVzdGF6aW9uZScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdCb3R0b25lQWdnaXVuZ2knLCBsYWJlbDogJ0JvdHRvbmUgQWdnaXVuZ2knIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQm90dG9uZURvd25sb2FkJywgbGFiZWw6ICdCb3R0b25lIERvd25sb2FkJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0JvdHRvbmVFbGltaW5hJywgbGFiZWw6ICdCb3R0b25lIEVsaW1pbmEnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQm90dG9uZUFudGVwcmltYScsIGxhYmVsOiAnQm90dG9uZSBBbnRlcHJpbWEnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ2FtcG9Ob21lRmlsZScsIGxhYmVsOiAnQ2FtcG8gbm9tZSBmaWxlJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSLCBTVEFURV9OT1RWQUxJRCwgU1RBVEVfUkVBRE9OTFldLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lJ10sXHJcbiAgICAgICAgbGFiZWw6ICdJbW1hZ2luZScsXHJcbiAgICAgICAgc3R5bGVQcm9wOiAnSW1hZ2VGaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0Rlc2NyaXppb25lIChsYWJlbCknIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQm90dG9uZURpc2VnbmEnLCBsYWJlbDogJ0JvdHRvbmUgRGlzZWduYScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnRWxlbmNvIGdlbmVyaWNvJ10sXHJcbiAgICAgICAgbGFiZWw6ICdFbGVuY28gZ2VuZXJpY28nLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0xpc3RWYWx1ZUZpZWxkU3R5bGVDU1MnLFxyXG4gICAgICAgIGVsZW1lbnRzOiBMSVNUX1ZBTFVFX0NPTUJPX0VMRU1FTlRTLFxyXG4gICAgICAgIHN0YXRlczogW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUiwgU1RBVEVfU0VMRVpJT05BVE8sIFNUQVRFX05PVFZBTElELCBTVEFURV9SRUFET05MWV0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnRWxlbmNvIGltbWFnaW5pJ10sXHJcbiAgICAgICAgbGFiZWw6ICdFbGVuY28gaW1tYWdpbmknLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0ltYWdlU2VsZWN0b3JGaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ2FzZWxsYVNlbGV6aW9uZScsIGxhYmVsOiAnQ2FzZWxsYSBkaSBzZWxlemlvbmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0Rlc2NyaXppb25lIChsYWJlbCknIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnU2VsZXppb25pJywgbGFiZWw6ICdTZWxlemlvbmkgKGNoZWNrYm94KScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUiwgU1RBVEVfU0VMRVpJT05BVE8sIFNUQVRFX05PVFZBTElELCBTVEFURV9SRUFET05MWV0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnRXRpY2hldHRhJ10sXHJcbiAgICAgICAgbGFiZWw6ICdFdGljaGV0dGEnLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0xhYmVsRmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydJbW1hZ2luZSBjb24gbWFya2VycyddLFxyXG4gICAgICAgIGxhYmVsOiAnSW1tYWdpbmUgY29uIG1hcmtlcnMnLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0ltYWdlV2l0aE1hcmtlcnNGaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0Rlc2NyaXppb25lIChsYWJlbCknIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQm90dG9uZU1hcmNhJywgbGFiZWw6ICdCb3R0b25lIE1hcmNhJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydCb3R0b25lJ10sXHJcbiAgICAgICAgbGFiZWw6ICdCb3R0b25lJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdBY3Rpb25CdXR0b25GaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQm90dG9uZScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdJY29uYScsIGxhYmVsOiAnSWNvbmEnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0V0aWNoZXR0YSAobGFiZWwpJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSLCB7IGtleTogJ1NlbGV6aW9uYXRvJywgbGFiZWw6ICdTZWxlemlvbmF0byAoY2xpY2spJyB9XSxcclxuICAgIH0sXHJcbl07XHJcblxyXG4vKipcclxuICogTm9tZSBkaSB1biBjYW1wbyBkYSBtb3N0cmFyZSBhIHZpZGVvLiBEZXNjcmlwdGlvbiBwdcOyIHZhbGVyZSBcIiBcIiAodW5vIHNwYXppbzogdHJ1dGh5IG1hXHJcbiAqIGludmlzaWJpbGUpLCBxdWluZGkgdmEgcmlwdWxpdGEgcHJpbWEgZGkgdXNhcmxhOyBwb2kgaWwgdGVzdG8gZGVsbCdFdGljaGV0dGEsIGlsIGNvZGljZSwgaWwgTmFtZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZERpc3BsYXlOYW1lKGZpZWxkOiBCYXNlRmllbGQpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFmaWVsZCkgeyByZXR1cm4gJyc7IH1cclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXHJcbiAgICAgICAgZmllbGQuRGVzY3JpcHRpb24sXHJcbiAgICAgICAgKGZpZWxkIGFzIGFueSkuRXRpY2hldHRhLFxyXG4gICAgICAgIGZpZWxkLkxhYmVsLFxyXG4gICAgICAgIGZpZWxkLk5hbWUsXHJcbiAgICBdO1xyXG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcclxuICAgICAgICBjb25zdCB0ID0gKGMgPz8gJycpLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgIGlmICh0KSB7IHJldHVybiB0OyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbn1cclxuXHJcbi8qKiBEZWZpbml6aW9uZSBkZWwgY2F0YWxvZ28gcGVyIHVuYSB0aXBvbG9naWE7IG51bGwgc2UgbGEgdGlwb2xvZ2lhIG5vbiBoYSBncmFmaWNhIGNvbmZpZ3VyYWJpbGUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkVHlwZTogRmllbGRUeXBlRW51bSB8IG51bWJlcik6IEZpZWxkU3R5bGVUeXBlRGVmIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gRklFTERfU1RZTEVfQ0FUQUxPRy5maW5kKChkKSA9PiBOdW1iZXIoZC5maWVsZFR5cGUpID09PSBOdW1iZXIoZmllbGRUeXBlKSkgPz8gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEVsZW1lbnRpIGdyYWZpY2kgZGkgdW4gY2FtcG8uIENvaW5jaWRvbm8gY29uIHF1ZWxsaSBkZWwgY2F0YWxvZ28sIHNhbHZvIGwnRWxlbmNvIGdlbmVyaWNvXHJcbiAqIGRvdmUgZGlwZW5kb25vIGRhbGxhIG1vZGFsaXTDoCBkaSBwcmVzZW50YXppb25lIHNjZWx0YSBzdWwgY2FtcG8uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGZpZWxkOiBCYXNlRmllbGQpOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+IHtcclxuICAgIGNvbnN0IGRlZiA9IGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkPy5GaWVsZFR5cGUpO1xyXG4gICAgaWYgKCFkZWYpIHsgcmV0dXJuIFtdOyB9XHJcblxyXG4gICAgaWYgKE51bWJlcihkZWYuZmllbGRUeXBlKSA9PT0gTnVtYmVyKEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBnZW5lcmljbyddKSkge1xyXG4gICAgICAgIGNvbnN0IG1vZGUgPSBOdW1iZXIoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKT8uUHJlc2VudGF0aW9uTW9kZSk7XHJcbiAgICAgICAgaWYgKG1vZGUgPT09IExpc3RQcmVzZW50YXRpb25FbnVtWydQdWxzYW50ZSBjb24gdGVzdG8nXSkgeyByZXR1cm4gTElTVF9WQUxVRV9CVVRUT05fRUxFTUVOVFM7IH1cclxuICAgICAgICBpZiAobW9kZSA9PT0gTGlzdFByZXNlbnRhdGlvbkVudW1bJ1JhZGlvIGJ1dHRvbiddKSB7IHJldHVybiBMSVNUX1ZBTFVFX1JBRElPX0VMRU1FTlRTOyB9XHJcbiAgICAgICAgcmV0dXJuIExJU1RfVkFMVUVfQ09NQk9fRUxFTUVOVFM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlZi5lbGVtZW50cztcclxufVxyXG5cclxuLyoqIE1hcHBhIGRlZ2xpIHN0aWxpIGRlbCBjYW1wbyAocHXDsiBlc3NlcmUgdW5kZWZpbmVkIHNlIG5vbiDDqCBtYWkgc3RhdGEgdmFsb3JpenphdGEpICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZFN0eWxlTWFwKGZpZWxkOiBCYXNlRmllbGQpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBkZWYgPSBnZXRGaWVsZFN0eWxlVHlwZURlZihmaWVsZD8uRmllbGRUeXBlKTtcclxuICAgIGlmICghZGVmKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICByZXR1cm4gKGZpZWxkIGFzIGFueSlbZGVmLnN0eWxlUHJvcF0gPz8gbnVsbDtcclxufVxyXG5cclxuLyoqIENvbWUgZ2V0RmllbGRTdHlsZU1hcCwgbWEgY3JlYSBsYSBtYXBwYSBzZSBtYW5jYSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRmllbGRTdHlsZU1hcChmaWVsZDogQmFzZUZpZWxkKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwge1xyXG4gICAgY29uc3QgZGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoZmllbGQ/LkZpZWxkVHlwZSk7XHJcbiAgICBpZiAoIWRlZikgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgaWYgKCEoZmllbGQgYXMgYW55KVtkZWYuc3R5bGVQcm9wXSkgeyAoZmllbGQgYXMgYW55KVtkZWYuc3R5bGVQcm9wXSA9IHt9OyB9XHJcbiAgICByZXR1cm4gKGZpZWxkIGFzIGFueSlbZGVmLnN0eWxlUHJvcF07XHJcbn1cclxuXHJcbi8qKiBMZWdnZSBpbCBDU1MgZGkgdW4gXCJFbGVtZW50byArIFN0YXRvXCIgKGVzLiBcIklucHV0Rm9jdXNlZFwiKSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRTdHlsZVZhbHVlKGZpZWxkOiBCYXNlRmllbGQsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBnZXRGaWVsZFN0eWxlTWFwKGZpZWxkKT8uW2tleV0gPz8gJyc7XHJcbn1cclxuXHJcbi8qKiBTY3JpdmUgaWwgQ1NTIGRpIHVuIFwiRWxlbWVudG8gKyBTdGF0b1wiOyBpbCB2YWxvcmUgdnVvdG8gcmltdW92ZSBsYSBjaGlhdmUgZGFsIEpTT04gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpZWxkU3R5bGVWYWx1ZShmaWVsZDogQmFzZUZpZWxkLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgbWFwID0gZW5zdXJlRmllbGRTdHlsZU1hcChmaWVsZCk7XHJcbiAgICBpZiAoIW1hcCkgeyByZXR1cm47IH1cclxuICAgIC8vIHVuZGVmaW5lZCB2aWVuZSBlc2NsdXNvIGRhIEpTT04uc3RyaW5naWZ5IC0+IGlsIEpTT04gc2FsdmF0byByaW1hbmUgY29tcGF0dG9cclxuICAgIChtYXAgYXMgYW55KVtrZXldID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKiogVHJ1ZSBzZSBpbCBjYW1wbyBub24gaGEgYW5jb3JhIG5lc3N1bmEgcmVnb2xhIGdyYWZpY2EgaW1wb3N0YXRhICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkU3R5bGVNYXBFbXB0eShmaWVsZDogQmFzZUZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBtYXAgPSBnZXRGaWVsZFN0eWxlTWFwKGZpZWxkKTtcclxuICAgIGlmICghbWFwKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gIU9iamVjdC5rZXlzKG1hcCkuc29tZSgoaykgPT4gISFtYXBba10pO1xyXG59XHJcblxyXG4vKiogQ29waWEgcHJvZm9uZGEgZGVsbGEgbWFwcGEgc3RpbGkgZGkgdW4gY2FtcG8gKHNvbG8gbGUgY2hpYXZpIHZhbG9yaXp6YXRlKSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVGaWVsZFN0eWxlTWFwKGZpZWxkOiBCYXNlRmllbGQpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG1hcCA9IGdldEZpZWxkU3R5bGVNYXAoZmllbGQpO1xyXG4gICAgY29uc3QgY2xvbmU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgIGlmICghbWFwKSB7IHJldHVybiBjbG9uZTsgfVxyXG4gICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKChrKSA9PiB7IGlmIChtYXBba10pIHsgY2xvbmVba10gPSBtYXBba107IH0gfSk7XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbn1cclxuXHJcbi8vI3JlZ2lvbiBHcmFmaWNhIGdsb2JhbGVcclxuXHJcbi8qKlxyXG4gKiBFbGVtZW50byBcImxvZ2ljb1wiIGRlbGxhIGdyYWZpY2EgZ2xvYmFsZTogdW4gY29uY2V0dG8gKGNvbnRlbml0b3JlLCBldGljaGV0dGEsIGFyZWEgZGVsIHZhbG9yZSlcclxuICogcHJlc2VudGUgaW4gcXVhc2kgdHV0dGUgbGUgdGlwb2xvZ2llIG1hIGNoZSBvZ25pIHRpcG9sb2dpYSBjaGlhbWEgY29uIHVuIG5vbWUgZGl2ZXJzby5cclxuICogU2VydmUgYWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIiwgZG92ZSBzaSBtb2RpZmljYW5vIGluc2llbWUgY2FtcGkgZGkgdGlwb2xvZ2llIGRpdmVyc2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbFN0eWxlRWxlbWVudERlZiB7XHJcbiAgICBrZXk6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICAvKiogUGVyIG9nbmkgdGlwb2xvZ2lhLCBnbGkgZWxlbWVudGkgcmVhbGkgc3UgY3VpIHNjcml2ZXJlICovXHJcbiAgICBwZXJUeXBlOiB7IFtmaWVsZFR5cGU6IG51bWJlcl06IEFycmF5PHN0cmluZz4gfTtcclxufVxyXG5cclxuY29uc3QgRlQgPSBGaWVsZFR5cGVFbnVtO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdMT0JBTF9TVFlMRV9FTEVNRU5UUzogQXJyYXk8R2xvYmFsU3R5bGVFbGVtZW50RGVmPiA9IFtcclxuICAgIHtcclxuICAgICAgICBrZXk6ICdDb250ZW5pdG9yZScsXHJcbiAgICAgICAgbGFiZWw6ICdDb250ZW5pdG9yZScsXHJcbiAgICAgICAgcGVyVHlwZToge1xyXG4gICAgICAgICAgICBbRlRbJ0NhbXBvIGRpIHRlc3RvJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0FyZWEgZGkgdGVzdG8nXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gbnVtZXJpY28nXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQm9vbGVhbm8nXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRGF0YSBlL28gb3JhJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0FsbGVnYXRvJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0ltbWFnaW5lJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0VsZW5jbyBnZW5lcmljbyddXTogWydDb250YWluZXInXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gaW1tYWdpbmknXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRXRpY2hldHRhJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0ltbWFnaW5lIGNvbiBtYXJrZXJzJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0JvdHRvbmUnXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAga2V5OiAnRXRpY2hldHRhJyxcclxuICAgICAgICBsYWJlbDogJ0V0aWNoZXR0YSAvIGRlc2NyaXppb25lJyxcclxuICAgICAgICBwZXJUeXBlOiB7XHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gZGkgdGVzdG8nXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydBcmVhIGRpIHRlc3RvJ11dOiBbJ0Rlc2NyaXppb25lJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gbnVtZXJpY28nXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydCb29sZWFubyddXTogWydEZXNjcml6aW9uZSddLFxyXG4gICAgICAgICAgICBbRlRbJ0RhdGEgZS9vIG9yYSddXTogWydEZXNjcml6aW9uZSddLFxyXG4gICAgICAgICAgICBbRlRbJ0FsbGVnYXRvJ11dOiBbJ0xhYmVsJ10sXHJcbiAgICAgICAgICAgIFtGVFsnSW1tYWdpbmUnXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gZ2VuZXJpY28nXV06IFsnTGFiZWwnXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gaW1tYWdpbmknXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydJbW1hZ2luZSBjb24gbWFya2VycyddXTogWydEZXNjcml6aW9uZSddLFxyXG4gICAgICAgICAgICBbRlRbJ0JvdHRvbmUnXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBrZXk6ICdWYWxvcmUnLFxyXG4gICAgICAgIGxhYmVsOiAnQXJlYSBkZWwgdmFsb3JlJyxcclxuICAgICAgICBwZXJUeXBlOiB7XHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gZGkgdGVzdG8nXV06IFsnSW5wdXQnXSxcclxuICAgICAgICAgICAgW0ZUWydBcmVhIGRpIHRlc3RvJ11dOiBbJ0lucHV0J10sXHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gbnVtZXJpY28nXV06IFsnSW5wdXQnXSxcclxuICAgICAgICAgICAgW0ZUWydCb29sZWFubyddXTogWydTY2VsdGEnXSxcclxuICAgICAgICAgICAgW0ZUWydEYXRhIGUvbyBvcmEnXV06IFsnQ2FtcG9EYXRhJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQWxsZWdhdG8nXV06IFsnQ2FtcG9Ob21lRmlsZSddLFxyXG4gICAgICAgICAgICBbRlRbJ0VsZW5jbyBnZW5lcmljbyddXTogWydDYXNlbGxhVHJpZ2dlcicsICdPcHppb25lJywgJ0JvdHRvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gaW1tYWdpbmknXV06IFsnQ2FzZWxsYVNlbGV6aW9uZSddLFxyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG5dO1xyXG5cclxuLyoqXHJcbiAqIEVsZW1lbnRpIHJlYWxpIGRpIHVuIGNhbXBvIGNvcnJpc3BvbmRlbnRpIGEgdW4gZWxlbWVudG8gbG9naWNvIGdsb2JhbGUuXHJcbiAqIEludGVyc2VjYSBsYSBtYXBwYXR1cmEgcGVyIHRpcG9sb2dpYSBjb24gZ2xpIGVsZW1lbnRpIGNoZSBpbCBjYW1wbyBoYSBkYXZ2ZXJvXHJcbiAqIChsJ0VsZW5jbyBnZW5lcmljbywgcGVyIGVzZW1waW8sIGNhbWJpYSBlbGVtZW50aSBpbiBiYXNlIGFsbGEgbW9kYWxpdMOgIGRpIHByZXNlbnRhemlvbmUpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhmaWVsZDogQmFzZUZpZWxkLCBnbG9iYWxLZXk6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgY29uc3QgZGVmID0gR0xPQkFMX1NUWUxFX0VMRU1FTlRTLmZpbmQoKGcpID0+IGcua2V5ID09PSBnbG9iYWxLZXkpO1xyXG4gICAgaWYgKCFkZWYpIHsgcmV0dXJuIFtdOyB9XHJcblxyXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGRlZi5wZXJUeXBlW051bWJlcihmaWVsZD8uRmllbGRUeXBlKV0gPz8gW107XHJcbiAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIFtdOyB9XHJcblxyXG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChnZXRGaWVsZFN0eWxlRWxlbWVudHMoZmllbGQpLm1hcCgoZSkgPT4gZS5rZXkpKTtcclxuICAgIHJldHVybiBjYW5kaWRhdGVzLmZpbHRlcigoaykgPT4gYXZhaWxhYmxlLmhhcyhrKSk7XHJcbn1cclxuXHJcbi8qKiBTdGF0aSBjb211bmkgYSB0dXR0ZSBsZSB0aXBvbG9naWUgcGFzc2F0ZTogc29ubyBnbGkgdW5pY2kgYXBwbGljYWJpbGkgZ2xvYmFsbWVudGUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblN0YXRlcyhmaWVsZFR5cGVzOiBBcnJheTxGaWVsZFR5cGVFbnVtIHwgbnVtYmVyPik6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4ge1xyXG4gICAgY29uc3QgZGVmcyA9IGZpZWxkVHlwZXNcclxuICAgICAgICAubWFwKCh0KSA9PiBnZXRGaWVsZFN0eWxlVHlwZURlZih0KSlcclxuICAgICAgICAuZmlsdGVyKChkKTogZCBpcyBGaWVsZFN0eWxlVHlwZURlZiA9PiBkICE9IG51bGwpO1xyXG4gICAgaWYgKGRlZnMubGVuZ3RoID09PSAwKSB7IHJldHVybiBbXTsgfVxyXG5cclxuICAgIHJldHVybiBkZWZzWzBdLnN0YXRlcy5maWx0ZXIoKHN0YXRlKSA9PlxyXG4gICAgICAgIGRlZnMuZXZlcnkoKGQpID0+IGQuc3RhdGVzLnNvbWUoKHMpID0+IHMua2V5ID09PSBzdGF0ZS5rZXkpKVxyXG4gICAgKTtcclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIEdyYWZpY2EgZ2xvYmFsZVxyXG5cclxuLy8jcmVnaW9uIENTUyBsZWdhY3kgKEZpZWxkc3R5bGVDU1MgLyBMYWJlbHN0eWxlQ1NTKVxyXG5cclxuLyoqXHJcbiAqIEkgY2FtcGkgaGFubm8gZHVlIHByb3ByaWV0w6Agc3RvcmljaGUsIExhYmVsc3R5bGVDU1MgZSBGaWVsZHN0eWxlQ1NTLCBjaGUgaSB0ZW1wbGF0ZVxyXG4gKiBhcHBsaWNhbm8gYW5jb3JhIGNvbiBbbmdTdHlsZV0sIHF1aW5kaSBjb21lIHN0aWxpIElOTElORS4gRXNzZW5kbyBpbmxpbmUgYmF0dG9ubyBsZSByZWdvbGVcclxuICogXCIjdWlkIHsgLi4uIH1cIiBpbmlldHRhdGUgZGFsbGEgZ3JhZmljYSBwZXIgZWxlbWVudG8gZSBzdGF0bzogdW4gY29sb3JlIGltcG9zdGF0byBkYWxsJ2VkaXRvclxyXG4gKiBncmFmaWNvIG5vbiBzaSB2ZWRldmEgc3VpIGNhbXBpIGNoZSBhdmV2YW5vIGlsIENTUyBsZWdhY3kgdmFsb3JpenphdG8uXHJcbiAqXHJcbiAqIFF1ZXN0YSB0YWJlbGxhIGRpY2UsIHBlciBvZ25pIHRpcG9sb2dpYSwgc3UgcXVhbGUgZWxlbWVudG8gZGVsbGEgZ3JhZmljYSBudW92YSBmaW5pc2NlXHJcbiAqIGNpYXNjdW5hIGRlbGxlIGR1ZSBwcm9wcmlldMOgIGxlZ2FjeSwgaW4gbW9kbyBkYSBwb3RlcmxlIGFzc29yYmlyZSBlIGF2ZXJlIHVuYSBzb2xhIGZvbnRlXHJcbiAqIGRpIHZlcml0w6AuIExlIHRpcG9sb2dpZSBhc3NlbnRpIG5vbiB1c2FubyBbbmdTdHlsZV0gaW4gbmVzc3VuIHRlbXBsYXRlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExFR0FDWV9TVFlMRV9UQVJHRVRTOiB7IFtmaWVsZFR5cGU6IG51bWJlcl06IHsgbGFiZWw/OiBzdHJpbmc7IGZpZWxkPzogc3RyaW5nIH0gfSA9IHtcclxuICAgIFtGVFsnQ2FtcG8gZGkgdGVzdG8nXV06IHsgbGFiZWw6ICdEZXNjcml6aW9uZScsIGZpZWxkOiAnSW5wdXQnIH0sXHJcbiAgICBbRlRbJ0FyZWEgZGkgdGVzdG8nXV06IHsgbGFiZWw6ICdEZXNjcml6aW9uZScsIGZpZWxkOiAnSW5wdXQnIH0sXHJcbiAgICBbRlRbJ0NhbXBvIG51bWVyaWNvJ11dOiB7IGxhYmVsOiAnRGVzY3JpemlvbmUnLCBmaWVsZDogJ0lucHV0JyB9LFxyXG4gICAgW0ZUWydCb29sZWFubyddXTogeyBsYWJlbDogJ0Rlc2NyaXppb25lJyB9LFxyXG4gICAgW0ZUWydFbGVuY28gaW1tYWdpbmknXV06IHsgbGFiZWw6ICdEZXNjcml6aW9uZScgfSxcclxuICAgIFtGVFsnRXRpY2hldHRhJ11dOiB7IGxhYmVsOiAnQ29udGFpbmVyJyB9LFxyXG4gICAgW0ZUWydFbGVuY28gZ2VuZXJpY28nXV06IHsgbGFiZWw6ICdMYWJlbCcsIGZpZWxkOiAnQ29udGFpbmVyJyB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lNZXJnZVJlc3VsdCB7XHJcbiAgICAvKiogUHJvcHJpZXTDoCBsZWdhY3kgYXNzb3JiaXRlICovXHJcbiAgICBjb25zdW1lZDogQXJyYXk8J0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnPjtcclxuICAgIC8qKiBDaGlhdmkgXCJFbGVtZW50b1N0YXRvXCIgdG9jY2F0ZSBkYWxsJ2Fzc29yYmltZW50byAqL1xyXG4gICAga2V5czogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJpdmVyc2EgaWwgQ1NTIGxlZ2FjeSBkZWwgY2FtcG8gZGVudHJvIHVuYSBtYXBwYSBcIkVsZW1lbnRvK1N0YXRvXCIgLT4gQ1NTLCBzdWxsbyBzdGF0byBOb3JtYWxlLlxyXG4gKiBOb24gc292cmFzY3JpdmUgbGUgcHJvcHJpZXTDoCBnacOgIHByZXNlbnRpIG5lbGxhIG1hcHBhOiBsYSBncmFmaWNhIG51b3ZhIGhhIGxhIHByZWNlZGVuemEuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMZWdhY3lTdHlsZXNJbnRvTWFwKFxyXG4gICAgZmllbGQ6IEJhc2VGaWVsZCxcclxuICAgIG1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcclxuICAgIG9ubHk/OiAnTGFiZWxzdHlsZUNTUycgfCAnRmllbGRzdHlsZUNTUydcclxuKTogTGVnYWN5TWVyZ2VSZXN1bHQge1xyXG4gICAgY29uc3QgcmVzdWx0OiBMZWdhY3lNZXJnZVJlc3VsdCA9IHsgY29uc3VtZWQ6IFtdLCBrZXlzOiBbXSB9O1xyXG5cclxuICAgIGNvbnN0IHRhcmdldCA9IExFR0FDWV9TVFlMRV9UQVJHRVRTW051bWJlcihmaWVsZD8uRmllbGRUeXBlKV07XHJcbiAgICBpZiAoIXRhcmdldCkgeyByZXR1cm4gcmVzdWx0OyB9XHJcblxyXG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChnZXRGaWVsZFN0eWxlRWxlbWVudHMoZmllbGQpLm1hcCgoZSkgPT4gZS5rZXkpKTtcclxuXHJcbiAgICBjb25zdCBhYnNvcmIgPSAoY3NzOiBzdHJpbmcsIGVsZW1lbnRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbmFtZTogJ0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnKSA9PiB7XHJcbiAgICAgICAgaWYgKG9ubHkgJiYgb25seSAhPT0gbmFtZSkgeyByZXR1cm47IH1cclxuICAgICAgICBpZiAoIWNzcyB8fCAhY3NzLnRyaW0oKSB8fCAhZWxlbWVudEtleSB8fCAhYXZhaWxhYmxlLmhhcyhlbGVtZW50S2V5KSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gZWxlbWVudEtleSArICdOb3JtYWxlJztcclxuICAgICAgICBsZXQgY3VycmVudCA9IG1hcFtrZXldID8/ICcnO1xyXG5cclxuICAgICAgICBwYXJzZUNzc0RlY2xhcmF0aW9ucyhjc3MpLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFnZXRDc3NEZWNsYXJhdGlvbihjdXJyZW50LCBkLnByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2V0Q3NzRGVjbGFyYXRpb24oY3VycmVudCwgZC5wcm9wLCBkLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudCkgeyBtYXBba2V5XSA9IGN1cnJlbnQ7IH1cclxuICAgICAgICByZXN1bHQuY29uc3VtZWQucHVzaChuYW1lKTtcclxuICAgICAgICBpZiAoIXJlc3VsdC5rZXlzLmluY2x1ZGVzKGtleSkpIHsgcmVzdWx0LmtleXMucHVzaChrZXkpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIGFic29yYihmaWVsZC5MYWJlbHN0eWxlQ1NTLCB0YXJnZXQubGFiZWwsICdMYWJlbHN0eWxlQ1NTJyk7XHJcbiAgICBhYnNvcmIoZmllbGQuRmllbGRzdHlsZUNTUywgdGFyZ2V0LmZpZWxkLCAnRmllbGRzdHlsZUNTUycpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqIENoaWF2ZSBcIkVsZW1lbnRvTm9ybWFsZVwiIHN1IGN1aSBmaW5pcmViYmUgdW5hIHByb3ByaWV0w6AgbGVnYWN5LCBvIG51bGwgc2Ugbm9uIGFwcGxpY2FiaWxlICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsZWdhY3lUYXJnZXRLZXkoZmllbGQ6IEJhc2VGaWVsZCwgbmFtZTogJ0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBMRUdBQ1lfU1RZTEVfVEFSR0VUU1tOdW1iZXIoZmllbGQ/LkZpZWxkVHlwZSldO1xyXG4gICAgaWYgKCF0YXJnZXQpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICBjb25zdCBlbGVtZW50S2V5ID0gbmFtZSA9PT0gJ0xhYmVsc3R5bGVDU1MnID8gdGFyZ2V0LmxhYmVsIDogdGFyZ2V0LmZpZWxkO1xyXG4gICAgaWYgKCFlbGVtZW50S2V5KSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChnZXRGaWVsZFN0eWxlRWxlbWVudHMoZmllbGQpLm1hcCgoZSkgPT4gZS5rZXkpKTtcclxuICAgIHJldHVybiBhdmFpbGFibGUuaGFzKGVsZW1lbnRLZXkpID8gZWxlbWVudEtleSArICdOb3JtYWxlJyA6IG51bGw7XHJcbn1cclxuXHJcbi8qKiBNYXBwYSBzdGlsaSBcImVmZmV0dGl2YVwiIGRpIHVuIGNhbXBvOiBxdWVsbGEgcGVyIGVsZW1lbnRvIHBpw7kgaWwgQ1NTIGxlZ2FjeSBhc3NvcmJpdG8gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVmZmVjdGl2ZVN0eWxlTWFwKGZpZWxkOiBCYXNlRmllbGQpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG1hcCA9IGNsb25lRmllbGRTdHlsZU1hcChmaWVsZCk7XHJcbiAgICBtZXJnZUxlZ2FjeVN0eWxlc0ludG9NYXAoZmllbGQsIG1hcCk7XHJcbiAgICByZXR1cm4gbWFwO1xyXG59XHJcblxyXG4vKipcclxuICogVHJ1ZSBzZSBpbCBjYW1wbyBoYSB1bmEgZ3JhZmljYSBkYSBxdWFsY2hlIHBhcnRlOiBuZWxsYSBtYXBwYSBwZXIgZWxlbWVudG8gb3BwdXJlIG5lbCBDU1NcclxuICogbGVnYWN5LiDDiCBpbCB0ZXN0IGdpdXN0byBwZXIgXCJxdWVzdG8gY2FtcG8gcHXDsiBmYXJlIGRhIHNvcmdlbnRlXCIgKGVyZWRpdMOgLCBDb3BpYSBHcmFmaWNhKTpcclxuICogaXNGaWVsZFN0eWxlTWFwRW1wdHkgZ3VhcmRhIHNvbG8gbGEgbWFwcGEgbnVvdmEgZSBpZ25vcmVyZWJiZSBpIGNhbXBpIHN0aWxpenphdGkgc29sbyBjb2wgbGVnYWN5LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc0VmZmVjdGl2ZVN0eWxlcyhmaWVsZDogQmFzZUZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZ2V0RWZmZWN0aXZlU3R5bGVNYXAoZmllbGQpKS5sZW5ndGggPiAwO1xyXG59XHJcblxyXG4vLyNlbmRyZWdpb24gQ1NTIGxlZ2FjeSAoRmllbGRzdHlsZUNTUyAvIExhYmVsc3R5bGVDU1MpXHJcblxyXG4vLyNyZWdpb24gR3JhZmljYSBkaSBkZWZhdWx0IGVyZWRpdGF0YVxyXG5cclxuLyoqXHJcbiAqIEdyYWZpY2EgZGkgZGVmYXVsdCBjb3N0cnVpdGEgYSBwYXJ0aXJlIGRhIGNhbXBpIGRpIHRpcG9sb2dpYSBESVZFUlNBLlxyXG4gKlxyXG4gKiBMJ2VyZWRpdMOgIG5hdHVyYWxlIMOoIGZyYSBjYW1waSBkZWxsYSBzdGVzc2EgdGlwb2xvZ2lhLCBjaGUgY29uZGl2aWRvbm8gaSBub21pIGRlZ2xpIGVsZW1lbnRpLlxyXG4gKiBRdWFuZG8gcGVyw7IgdW5hIHRpcG9sb2dpYSB2aWVuZSB1c2F0YSBwZXIgbGEgcHJpbWEgdm9sdGEgbm9uIGMnw6ggbmVzc3VuIGNhbXBvIHNpbWlsZSBkYSBjdWlcclxuICogY29waWFyZTogaW4gcXVlbCBjYXNvIHNpIHBhc3NhIHBlciBnbGkgZWxlbWVudGkgbG9naWNpIGRlbGxhIGdyYWZpY2EgZ2xvYmFsZSAoY29udGVuaXRvcmUsXHJcbiAqIGV0aWNoZXR0YSwgYXJlYSBkZWwgdmFsb3JlKSwgY2hlIG9nbmkgdGlwb2xvZ2lhIHNhIHRyYWR1cnJlIG5laSBwcm9wcmkgZWxlbWVudGkuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaWVsZCAgIGNhbXBvIG51b3ZvIGNoZSBkZXZlIHJpY2V2ZXJlIGxhIGdyYWZpY2FcclxuICogQHBhcmFtIHNvdXJjZXMgY2FtcGkgZ2nDoCBwcmVzZW50aSBuZWxsYSBmb3JtLCBpbiBvcmRpbmVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdsb2JhbEluaGVyaXRlZE1hcChcclxuICAgIGZpZWxkOiBCYXNlRmllbGQsXHJcbiAgICBzb3VyY2VzOiBBcnJheTxCYXNlRmllbGQ+XHJcbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcblxyXG4gICAgY29uc3QgdHlwZURlZiA9IGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkPy5GaWVsZFR5cGUpO1xyXG4gICAgaWYgKCF0eXBlRGVmKSB7IHJldHVybiByZXN1bHQ7IH1cclxuXHJcbiAgICBHTE9CQUxfU1RZTEVfRUxFTUVOVFMuZm9yRWFjaCgoZ2xvYmFsRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEtleXMgPSByZXNvbHZlR2xvYmFsRWxlbWVudEtleXMoZmllbGQsIGdsb2JhbEVsZW1lbnQua2V5KTtcclxuICAgICAgICBpZiAodGFyZ2V0S2V5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMgPz8gW10pIHtcclxuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gZmllbGQpIHsgY29udGludWU7IH1cclxuICAgICAgICAgICAgaWYgKE51bWJlcihzb3VyY2U/LkZpZWxkVHlwZSkgPT09IE51bWJlcih0eXBlRGVmLmZpZWxkVHlwZSkpIHsgY29udGludWU7IH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUtleXMgPSByZXNvbHZlR2xvYmFsRWxlbWVudEtleXMoc291cmNlLCBnbG9iYWxFbGVtZW50LmtleSk7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VLZXlzLmxlbmd0aCA9PT0gMCkgeyBjb250aW51ZTsgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlTWFwID0gZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc291cmNlKTtcclxuICAgICAgICAgICAgbGV0IGNvcGllZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gU29sbyBnbGkgc3RhdGkgY2hlIGxhIHRpcG9sb2dpYSBkaSBkZXN0aW5hemlvbmUgY29ub3NjZSBkYXZ2ZXJvXHJcbiAgICAgICAgICAgIHR5cGVEZWYuc3RhdGVzLmZvckVhY2goKHN0YXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjc3MgPSBzb3VyY2VNYXBbc291cmNlS2V5c1swXSArIHN0YXRlLmtleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNzcyB8fCAhY3NzLnRyaW0oKSkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgIHRhcmdldEtleXMuZm9yRWFjaCgodGspID0+IHsgcmVzdWx0W3RrICsgc3RhdGUua2V5XSA9IGNzczsgfSk7XHJcbiAgICAgICAgICAgICAgICBjb3BpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb3BpZWQpIHsgYnJlYWs7IH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vLyNlbmRyZWdpb24gR3JhZmljYSBkaSBkZWZhdWx0IGVyZWRpdGF0YVxyXG4iXX0=
517
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtc3R5bGUtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3V0aWxzL2ZpZWxkLXN0eWxlLWNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBa0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRyxPQUFPLEVBRUgsMEJBQTBCLEVBQzFCLGlCQUFpQixFQUNqQixpQkFBaUIsR0FDcEIsTUFBTSx3QkFBd0IsQ0FBQztBQTRCaEMsTUFBTSxhQUFhLEdBQXVCLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDL0UsTUFBTSxlQUFlLEdBQXVCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDdkYsTUFBTSxhQUFhLEdBQXVCLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDbkYsTUFBTSxpQkFBaUIsR0FBdUIsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUMzRixNQUFNLGNBQWMsR0FBdUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUNwRixNQUFNLGNBQWMsR0FBdUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUV0RixNQUFNLFdBQVcsR0FBRyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVwRyxnR0FBZ0c7QUFDaEcsTUFBTSx5QkFBeUIsR0FBOEI7SUFDekQsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7SUFDMUMsc0ZBQXNGO0lBQ3RGLHVEQUF1RDtJQUN2RCxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRTtJQUN6RixFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFO0lBQzVGLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtJQUNsRCxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7Q0FDeEQsQ0FBQztBQUNGLE1BQU0seUJBQXlCLEdBQThCO0lBQ3pELEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtJQUNoRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNwQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFO0NBQ25ELENBQUM7QUFDRixNQUFNLDBCQUEwQixHQUE4QjtJQUMxRCxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUU7SUFDaEUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7Q0FDdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE2QjtJQUN6RDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDMUMsS0FBSyxFQUFFLGdCQUFnQjtRQUN2QixTQUFTLEVBQUUsbUJBQW1CO1FBQzlCLFFBQVEsRUFBRTtZQUNOLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQzFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7WUFDM0MsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUU7WUFDL0YsRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRTtZQUNsRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUNoQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtZQUN4QyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRTtTQUMzQztRQUNELE1BQU0sRUFBRSxXQUFXO0tBQ3RCO0lBQ0Q7UUFDSSxTQUFTLEVBQUUsYUFBYSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxLQUFLLEVBQUUsZUFBZTtRQUN0QixTQUFTLEVBQUUsdUJBQXVCO1FBQ2xDLFFBQVEsRUFBRTtZQUNOLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQzFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO1lBQ3hDLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFO1lBQy9GLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUU7WUFDbEcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDaEMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUU7U0FDM0M7UUFDRCxNQUFNLEVBQUUsV0FBVztLQUN0QjtJQUNEO1FBQ0ksU0FBUyxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMxQyxLQUFLLEVBQUUsZ0JBQWdCO1FBQ3ZCLFNBQVMsRUFBRSxzQkFBc0I7UUFDakMsUUFBUSxFQUFFO1lBQ04sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDMUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtZQUMzQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRTtZQUMvRixFQUFFLEdBQUcsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFO1lBQ2xHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1lBQ2hDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO1NBQzNDO1FBQ0QsTUFBTSxFQUFFLFdBQVc7S0FDdEI7SUFDRDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3BDLEtBQUssRUFBRSxVQUFVO1FBQ2pCLFNBQVMsRUFBRSxzQkFBc0I7UUFDakMsUUFBUSxFQUFFO1lBQ04sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDMUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSx1Q0FBdUMsRUFBRTtZQUNqRSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtTQUNuRjtRQUNELE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQztLQUMxRTtJQUNEO1FBQ0ksU0FBUyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUM7UUFDeEMsS0FBSyxFQUFFLGNBQWM7UUFDckIsU0FBUyxFQUFFLG1CQUFtQjtRQUM5QixRQUFRLEVBQUU7WUFDTixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFO1lBQ2xELEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFO1lBQy9GLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUU7WUFDbEcsRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFO1lBQzNELEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFO1lBQ3ZELEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7WUFDbkQsRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO1lBQzdELEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1NBQ3ZDO1FBQ0QsTUFBTSxFQUFFLFdBQVc7S0FDdEI7SUFDRDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3BDLEtBQUssRUFBRSxVQUFVO1FBQ2pCLFNBQVMsRUFBRSx5QkFBeUI7UUFDcEMsUUFBUSxFQUFFO1lBQ04sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDMUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUU7WUFDM0UsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1lBQ3JELEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtZQUNyRCxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7WUFDbkQsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFO1lBQ3ZELEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7U0FDckQ7UUFDRCxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUM7S0FDM0U7SUFDRDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ3BDLEtBQUssRUFBRSxVQUFVO1FBQ2pCLFNBQVMsRUFBRSxvQkFBb0I7UUFDL0IsUUFBUSxFQUFFO1lBQ04sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDMUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUU7WUFDaEYsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFO1NBQ3REO1FBQ0QsTUFBTSxFQUFFLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztLQUMzQztJQUNEO1FBQ0ksU0FBUyxFQUFFLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztRQUMzQyxLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFNBQVMsRUFBRSx3QkFBd0I7UUFDbkMsUUFBUSxFQUFFLHlCQUF5QjtRQUNuQyxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUM7S0FDOUY7SUFDRDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsaUJBQWlCLENBQUM7UUFDM0MsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixTQUFTLEVBQUUsNEJBQTRCO1FBQ3ZDLFFBQVEsRUFBRTtZQUNOLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQzFDLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtZQUMxRCxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRTtZQUMvRixFQUFFLEdBQUcsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFO1lBQ2xHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7U0FDdEQ7UUFDRCxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUM7S0FDOUY7SUFDRDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDO1FBQ3JDLEtBQUssRUFBRSxXQUFXO1FBQ2xCLFNBQVMsRUFBRSxvQkFBb0I7UUFDL0IsUUFBUSxFQUFFO1lBQ04sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7U0FDN0M7UUFDRCxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDO0tBQzNDO0lBQ0Q7UUFDSSxTQUFTLEVBQUUsYUFBYSxDQUFDLHNCQUFzQixDQUFDO1FBQ2hELEtBQUssRUFBRSxzQkFBc0I7UUFDN0IsU0FBUyxFQUFFLCtCQUErQjtRQUMxQyxRQUFRLEVBQUU7WUFDTixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtZQUMxQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtZQUNoRixFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtTQUNsRDtRQUNELE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUM7S0FDM0M7SUFDRDtRQUNJLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDO1FBQ25DLEtBQUssRUFBRSxTQUFTO1FBQ2hCLFNBQVMsRUFBRSwyQkFBMkI7UUFDdEMsUUFBUSxFQUFFO1lBQ04sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDaEMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUU7U0FDakY7UUFDRCxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztLQUNqRztDQUNKLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBZ0I7SUFDaEQsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFDO0tBQUU7SUFDMUIsTUFBTSxVQUFVLEdBQUc7UUFDZixLQUFLLENBQUMsV0FBVztRQUNoQixLQUFhLENBQUMsU0FBUztRQUN4QixLQUFLLENBQUMsS0FBSztRQUNYLEtBQUssQ0FBQyxJQUFJO0tBQ2IsQ0FBQztJQUNGLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUM7U0FBRTtLQUN2QjtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ2QsQ0FBQztBQUVELG9HQUFvRztBQUNwRyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsU0FBaUM7SUFDbEUsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQzlGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBZ0I7SUFDbEQsTUFBTSxHQUFHLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztLQUFFO0lBRXhCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRTtRQUNwRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUUsS0FBd0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pFLElBQUksSUFBSSxLQUFLLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFBRSxPQUFPLDBCQUEwQixDQUFDO1NBQUU7UUFDL0YsSUFBSSxJQUFJLEtBQUssb0JBQW9CLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFBRSxPQUFPLHlCQUF5QixDQUFDO1NBQUU7UUFDeEYsT0FBTyx5QkFBeUIsQ0FBQztLQUNwQztJQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUN4QixDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFnQjtJQUM3QyxNQUFNLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0tBQUU7SUFDMUIsT0FBUSxLQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNqRCxDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFnQjtJQUNoRCxNQUFNLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0tBQUU7SUFDMUIsSUFBSSxDQUFFLEtBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFBRyxLQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUFFO0lBQzNFLE9BQVEsS0FBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFnQixFQUFFLEdBQVc7SUFDNUQsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNoRCxDQUFDO0FBRUQseUZBQXlGO0FBQ3pGLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFnQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQzNFLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPO0tBQUU7SUFDckIsK0VBQStFO0lBQzlFLEdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO0FBQzNDLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQWdCO0lBQ2pELE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQztLQUFFO0lBQzFCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWdCO0lBQy9DLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUE4QixFQUFFLENBQUM7SUFDNUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQWtCRCxNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUM7QUFFekIsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWlDO0lBQy9EO1FBQ0ksR0FBRyxFQUFFLGFBQWE7UUFDbEIsS0FBSyxFQUFFLGFBQWE7UUFDcEIsT0FBTyxFQUFFO1lBQ0wsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ3JDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDcEMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ3JDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDL0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNuQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQy9CLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDL0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ3RDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUN0QyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ2hDLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1NBQ2pDO0tBQ0o7SUFDRDtRQUNJLEdBQUcsRUFBRSxpQkFBaUI7UUFDdEIsS0FBSyxFQUFFLDJCQUEyQjtRQUNsQyxPQUFPLEVBQUUsMEJBQTBCO1FBQ25DLGtGQUFrRjtRQUNsRix1Q0FBdUM7UUFDdkMsT0FBTyxFQUFFO1lBQ0wsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDdEMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUN4QyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQ3JDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQ2pDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDM0IsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDN0MsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUNuQztLQUNKO0lBQ0Q7UUFDSSxHQUFHLEVBQUUsb0JBQW9CO1FBQ3pCLEtBQUssRUFBRSxxQkFBcUI7UUFDNUIsT0FBTyxFQUFFLDBCQUEwQjtRQUNuQyxPQUFPLEVBQUU7WUFDTCxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztZQUNoRCxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUM7WUFDL0MsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUM7WUFDaEQsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUM7WUFDakQsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDO1lBQzlDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1NBQzlDO0tBQ0o7SUFDRDtRQUNJLEdBQUcsRUFBRSxRQUFRO1FBQ2IsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLE9BQU8sRUFBRTtZQUNMLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNqQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNqQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQzVCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDbkMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO1lBQ2pFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO1NBQ2hEO0tBQ0o7Q0FDSixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFnQixFQUFFLFNBQWlCO0lBQ3hFLE1BQU0sR0FBRyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNuRSxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7S0FBRTtJQUV4QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFDO0tBQUU7SUFFM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBeUM7SUFDckUsTUFBTSxJQUFJLEdBQUcsVUFBVTtTQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBMEIsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7S0FBRTtJQUVyQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQy9ELENBQUM7QUFDTixDQUFDO0FBRUQsNEJBQTRCO0FBRTVCLG9EQUFvRDtBQUVwRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZ0U7SUFDN0YsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0lBQ2hFLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7SUFDL0QsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0lBQ2hFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7SUFDakQsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7SUFDekMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0NBQ2xFLENBQUM7QUFTRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3BDLEtBQWdCLEVBQ2hCLEdBQThCLEVBQzlCLElBQXdDO0lBRXhDLE1BQU0sTUFBTSxHQUFzQixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBRTdELE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUM7S0FBRTtJQUUvQixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFLFVBQThCLEVBQUUsSUFBdUMsRUFBRSxFQUFFO1FBQ3BHLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFakYsTUFBTSxHQUFHLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTdCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3pEO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sRUFBRTtZQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7U0FBRTtRQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUFFO0lBQzlELENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDM0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMzRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsZ0dBQWdHO0FBQ2hHLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBZ0IsRUFBRSxJQUF1QztJQUNyRixNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0tBQUU7SUFFN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMxRSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7S0FBRTtJQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3JFLENBQUM7QUFFRCwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQWdCO0lBQ2pELE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQyxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWdCO0lBQy9DLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELHVEQUF1RDtBQUV2RCxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsS0FBZ0IsRUFDaEIsT0FBeUI7SUFFekIsTUFBTSxNQUFNLEdBQThCLEVBQUUsQ0FBQztJQUU3QyxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDO0tBQUU7SUFFaEMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDNUMsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXhDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRTtZQUNoQyxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQ25DLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUUxRSxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRTFDLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztZQUVuQixrRUFBa0U7WUFDbEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQUUsT0FBTztpQkFBRTtnQkFDcEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLE1BQU0sRUFBRTtnQkFBRSxNQUFNO2FBQUU7U0FDekI7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCx5Q0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRmllbGQsIEZpZWxkVHlwZUVudW0gfSBmcm9tICcuLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgTGlzdFByZXNlbnRhdGlvbkVudW0sIExpc3RWYWx1ZUZpZWxkIH0gZnJvbSAnLi4vbW9kZWxzL2ZpZWxkcy9saXN0VmFsdWVGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IGdldENzc0RlY2xhcmF0aW9uLCBwYXJzZUNzc0RlY2xhcmF0aW9ucywgc2V0Q3NzRGVjbGFyYXRpb24gfSBmcm9tICcuL2Nzcy1kZWNsYXJhdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gICAgQ3NzRWxlbWVudFByb2ZpbGUsXHJcbiAgICBDU1NfUFJPRklMRV9GTE9BVElOR19MQUJFTCxcclxuICAgIENTU19QUk9GSUxFX0xBQkVMLFxyXG4gICAgQ1NTX1BST0ZJTEVfVkFMVUUsXHJcbn0gZnJvbSAnLi9jc3MtcHJvcGVydHktY2F0YWxvZyc7XHJcblxyXG4vKipcclxuICogQ2F0YWxvZ28gY2VudHJhbGl6emF0byBkZWxsYSBncmFmaWNhIGRlaSBjYW1waS5cclxuICpcclxuICogT2duaSB0aXBvbG9naWEgZGkgY2FtcG8gZXNwb25lIHVuYSBtYXBwYSBwaWF0dGEgXCJFbGVtZW50byArIFN0YXRvXCIgLT4gc3RyaW5nYSBDU1NcclxuICogKGVzLiBUZXh0RmllbGRTdHlsZUNTUy5JbnB1dEZvY3VzZWQgPSBcImNvbG9yOiByZWQ7XCIpLiBRdWkgc3Rhbm5vLCBpbiB1biB1bmljbyBwb3N0byxcclxuICogaSBtZXRhZGF0aSBkaSBxdWFsaSBlbGVtZW50aSBlIHF1YWxpIHN0YXRpIGVzaXN0b25vIHBlciBvZ25pIHRpcG9sb2dpYSwgaW5zaWVtZSBhZ2xpXHJcbiAqIGFjY2Vzc29yIGdlbmVyaWNpIHBlciBsZWdnZXJlL3Njcml2ZXJlIHF1ZWxsZSBtYXBwZSBzZW56YSBkdXBsaWNhcmUgY29kaWNlIHBlciB0aXBvLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRTdHlsZUVudHJ5RGVmIHtcclxuICAgIGtleTogc3RyaW5nO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBQcm9wcmlldMOgIG1vc3RyYXRlIGRhbGwnZWRpdG9yIHBlciBxdWVzdG8gZWxlbWVudG8gKGRlZmF1bHQ6IGVsZW5jbyBnZW5lcmFsZSkgKi9cclxuICAgIHByb2ZpbGU/OiBDc3NFbGVtZW50UHJvZmlsZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFN0eWxlVHlwZURlZiB7XHJcbiAgICBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW07XHJcbiAgICAvKiogRXRpY2hldHRhIGRlbGxhIHRpcG9sb2dpYSBtb3N0cmF0YSBhIHZpZGVvICovXHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbGEgbWFwcGEgZGVnbGkgc3RpbGkgc3VsIGZpZWxkICovXHJcbiAgICBzdHlsZVByb3A6IHN0cmluZztcclxuICAgIGVsZW1lbnRzOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+O1xyXG4gICAgc3RhdGVzOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+O1xyXG59XHJcblxyXG5jb25zdCBTVEFURV9OT1JNQUxFOiBGaWVsZFN0eWxlRW50cnlEZWYgPSB7IGtleTogJ05vcm1hbGUnLCBsYWJlbDogJ05vcm1hbGUnIH07XHJcbmNvbnN0IFNUQVRFX01PVVNFT1ZFUjogRmllbGRTdHlsZUVudHJ5RGVmID0geyBrZXk6ICdNb3VzZW92ZXInLCBsYWJlbDogJ01vdXNlIHNvcHJhJyB9O1xyXG5jb25zdCBTVEFURV9GT0NVU0VEOiBGaWVsZFN0eWxlRW50cnlEZWYgPSB7IGtleTogJ0ZvY3VzZWQnLCBsYWJlbDogJ1NlbGV6aW9uYXRvJyB9O1xyXG5jb25zdCBTVEFURV9TRUxFWklPTkFUTzogRmllbGRTdHlsZUVudHJ5RGVmID0geyBrZXk6ICdTZWxlemlvbmF0bycsIGxhYmVsOiAnU2VsZXppb25hdG8nIH07XHJcbmNvbnN0IFNUQVRFX05PVFZBTElEOiBGaWVsZFN0eWxlRW50cnlEZWYgPSB7IGtleTogJ05vdFZhbGlkJywgbGFiZWw6ICdOb24gdmFsaWRvJyB9O1xyXG5jb25zdCBTVEFURV9SRUFET05MWTogRmllbGRTdHlsZUVudHJ5RGVmID0geyBrZXk6ICdSZWFkb25seScsIGxhYmVsOiAnU29sYSBsZXR0dXJhJyB9O1xyXG5cclxuY29uc3QgRlVMTF9TVEFURVMgPSBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSLCBTVEFURV9GT0NVU0VELCBTVEFURV9OT1RWQUxJRCwgU1RBVEVfUkVBRE9OTFldO1xyXG5cclxuLyoqIEVsZW1lbnRpIGRlbCBjYW1wbyBcIkVsZW5jbyBnZW5lcmljb1wiLCBjaGUgY2FtYmlhbm8gaW4gYmFzZSBhbGxhIG1vZGFsaXTDoCBkaSBwcmVzZW50YXppb25lICovXHJcbmNvbnN0IExJU1RfVkFMVUVfQ09NQk9fRUxFTUVOVFM6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4gPSBbXHJcbiAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAvLyBTdGVzc2EgbGFiZWw6IFwiTGFiZWxcIiDDqCBsYSBncmFmaWNhIGJhc2UsIHNlbXByZSB2YWxpZGE7IFwiTGFiZWxTb2xsZXZhdGFcIiAodmlydHVhbGUsXHJcbiAgICAvLyBzYWx2YXRhIGRlbnRybyBMYWJlbCkgc292cmFzY3JpdmUgcXVhbmRvIMOoIHN1bCBib3Jkb1xyXG4gICAgeyBrZXk6ICdMYWJlbCcsIGxhYmVsOiAnRXRpY2hldHRhIG5lbCBjb250ZW5pdG9yZScsIHByb2ZpbGU6IENTU19QUk9GSUxFX0ZMT0FUSU5HX0xBQkVMIH0sXHJcbiAgICB7IGtleTogJ0xhYmVsU29sbGV2YXRhJywgbGFiZWw6ICdFdGljaGV0dGEgc3VsIGJvcmRvJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfRkxPQVRJTkdfTEFCRUwgfSxcclxuICAgIHsga2V5OiAnQ2FzZWxsYVRyaWdnZXInLCBsYWJlbDogJ0Nhc2VsbGEgU2VsZWN0JyB9LFxyXG4gICAgeyBrZXk6ICdCb3R0b25lQ2FuY2VsbGEnLCBsYWJlbDogJ0JvdHRvbmUgQ2FuY2VsbGEnIH0sXHJcbl07XHJcbmNvbnN0IExJU1RfVkFMVUVfUkFESU9fRUxFTUVOVFM6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4gPSBbXHJcbiAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICB7IGtleTogJ0xhYmVsJywgbGFiZWw6ICdFdGljaGV0dGEnLCBwcm9maWxlOiBDU1NfUFJPRklMRV9MQUJFTCB9LFxyXG4gICAgeyBrZXk6ICdPcHppb25lJywgbGFiZWw6ICdPcHppb25lJyB9LFxyXG4gICAgeyBrZXk6ICdTZWxlemlvbmUnLCBsYWJlbDogJ1NlbGV6aW9uZSAocmFkaW8pJyB9LFxyXG5dO1xyXG5jb25zdCBMSVNUX1ZBTFVFX0JVVFRPTl9FTEVNRU5UUzogQXJyYXk8RmllbGRTdHlsZUVudHJ5RGVmPiA9IFtcclxuICAgIHsga2V5OiAnTGFiZWwnLCBsYWJlbDogJ0V0aWNoZXR0YScsIHByb2ZpbGU6IENTU19QUk9GSUxFX0xBQkVMIH0sXHJcbiAgICB7IGtleTogJ0JvdHRvbmUnLCBsYWJlbDogJ0JvdHRvbmUnIH0sXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgRklFTERfU1RZTEVfQ0FUQUxPRzogQXJyYXk8RmllbGRTdHlsZVR5cGVEZWY+ID0gW1xyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnQ2FtcG8gZGkgdGVzdG8nXSxcclxuICAgICAgICBsYWJlbDogJ0NhbXBvIGRpIHRlc3RvJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdUZXh0RmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0lucHV0JywgbGFiZWw6ICdDYXNlbGxhIGRpIHRlc3RvJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdFdGljaGV0dGEgbmVsIGNvbnRlbml0b3JlJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfRkxPQVRJTkdfTEFCRUwgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdEZXNjcml6aW9uZVNvbGxldmF0YScsIGxhYmVsOiAnRXRpY2hldHRhIHN1bCBib3JkbycsIHByb2ZpbGU6IENTU19QUk9GSUxFX0ZMT0FUSU5HX0xBQkVMIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSWNvbmEnLCBsYWJlbDogJ0ljb25hJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ01pY3JvZm9ubycsIGxhYmVsOiAnTWljcm9mb25vJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Vycm9yZScsIGxhYmVsOiAnVGVzdG8gZXJyb3JlJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBGVUxMX1NUQVRFUyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydBcmVhIGRpIHRlc3RvJ10sXHJcbiAgICAgICAgbGFiZWw6ICdBcmVhIGRpIHRlc3RvJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdUZXh0YXJlYUZpZWxkU3R5bGVDU1MnLFxyXG4gICAgICAgIGVsZW1lbnRzOiBbXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ29udGFpbmVyJywgbGFiZWw6ICdDb250ZW5pdG9yZScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdJbnB1dCcsIGxhYmVsOiAnQXJlYSBkaSB0ZXN0bycgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdEZXNjcml6aW9uZScsIGxhYmVsOiAnRXRpY2hldHRhIG5lbCBjb250ZW5pdG9yZScsIHByb2ZpbGU6IENTU19QUk9GSUxFX0ZMT0FUSU5HX0xBQkVMIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmVTb2xsZXZhdGEnLCBsYWJlbDogJ0V0aWNoZXR0YSBzdWwgYm9yZG8nLCBwcm9maWxlOiBDU1NfUFJPRklMRV9GTE9BVElOR19MQUJFTCB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hJywgbGFiZWw6ICdJY29uYScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdNaWNyb2Zvbm8nLCBsYWJlbDogJ01pY3JvZm9ubycgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdFcnJvcmUnLCBsYWJlbDogJ1Rlc3RvIGVycm9yZScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogRlVMTF9TVEFURVMsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnQ2FtcG8gbnVtZXJpY28nXSxcclxuICAgICAgICBsYWJlbDogJ0NhbXBvIG51bWVyaWNvJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdOdW1lcmljRmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0lucHV0JywgbGFiZWw6ICdDYXNlbGxhIG51bWVyaWNhJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdFdGljaGV0dGEgbmVsIGNvbnRlbml0b3JlJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfRkxPQVRJTkdfTEFCRUwgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdEZXNjcml6aW9uZVNvbGxldmF0YScsIGxhYmVsOiAnRXRpY2hldHRhIHN1bCBib3JkbycsIHByb2ZpbGU6IENTU19QUk9GSUxFX0ZMT0FUSU5HX0xBQkVMIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSWNvbmEnLCBsYWJlbDogJ0ljb25hJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Vycm9yZScsIGxhYmVsOiAnVGVzdG8gZXJyb3JlJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBGVUxMX1NUQVRFUyxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydCb29sZWFubyddLFxyXG4gICAgICAgIGxhYmVsOiAnQm9vbGVhbm8nLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0Jvb2xlYW5GaWVsZFN0eWxlQ1NTJyxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAgICB7IGtleTogJ0NvbnRhaW5lcicsIGxhYmVsOiAnQ29udGVuaXRvcmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnU2NlbHRhJywgbGFiZWw6ICdDb250cm9sbG8gKHRvZ2dsZSAvIGNoZWNrYm94IC8gcmFkaW8pJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdEZXNjcml6aW9uZSAobGFiZWwpJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfTEFCRUwgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUiwgU1RBVEVfRk9DVVNFRCwgU1RBVEVfUkVBRE9OTFldLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW1bJ0RhdGEgZS9vIG9yYSddLFxyXG4gICAgICAgIGxhYmVsOiAnRGF0YSBlL28gb3JhJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdEYXRlRmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlIGVzdGVybm8nIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmUnLCBsYWJlbDogJ0V0aWNoZXR0YSBuZWwgY29udGVuaXRvcmUnLCBwcm9maWxlOiBDU1NfUFJPRklMRV9GTE9BVElOR19MQUJFTCB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lU29sbGV2YXRhJywgbGFiZWw6ICdFdGljaGV0dGEgc3VsIGJvcmRvJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfRkxPQVRJTkdfTEFCRUwgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250ZW5pdG9yZUludGVybm8nLCBsYWJlbDogJ0NvbnRlbml0b3JlIGludGVybm8nIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ2FtcG9EYXRhJywgbGFiZWw6ICdDYXNlbGxhIGRpIHRlc3RvJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hQ2FsZW5kYXJpbycsIGxhYmVsOiAnQm90dG9uZSBjYWxlbmRhcmlvJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hT3JvbG9naW8nLCBsYWJlbDogJ0JvdHRvbmUgb3JvbG9naW8nIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnSWNvbmFDYW5jZWxsYXppb25lJywgbGFiZWw6ICdCb3R0b25lIGNhbmNlbGxhemlvbmUnIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnVG9vbHRpcCcsIGxhYmVsOiAnVG9vbHRpcCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogRlVMTF9TVEFURVMsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnQWxsZWdhdG8nXSxcclxuICAgICAgICBsYWJlbDogJ0FsbGVnYXRvJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdBdHRhY2htZW50RmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0xhYmVsJywgbGFiZWw6ICdMYWJlbCAvIGludGVzdGF6aW9uZScsIHByb2ZpbGU6IENTU19QUk9GSUxFX0xBQkVMIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnQm90dG9uZUFnZ2l1bmdpJywgbGFiZWw6ICdCb3R0b25lIEFnZ2l1bmdpJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0JvdHRvbmVEb3dubG9hZCcsIGxhYmVsOiAnQm90dG9uZSBEb3dubG9hZCcgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdCb3R0b25lRWxpbWluYScsIGxhYmVsOiAnQm90dG9uZSBFbGltaW5hJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0JvdHRvbmVBbnRlcHJpbWEnLCBsYWJlbDogJ0JvdHRvbmUgQW50ZXByaW1hJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0NhbXBvTm9tZUZpbGUnLCBsYWJlbDogJ0NhbXBvIG5vbWUgZmlsZScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUiwgU1RBVEVfTk9UVkFMSUQsIFNUQVRFX1JFQURPTkxZXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydJbW1hZ2luZSddLFxyXG4gICAgICAgIGxhYmVsOiAnSW1tYWdpbmUnLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0ltYWdlRmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdEZXNjcml6aW9uZSAobGFiZWwpJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfTEFCRUwgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdCb3R0b25lRGlzZWduYScsIGxhYmVsOiAnQm90dG9uZSBEaXNlZ25hJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydFbGVuY28gZ2VuZXJpY28nXSxcclxuICAgICAgICBsYWJlbDogJ0VsZW5jbyBnZW5lcmljbycsXHJcbiAgICAgICAgc3R5bGVQcm9wOiAnTGlzdFZhbHVlRmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IExJU1RfVkFMVUVfQ09NQk9fRUxFTUVOVFMsXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSLCBTVEFURV9TRUxFWklPTkFUTywgU1RBVEVfTk9UVkFMSUQsIFNUQVRFX1JFQURPTkxZXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtWydFbGVuY28gaW1tYWdpbmknXSxcclxuICAgICAgICBsYWJlbDogJ0VsZW5jbyBpbW1hZ2luaScsXHJcbiAgICAgICAgc3R5bGVQcm9wOiAnSW1hZ2VTZWxlY3RvckZpZWxkU3R5bGVDU1MnLFxyXG4gICAgICAgIGVsZW1lbnRzOiBbXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ29udGFpbmVyJywgbGFiZWw6ICdDb250ZW5pdG9yZScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdDYXNlbGxhU2VsZXppb25lJywgbGFiZWw6ICdDYXNlbGxhIGRpIHNlbGV6aW9uZScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdEZXNjcml6aW9uZScsIGxhYmVsOiAnRXRpY2hldHRhIG5lbCBjb250ZW5pdG9yZScsIHByb2ZpbGU6IENTU19QUk9GSUxFX0ZMT0FUSU5HX0xBQkVMIH0sXHJcbiAgICAgICAgICAgIHsga2V5OiAnRGVzY3JpemlvbmVTb2xsZXZhdGEnLCBsYWJlbDogJ0V0aWNoZXR0YSBzdWwgYm9yZG8nLCBwcm9maWxlOiBDU1NfUFJPRklMRV9GTE9BVElOR19MQUJFTCB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ1NlbGV6aW9uaScsIGxhYmVsOiAnU2VsZXppb25pIChjaGVja2JveCknIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBzdGF0ZXM6IFtTVEFURV9OT1JNQUxFLCBTVEFURV9NT1VTRU9WRVIsIFNUQVRFX1NFTEVaSU9OQVRPLCBTVEFURV9OT1RWQUxJRCwgU1RBVEVfUkVBRE9OTFldLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW1bJ0V0aWNoZXR0YSddLFxyXG4gICAgICAgIGxhYmVsOiAnRXRpY2hldHRhJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdMYWJlbEZpZWxkU3R5bGVDU1MnLFxyXG4gICAgICAgIGVsZW1lbnRzOiBbXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ29udGFpbmVyJywgbGFiZWw6ICdDb250ZW5pdG9yZScgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHN0YXRlczogW1NUQVRFX05PUk1BTEUsIFNUQVRFX01PVVNFT1ZFUl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGZpZWxkVHlwZTogRmllbGRUeXBlRW51bVsnSW1tYWdpbmUgY29uIG1hcmtlcnMnXSxcclxuICAgICAgICBsYWJlbDogJ0ltbWFnaW5lIGNvbiBtYXJrZXJzJyxcclxuICAgICAgICBzdHlsZVByb3A6ICdJbWFnZVdpdGhNYXJrZXJzRmllbGRTdHlsZUNTUycsXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgICAgeyBrZXk6ICdDb250YWluZXInLCBsYWJlbDogJ0NvbnRlbml0b3JlJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0Rlc2NyaXppb25lJywgbGFiZWw6ICdEZXNjcml6aW9uZSAobGFiZWwpJywgcHJvZmlsZTogQ1NTX1BST0ZJTEVfTEFCRUwgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdCb3R0b25lTWFyY2EnLCBsYWJlbDogJ0JvdHRvbmUgTWFyY2EnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBzdGF0ZXM6IFtTVEFURV9OT1JNQUxFLCBTVEFURV9NT1VTRU9WRVJdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW1bJ0JvdHRvbmUnXSxcclxuICAgICAgICBsYWJlbDogJ0JvdHRvbmUnLFxyXG4gICAgICAgIHN0eWxlUHJvcDogJ0FjdGlvbkJ1dHRvbkZpZWxkU3R5bGVDU1MnLFxyXG4gICAgICAgIGVsZW1lbnRzOiBbXHJcbiAgICAgICAgICAgIHsga2V5OiAnQ29udGFpbmVyJywgbGFiZWw6ICdCb3R0b25lJyB9LFxyXG4gICAgICAgICAgICB7IGtleTogJ0ljb25hJywgbGFiZWw6ICdJY29uYScgfSxcclxuICAgICAgICAgICAgeyBrZXk6ICdEZXNjcml6aW9uZScsIGxhYmVsOiAnRXRpY2hldHRhIChsYWJlbCknLCBwcm9maWxlOiBDU1NfUFJPRklMRV9MQUJFTCB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgc3RhdGVzOiBbU1RBVEVfTk9STUFMRSwgU1RBVEVfTU9VU0VPVkVSLCB7IGtleTogJ1NlbGV6aW9uYXRvJywgbGFiZWw6ICdTZWxlemlvbmF0byAoY2xpY2spJyB9XSxcclxuICAgIH0sXHJcbl07XHJcblxyXG4vKipcclxuICogTm9tZSBkaSB1biBjYW1wbyBkYSBtb3N0cmFyZSBhIHZpZGVvLiBEZXNjcmlwdGlvbiBwdcOyIHZhbGVyZSBcIiBcIiAodW5vIHNwYXppbzogdHJ1dGh5IG1hXHJcbiAqIGludmlzaWJpbGUpLCBxdWluZGkgdmEgcmlwdWxpdGEgcHJpbWEgZGkgdXNhcmxhOyBwb2kgaWwgdGVzdG8gZGVsbCdFdGljaGV0dGEsIGlsIGNvZGljZSwgaWwgTmFtZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZERpc3BsYXlOYW1lKGZpZWxkOiBCYXNlRmllbGQpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFmaWVsZCkgeyByZXR1cm4gJyc7IH1cclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXHJcbiAgICAgICAgZmllbGQuRGVzY3JpcHRpb24sXHJcbiAgICAgICAgKGZpZWxkIGFzIGFueSkuRXRpY2hldHRhLFxyXG4gICAgICAgIGZpZWxkLkxhYmVsLFxyXG4gICAgICAgIGZpZWxkLk5hbWUsXHJcbiAgICBdO1xyXG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcclxuICAgICAgICBjb25zdCB0ID0gKGMgPz8gJycpLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgIGlmICh0KSB7IHJldHVybiB0OyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbn1cclxuXHJcbi8qKiBEZWZpbml6aW9uZSBkZWwgY2F0YWxvZ28gcGVyIHVuYSB0aXBvbG9naWE7IG51bGwgc2UgbGEgdGlwb2xvZ2lhIG5vbiBoYSBncmFmaWNhIGNvbmZpZ3VyYWJpbGUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkVHlwZTogRmllbGRUeXBlRW51bSB8IG51bWJlcik6IEZpZWxkU3R5bGVUeXBlRGVmIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gRklFTERfU1RZTEVfQ0FUQUxPRy5maW5kKChkKSA9PiBOdW1iZXIoZC5maWVsZFR5cGUpID09PSBOdW1iZXIoZmllbGRUeXBlKSkgPz8gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEVsZW1lbnRpIGdyYWZpY2kgZGkgdW4gY2FtcG8uIENvaW5jaWRvbm8gY29uIHF1ZWxsaSBkZWwgY2F0YWxvZ28sIHNhbHZvIGwnRWxlbmNvIGdlbmVyaWNvXHJcbiAqIGRvdmUgZGlwZW5kb25vIGRhbGxhIG1vZGFsaXTDoCBkaSBwcmVzZW50YXppb25lIHNjZWx0YSBzdWwgY2FtcG8uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGZpZWxkOiBCYXNlRmllbGQpOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+IHtcclxuICAgIGNvbnN0IGRlZiA9IGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkPy5GaWVsZFR5cGUpO1xyXG4gICAgaWYgKCFkZWYpIHsgcmV0dXJuIFtdOyB9XHJcblxyXG4gICAgaWYgKE51bWJlcihkZWYuZmllbGRUeXBlKSA9PT0gTnVtYmVyKEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBnZW5lcmljbyddKSkge1xyXG4gICAgICAgIGNvbnN0IG1vZGUgPSBOdW1iZXIoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKT8uUHJlc2VudGF0aW9uTW9kZSk7XHJcbiAgICAgICAgaWYgKG1vZGUgPT09IExpc3RQcmVzZW50YXRpb25FbnVtWydQdWxzYW50ZSBjb24gdGVzdG8nXSkgeyByZXR1cm4gTElTVF9WQUxVRV9CVVRUT05fRUxFTUVOVFM7IH1cclxuICAgICAgICBpZiAobW9kZSA9PT0gTGlzdFByZXNlbnRhdGlvbkVudW1bJ1JhZGlvIGJ1dHRvbiddKSB7IHJldHVybiBMSVNUX1ZBTFVFX1JBRElPX0VMRU1FTlRTOyB9XHJcbiAgICAgICAgcmV0dXJuIExJU1RfVkFMVUVfQ09NQk9fRUxFTUVOVFM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlZi5lbGVtZW50cztcclxufVxyXG5cclxuLyoqIE1hcHBhIGRlZ2xpIHN0aWxpIGRlbCBjYW1wbyAocHXDsiBlc3NlcmUgdW5kZWZpbmVkIHNlIG5vbiDDqCBtYWkgc3RhdGEgdmFsb3JpenphdGEpICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZFN0eWxlTWFwKGZpZWxkOiBCYXNlRmllbGQpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBkZWYgPSBnZXRGaWVsZFN0eWxlVHlwZURlZihmaWVsZD8uRmllbGRUeXBlKTtcclxuICAgIGlmICghZGVmKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICByZXR1cm4gKGZpZWxkIGFzIGFueSlbZGVmLnN0eWxlUHJvcF0gPz8gbnVsbDtcclxufVxyXG5cclxuLyoqIENvbWUgZ2V0RmllbGRTdHlsZU1hcCwgbWEgY3JlYSBsYSBtYXBwYSBzZSBtYW5jYSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRmllbGRTdHlsZU1hcChmaWVsZDogQmFzZUZpZWxkKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwge1xyXG4gICAgY29uc3QgZGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoZmllbGQ/LkZpZWxkVHlwZSk7XHJcbiAgICBpZiAoIWRlZikgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgaWYgKCEoZmllbGQgYXMgYW55KVtkZWYuc3R5bGVQcm9wXSkgeyAoZmllbGQgYXMgYW55KVtkZWYuc3R5bGVQcm9wXSA9IHt9OyB9XHJcbiAgICByZXR1cm4gKGZpZWxkIGFzIGFueSlbZGVmLnN0eWxlUHJvcF07XHJcbn1cclxuXHJcbi8qKiBMZWdnZSBpbCBDU1MgZGkgdW4gXCJFbGVtZW50byArIFN0YXRvXCIgKGVzLiBcIklucHV0Rm9jdXNlZFwiKSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRTdHlsZVZhbHVlKGZpZWxkOiBCYXNlRmllbGQsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBnZXRGaWVsZFN0eWxlTWFwKGZpZWxkKT8uW2tleV0gPz8gJyc7XHJcbn1cclxuXHJcbi8qKiBTY3JpdmUgaWwgQ1NTIGRpIHVuIFwiRWxlbWVudG8gKyBTdGF0b1wiOyBpbCB2YWxvcmUgdnVvdG8gcmltdW92ZSBsYSBjaGlhdmUgZGFsIEpTT04gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpZWxkU3R5bGVWYWx1ZShmaWVsZDogQmFzZUZpZWxkLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgbWFwID0gZW5zdXJlRmllbGRTdHlsZU1hcChmaWVsZCk7XHJcbiAgICBpZiAoIW1hcCkgeyByZXR1cm47IH1cclxuICAgIC8vIHVuZGVmaW5lZCB2aWVuZSBlc2NsdXNvIGRhIEpTT04uc3RyaW5naWZ5IC0+IGlsIEpTT04gc2FsdmF0byByaW1hbmUgY29tcGF0dG9cclxuICAgIChtYXAgYXMgYW55KVtrZXldID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKiogVHJ1ZSBzZSBpbCBjYW1wbyBub24gaGEgYW5jb3JhIG5lc3N1bmEgcmVnb2xhIGdyYWZpY2EgaW1wb3N0YXRhICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkU3R5bGVNYXBFbXB0eShmaWVsZDogQmFzZUZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBtYXAgPSBnZXRGaWVsZFN0eWxlTWFwKGZpZWxkKTtcclxuICAgIGlmICghbWFwKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gIU9iamVjdC5rZXlzKG1hcCkuc29tZSgoaykgPT4gISFtYXBba10pO1xyXG59XHJcblxyXG4vKiogQ29waWEgcHJvZm9uZGEgZGVsbGEgbWFwcGEgc3RpbGkgZGkgdW4gY2FtcG8gKHNvbG8gbGUgY2hpYXZpIHZhbG9yaXp6YXRlKSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVGaWVsZFN0eWxlTWFwKGZpZWxkOiBCYXNlRmllbGQpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG1hcCA9IGdldEZpZWxkU3R5bGVNYXAoZmllbGQpO1xyXG4gICAgY29uc3QgY2xvbmU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgIGlmICghbWFwKSB7IHJldHVybiBjbG9uZTsgfVxyXG4gICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKChrKSA9PiB7IGlmIChtYXBba10pIHsgY2xvbmVba10gPSBtYXBba107IH0gfSk7XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbn1cclxuXHJcbi8vI3JlZ2lvbiBHcmFmaWNhIGdsb2JhbGVcclxuXHJcbi8qKlxyXG4gKiBFbGVtZW50byBcImxvZ2ljb1wiIGRlbGxhIGdyYWZpY2EgZ2xvYmFsZTogdW4gY29uY2V0dG8gKGNvbnRlbml0b3JlLCBldGljaGV0dGEsIGFyZWEgZGVsIHZhbG9yZSlcclxuICogcHJlc2VudGUgaW4gcXVhc2kgdHV0dGUgbGUgdGlwb2xvZ2llIG1hIGNoZSBvZ25pIHRpcG9sb2dpYSBjaGlhbWEgY29uIHVuIG5vbWUgZGl2ZXJzby5cclxuICogU2VydmUgYWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIiwgZG92ZSBzaSBtb2RpZmljYW5vIGluc2llbWUgY2FtcGkgZGkgdGlwb2xvZ2llIGRpdmVyc2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbFN0eWxlRWxlbWVudERlZiB7XHJcbiAgICBrZXk6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICAvKiogUHJvcHJpZXTDoCBtb3N0cmF0ZSBkYWxsJ2VkaXRvciBwZXIgcXVlc3RvIGVsZW1lbnRvIChkZWZhdWx0OiBlbGVuY28gZ2VuZXJhbGUpICovXHJcbiAgICBwcm9maWxlPzogQ3NzRWxlbWVudFByb2ZpbGU7XHJcbiAgICAvKiogUGVyIG9nbmkgdGlwb2xvZ2lhLCBnbGkgZWxlbWVudGkgcmVhbGkgc3UgY3VpIHNjcml2ZXJlICovXHJcbiAgICBwZXJUeXBlOiB7IFtmaWVsZFR5cGU6IG51bWJlcl06IEFycmF5PHN0cmluZz4gfTtcclxufVxyXG5cclxuY29uc3QgRlQgPSBGaWVsZFR5cGVFbnVtO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdMT0JBTF9TVFlMRV9FTEVNRU5UUzogQXJyYXk8R2xvYmFsU3R5bGVFbGVtZW50RGVmPiA9IFtcclxuICAgIHtcclxuICAgICAgICBrZXk6ICdDb250ZW5pdG9yZScsXHJcbiAgICAgICAgbGFiZWw6ICdDb250ZW5pdG9yZScsXHJcbiAgICAgICAgcGVyVHlwZToge1xyXG4gICAgICAgICAgICBbRlRbJ0NhbXBvIGRpIHRlc3RvJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0FyZWEgZGkgdGVzdG8nXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gbnVtZXJpY28nXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQm9vbGVhbm8nXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRGF0YSBlL28gb3JhJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0FsbGVnYXRvJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0ltbWFnaW5lJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0VsZW5jbyBnZW5lcmljbyddXTogWydDb250YWluZXInXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gaW1tYWdpbmknXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRXRpY2hldHRhJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0ltbWFnaW5lIGNvbiBtYXJrZXJzJ11dOiBbJ0NvbnRhaW5lciddLFxyXG4gICAgICAgICAgICBbRlRbJ0JvdHRvbmUnXV06IFsnQ29udGFpbmVyJ10sXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAga2V5OiAnRXRpY2hldHRhUmlwb3NvJyxcclxuICAgICAgICBsYWJlbDogJ0V0aWNoZXR0YSBuZWwgY29udGVuaXRvcmUnLFxyXG4gICAgICAgIHByb2ZpbGU6IENTU19QUk9GSUxFX0ZMT0FUSU5HX0xBQkVMLFxyXG4gICAgICAgIC8vIEdyYWZpY2EgYmFzZSBkZWxsYSBsYWJlbCBkaSBvZ25pIHRpcG9sb2dpYSAocGVyIGNoaSBoYSBsYSBsYWJlbCBjaGUgc2kgc29sbGV2YSxcclxuICAgICAgICAvLyB2YWxlIGFuY2hlIHN1bCBib3JkbyBzYWx2byBvdmVycmlkZSlcclxuICAgICAgICBwZXJUeXBlOiB7XHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gZGkgdGVzdG8nXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydBcmVhIGRpIHRlc3RvJ11dOiBbJ0Rlc2NyaXppb25lJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQ2FtcG8gbnVtZXJpY28nXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gaW1tYWdpbmknXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydEYXRhIGUvbyBvcmEnXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gZ2VuZXJpY28nXV06IFsnTGFiZWwnXSxcclxuICAgICAgICAgICAgW0ZUWydCb29sZWFubyddXTogWydEZXNjcml6aW9uZSddLFxyXG4gICAgICAgICAgICBbRlRbJ0FsbGVnYXRvJ11dOiBbJ0xhYmVsJ10sXHJcbiAgICAgICAgICAgIFtGVFsnSW1tYWdpbmUnXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICAgICAgW0ZUWydJbW1hZ2luZSBjb24gbWFya2VycyddXTogWydEZXNjcml6aW9uZSddLFxyXG4gICAgICAgICAgICBbRlRbJ0JvdHRvbmUnXV06IFsnRGVzY3JpemlvbmUnXSxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBrZXk6ICdFdGljaGV0dGFTb2xsZXZhdGEnLFxyXG4gICAgICAgIGxhYmVsOiAnRXRpY2hldHRhIHN1bCBib3JkbycsXHJcbiAgICAgICAgcHJvZmlsZTogQ1NTX1BST0ZJTEVfRkxPQVRJTkdfTEFCRUwsXHJcbiAgICAgICAgcGVyVHlwZToge1xyXG4gICAgICAgICAgICBbRlRbJ0NhbXBvIGRpIHRlc3RvJ11dOiBbJ0Rlc2NyaXppb25lU29sbGV2YXRhJ10sXHJcbiAgICAgICAgICAgIFtGVFsnQXJlYSBkaSB0ZXN0byddXTogWydEZXNjcml6aW9uZVNvbGxldmF0YSddLFxyXG4gICAgICAgICAgICBbRlRbJ0NhbXBvIG51bWVyaWNvJ11dOiBbJ0Rlc2NyaXppb25lU29sbGV2YXRhJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRWxlbmNvIGltbWFnaW5pJ11dOiBbJ0Rlc2NyaXppb25lU29sbGV2YXRhJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRGF0YSBlL28gb3JhJ11dOiBbJ0Rlc2NyaXppb25lU29sbGV2YXRhJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRWxlbmNvIGdlbmVyaWNvJ11dOiBbJ0xhYmVsU29sbGV2YXRhJ10sXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAga2V5OiAnVmFsb3JlJyxcclxuICAgICAgICBsYWJlbDogJ0FyZWEgZGVsIHZhbG9yZScsXHJcbiAgICAgICAgcHJvZmlsZTogQ1NTX1BST0ZJTEVfVkFMVUUsXHJcbiAgICAgICAgcGVyVHlwZToge1xyXG4gICAgICAgICAgICBbRlRbJ0NhbXBvIGRpIHRlc3RvJ11dOiBbJ0lucHV0J10sXHJcbiAgICAgICAgICAgIFtGVFsnQXJlYSBkaSB0ZXN0byddXTogWydJbnB1dCddLFxyXG4gICAgICAgICAgICBbRlRbJ0NhbXBvIG51bWVyaWNvJ11dOiBbJ0lucHV0J10sXHJcbiAgICAgICAgICAgIFtGVFsnQm9vbGVhbm8nXV06IFsnU2NlbHRhJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRGF0YSBlL28gb3JhJ11dOiBbJ0NhbXBvRGF0YSddLFxyXG4gICAgICAgICAgICBbRlRbJ0FsbGVnYXRvJ11dOiBbJ0NhbXBvTm9tZUZpbGUnXSxcclxuICAgICAgICAgICAgW0ZUWydFbGVuY28gZ2VuZXJpY28nXV06IFsnQ2FzZWxsYVRyaWdnZXInLCAnT3B6aW9uZScsICdCb3R0b25lJ10sXHJcbiAgICAgICAgICAgIFtGVFsnRWxlbmNvIGltbWFnaW5pJ11dOiBbJ0Nhc2VsbGFTZWxlemlvbmUnXSxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuXTtcclxuXHJcbi8qKlxyXG4gKiBFbGVtZW50aSByZWFsaSBkaSB1biBjYW1wbyBjb3JyaXNwb25kZW50aSBhIHVuIGVsZW1lbnRvIGxvZ2ljbyBnbG9iYWxlLlxyXG4gKiBJbnRlcnNlY2EgbGEgbWFwcGF0dXJhIHBlciB0aXBvbG9naWEgY29uIGdsaSBlbGVtZW50aSBjaGUgaWwgY2FtcG8gaGEgZGF2dmVyb1xyXG4gKiAobCdFbGVuY28gZ2VuZXJpY28sIHBlciBlc2VtcGlvLCBjYW1iaWEgZWxlbWVudGkgaW4gYmFzZSBhbGxhIG1vZGFsaXTDoCBkaSBwcmVzZW50YXppb25lKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR2xvYmFsRWxlbWVudEtleXMoZmllbGQ6IEJhc2VGaWVsZCwgZ2xvYmFsS2V5OiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGRlZiA9IEdMT0JBTF9TVFlMRV9FTEVNRU5UUy5maW5kKChnKSA9PiBnLmtleSA9PT0gZ2xvYmFsS2V5KTtcclxuICAgIGlmICghZGVmKSB7IHJldHVybiBbXTsgfVxyXG5cclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBkZWYucGVyVHlwZVtOdW1iZXIoZmllbGQ/LkZpZWxkVHlwZSldID8/IFtdO1xyXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBbXTsgfVxyXG5cclxuICAgIGNvbnN0IGF2YWlsYWJsZSA9IG5ldyBTZXQoZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGZpZWxkKS5tYXAoKGUpID0+IGUua2V5KSk7XHJcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5maWx0ZXIoKGspID0+IGF2YWlsYWJsZS5oYXMoaykpO1xyXG59XHJcblxyXG4vKiogU3RhdGkgY29tdW5pIGEgdHV0dGUgbGUgdGlwb2xvZ2llIHBhc3NhdGU6IHNvbm8gZ2xpIHVuaWNpIGFwcGxpY2FiaWxpIGdsb2JhbG1lbnRlICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25TdGF0ZXMoZmllbGRUeXBlczogQXJyYXk8RmllbGRUeXBlRW51bSB8IG51bWJlcj4pOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+IHtcclxuICAgIGNvbnN0IGRlZnMgPSBmaWVsZFR5cGVzXHJcbiAgICAgICAgLm1hcCgodCkgPT4gZ2V0RmllbGRTdHlsZVR5cGVEZWYodCkpXHJcbiAgICAgICAgLmZpbHRlcigoZCk6IGQgaXMgRmllbGRTdHlsZVR5cGVEZWYgPT4gZCAhPSBudWxsKTtcclxuICAgIGlmIChkZWZzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gW107IH1cclxuXHJcbiAgICByZXR1cm4gZGVmc1swXS5zdGF0ZXMuZmlsdGVyKChzdGF0ZSkgPT5cclxuICAgICAgICBkZWZzLmV2ZXJ5KChkKSA9PiBkLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUua2V5KSlcclxuICAgICk7XHJcbn1cclxuXHJcbi8vI2VuZHJlZ2lvbiBHcmFmaWNhIGdsb2JhbGVcclxuXHJcbi8vI3JlZ2lvbiBDU1MgbGVnYWN5IChGaWVsZHN0eWxlQ1NTIC8gTGFiZWxzdHlsZUNTUylcclxuXHJcbi8qKlxyXG4gKiBJIGNhbXBpIGhhbm5vIGR1ZSBwcm9wcmlldMOgIHN0b3JpY2hlLCBMYWJlbHN0eWxlQ1NTIGUgRmllbGRzdHlsZUNTUywgY2hlIGkgdGVtcGxhdGVcclxuICogYXBwbGljYW5vIGFuY29yYSBjb24gW25nU3R5bGVdLCBxdWluZGkgY29tZSBzdGlsaSBJTkxJTkUuIEVzc2VuZG8gaW5saW5lIGJhdHRvbm8gbGUgcmVnb2xlXHJcbiAqIFwiI3VpZCB7IC4uLiB9XCIgaW5pZXR0YXRlIGRhbGxhIGdyYWZpY2EgcGVyIGVsZW1lbnRvIGUgc3RhdG86IHVuIGNvbG9yZSBpbXBvc3RhdG8gZGFsbCdlZGl0b3JcclxuICogZ3JhZmljbyBub24gc2kgdmVkZXZhIHN1aSBjYW1waSBjaGUgYXZldmFubyBpbCBDU1MgbGVnYWN5IHZhbG9yaXp6YXRvLlxyXG4gKlxyXG4gKiBRdWVzdGEgdGFiZWxsYSBkaWNlLCBwZXIgb2duaSB0aXBvbG9naWEsIHN1IHF1YWxlIGVsZW1lbnRvIGRlbGxhIGdyYWZpY2EgbnVvdmEgZmluaXNjZVxyXG4gKiBjaWFzY3VuYSBkZWxsZSBkdWUgcHJvcHJpZXTDoCBsZWdhY3ksIGluIG1vZG8gZGEgcG90ZXJsZSBhc3NvcmJpcmUgZSBhdmVyZSB1bmEgc29sYSBmb250ZVxyXG4gKiBkaSB2ZXJpdMOgLiBMZSB0aXBvbG9naWUgYXNzZW50aSBub24gdXNhbm8gW25nU3R5bGVdIGluIG5lc3N1biB0ZW1wbGF0ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBMRUdBQ1lfU1RZTEVfVEFSR0VUUzogeyBbZmllbGRUeXBlOiBudW1iZXJdOiB7IGxhYmVsPzogc3RyaW5nOyBmaWVsZD86IHN0cmluZyB9IH0gPSB7XHJcbiAgICBbRlRbJ0NhbXBvIGRpIHRlc3RvJ11dOiB7IGxhYmVsOiAnRGVzY3JpemlvbmUnLCBmaWVsZDogJ0lucHV0JyB9LFxyXG4gICAgW0ZUWydBcmVhIGRpIHRlc3RvJ11dOiB7IGxhYmVsOiAnRGVzY3JpemlvbmUnLCBmaWVsZDogJ0lucHV0JyB9LFxyXG4gICAgW0ZUWydDYW1wbyBudW1lcmljbyddXTogeyBsYWJlbDogJ0Rlc2NyaXppb25lJywgZmllbGQ6ICdJbnB1dCcgfSxcclxuICAgIFtGVFsnQm9vbGVhbm8nXV06IHsgbGFiZWw6ICdEZXNjcml6aW9uZScgfSxcclxuICAgIFtGVFsnRWxlbmNvIGltbWFnaW5pJ11dOiB7IGxhYmVsOiAnRGVzY3JpemlvbmUnIH0sXHJcbiAgICBbRlRbJ0V0aWNoZXR0YSddXTogeyBsYWJlbDogJ0NvbnRhaW5lcicgfSxcclxuICAgIFtGVFsnRWxlbmNvIGdlbmVyaWNvJ11dOiB7IGxhYmVsOiAnTGFiZWwnLCBmaWVsZDogJ0NvbnRhaW5lcicgfSxcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5TWVyZ2VSZXN1bHQge1xyXG4gICAgLyoqIFByb3ByaWV0w6AgbGVnYWN5IGFzc29yYml0ZSAqL1xyXG4gICAgY29uc3VtZWQ6IEFycmF5PCdMYWJlbHN0eWxlQ1NTJyB8ICdGaWVsZHN0eWxlQ1NTJz47XHJcbiAgICAvKiogQ2hpYXZpIFwiRWxlbWVudG9TdGF0b1wiIHRvY2NhdGUgZGFsbCdhc3NvcmJpbWVudG8gKi9cclxuICAgIGtleXM6IEFycmF5PHN0cmluZz47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSaXZlcnNhIGlsIENTUyBsZWdhY3kgZGVsIGNhbXBvIGRlbnRybyB1bmEgbWFwcGEgXCJFbGVtZW50bytTdGF0b1wiIC0+IENTUywgc3VsbG8gc3RhdG8gTm9ybWFsZS5cclxuICogTm9uIHNvdnJhc2NyaXZlIGxlIHByb3ByaWV0w6AgZ2nDoCBwcmVzZW50aSBuZWxsYSBtYXBwYTogbGEgZ3JhZmljYSBudW92YSBoYSBsYSBwcmVjZWRlbnphLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGVnYWN5U3R5bGVzSW50b01hcChcclxuICAgIGZpZWxkOiBCYXNlRmllbGQsXHJcbiAgICBtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXHJcbiAgICBvbmx5PzogJ0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnXHJcbik6IExlZ2FjeU1lcmdlUmVzdWx0IHtcclxuICAgIGNvbnN0IHJlc3VsdDogTGVnYWN5TWVyZ2VSZXN1bHQgPSB7IGNvbnN1bWVkOiBbXSwga2V5czogW10gfTtcclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSBMRUdBQ1lfU1RZTEVfVEFSR0VUU1tOdW1iZXIoZmllbGQ/LkZpZWxkVHlwZSldO1xyXG4gICAgaWYgKCF0YXJnZXQpIHsgcmV0dXJuIHJlc3VsdDsgfVxyXG5cclxuICAgIGNvbnN0IGF2YWlsYWJsZSA9IG5ldyBTZXQoZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGZpZWxkKS5tYXAoKGUpID0+IGUua2V5KSk7XHJcblxyXG4gICAgY29uc3QgYWJzb3JiID0gKGNzczogc3RyaW5nLCBlbGVtZW50S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIG5hbWU6ICdMYWJlbHN0eWxlQ1NTJyB8ICdGaWVsZHN0eWxlQ1NTJykgPT4ge1xyXG4gICAgICAgIGlmIChvbmx5ICYmIG9ubHkgIT09IG5hbWUpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKCFjc3MgfHwgIWNzcy50cmltKCkgfHwgIWVsZW1lbnRLZXkgfHwgIWF2YWlsYWJsZS5oYXMoZWxlbWVudEtleSkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGtleSA9IGVsZW1lbnRLZXkgKyAnTm9ybWFsZSc7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBtYXBba2V5XSA/PyAnJztcclxuXHJcbiAgICAgICAgcGFyc2VDc3NEZWNsYXJhdGlvbnMoY3NzKS5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZ2V0Q3NzRGVjbGFyYXRpb24oY3VycmVudCwgZC5wcm9wKSkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHNldENzc0RlY2xhcmF0aW9uKGN1cnJlbnQsIGQucHJvcCwgZC52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnQpIHsgbWFwW2tleV0gPSBjdXJyZW50OyB9XHJcbiAgICAgICAgcmVzdWx0LmNvbnN1bWVkLnB1c2gobmFtZSk7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQua2V5cy5pbmNsdWRlcyhrZXkpKSB7IHJlc3VsdC5rZXlzLnB1c2goa2V5KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBhYnNvcmIoZmllbGQuTGFiZWxzdHlsZUNTUywgdGFyZ2V0LmxhYmVsLCAnTGFiZWxzdHlsZUNTUycpO1xyXG4gICAgYWJzb3JiKGZpZWxkLkZpZWxkc3R5bGVDU1MsIHRhcmdldC5maWVsZCwgJ0ZpZWxkc3R5bGVDU1MnKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKiBDaGlhdmUgXCJFbGVtZW50b05vcm1hbGVcIiBzdSBjdWkgZmluaXJlYmJlIHVuYSBwcm9wcmlldMOgIGxlZ2FjeSwgbyBudWxsIHNlIG5vbiBhcHBsaWNhYmlsZSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGVnYWN5VGFyZ2V0S2V5KGZpZWxkOiBCYXNlRmllbGQsIG5hbWU6ICdMYWJlbHN0eWxlQ1NTJyB8ICdGaWVsZHN0eWxlQ1NTJyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gTEVHQUNZX1NUWUxFX1RBUkdFVFNbTnVtYmVyKGZpZWxkPy5GaWVsZFR5cGUpXTtcclxuICAgIGlmICghdGFyZ2V0KSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgY29uc3QgZWxlbWVudEtleSA9IG5hbWUgPT09ICdMYWJlbHN0eWxlQ1NTJyA/IHRhcmdldC5sYWJlbCA6IHRhcmdldC5maWVsZDtcclxuICAgIGlmICghZWxlbWVudEtleSkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgIGNvbnN0IGF2YWlsYWJsZSA9IG5ldyBTZXQoZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGZpZWxkKS5tYXAoKGUpID0+IGUua2V5KSk7XHJcbiAgICByZXR1cm4gYXZhaWxhYmxlLmhhcyhlbGVtZW50S2V5KSA/IGVsZW1lbnRLZXkgKyAnTm9ybWFsZScgOiBudWxsO1xyXG59XHJcblxyXG4vKiogTWFwcGEgc3RpbGkgXCJlZmZldHRpdmFcIiBkaSB1biBjYW1wbzogcXVlbGxhIHBlciBlbGVtZW50byBwacO5IGlsIENTUyBsZWdhY3kgYXNzb3JiaXRvICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3RpdmVTdHlsZU1hcChmaWVsZDogQmFzZUZpZWxkKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICBjb25zdCBtYXAgPSBjbG9uZUZpZWxkU3R5bGVNYXAoZmllbGQpO1xyXG4gICAgbWVyZ2VMZWdhY3lTdHlsZXNJbnRvTWFwKGZpZWxkLCBtYXApO1xyXG4gICAgcmV0dXJuIG1hcDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRydWUgc2UgaWwgY2FtcG8gaGEgdW5hIGdyYWZpY2EgZGEgcXVhbGNoZSBwYXJ0ZTogbmVsbGEgbWFwcGEgcGVyIGVsZW1lbnRvIG9wcHVyZSBuZWwgQ1NTXHJcbiAqIGxlZ2FjeS4gw4ggaWwgdGVzdCBnaXVzdG8gcGVyIFwicXVlc3RvIGNhbXBvIHB1w7IgZmFyZSBkYSBzb3JnZW50ZVwiIChlcmVkaXTDoCwgQ29waWEgR3JhZmljYSk6XHJcbiAqIGlzRmllbGRTdHlsZU1hcEVtcHR5IGd1YXJkYSBzb2xvIGxhIG1hcHBhIG51b3ZhIGUgaWdub3JlcmViYmUgaSBjYW1waSBzdGlsaXp6YXRpIHNvbG8gY29sIGxlZ2FjeS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNFZmZlY3RpdmVTdHlsZXMoZmllbGQ6IEJhc2VGaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdldEVmZmVjdGl2ZVN0eWxlTWFwKGZpZWxkKSkubGVuZ3RoID4gMDtcclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIENTUyBsZWdhY3kgKEZpZWxkc3R5bGVDU1MgLyBMYWJlbHN0eWxlQ1NTKVxyXG5cclxuLy8jcmVnaW9uIEdyYWZpY2EgZGkgZGVmYXVsdCBlcmVkaXRhdGFcclxuXHJcbi8qKlxyXG4gKiBHcmFmaWNhIGRpIGRlZmF1bHQgY29zdHJ1aXRhIGEgcGFydGlyZSBkYSBjYW1waSBkaSB0aXBvbG9naWEgRElWRVJTQS5cclxuICpcclxuICogTCdlcmVkaXTDoCBuYXR1cmFsZSDDqCBmcmEgY2FtcGkgZGVsbGEgc3Rlc3NhIHRpcG9sb2dpYSwgY2hlIGNvbmRpdmlkb25vIGkgbm9taSBkZWdsaSBlbGVtZW50aS5cclxuICogUXVhbmRvIHBlcsOyIHVuYSB0aXBvbG9naWEgdmllbmUgdXNhdGEgcGVyIGxhIHByaW1hIHZvbHRhIG5vbiBjJ8OoIG5lc3N1biBjYW1wbyBzaW1pbGUgZGEgY3VpXHJcbiAqIGNvcGlhcmU6IGluIHF1ZWwgY2FzbyBzaSBwYXNzYSBwZXIgZ2xpIGVsZW1lbnRpIGxvZ2ljaSBkZWxsYSBncmFmaWNhIGdsb2JhbGUgKGNvbnRlbml0b3JlLFxyXG4gKiBldGljaGV0dGEsIGFyZWEgZGVsIHZhbG9yZSksIGNoZSBvZ25pIHRpcG9sb2dpYSBzYSB0cmFkdXJyZSBuZWkgcHJvcHJpIGVsZW1lbnRpLlxyXG4gKlxyXG4gKiBAcGFyYW0gZmllbGQgICBjYW1wbyBudW92byBjaGUgZGV2ZSByaWNldmVyZSBsYSBncmFmaWNhXHJcbiAqIEBwYXJhbSBzb3VyY2VzIGNhbXBpIGdpw6AgcHJlc2VudGkgbmVsbGEgZm9ybSwgaW4gb3JkaW5lXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHbG9iYWxJbmhlcml0ZWRNYXAoXHJcbiAgICBmaWVsZDogQmFzZUZpZWxkLFxyXG4gICAgc291cmNlczogQXJyYXk8QmFzZUZpZWxkPlxyXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG5cclxuICAgIGNvbnN0IHR5cGVEZWYgPSBnZXRGaWVsZFN0eWxlVHlwZURlZihmaWVsZD8uRmllbGRUeXBlKTtcclxuICAgIGlmICghdHlwZURlZikgeyByZXR1cm4gcmVzdWx0OyB9XHJcblxyXG4gICAgR0xPQkFMX1NUWUxFX0VMRU1FTlRTLmZvckVhY2goKGdsb2JhbEVsZW1lbnQpID0+IHtcclxuICAgICAgICBjb25zdCB0YXJnZXRLZXlzID0gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGZpZWxkLCBnbG9iYWxFbGVtZW50LmtleSk7XHJcbiAgICAgICAgaWYgKHRhcmdldEtleXMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzID8/IFtdKSB7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IGZpZWxkKSB7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgIGlmIChOdW1iZXIoc291cmNlPy5GaWVsZFR5cGUpID09PSBOdW1iZXIodHlwZURlZi5maWVsZFR5cGUpKSB7IGNvbnRpbnVlOyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VLZXlzID0gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNvdXJjZSwgZ2xvYmFsRWxlbWVudC5rZXkpO1xyXG4gICAgICAgICAgICBpZiAoc291cmNlS2V5cy5sZW5ndGggPT09IDApIHsgY29udGludWU7IH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU1hcCA9IGdldEVmZmVjdGl2ZVN0eWxlTWFwKHNvdXJjZSk7XHJcbiAgICAgICAgICAgIGxldCBjb3BpZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNvbG8gZ2xpIHN0YXRpIGNoZSBsYSB0aXBvbG9naWEgZGkgZGVzdGluYXppb25lIGNvbm9zY2UgZGF2dmVyb1xyXG4gICAgICAgICAgICB0eXBlRGVmLnN0YXRlcy5mb3JFYWNoKChzdGF0ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3NzID0gc291cmNlTWFwW3NvdXJjZUtleXNbMF0gKyBzdGF0ZS5rZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjc3MgfHwgIWNzcy50cmltKCkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRLZXlzLmZvckVhY2goKHRrKSA9PiB7IHJlc3VsdFt0ayArIHN0YXRlLmtleV0gPSBjc3M7IH0pO1xyXG4gICAgICAgICAgICAgICAgY29waWVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29waWVkKSB7IGJyZWFrOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIEdyYWZpY2EgZGkgZGVmYXVsdCBlcmVkaXRhdGFcclxuIl19
@@ -0,0 +1,155 @@
1
+ import { getCssDeclaration, setCssDeclaration } from './css-declarations';
2
+ /**
3
+ * Label "flottante" dei mat-form-field outline (Angular Material 15).
4
+ *
5
+ * La stessa label ha due aspetti: a riposo dentro la casella (campo vuoto e non selezionato)
6
+ * e sollevata sul bordo (campo compilato o selezionato). L'editor li mostra come due elementi:
7
+ * "Etichetta nel contenitore" è la chiave storica (Descrizione / Label): grafica base della
8
+ * label, valida sempre. "Etichetta sul bordo" (DescrizioneSollevata / LabelSollevata) sovrascrive
9
+ * solo ciò che vi è impostato quando la label è sollevata.
10
+ *
11
+ * Il server conosce solo le chiavi storiche: l'override del bordo viene quindi salvato DENTRO la
12
+ * stringa CSS della chiave base, come proprietà custom `--eqp-sollevata: "<css>"`. È CSS valido
13
+ * (il browser la ignora) e passa intatta per le classi tipizzate del server. Le chiavi
14
+ * "…Sollevata" esistono solo in memoria, nell'editor: readStyleCss/writeStyleCss fanno da ponte.
15
+ */
16
+ /** Suffisso del selettore della label per la label sollevata */
17
+ export const LABEL_FLOATING_SUFFIX = '.mdc-floating-label--float-above';
18
+ /** Proprietà custom, dentro la chiave base, che contiene il CSS dell'etichetta sul bordo */
19
+ export const FLOATING_OVERRIDE_PROP = '--eqp-sollevata';
20
+ /** True per le chiavi virtuali dell'etichetta sul bordo (es. "DescrizioneSollevataNormale") */
21
+ export function isFloatingOverrideKey(key) {
22
+ return /Sollevata/.test(key ?? '');
23
+ }
24
+ /** Chiave reale in cui è salvato l'override: "DescrizioneSollevataNormale" -> "DescrizioneNormale" */
25
+ export function floatingBaseKey(key) {
26
+ return (key ?? '').replace('Sollevata', '');
27
+ }
28
+ function decodeOverride(raw) {
29
+ if (!raw) {
30
+ return '';
31
+ }
32
+ try {
33
+ const value = JSON.parse(raw);
34
+ return typeof value === 'string' ? value : '';
35
+ }
36
+ catch {
37
+ return '';
38
+ }
39
+ }
40
+ /**
41
+ * CSS di una chiave "Elemento+Stato", anche virtuale, letto da una mappa nel formato salvato.
42
+ * Per le chiavi base restituisce il CSS senza la proprietà custom (che non va iniettata).
43
+ */
44
+ export function readStyleCss(map, key) {
45
+ if (!map) {
46
+ return '';
47
+ }
48
+ if (isFloatingOverrideKey(key)) {
49
+ return decodeOverride(getCssDeclaration(map[floatingBaseKey(key)] ?? '', FLOATING_OVERRIDE_PROP));
50
+ }
51
+ return setCssDeclaration(map[key] ?? '', FLOATING_OVERRIDE_PROP, '');
52
+ }
53
+ /** Scrive il CSS di una chiave, anche virtuale, in una mappa nel formato salvato */
54
+ export function writeStyleCss(map, key, css) {
55
+ const clean = (css ?? '').trim();
56
+ if (isFloatingOverrideKey(key)) {
57
+ const base = floatingBaseKey(key);
58
+ const updated = setCssDeclaration(map[base] ?? '', FLOATING_OVERRIDE_PROP, clean ? JSON.stringify(clean) : '');
59
+ if (updated) {
60
+ map[base] = updated;
61
+ }
62
+ else {
63
+ delete map[base];
64
+ }
65
+ return;
66
+ }
67
+ // Riscrivendo la base l'override già presente va conservato
68
+ const override = getCssDeclaration(map[key] ?? '', FLOATING_OVERRIDE_PROP);
69
+ const updated = override ? setCssDeclaration(clean, FLOATING_OVERRIDE_PROP, override) : clean;
70
+ if (updated) {
71
+ map[key] = updated;
72
+ }
73
+ else {
74
+ delete map[key];
75
+ }
76
+ }
77
+ const LABEL_KEY_PATTERN = /^(Descrizione|Label)(Normale|Mouseover|Focused|Selezionato|NotValid|Readonly)$/;
78
+ /** Mappa "esplosa" per l'editor: chiavi base pulite più le chiavi virtuali "…Sollevata…" */
79
+ export function decodeFloatingMap(map) {
80
+ const out = {};
81
+ Object.keys(map ?? {}).forEach((key) => {
82
+ if (!map[key]) {
83
+ return;
84
+ }
85
+ const base = readStyleCss(map, key);
86
+ if (base) {
87
+ out[key] = base;
88
+ }
89
+ const m = LABEL_KEY_PATTERN.exec(key);
90
+ if (m) {
91
+ const overrideKey = `${m[1]}Sollevata${m[2]}`;
92
+ const override = readStyleCss(map, overrideKey);
93
+ if (override) {
94
+ out[overrideKey] = override;
95
+ }
96
+ }
97
+ });
98
+ return out;
99
+ }
100
+ /** Inverso di decodeFloatingMap: riporta la mappa al formato salvato */
101
+ export function encodeFloatingMap(decoded) {
102
+ const out = {};
103
+ Object.keys(decoded ?? {}).forEach((key) => writeStyleCss(out, key, decoded[key]));
104
+ return out;
105
+ }
106
+ /** Aggiunge !important a ogni dichiarazione: serve dove regole globali con !important coprono le nostre */
107
+ export function forceImportantCss(css) {
108
+ return (css ?? '')
109
+ .split(';')
110
+ .map((d) => d.trim())
111
+ .filter((d) => d.length > 0)
112
+ .map((d) => (/!important\s*$/i.test(d) ? d : `${d} !important`))
113
+ .join('; ') + (css?.trim() ? ';' : '');
114
+ }
115
+ /** True se il campo ha una grafica sulla label (base o sul bordo) con quel prefisso di chiave */
116
+ export function hasFloatingLabelStyles(styleMap, basePrefix = 'Descrizione') {
117
+ return Object.keys(styleMap ?? {})
118
+ .some((key) => key.startsWith(basePrefix) && !!(styleMap[key] ?? '').trim());
119
+ }
120
+ /**
121
+ * Regole di base da iniettare prima di quelle dell'utente quando la label è personalizzata. Material la rimpicciolisce al 75% con una trasformazione: dimensione testo,
122
+ * padding e larghezza impostati dall'utente risulterebbero ridotti. Qui la scala torna a 1 e il
123
+ * testo riparte dalla stessa dimensione che Material mostrava (12px); la label resta centrata
124
+ * sulla linea del bordo, e "top" la sposta da lì.
125
+ * I selettori sono dentro :where() per restare più deboli di qualsiasi regola dell'utente,
126
+ * anche di quelle su Descrizione che valgono per entrambe le posizioni.
127
+ *
128
+ * @param uid id del wrapper del campo
129
+ * @param labelSelector selettore della label, relativo al wrapper (es. " label.mat-mdc-floating-label")
130
+ * @param styleMap mappa "Elemento+Stato" -> CSS del campo
131
+ */
132
+ export function buildFloatingLabelBaseRules(uid, labelSelector, styleMap) {
133
+ if (!hasFloatingLabelStyles(styleMap, 'Descrizione')) {
134
+ return [];
135
+ }
136
+ const easing = '150ms cubic-bezier(0.4, 0, 0.2, 1)';
137
+ return [
138
+ // La variabile è letta sia dalla trasformazione della label sia dal calcolo del varco nel bordo
139
+ `#${uid} .mat-mdc-form-field { --mat-mdc-form-field-floating-label-scale: 1; }`,
140
+ `#${uid} :where(${labelSelector.trim()}) { transition: transform ${easing}, top ${easing}, color ${easing}; }`,
141
+ `#${uid} :where(${labelSelector.trim()}${LABEL_FLOATING_SUFFIX}) {`
142
+ + ` font-size: 12px; line-height: 1.15em; top: 0;`
143
+ + ` --mat-mdc-form-field-label-transform: translateY(-50%); }`,
144
+ ];
145
+ }
146
+ /**
147
+ * True se il CSS imposta "top". Il top dell'etichetta nel contenitore non deve propagarsi alla
148
+ * label sollevata, che ha la propria posizione: i template, dopo la regola della chiave base (Descrizione / Label),
149
+ * ne emettono una che riporta a 0 il top della label sollevata; quella di "…Sollevata",
150
+ * venendo dopo, la sovrascrive.
151
+ */
152
+ export function cssSetsTop(css) {
153
+ return /(^|[\s;])top\s*:/i.test(css ?? '');
154
+ }
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvYXRpbmctbGFiZWwtc3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvdXRpbHMvZmxvYXRpbmctbGFiZWwtc3R5bGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTFFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsa0NBQWtDLENBQUM7QUFFeEUsNEZBQTRGO0FBQzVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLGlCQUFpQixDQUFDO0FBRXhELCtGQUErRjtBQUMvRixNQUFNLFVBQVUscUJBQXFCLENBQUMsR0FBVztJQUM3QyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxzR0FBc0c7QUFDdEcsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFXO0lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsR0FBVztJQUMvQixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7S0FBRTtJQUN4QixJQUFJO1FBQ0EsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDakQ7SUFBQyxNQUFNO1FBQ0osT0FBTyxFQUFFLENBQUM7S0FDYjtBQUNMLENBQUM7QUFFRDs7O0dBR0c7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LE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1NBQzdCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsR0FBVyxFQUFFLGFBQXFCLEVBQUUsUUFBbUM7SUFDL0csSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFDO0tBQUU7SUFFcEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsT0FBTztRQUNILGdHQUFnRztRQUNoRyxJQUFJLEdBQUcsd0VBQXdFO1FBQy9FLElBQUksR0FBRyxXQUFXLGFBQWEsQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLE1BQU0sU0FBUyxNQUFNLFdBQVcsTUFBTSxLQUFLO1FBQzlHLElBQUksR0FBRyxXQUFXLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxxQkFBcUIsS0FBSztjQUNqRSxnREFBZ0Q7Y0FDaEQsNERBQTREO0tBQ2pFLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQVc7SUFDbEMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDc3NEZWNsYXJhdGlvbiwgc2V0Q3NzRGVjbGFyYXRpb24gfSBmcm9tICcuL2Nzcy1kZWNsYXJhdGlvbnMnO1xyXG5cclxuLyoqXHJcbiAqIExhYmVsIFwiZmxvdHRhbnRlXCIgZGVpIG1hdC1mb3JtLWZpZWxkIG91dGxpbmUgKEFuZ3VsYXIgTWF0ZXJpYWwgMTUpLlxyXG4gKlxyXG4gKiBMYSBzdGVzc2EgbGFiZWwgaGEgZHVlIGFzcGV0dGk6IGEgcmlwb3NvIGRlbnRybyBsYSBjYXNlbGxhIChjYW1wbyB2dW90byBlIG5vbiBzZWxlemlvbmF0bylcclxuICogZSBzb2xsZXZhdGEgc3VsIGJvcmRvIChjYW1wbyBjb21waWxhdG8gbyBzZWxlemlvbmF0bykuIEwnZWRpdG9yIGxpIG1vc3RyYSBjb21lIGR1ZSBlbGVtZW50aTpcclxuICogXCJFdGljaGV0dGEgbmVsIGNvbnRlbml0b3JlXCIgw6ggbGEgY2hpYXZlIHN0b3JpY2EgKERlc2NyaXppb25lIC8gTGFiZWwpOiBncmFmaWNhIGJhc2UgZGVsbGFcclxuICogbGFiZWwsIHZhbGlkYSBzZW1wcmUuIFwiRXRpY2hldHRhIHN1bCBib3Jkb1wiIChEZXNjcml6aW9uZVNvbGxldmF0YSAvIExhYmVsU29sbGV2YXRhKSBzb3ZyYXNjcml2ZVxyXG4gKiBzb2xvIGNpw7IgY2hlIHZpIMOoIGltcG9zdGF0byBxdWFuZG8gbGEgbGFiZWwgw6ggc29sbGV2YXRhLlxyXG4gKlxyXG4gKiBJbCBzZXJ2ZXIgY29ub3NjZSBzb2xvIGxlIGNoaWF2aSBzdG9yaWNoZTogbCdvdmVycmlkZSBkZWwgYm9yZG8gdmllbmUgcXVpbmRpIHNhbHZhdG8gREVOVFJPIGxhXHJcbiAqIHN0cmluZ2EgQ1NTIGRlbGxhIGNoaWF2ZSBiYXNlLCBjb21lIHByb3ByaWV0w6AgY3VzdG9tIGAtLWVxcC1zb2xsZXZhdGE6IFwiPGNzcz5cImAuIMOIIENTUyB2YWxpZG9cclxuICogKGlsIGJyb3dzZXIgbGEgaWdub3JhKSBlIHBhc3NhIGludGF0dGEgcGVyIGxlIGNsYXNzaSB0aXBpenphdGUgZGVsIHNlcnZlci4gTGUgY2hpYXZpXHJcbiAqIFwi4oCmU29sbGV2YXRhXCIgZXNpc3Rvbm8gc29sbyBpbiBtZW1vcmlhLCBuZWxsJ2VkaXRvcjogcmVhZFN0eWxlQ3NzL3dyaXRlU3R5bGVDc3MgZmFubm8gZGEgcG9udGUuXHJcbiAqL1xyXG5cclxuLyoqIFN1ZmZpc3NvIGRlbCBzZWxldHRvcmUgZGVsbGEgbGFiZWwgcGVyIGxhIGxhYmVsIHNvbGxldmF0YSAqL1xyXG5leHBvcnQgY29uc3QgTEFCRUxfRkxPQVRJTkdfU1VGRklYID0gJy5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlJztcclxuXHJcbi8qKiBQcm9wcmlldMOgIGN1c3RvbSwgZGVudHJvIGxhIGNoaWF2ZSBiYXNlLCBjaGUgY29udGllbmUgaWwgQ1NTIGRlbGwnZXRpY2hldHRhIHN1bCBib3JkbyAqL1xyXG5leHBvcnQgY29uc3QgRkxPQVRJTkdfT1ZFUlJJREVfUFJPUCA9ICctLWVxcC1zb2xsZXZhdGEnO1xyXG5cclxuLyoqIFRydWUgcGVyIGxlIGNoaWF2aSB2aXJ0dWFsaSBkZWxsJ2V0aWNoZXR0YSBzdWwgYm9yZG8gKGVzLiBcIkRlc2NyaXppb25lU29sbGV2YXRhTm9ybWFsZVwiKSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNGbG9hdGluZ092ZXJyaWRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gL1NvbGxldmF0YS8udGVzdChrZXkgPz8gJycpO1xyXG59XHJcblxyXG4vKiogQ2hpYXZlIHJlYWxlIGluIGN1aSDDqCBzYWx2YXRvIGwnb3ZlcnJpZGU6IFwiRGVzY3JpemlvbmVTb2xsZXZhdGFOb3JtYWxlXCIgLT4gXCJEZXNjcml6aW9uZU5vcm1hbGVcIiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmxvYXRpbmdCYXNlS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoa2V5ID8/ICcnKS5yZXBsYWNlKCdTb2xsZXZhdGEnLCAnJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlY29kZU92ZXJyaWRlKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghcmF3KSB7IHJldHVybiAnJzsgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UocmF3KTtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDU1MgZGkgdW5hIGNoaWF2ZSBcIkVsZW1lbnRvK1N0YXRvXCIsIGFuY2hlIHZpcnR1YWxlLCBsZXR0byBkYSB1bmEgbWFwcGEgbmVsIGZvcm1hdG8gc2FsdmF0by5cclxuICogUGVyIGxlIGNoaWF2aSBiYXNlIHJlc3RpdHVpc2NlIGlsIENTUyBzZW56YSBsYSBwcm9wcmlldMOgIGN1c3RvbSAoY2hlIG5vbiB2YSBpbmlldHRhdGEpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTdHlsZUNzcyhtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghbWFwKSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKGlzRmxvYXRpbmdPdmVycmlkZUtleShrZXkpKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZU92ZXJyaWRlKGdldENzc0RlY2xhcmF0aW9uKG1hcFtmbG9hdGluZ0Jhc2VLZXkoa2V5KV0gPz8gJycsIEZMT0FUSU5HX09WRVJSSURFX1BST1ApKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZXRDc3NEZWNsYXJhdGlvbihtYXBba2V5XSA/PyAnJywgRkxPQVRJTkdfT1ZFUlJJREVfUFJPUCwgJycpO1xyXG59XHJcblxyXG4vKiogU2NyaXZlIGlsIENTUyBkaSB1bmEgY2hpYXZlLCBhbmNoZSB2aXJ0dWFsZSwgaW4gdW5hIG1hcHBhIG5lbCBmb3JtYXRvIHNhbHZhdG8gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3R5bGVDc3MobWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBrZXk6IHN0cmluZywgY3NzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsZWFuID0gKGNzcyA/PyAnJykudHJpbSgpO1xyXG5cclxuICAgIGlmIChpc0Zsb2F0aW5nT3ZlcnJpZGVLZXkoa2V5KSkge1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBmbG9hdGluZ0Jhc2VLZXkoa2V5KTtcclxuICAgICAgICBjb25zdCB1cGRhdGVkID0gc2V0Q3NzRGVjbGFyYXRpb24obWFwW2Jhc2VdID8/ICcnLCBGTE9BVElOR19PVkVSUklERV9QUk9QLCBjbGVhbiA/IEpTT04uc3RyaW5naWZ5KGNsZWFuKSA6ICcnKTtcclxuICAgICAgICBpZiAodXBkYXRlZCkgeyBtYXBbYmFzZV0gPSB1cGRhdGVkOyB9IGVsc2UgeyBkZWxldGUgbWFwW2Jhc2VdOyB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJpc2NyaXZlbmRvIGxhIGJhc2UgbCdvdmVycmlkZSBnacOgIHByZXNlbnRlIHZhIGNvbnNlcnZhdG9cclxuICAgIGNvbnN0IG92ZXJyaWRlID0gZ2V0Q3NzRGVjbGFyYXRpb24obWFwW2tleV0gPz8gJycsIEZMT0FUSU5HX09WRVJSSURFX1BST1ApO1xyXG4gICAgY29uc3QgdXBkYXRlZCA9IG92ZXJyaWRlID8gc2V0Q3NzRGVjbGFyYXRpb24oY2xlYW4sIEZMT0FUSU5HX09WRVJSSURFX1BST1AsIG92ZXJyaWRlKSA6IGNsZWFuO1xyXG4gICAgaWYgKHVwZGF0ZWQpIHsgbWFwW2tleV0gPSB1cGRhdGVkOyB9IGVsc2UgeyBkZWxldGUgbWFwW2tleV07IH1cclxufVxyXG5cclxuY29uc3QgTEFCRUxfS0VZX1BBVFRFUk4gPSAvXihEZXNjcml6aW9uZXxMYWJlbCkoTm9ybWFsZXxNb3VzZW92ZXJ8Rm9jdXNlZHxTZWxlemlvbmF0b3xOb3RWYWxpZHxSZWFkb25seSkkLztcclxuXHJcbi8qKiBNYXBwYSBcImVzcGxvc2FcIiBwZXIgbCdlZGl0b3I6IGNoaWF2aSBiYXNlIHB1bGl0ZSBwacO5IGxlIGNoaWF2aSB2aXJ0dWFsaSBcIuKAplNvbGxldmF0YeKAplwiICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGbG9hdGluZ01hcChtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG91dDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXMobWFwID8/IHt9KS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBpZiAoIW1hcFtrZXldKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGJhc2UgPSByZWFkU3R5bGVDc3MobWFwLCBrZXkpO1xyXG4gICAgICAgIGlmIChiYXNlKSB7IG91dFtrZXldID0gYmFzZTsgfVxyXG5cclxuICAgICAgICBjb25zdCBtID0gTEFCRUxfS0VZX1BBVFRFUk4uZXhlYyhrZXkpO1xyXG4gICAgICAgIGlmIChtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlS2V5ID0gYCR7bVsxXX1Tb2xsZXZhdGEke21bMl19YDtcclxuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSByZWFkU3R5bGVDc3MobWFwLCBvdmVycmlkZUtleSk7XHJcbiAgICAgICAgICAgIGlmIChvdmVycmlkZSkgeyBvdXRbb3ZlcnJpZGVLZXldID0gb3ZlcnJpZGU7IH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvdXQ7XHJcbn1cclxuXHJcbi8qKiBJbnZlcnNvIGRpIGRlY29kZUZsb2F0aW5nTWFwOiByaXBvcnRhIGxhIG1hcHBhIGFsIGZvcm1hdG8gc2FsdmF0byAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRmxvYXRpbmdNYXAoZGVjb2RlZDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgY29uc3Qgb3V0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBPYmplY3Qua2V5cyhkZWNvZGVkID8/IHt9KS5mb3JFYWNoKChrZXkpID0+IHdyaXRlU3R5bGVDc3Mob3V0LCBrZXksIGRlY29kZWRba2V5XSkpO1xyXG4gICAgcmV0dXJuIG91dDtcclxufVxyXG5cclxuLyoqIEFnZ2l1bmdlICFpbXBvcnRhbnQgYSBvZ25pIGRpY2hpYXJhemlvbmU6IHNlcnZlIGRvdmUgcmVnb2xlIGdsb2JhbGkgY29uICFpbXBvcnRhbnQgY29wcm9ubyBsZSBub3N0cmUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlSW1wb3J0YW50Q3NzKGNzczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoY3NzID8/ICcnKVxyXG4gICAgICAgIC5zcGxpdCgnOycpXHJcbiAgICAgICAgLm1hcCgoZCkgPT4gZC50cmltKCkpXHJcbiAgICAgICAgLmZpbHRlcigoZCkgPT4gZC5sZW5ndGggPiAwKVxyXG4gICAgICAgIC5tYXAoKGQpID0+ICgvIWltcG9ydGFudFxccyokL2kudGVzdChkKSA/IGQgOiBgJHtkfSAhaW1wb3J0YW50YCkpXHJcbiAgICAgICAgLmpvaW4oJzsgJykgKyAoY3NzPy50cmltKCkgPyAnOycgOiAnJyk7XHJcbn1cclxuXHJcbi8qKiBUcnVlIHNlIGlsIGNhbXBvIGhhIHVuYSBncmFmaWNhIHN1bGxhIGxhYmVsIChiYXNlIG8gc3VsIGJvcmRvKSBjb24gcXVlbCBwcmVmaXNzbyBkaSBjaGlhdmUgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zsb2F0aW5nTGFiZWxTdHlsZXMoc3R5bGVNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGJhc2VQcmVmaXg6IHN0cmluZyA9ICdEZXNjcml6aW9uZScpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdHlsZU1hcCA/PyB7fSlcclxuICAgICAgICAuc29tZSgoa2V5KSA9PiBrZXkuc3RhcnRzV2l0aChiYXNlUHJlZml4KSAmJiAhIShzdHlsZU1hcFtrZXldID8/ICcnKS50cmltKCkpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVnb2xlIGRpIGJhc2UgZGEgaW5pZXR0YXJlIHByaW1hIGRpIHF1ZWxsZSBkZWxsJ3V0ZW50ZSBxdWFuZG8gbGEgbGFiZWwgw6ggcGVyc29uYWxpenphdGEuIE1hdGVyaWFsIGxhIHJpbXBpY2Npb2xpc2NlIGFsIDc1JSBjb24gdW5hIHRyYXNmb3JtYXppb25lOiBkaW1lbnNpb25lIHRlc3RvLFxyXG4gKiBwYWRkaW5nIGUgbGFyZ2hlenphIGltcG9zdGF0aSBkYWxsJ3V0ZW50ZSByaXN1bHRlcmViYmVybyByaWRvdHRpLiBRdWkgbGEgc2NhbGEgdG9ybmEgYSAxIGUgaWxcclxuICogdGVzdG8gcmlwYXJ0ZSBkYWxsYSBzdGVzc2EgZGltZW5zaW9uZSBjaGUgTWF0ZXJpYWwgbW9zdHJhdmEgKDEycHgpOyBsYSBsYWJlbCByZXN0YSBjZW50cmF0YVxyXG4gKiBzdWxsYSBsaW5lYSBkZWwgYm9yZG8sIGUgXCJ0b3BcIiBsYSBzcG9zdGEgZGEgbMOsLlxyXG4gKiBJIHNlbGV0dG9yaSBzb25vIGRlbnRybyA6d2hlcmUoKSBwZXIgcmVzdGFyZSBwacO5IGRlYm9saSBkaSBxdWFsc2lhc2kgcmVnb2xhIGRlbGwndXRlbnRlLFxyXG4gKiBhbmNoZSBkaSBxdWVsbGUgc3UgRGVzY3JpemlvbmUgY2hlIHZhbGdvbm8gcGVyIGVudHJhbWJlIGxlIHBvc2l6aW9uaS5cclxuICpcclxuICogQHBhcmFtIHVpZCAgICAgICAgICAgaWQgZGVsIHdyYXBwZXIgZGVsIGNhbXBvXHJcbiAqIEBwYXJhbSBsYWJlbFNlbGVjdG9yIHNlbGV0dG9yZSBkZWxsYSBsYWJlbCwgcmVsYXRpdm8gYWwgd3JhcHBlciAoZXMuIFwiIGxhYmVsLm1hdC1tZGMtZmxvYXRpbmctbGFiZWxcIilcclxuICogQHBhcmFtIHN0eWxlTWFwICAgICAgbWFwcGEgXCJFbGVtZW50bytTdGF0b1wiIC0+IENTUyBkZWwgY2FtcG9cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZsb2F0aW5nTGFiZWxCYXNlUnVsZXModWlkOiBzdHJpbmcsIGxhYmVsU2VsZWN0b3I6IHN0cmluZywgc3R5bGVNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGlmICghaGFzRmxvYXRpbmdMYWJlbFN0eWxlcyhzdHlsZU1hcCwgJ0Rlc2NyaXppb25lJykpIHsgcmV0dXJuIFtdOyB9XHJcblxyXG4gICAgY29uc3QgZWFzaW5nID0gJzE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSknO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICAvLyBMYSB2YXJpYWJpbGUgw6ggbGV0dGEgc2lhIGRhbGxhIHRyYXNmb3JtYXppb25lIGRlbGxhIGxhYmVsIHNpYSBkYWwgY2FsY29sbyBkZWwgdmFyY28gbmVsIGJvcmRvXHJcbiAgICAgICAgYCMke3VpZH0gLm1hdC1tZGMtZm9ybS1maWVsZCB7IC0tbWF0LW1kYy1mb3JtLWZpZWxkLWZsb2F0aW5nLWxhYmVsLXNjYWxlOiAxOyB9YCxcclxuICAgICAgICBgIyR7dWlkfSA6d2hlcmUoJHtsYWJlbFNlbGVjdG9yLnRyaW0oKX0pIHsgdHJhbnNpdGlvbjogdHJhbnNmb3JtICR7ZWFzaW5nfSwgdG9wICR7ZWFzaW5nfSwgY29sb3IgJHtlYXNpbmd9OyB9YCxcclxuICAgICAgICBgIyR7dWlkfSA6d2hlcmUoJHtsYWJlbFNlbGVjdG9yLnRyaW0oKX0ke0xBQkVMX0ZMT0FUSU5HX1NVRkZJWH0pIHtgXHJcbiAgICAgICAgKyBgIGZvbnQtc2l6ZTogMTJweDsgbGluZS1oZWlnaHQ6IDEuMTVlbTsgdG9wOiAwO2BcclxuICAgICAgICArIGAgLS1tYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOyB9YCxcclxuICAgIF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUcnVlIHNlIGlsIENTUyBpbXBvc3RhIFwidG9wXCIuIElsIHRvcCBkZWxsJ2V0aWNoZXR0YSBuZWwgY29udGVuaXRvcmUgbm9uIGRldmUgcHJvcGFnYXJzaSBhbGxhXHJcbiAqIGxhYmVsIHNvbGxldmF0YSwgY2hlIGhhIGxhIHByb3ByaWEgcG9zaXppb25lOiBpIHRlbXBsYXRlLCBkb3BvIGxhIHJlZ29sYSBkZWxsYSBjaGlhdmUgYmFzZSAoRGVzY3JpemlvbmUgLyBMYWJlbCksXHJcbiAqIG5lIGVtZXR0b25vIHVuYSBjaGUgcmlwb3J0YSBhIDAgaWwgdG9wIGRlbGxhIGxhYmVsIHNvbGxldmF0YTsgcXVlbGxhIGRpIFwi4oCmU29sbGV2YXRhXCIsXHJcbiAqIHZlbmVuZG8gZG9wbywgbGEgc292cmFzY3JpdmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3NzU2V0c1RvcChjc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIC8oXnxbXFxzO10pdG9wXFxzKjovaS50ZXN0KGNzcyA/PyAnJyk7XHJcbn1cclxuIl19