@ngxsmk/theme 1.3.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -59,6 +59,18 @@ Presets are plain `ThemeConfig` objects exported from the package, so you can sp
59
59
  - **Radius** — global `borderRadius` (`none` / `sm` / `md` / `lg` / `xl`) plus per-corner tokens.
60
60
  - **Typography** — font families and a Material-inspired display / headline / title / body / label scale.
61
61
  - **Layout** — spacing, shadow, duration, easing, and a shared `z-index` ladder that overlays must respect.
62
+ - **Chart palette** — `--ngxsmk-chart-1` … `--ngxsmk-chart-8`, a fixed 8-hue categorical set (stepped per mode) that the `@ngxsmk/core` charts use for series colors. Independent of the brand hue so adjacent series stay distinguishable; override any slot to rebrand series.
63
+
64
+ ### Chart series colors
65
+
66
+ Charts read the categorical palette from CSS custom properties at render time, so overriding a slot re-colors every chart — no component input needed:
67
+
68
+ ```css
69
+ :root {
70
+ --ngxsmk-chart-1: #2563eb;
71
+ --ngxsmk-chart-2: #db2777;
72
+ }
73
+ ```
62
74
 
63
75
  ## Custom themes
64
76
 
@@ -1,6 +1,6 @@
1
1
  import { deriveScale, rotateHue, shiftLightness } from './color';
2
2
  import { resolveTheme } from './define-config';
3
- import { CONTROL_HEIGHT, CONTROL_HEIGHTS, ICON_SIZE, OPACITY, TRACKING } from './tokens';
3
+ import { CONTROL_HEIGHT, CONTROL_HEIGHTS, FONT_WEIGHT, ICON_SIZE, LEADING, OPACITY, TRACKING, } from './tokens';
4
4
  function scaleVars(prefix, scale) {
5
5
  const vars = {};
6
6
  for (const [step, value] of Object.entries(scale)) {
@@ -8,51 +8,34 @@ function scaleVars(prefix, scale) {
8
8
  }
9
9
  return vars;
10
10
  }
11
- /** Tokens that do not change between light and dark mode. */
12
- function staticVars(theme) {
13
- const vars = {
14
- ...scaleVars('brand', theme.brand),
15
- ...scaleVars('secondary', theme.secondary),
16
- ...scaleVars('neutral', theme.neutral),
17
- '--ngxsmk-font-sans': theme.fontFamily.sans,
18
- '--ngxsmk-font-mono': theme.fontFamily.mono,
19
- '--ngxsmk-radius-base': theme.radius[theme.radiusBase],
20
- '--ngxsmk-control-height': CONTROL_HEIGHT,
21
- // Motion Tokens
22
- '--ngxsmk-motion-duration': 'var(--ngxsmk-duration-normal)',
23
- '--ngxsmk-motion-ease': 'var(--ngxsmk-ease-in-out)',
24
- // Interactive-state motion: shared lift/press transforms. Neutralized to
25
- // `none` under prefers-reduced-motion (see buildThemeCss).
26
- '--ngxsmk-hover-lift': 'translateY(-1px)',
27
- '--ngxsmk-press-scale': 'scale(0.98)',
28
- // Focus ring: THE focus indicator for every component. Aliases the
29
- // mode-aware --ngxsmk-shadow-focus; the error variant derives from the
30
- // semantic error role so invalid controls ring red in both modes.
31
- '--ngxsmk-focus-ring': 'var(--ngxsmk-shadow-focus)',
32
- '--ngxsmk-focus-ring-error': '0 0 0 2px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent), ' +
33
- '0 0 0 4px color-mix(in srgb, var(--ngxsmk-color-error) 45%, transparent)',
34
- // Component-specific Tokens (Buttons)
11
+ /** Default CSS custom properties for each component, emitted once in :root. */
12
+ const COMPONENT_TOKEN_DEFAULTS = {
13
+ button: {
35
14
  '--ngxsmk-button-bg': 'var(--ngxsmk-color-primary)',
36
15
  '--ngxsmk-button-color': 'var(--ngxsmk-color-on-primary)',
37
16
  '--ngxsmk-button-font-family': 'var(--ngxsmk-font-sans)',
38
17
  '--ngxsmk-button-font-weight': '500',
39
18
  '--ngxsmk-button-radius': 'var(--ngxsmk-radius-base)',
40
19
  '--ngxsmk-button-disabled-opacity': '0.5',
41
- // Component-specific Tokens (Cards)
20
+ },
21
+ card: {
42
22
  '--ngxsmk-card-bg': 'var(--ngxsmk-color-surface)',
43
23
  '--ngxsmk-card-radius': 'var(--ngxsmk-radius-xl)',
44
24
  '--ngxsmk-card-shadow': 'var(--ngxsmk-shadow-sm)',
45
25
  '--ngxsmk-card-border-color': 'var(--ngxsmk-color-outline)',
46
- // Component-specific Tokens (Accordion)
26
+ },
27
+ accordion: {
47
28
  '--ngxsmk-accordion-bg': 'var(--ngxsmk-color-surface)',
48
29
  '--ngxsmk-accordion-radius': 'var(--ngxsmk-radius-lg)',
49
30
  '--ngxsmk-accordion-border-color': 'var(--ngxsmk-color-outline)',
50
- // Component-specific Tokens (Progress)
31
+ },
32
+ progress: {
51
33
  '--ngxsmk-progress-height': '0.5rem',
52
34
  '--ngxsmk-progress-bg': 'var(--ngxsmk-color-surface-variant)',
53
35
  '--ngxsmk-progress-color': 'var(--ngxsmk-color-primary)',
54
36
  '--ngxsmk-progress-radius': 'var(--ngxsmk-radius-full)',
55
- // Component-specific Tokens (Switch)
37
+ },
38
+ switch: {
56
39
  '--ngxsmk-switch-width': '2.25rem',
57
40
  '--ngxsmk-switch-height': '1.25rem',
58
41
  '--ngxsmk-switch-radius': 'var(--ngxsmk-radius-full)',
@@ -60,6 +43,74 @@ function staticVars(theme) {
60
43
  '--ngxsmk-switch-thumb-size': '0.875rem',
61
44
  '--ngxsmk-switch-thumb-bg': 'var(--ngxsmk-color-surface)',
62
45
  '--ngxsmk-switch-checked-bg': 'var(--ngxsmk-color-primary)',
46
+ },
47
+ spreadsheet: {
48
+ '--ngxsmk-spreadsheet-bg': 'var(--ngxsmk-color-surface)',
49
+ '--ngxsmk-spreadsheet-header-bg': 'var(--ngxsmk-color-surface-variant)',
50
+ '--ngxsmk-spreadsheet-header-color': 'var(--ngxsmk-color-on-surface-variant)',
51
+ '--ngxsmk-spreadsheet-border': 'var(--ngxsmk-color-outline)',
52
+ '--ngxsmk-spreadsheet-grid-color': 'var(--ngxsmk-color-outline-variant)',
53
+ '--ngxsmk-spreadsheet-hover-bg': 'var(--ngxsmk-color-surface-hover)',
54
+ '--ngxsmk-spreadsheet-selected-bg': 'color-mix(in srgb, var(--ngxsmk-color-primary) 12%, transparent)',
55
+ '--ngxsmk-spreadsheet-active-border': 'var(--ngxsmk-color-primary)',
56
+ '--ngxsmk-spreadsheet-font': 'var(--ngxsmk-font-sans)',
57
+ '--ngxsmk-spreadsheet-font-mono': 'var(--ngxsmk-font-mono)',
58
+ '--ngxsmk-spreadsheet-row-height': '2.25rem',
59
+ '--ngxsmk-spreadsheet-header-height': '2.5rem',
60
+ '--ngxsmk-spreadsheet-cell-padding': '6px 10px',
61
+ '--ngxsmk-spreadsheet-cell-font-size': 'var(--ngxsmk-text-body-sm-size)',
62
+ '--ngxsmk-spreadsheet-scrollbar-size': '8px',
63
+ '--ngxsmk-spreadsheet-shadow': 'var(--ngxsmk-shadow-sm)',
64
+ '--ngxsmk-spreadsheet-radius': 'var(--ngxsmk-radius-lg)',
65
+ '--ngxsmk-spreadsheet-edit-bg': 'var(--ngxsmk-color-surface)',
66
+ '--ngxsmk-spreadsheet-edit-border': 'var(--ngxsmk-color-primary)',
67
+ '--ngxsmk-spreadsheet-row-hover-bg': 'var(--ngxsmk-color-surface-hover)',
68
+ '--ngxsmk-spreadsheet-col-hover-bg': 'color-mix(in srgb, var(--ngxsmk-color-primary) 6%, transparent)',
69
+ '--ngxsmk-spreadsheet-frozen-shadow': '2px 0 4px rgba(0,0,0,0.08)',
70
+ '--ngxsmk-spreadsheet-selection-range': 'color-mix(in srgb, var(--ngxsmk-color-primary) 8%, transparent)',
71
+ },
72
+ inputGroup: {
73
+ '--ngxsmk-input-group-bg': 'var(--ngxsmk-color-surface)',
74
+ '--ngxsmk-input-group-border': 'var(--ngxsmk-color-outline-strong)',
75
+ '--ngxsmk-input-group-radius': 'var(--ngxsmk-radius-md)',
76
+ '--ngxsmk-input-group-shadow': 'none',
77
+ '--ngxsmk-input-group-focus-border': 'var(--ngxsmk-color-primary)',
78
+ '--ngxsmk-input-group-focus-shadow': '0 0 0 3px color-mix(in srgb, var(--ngxsmk-color-primary) 15%, transparent)',
79
+ '--ngxsmk-input-group-error-border': 'var(--ngxsmk-color-error)',
80
+ '--ngxsmk-input-group-error-focus-shadow': '0 0 0 3px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent)',
81
+ '--ngxsmk-input-group-success-border': 'var(--ngxsmk-color-success)',
82
+ '--ngxsmk-input-group-warning-border': 'var(--ngxsmk-color-warning)',
83
+ '--ngxsmk-input-group-height': '2.5rem',
84
+ '--ngxsmk-input-group-padding': '0.75rem',
85
+ '--ngxsmk-input-group-gap': 'var(--ngxsmk-space-2)',
86
+ '--ngxsmk-input-group-font': 'var(--ngxsmk-font-sans)',
87
+ },
88
+ };
89
+ /** Tokens that do not change between light and dark mode. */
90
+ function staticVars(theme) {
91
+ const vars = {
92
+ ...scaleVars('brand', theme.brand),
93
+ ...scaleVars('secondary', theme.secondary),
94
+ ...scaleVars('neutral', theme.neutral),
95
+ '--ngxsmk-font-sans': theme.fontFamily.sans,
96
+ '--ngxsmk-font-mono': theme.fontFamily.mono,
97
+ '--ngxsmk-radius-base': theme.radius[theme.radiusBase],
98
+ '--ngxsmk-control-height': CONTROL_HEIGHT,
99
+ // Motion Tokens
100
+ '--ngxsmk-motion-duration': 'var(--ngxsmk-duration-normal)',
101
+ '--ngxsmk-motion-ease': 'var(--ngxsmk-ease-in-out)',
102
+ // Interactive-state motion: shared lift/press transforms. Neutralized to
103
+ // `none` under prefers-reduced-motion (see buildThemeCss).
104
+ '--ngxsmk-hover-lift': 'translateY(-1px)',
105
+ '--ngxsmk-press-scale': 'scale(0.98)',
106
+ // Focus ring: THE focus indicator for every component. Aliases the
107
+ // mode-aware --ngxsmk-shadow-focus; the error variant derives from the
108
+ // semantic error role so invalid controls ring red in both modes.
109
+ '--ngxsmk-focus-ring': 'var(--ngxsmk-shadow-focus)',
110
+ '--ngxsmk-focus-ring-error': '0 0 0 2px color-mix(in srgb, var(--ngxsmk-color-error) 15%, transparent), ' +
111
+ '0 0 0 4px color-mix(in srgb, var(--ngxsmk-color-error) 45%, transparent)',
112
+ // Component-specific token defaults
113
+ ...Object.values(COMPONENT_TOKEN_DEFAULTS).reduce((merged, tokens) => ({ ...merged, ...tokens }), {}),
63
114
  };
64
115
  for (const [key, value] of Object.entries(CONTROL_HEIGHTS)) {
65
116
  vars[`--ngxsmk-control-height-${key}`] = value;
@@ -73,6 +124,12 @@ function staticVars(theme) {
73
124
  for (const [key, value] of Object.entries(TRACKING)) {
74
125
  vars[`--ngxsmk-tracking-${key}`] = value;
75
126
  }
127
+ for (const [key, value] of Object.entries(FONT_WEIGHT)) {
128
+ vars[`--ngxsmk-font-weight-${key}`] = value;
129
+ }
130
+ for (const [key, value] of Object.entries(LEADING)) {
131
+ vars[`--ngxsmk-leading-${key}`] = value;
132
+ }
76
133
  for (const [key, value] of Object.entries(theme.spacing)) {
77
134
  vars[`--ngxsmk-space-${key}`] = value;
78
135
  }
@@ -145,6 +202,19 @@ function lightVars(theme) {
145
202
  '--ngxsmk-color-ring': theme.brandBase,
146
203
  '--ngxsmk-color-backdrop': 'rgb(1 18 40 / 0.4)',
147
204
  '--ngxsmk-shadow-focus': `0 0 0 2px ${theme.brand[100]}, 0 0 0 4px color-mix(in srgb, ${theme.brandBase} 45%, transparent)`,
205
+ // Categorical chart palette — a fixed 8-hue qualitative set (NOT derived
206
+ // from the brand, so adjacent series stay distinguishable across themes),
207
+ // stepped for the light surface. Validated for the light chart surface:
208
+ // CVD worst-adjacent ΔE 24.2, chroma/lightness in-band. Charts read these
209
+ // via getComputedStyle; consumers can override any slot to rebrand series.
210
+ '--ngxsmk-chart-1': '#2A78D6',
211
+ '--ngxsmk-chart-2': '#1BAF7A',
212
+ '--ngxsmk-chart-3': '#EDA100',
213
+ '--ngxsmk-chart-4': '#008300',
214
+ '--ngxsmk-chart-5': '#4A3AA7',
215
+ '--ngxsmk-chart-6': '#E34948',
216
+ '--ngxsmk-chart-7': '#E87BA4',
217
+ '--ngxsmk-chart-8': '#EB6834',
148
218
  };
149
219
  const tertiary = deriveScale(rotateHue(theme.brandBase, 64));
150
220
  vars['--ngxsmk-color-tertiary'] = tertiary[500];
@@ -199,6 +269,18 @@ function darkVars(theme) {
199
269
  '--ngxsmk-color-ring': theme.brand[400],
200
270
  '--ngxsmk-color-backdrop': 'rgb(17 17 18 / 0.6)',
201
271
  '--ngxsmk-shadow-focus': `0 0 0 2px color-mix(in srgb, ${theme.brand[400]} 25%, transparent), 0 0 0 4px color-mix(in srgb, ${theme.brand[400]} 45%, transparent)`,
272
+ // Categorical chart palette — the same eight hues as light, re-stepped for
273
+ // the dark surface (not a different palette). Validated for the dark chart
274
+ // surface: all slots ≥ 3:1 contrast, CVD worst-adjacent ΔE 10.3 (floor band,
275
+ // relies on the legend/labels charts already render for secondary encoding).
276
+ '--ngxsmk-chart-1': '#3987E5',
277
+ '--ngxsmk-chart-2': '#199E70',
278
+ '--ngxsmk-chart-3': '#C98500',
279
+ '--ngxsmk-chart-4': '#008300',
280
+ '--ngxsmk-chart-5': '#9085E9',
281
+ '--ngxsmk-chart-6': '#E66767',
282
+ '--ngxsmk-chart-7': '#D55181',
283
+ '--ngxsmk-chart-8': '#D95926',
202
284
  };
203
285
  const tertiary = deriveScale(rotateHue(theme.brandBase, 64));
204
286
  vars['--ngxsmk-color-tertiary'] = tertiary[400];
@@ -271,4 +353,4 @@ export function buildThemeCss(config) {
271
353
  ].join('\n\n');
272
354
  return `/* Generated by @ngxsmk/theme — do not edit by hand. */\n${root}\n\n${darkBlock}\n\n${reducedMotion}\n`;
273
355
  }
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUvc3JjL2xpYi9jc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUl6RixTQUFTLFNBQVMsQ0FBQyxNQUFjLEVBQUUsS0FBaUI7SUFDbEQsTUFBTSxJQUFJLEdBQVMsRUFBRSxDQUFDO0lBQ3RCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGtCQUFrQixNQUFNLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxTQUFTLFVBQVUsQ0FBQyxLQUFvQjtJQUN0QyxNQUFNLElBQUksR0FBUztRQUNqQixHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNsQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN0QyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDM0Msb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQzNDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxNQUFN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QUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVcsQ0FBQztJQUNsRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxLQUFLLE1B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QUFXLEdBQVM7UUFDeEIsMEJBQTBCLEVBQUUsS0FBSztRQUNqQyxxQkFBcUIsRUFBRSxNQUFNO1FBQzdCLHNCQUFzQixFQUFFLE1BQU07S0FDL0IsQ0FBQztJQUNGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxXQUFXLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2xELENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRztRQUNwQiw4Q0FBOEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDcEYsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLFdBQVcsQ0FBQztLQUN4RSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNmLE9BQU8sNERBQTRELElBQUksT0FBTyxTQUFTLE9BQU8sYUFBYSxJQUFJLENBQUM7QUFDbEgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlcml2ZVNjYWxlLCByb3RhdGVIdWUsIHNoaWZ0TGlnaHRuZXNzIH0gZnJvbSAnLi9jb2xvcic7XG5pbXBvcnQgeyByZXNvbHZlVGhlbWUgfSBmcm9tICcuL2RlZmluZS1jb25maWcnO1xuaW1wb3J0IHsgQ29sb3JTY2FsZSwgUmVzb2x2ZWRUaGVtZSwgVGhlbWVDb25maWcsIFR5cGVSb2xlU2l6ZSwgVHlwZVN0eWxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDT05UUk9MX0hFSUdIVCwgQ09OVFJPTF9IRUlHSFRTLCBJQ09OX1NJWkUsIE9QQUNJVFksIFRSQUNLSU5HIH0gZnJvbSAnLi90b2tlbnMnO1xuXG50eXBlIFZhcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG5mdW5jdGlvbiBzY2FsZVZhcnMocHJlZml4OiBzdHJpbmcsIHNjYWxlOiBDb2xvclNjYWxlKTogVmFycyB7XG4gIGNvbnN0IHZhcnM6IFZhcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbc3RlcCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjYWxlKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7cHJlZml4fS0ke3N0ZXB9YF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFycztcbn1cblxuLyoqIFRva2VucyB0aGF0IGRvIG5vdCBjaGFuZ2UgYmV0d2VlbiBsaWdodCBhbmQgZGFyayBtb2RlLiAqL1xuZnVuY3Rpb24gc3RhdGljVmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgIC4uLnNjYWxlVmFycygnYnJhbmQnLCB0aGVtZS5icmFuZCksXG4gICAgLi4uc2NhbGVWYXJzKCdzZWNvbmRhcnknLCB0aGVtZS5zZWNvbmRhcnkpLFxuICAgIC4uLnNjYWxlVmFycygnbmV1dHJhbCcsIHRoZW1lLm5ldXRyYWwpLFxuICAgICctLW5neHNtay1mb250LXNhbnMnOiB0aGVtZS5mb250RmFtaWx5LnNhbnMsXG4gICAgJy0tbmd4c21rLWZvbnQtbW9ubyc6IHRoZW1lLmZvbnRGYW1pbHkubW9ubyxcbiAgICAnLS1uZ3hzbWstcmFkaXVzLWJhc2UnOiB0aGVtZS5yYWRpdXNbdGhlbWUucmFkaXVzQmFzZV0sXG4gICAgJy0tbmd4c21rLWNvbnRyb2wtaGVpZ2h0JzogQ09OVFJPTF9IRUlHSFQsXG5cbiAgICAvLyBNb3Rpb24gVG9rZW5zXG4gICAgJy0tbmd4c21rLW1vdGlvbi1kdXJhdGlvbic6ICd2YXIoLS1uZ3hzbWstZHVyYXRpb24tbm9ybWFsKScsXG4gICAgJy0tbmd4c21rLW1vdGlvbi1lYXNlJzogJ3ZhcigtLW5neHNtay1lYXNlLWluLW91dCknLFxuXG4gICAgLy8gSW50ZXJhY3RpdmUtc3RhdGUgbW90aW9uOiBzaGFyZWQgbGlmdC9wcmVzcyB0cmFuc2Zvcm1zLiBOZXV0cmFsaXplZCB0b1xuICAgIC8vIGBub25lYCB1bmRlciBwcmVmZXJzLXJlZHVjZWQtbW90aW9uIChzZWUgYnVpbGRUaGVtZUNzcykuXG4gICAgJy0tbmd4c21rLWhvdmVyLWxpZnQnOiAndHJhbnNsYXRlWSgtMXB4KScsXG4gICAgJy0tbmd4c21rLXByZXNzLXNjYWxlJzogJ3NjYWxlKDAuOTgpJyxcblxuICAgIC8vIEZvY3VzIHJpbmc6IFRIRSBmb2N1cyBpbmRpY2F0b3IgZm9yIGV2ZXJ5IGNvbXBvbmVudC4gQWxpYXNlcyB0aGVcbiAgICAvLyBtb2RlLWF3YXJlIC0tbmd4c21rLXNoYWRvdy1mb2N1czsgdGhlIGVycm9yIHZhcmlhbnQgZGVyaXZlcyBmcm9tIHRoZVxuICAgIC8vIHNlbWFudGljIGVycm9yIHJvbGUgc28gaW52YWxpZCBjb250cm9scyByaW5nIHJlZCBpbiBib3RoIG1vZGVzLlxuICAgICctLW5neHNtay1mb2N1cy1yaW5nJzogJ3ZhcigtLW5neHNtay1zaGFkb3ctZm9jdXMpJyxcbiAgICAnLS1uZ3hzbWstZm9jdXMtcmluZy1lcnJvcic6XG4gICAgICAnMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1uZ3hzbWstY29sb3ItZXJyb3IpIDE1JSwgdHJhbnNwYXJlbnQpLCAnICtcbiAgICAgICcwIDAgMCA0cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW5neHNtay1jb2xvci1lcnJvcikgNDUlLCB0cmFuc3BhcmVudCknLFxuXG4gICAgLy8gQ29tcG9uZW50LXNwZWNpZmljIFRva2VucyAoQnV0dG9ucylcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1wcmltYXJ5KScsXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeSknLFxuICAgICctLW5neHNtay1idXR0b24tZm9udC1mYW1pbHknOiAndmFyKC0tbmd4c21rLWZvbnQtc2FucyknLFxuICAgICctLW5neHNtay1idXR0b24tZm9udC13ZWlnaHQnOiAnNTAwJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWJhc2UpJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWRpc2FibGVkLW9wYWNpdHknOiAnMC41JyxcblxuICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBUb2tlbnMgKENhcmRzKVxuICAgICctLW5neHNtay1jYXJkLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlKScsXG4gICAgJy0tbmd4c21rLWNhcmQtcmFkaXVzJzogJ3ZhcigtLW5neHNtay1yYWRpdXMteGwpJyxcbiAgICAnLS1uZ3hzbWstY2FyZC1zaGFkb3cnOiAndmFyKC0tbmd4c21rLXNoYWRvdy1zbSknLFxuICAgICctLW5neHNtay1jYXJkLWJvcmRlci1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3Itb3V0bGluZSknLFxuXG4gICAgLy8gQ29tcG9uZW50LXNwZWNpZmljIFRva2VucyAoQWNjb3JkaW9uKVxuICAgICctLW5neHNtay1hY2NvcmRpb24tYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UpJyxcbiAgICAnLS1uZ3hzbWstYWNjb3JkaW9uLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWxnKScsXG4gICAgJy0tbmd4c21rLWFjY29yZGlvbi1ib3JkZXItY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLW91dGxpbmUpJyxcblxuICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBUb2tlbnMgKFByb2dyZXNzKVxuICAgICctLW5neHNtay1wcm9ncmVzcy1oZWlnaHQnOiAnMC41cmVtJyxcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCknLFxuICAgICctLW5neHNtay1wcm9ncmVzcy1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSknLFxuICAgICctLW5neHNtay1wcm9ncmVzcy1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1mdWxsKScsXG5cbiAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgVG9rZW5zIChTd2l0Y2gpXG4gICAgJy0tbmd4c21rLXN3aXRjaC13aWR0aCc6ICcyLjI1cmVtJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLWhlaWdodCc6ICcxLjI1cmVtJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWZ1bGwpJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyknLFxuICAgICctLW5neHNtay1zd2l0Y2gtdGh1bWItc2l6ZSc6ICcwLjg3NXJlbScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC10aHVtYi1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3Itc3VyZmFjZSknLFxuICAgICctLW5neHNtay1zd2l0Y2gtY2hlY2tlZC1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSknLFxuICB9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKENPTlRST0xfSEVJR0hUUykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1jb250cm9sLWhlaWdodC0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKE9QQUNJVFkpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstb3BhY2l0eS0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKElDT05fU0laRSkpIHtcbiAgICB2YXJzW2AtLW5neHNtay1pY29uLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoVFJBQ0tJTkcpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstdHJhY2tpbmctJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5zcGFjaW5nKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXNwYWNlLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUucmFkaXVzKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXJhZGl1cy0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNoYWRvdykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1zaGFkb3ctJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5kdXJhdGlvbikpIHtcbiAgICB2YXJzW2AtLW5neHNtay1kdXJhdGlvbi0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLmVhc2luZykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1lYXNlLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuekluZGV4KSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXotJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHNpemVzID0geyBsYXJnZTogJ2xnJywgbWVkaXVtOiAnbWQnLCBzbWFsbDogJ3NtJyB9IGFzIGNvbnN0O1xuICBmb3IgKGNvbnN0IFtyb2xlLCBzdHlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnR5cG9ncmFwaHkpKSB7XG4gICAgZm9yIChjb25zdCBbc2l6ZSwgc3VmZml4XSBvZiBPYmplY3QuZW50cmllcyhzaXplcykpIHtcbiAgICAgIGNvbnN0IHN0eWxlOiBUeXBlU3R5bGUgPSBzdHlsZXNbc2l6ZSBhcyBUeXBlUm9sZVNpemVdO1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS1zaXplYF0gPSBzdHlsZS5zaXplO1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS1saW5lYF0gPSBzdHlsZS5saW5lSGVpZ2h0O1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS13ZWlnaHRgXSA9IHN0eWxlLndlaWdodDtcbiAgICB9XG4gIH1cblxuICAvLyBFeHRyYS1zbWFsbCBib2R5IHRleHQgZm9yIGRlbnNlIG1ldGFkYXRhIHJvd3M7IGJlbG93IHRoZSBzbWFsbGVzdFxuICAvLyBUeXBlUm9sZVNpemUgc28gaXQgaXMgZW1pdHRlZCBvdXRzaWRlIHRoZSByb2xlIGxvb3AuXG4gIHZhcnNbJy0tbmd4c21rLXRleHQtYm9keS14cy1zaXplJ10gPSAnMC42ODc1cmVtJztcbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLWxpbmUnXSA9ICcxcmVtJztcbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLXdlaWdodCddID0gJzQwMCc7XG5cbiAgcmV0dXJuIHZhcnM7XG59XG5cbi8qKiBTZW1hbnRpYyByb2xlIHRva2VucyBmb3IgbGlnaHQgbW9kZS4gKi9cbmZ1bmN0aW9uIGxpZ2h0VmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgICdjb2xvci1zY2hlbWUnOiAnbGlnaHQnLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnknOiB0aGVtZS5icmFuZEJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnknOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktaG92ZXInOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5icmFuZEJhc2UsIC04KSxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1hY3RpdmUnOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5icmFuZEJhc2UsIC0xNCksXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbMTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeS1jb250YWluZXInOiB0aGVtZS5icmFuZFs5MDBdLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXNlY29uZGFyeSc6IHRoZW1lLnNlY29uZGFyeUJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXNlY29uZGFyeSc6ICcjRkZGRkZGJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5LWhvdmVyJzogc2hpZnRMaWdodG5lc3ModGhlbWUuc2Vjb25kYXJ5QmFzZSwgLTgpLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktYWN0aXZlJzogc2hpZnRMaWdodG5lc3ModGhlbWUuc2Vjb25kYXJ5QmFzZSwgLTE0KSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5LWNvbnRhaW5lcic6IHRoZW1lLnNlY29uZGFyeVsxMDBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1zZWNvbmRhcnktY29udGFpbmVyJzogdGhlbWUuc2Vjb25kYXJ5WzkwMF0sXG5cbiAgICAvLyBEZWZhdWx0IGxpZ2h0IHRoZW1lOiBjb29sLWdyZXkgYm9keSwgd2hpdGUgY2FyZHMgZmxvYXRpbmcgb24gdG9wLCBoYWlybGluZSBib3JkZXJzLlxuICAgICctLW5neHNtay1jb2xvci1iYWNrZ3JvdW5kJzogdGhlbWUubmV1dHJhbFs1MF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLWJhY2tncm91bmQnOiAnIzBBMTMxNycsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UnOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UnOiAnIzBBMTMxNycsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCc6IHRoZW1lLm5ldXRyYWxbMTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZS12YXJpYW50JzogdGhlbWUubmV1dHJhbFs1MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWhvdmVyJzogJ3JnYig1IDU0IDg5IC8gMC4wNSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWFjdGl2ZSc6ICdyZ2IoNSA1NCA4OSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWNvbnRhaW5lcic6ICcjRkZGRkZGJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZSc6ICdyZ2IoNSA1NCA4OSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyc6IHRoZW1lLm5ldXRyYWxbMjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS12YXJpYW50JzogJ3JnYig1IDU0IDg5IC8gMC4wNiknLFxuXG4gICAgLy8gRWxldmF0aW9uIGxhZGRlclxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTEnOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtMic6IHRoZW1lLm5ldXRyYWxbNTBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTMnOiB0aGVtZS5uZXV0cmFsWzEwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtNCc6IHRoZW1lLm5ldXRyYWxbMjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS01JzogdGhlbWUubmV1dHJhbFszMDBdLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXJpbmcnOiB0aGVtZS5icmFuZEJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tkcm9wJzogJ3JnYigxIDE4IDQwIC8gMC40KScsXG4gICAgJy0tbmd4c21rLXNoYWRvdy1mb2N1cyc6IGAwIDAgMCAycHggJHt0aGVtZS5icmFuZFsxMDBdfSwgMCAwIDAgNHB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kQmFzZX0gNDUlLCB0cmFuc3BhcmVudClgLFxuICB9O1xuXG4gIGNvbnN0IHRlcnRpYXJ5ID0gZGVyaXZlU2NhbGUocm90YXRlSHVlKHRoZW1lLmJyYW5kQmFzZSwgNjQpKTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3ItdGVydGlhcnknXSA9IHRlcnRpYXJ5WzUwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5J10gPSAnI0ZGRkZGRic7XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbMTAwXTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3Itb24tdGVydGlhcnktY29udGFpbmVyJ10gPSB0ZXJ0aWFyeVs5MDBdO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIGhleF0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuc2VtYW50aWMpKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBkZXJpdmVTY2FsZShoZXgpO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7bmFtZX1gXSA9IGhleDtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci1vbi0ke25hbWV9YF0gPSAnI0ZGRkZGRic7XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3ItJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzEwMF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzgwMF07XG4gIH1cblxuICByZXR1cm4geyAuLi52YXJzLCAuLi50aGVtZS5vdmVycmlkZXMubGlnaHQgfTtcbn1cblxuLyoqIFNlbWFudGljIHJvbGUgdG9rZW5zIGZvciBkYXJrIG1vZGUuICovXG5mdW5jdGlvbiBkYXJrVmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgICdjb2xvci1zY2hlbWUnOiAnZGFyaycsXG5cbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeSc6IHRoZW1lLmJyYW5kWzQwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnknOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktaG92ZXInOiB0aGVtZS5icmFuZFszMDBdLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWFjdGl2ZSc6IHRoZW1lLmJyYW5kWzIwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbOTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeS1jb250YWluZXInOiB0aGVtZS5icmFuZFsxMDBdLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXNlY29uZGFyeSc6IHRoZW1lLnNlY29uZGFyeVs0MDBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1zZWNvbmRhcnknOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXNlY29uZGFyeS1ob3Zlcic6IHRoZW1lLnNlY29uZGFyeVszMDBdLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktYWN0aXZlJzogdGhlbWUuc2Vjb25kYXJ5WzIwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXNlY29uZGFyeS1jb250YWluZXInOiB0aGVtZS5zZWNvbmRhcnlbOTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc2Vjb25kYXJ5LWNvbnRhaW5lcic6IHRoZW1lLnNlY29uZGFyeVsxMDBdLFxuXG4gICAgLy8gRGVmYXVsdCBkYXJrIHRoZW1lOiBuZWFyLW5ldXRyYWwgY2hhcmNvYWwgYm9keSwgc2xpZ2h0bHkgbGlnaHRlciBjYXJkLFxuICAgIC8vIGxpZ2h0ZXIgc3RpbGwgZm9yIHBvcG92ZXJzOyBoYWlybGluZSBsaWdodC1vbi1kYXJrIGJvcmRlcnMuXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tncm91bmQnOiAnIzExMTExMicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLWJhY2tncm91bmQnOiAnI0RGRTJFNScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UnOiAnIzFGMUYyMicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UnOiAnI0RGRTJFNScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCc6ICcjMjgyOTJDJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZS12YXJpYW50JzogJyNBQUFGQjUnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWhvdmVyJzogJ3JnYigyNTUgMjU1IDI1NSAvIDAuMDUpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1hY3RpdmUnOiAncmdiKDI1NSAyNTUgMjU1IC8gMC4xKScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtY29udGFpbmVyJzogJyMyODI5MkMnLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lJzogJ3JnYigyNDIgMjQ0IDI0NiAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyc6ICcjNDk0RDUzJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS12YXJpYW50JzogJ3JnYigyNDIgMjQ0IDI0NiAvIDAuMDYpJyxcblxuICAgIC8vIEVsZXZhdGlvbiBsYWRkZXJcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS0xJzogdGhlbWUubmV1dHJhbFs4MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTInOiB0aGVtZS5uZXV0cmFsWzcwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtMyc6IHRoZW1lLm5ldXRyYWxbNjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS00JzogdGhlbWUubmV1dHJhbFs1MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTUnOiB0aGVtZS5uZXV0cmFsWzQwMF0sXG5cbiAgICAnLS1uZ3hzbWstY29sb3ItcmluZyc6IHRoZW1lLmJyYW5kWzQwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tkcm9wJzogJ3JnYigxNyAxNyAxOCAvIDAuNiknLFxuICAgICctLW5neHNtay1zaGFkb3ctZm9jdXMnOiBgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kWzQwMF19IDI1JSwgdHJhbnNwYXJlbnQpLCAwIDAgMCA0cHggY29sb3ItbWl4KGluIHNyZ2IsICR7dGhlbWUuYnJhbmRbNDAwXX0gNDUlLCB0cmFuc3BhcmVudClgLFxuICB9O1xuXG4gIGNvbnN0IHRlcnRpYXJ5ID0gZGVyaXZlU2NhbGUocm90YXRlSHVlKHRoZW1lLmJyYW5kQmFzZSwgNjQpKTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3ItdGVydGlhcnknXSA9IHRlcnRpYXJ5WzQwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5J10gPSB0ZXJ0aWFyeVs5NTBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci10ZXJ0aWFyeS1jb250YWluZXInXSA9IHRlcnRpYXJ5WzkwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbMTAwXTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBoZXhdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNlbWFudGljKSkge1xuICAgIGNvbnN0IHNjYWxlID0gZGVyaXZlU2NhbGUoaGV4KTtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci0ke25hbWV9YF0gPSBzY2FsZVs0MDBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLW9uLSR7bmFtZX1gXSA9IHNjYWxlWzk1MF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3ItJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzk1MF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzMwMF07XG4gIH1cblxuICByZXR1cm4geyAuLi52YXJzLCAuLi50aGVtZS5vdmVycmlkZXMuZGFyayB9O1xufVxuXG5mdW5jdGlvbiBibG9jayhzZWxlY3Rvcjogc3RyaW5nLCB2YXJzOiBWYXJzLCBpbmRlbnQgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXModmFycykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtpbmRlbnR9ICAke25hbWV9OiAke3ZhbHVlfTtgKTtcbiAgcmV0dXJuIGAke2luZGVudH0ke3NlbGVjdG9yfSB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2luZGVudH19YDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSB0aGVtZSBjb25maWcgaW50byBhIENTUyBzdHlsZXNoZWV0IG9mIGAtLW5neHNtay0qYCBjdXN0b21cbiAqIHByb3BlcnRpZXMuIEVtaXRzIHN0YXRpYyB0b2tlbnMgcGx1cyBsaWdodC1tb2RlIHJvbGVzIG9uIGA6cm9vdGAsIGFuZFxuICogZGFyay1tb2RlIHJvbGVzIGFjY29yZGluZyB0byB0aGUgY29uZmlndXJlZCBkYXJrLW1vZGUgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRoZW1lQ3NzKGNvbmZpZzogVGhlbWVDb25maWcgfCBSZXNvbHZlZFRoZW1lKTogc3RyaW5nIHtcbiAgY29uc3QgdGhlbWUgPVxuICAgICdicmFuZCcgaW4gY29uZmlnICYmICdzcGFjaW5nJyBpbiAoY29uZmlnIGFzIG9iamVjdClcbiAgICAgID8gKGNvbmZpZyBhcyBSZXNvbHZlZFRoZW1lKVxuICAgICAgOiByZXNvbHZlVGhlbWUoY29uZmlnIGFzIFRoZW1lQ29uZmlnKTtcblxuICBjb25zdCByb290ID0gYmxvY2soJzpyb290JywgeyAuLi5zdGF0aWNWYXJzKHRoZW1lKSwgLi4ubGlnaHRWYXJzKHRoZW1lKSB9KTtcbiAgY29uc3QgZGFyayA9IGRhcmtWYXJzKHRoZW1lKTtcblxuICBsZXQgZGFya0Jsb2NrOiBzdHJpbmc7XG4gIHN3aXRjaCAodGhlbWUuZGFya01vZGUuc3RyYXRlZ3kpIHtcbiAgICBjYXNlICdtZWRpYSc6XG4gICAgICBkYXJrQmxvY2sgPSBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzeXN0ZW0nOiB7XG4gICAgICAvLyBgbGlnaHQtZGFyaygpYCBzdXBwb3J0IGlzIHBlci1wcm9wZXJ0eTsgdGhlIGNsYXNzIGJsb2NrIHN0aWxsIHNlcnZlc1xuICAgICAgLy8gYXMgdGhlIG92ZXJyaWRlIGhvb2ssIHNvIGBzeXN0ZW1gIGJlaGF2ZXMgYXMgbWVkaWEgKyBjbGFzcy5cbiAgICAgIGNvbnN0IGNuID0gdGhlbWUuZGFya01vZGUuY2xhc3NOYW1lO1xuICAgICAgZGFya0Jsb2NrID0gW1xuICAgICAgICBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWAsXG4gICAgICAgIGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayksXG4gICAgICBdLmpvaW4oJ1xcblxcbicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIGA6cm9vdC48Y2xhc3M+YCAoc3BlY2lmaWNpdHkgMCwyLDApIHBsdXMgYSBgYm9keWAgdmFyaWFudCBkZWZlbmQgdGhlXG4gICAgICAvLyBkYXJrIHRva2VucyBhZ2FpbnN0IHRoaXJkLXBhcnR5IHN0eWxlc2hlZXRzIHRoYXQgcmVkZWZpbmUgYC0tbmd4c21rLSpgXG4gICAgICAvLyBvbiBhIHBsYWluIGA6cm9vdGAgKDAsMSwwKSDigJQgdGhvc2Ugd291bGQgb3RoZXJ3aXNlIHdpbiBieSBzb3VyY2Ugb3JkZXJcbiAgICAgIC8vIHdoZW4gaW5qZWN0ZWQgaW50byA8aGVhZD4gYWZ0ZXIgdGhpcyBzaGVldC4gVGhlIGJhcmUgYC48Y2xhc3M+YCBrZWVwc1xuICAgICAgLy8gc2NvcGVkIChub24tcm9vdCkgZGFyayByZWdpb25zIHdvcmtpbmcuXG4gICAgICBjb25zdCBjbiA9IHRoZW1lLmRhcmtNb2RlLmNsYXNzTmFtZTtcbiAgICAgIGRhcmtCbG9jayA9IGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayk7XG4gICAgfVxuICB9XG5cbiAgLy8gWmVybyBldmVyeSBkdXJhdGlvbiB0b2tlbiAoY29tcG9uZW50cyBhbmltYXRlIHdpdGggLS1uZ3hzbWstZHVyYXRpb24tKlxuICAvLyBkaXJlY3RseSkgYW5kIG5ldXRyYWxpemUgdGhlIHNoYXJlZCB0cmFuc2Zvcm1zIHNvIEFMTCB0b2tlbi1kcml2ZW4gbW90aW9uXG4gIC8vIHN0b3BzLiBgLm5neHNtay1yZWR1Y2UtbW90aW9uYCBvZmZlcnMgdGhlIHNhbWUgYXMgYW4gYXBwLWxldmVsIG9wdC1pbi5cbiAgY29uc3QgcmVkdWNlZFZhcnM6IFZhcnMgPSB7XG4gICAgJy0tbmd4c21rLW1vdGlvbi1kdXJhdGlvbic6ICcwbXMnLFxuICAgICctLW5neHNtay1ob3Zlci1saWZ0JzogJ25vbmUnLFxuICAgICctLW5neHNtay1wcmVzcy1zY2FsZSc6ICdub25lJyxcbiAgfTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhlbWUuZHVyYXRpb24pKSB7XG4gICAgcmVkdWNlZFZhcnNbYC0tbmd4c21rLWR1cmF0aW9uLSR7a2V5fWBdID0gJzBtcyc7XG4gIH1cbiAgY29uc3QgcmVkdWNlZE1vdGlvbiA9IFtcbiAgICBgQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcXG4ke2Jsb2NrKCc6cm9vdCcsIHJlZHVjZWRWYXJzLCAnICAnKX1cXG59YCxcbiAgICBibG9jaygnOnJvb3Qubmd4c21rLXJlZHVjZS1tb3Rpb24sIC5uZ3hzbWstcmVkdWNlLW1vdGlvbicsIHJlZHVjZWRWYXJzKSxcbiAgXS5qb2luKCdcXG5cXG4nKTtcbiAgcmV0dXJuIGAvKiBHZW5lcmF0ZWQgYnkgQG5neHNtay90aGVtZSDigJQgZG8gbm90IGVkaXQgYnkgaGFuZC4gKi9cXG4ke3Jvb3R9XFxuXFxuJHtkYXJrQmxvY2t9XFxuXFxuJHtyZWR1Y2VkTW90aW9ufVxcbmA7XG59XG4iXX0=
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUvc3JjL2xpYi9jc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGVBQWUsRUFDZixXQUFXLEVBQ1gsU0FBUyxFQUNULE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxHQUNULE1BQU0sVUFBVSxDQUFDO0FBSWxCLFNBQVMsU0FBUyxDQUFDLE1BQWMsRUFBRSxLQUFpQjtJQUNsRCxNQUFNLElBQUksR0FBUyxFQUFFLENBQUM7SUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsa0JBQWtCLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sd0JBQXdCLEdBQXlCO0lBQ3JELE1BQU0sRUFBRTtRQUNOLG9CQUFvQixFQUFFLDZCQUE2QjtRQUNuRCx1QkFBdUIsRUFBRSxnQ0FBZ0M7UUFDekQsNkJBQTZCLEVBQUUseUJBQXlCO1FBQ3hELDZCQUE2QixFQUFFLEtBQUs7UUFDcEMsd0JBQXdCLEVBQUUsMkJBQTJCO1FBQ3JELGtDQUFrQyxFQUFFLEtBQUs7S0FDMUM7SUFDRCxJQUFJLEVBQUU7UUFDSixrQkFBa0IsRUFBRSw2QkFBNkI7UUFDakQsc0JBQXNCLEVBQUUseUJBQXlCO1FBQ2pELHNCQUFzQixFQUFFLHlCQUF5QjtRQUNqRCw0QkFBNEIsRUFBRSw2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QUEwQztZQUMxQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3pFLE1BQU0sV0FBVyxHQUFTO1FBQ3hCLDBCQUEwQixFQUFFLEtBQUs7UUFDakMscUJBQXFCLEVBQUUsTUFBTTtRQUM3QixzQkFBc0IsRUFBRSxNQUFNO0tBQy9CLENBQUM7SUFDRixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDOUMsV0FBVyxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNsRCxDQUFDO0lBQ0QsTUFBTSxhQUFhLEdBQUc7UUFDcEIsOENBQThDLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLO1FBQ3BGLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxXQUFXLENBQUM7S0FDeEUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDZixPQUFPLDREQUE0RCxJQUFJLE9BQU8sU0FBUyxPQUFPLGFBQWEsSUFBSSxDQUFDO0FBQ2xILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXJpdmVTY2FsZSwgcm90YXRlSHVlLCBzaGlmdExpZ2h0bmVzcyB9IGZyb20gJy4vY29sb3InO1xuaW1wb3J0IHsgcmVzb2x2ZVRoZW1lIH0gZnJvbSAnLi9kZWZpbmUtY29uZmlnJztcbmltcG9ydCB7IENvbG9yU2NhbGUsIFJlc29sdmVkVGhlbWUsIFRoZW1lQ29uZmlnLCBUeXBlUm9sZVNpemUsIFR5cGVTdHlsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQ09OVFJPTF9IRUlHSFQsXG4gIENPTlRST0xfSEVJR0hUUyxcbiAgRk9OVF9XRUlHSFQsXG4gIElDT05fU0laRSxcbiAgTEVBRElORyxcbiAgT1BBQ0lUWSxcbiAgVFJBQ0tJTkcsXG59IGZyb20gJy4vdG9rZW5zJztcblxudHlwZSBWYXJzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuZnVuY3Rpb24gc2NhbGVWYXJzKHByZWZpeDogc3RyaW5nLCBzY2FsZTogQ29sb3JTY2FsZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge307XG4gIGZvciAoY29uc3QgW3N0ZXAsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2FsZSkpIHtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci0ke3ByZWZpeH0tJHtzdGVwfWBdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhcnM7XG59XG5cbi8qKiBEZWZhdWx0IENTUyBjdXN0b20gcHJvcGVydGllcyBmb3IgZWFjaCBjb21wb25lbnQsIGVtaXR0ZWQgb25jZSBpbiA6cm9vdC4gKi9cbmNvbnN0IENPTVBPTkVOVF9UT0tFTl9ERUZBVUxUUzogUmVjb3JkPHN0cmluZywgVmFycz4gPSB7XG4gIGJ1dHRvbjoge1xuICAgICctLW5neHNtay1idXR0b24tYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXByaW1hcnkpJyxcbiAgICAnLS1uZ3hzbWstYnV0dG9uLWNvbG9yJzogJ3ZhcigtLW5neHNtay1jb2xvci1vbi1wcmltYXJ5KScsXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1mb250LWZhbWlseSc6ICd2YXIoLS1uZ3hzbWstZm9udC1zYW5zKScsXG4gICAgJy0tbmd4c21rLWJ1dHRvbi1mb250LXdlaWdodCc6ICc1MDAnLFxuICAgICctLW5neHNtay1idXR0b24tcmFkaXVzJzogJ3ZhcigtLW5neHNtay1yYWRpdXMtYmFzZSknLFxuICAgICctLW5neHNtay1idXR0b24tZGlzYWJsZWQtb3BhY2l0eSc6ICcwLjUnLFxuICB9LFxuICBjYXJkOiB7XG4gICAgJy0tbmd4c21rLWNhcmQtYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UpJyxcbiAgICAnLS1uZ3hzbWstY2FyZC1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy14bCknLFxuICAgICctLW5neHNtay1jYXJkLXNoYWRvdyc6ICd2YXIoLS1uZ3hzbWstc2hhZG93LXNtKScsXG4gICAgJy0tbmd4c21rLWNhcmQtYm9yZGVyLWNvbG9yJzogJ3ZhcigtLW5neHNtay1jb2xvci1vdXRsaW5lKScsXG4gIH0sXG4gIGFjY29yZGlvbjoge1xuICAgICctLW5neHNtay1hY2NvcmRpb24tYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UpJyxcbiAgICAnLS1uZ3hzbWstYWNjb3JkaW9uLXJhZGl1cyc6ICd2YXIoLS1uZ3hzbWstcmFkaXVzLWxnKScsXG4gICAgJy0tbmd4c21rLWFjY29yZGlvbi1ib3JkZXItY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLW91dGxpbmUpJyxcbiAgfSxcbiAgcHJvZ3Jlc3M6IHtcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtaGVpZ2h0JzogJzAuNXJlbScsXG4gICAgJy0tbmd4c21rLXByb2dyZXNzLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlLXZhcmlhbnQpJyxcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtY29sb3InOiAndmFyKC0tbmd4c21rLWNvbG9yLXByaW1hcnkpJyxcbiAgICAnLS1uZ3hzbWstcHJvZ3Jlc3MtcmFkaXVzJzogJ3ZhcigtLW5neHNtay1yYWRpdXMtZnVsbCknLFxuICB9LFxuICBzd2l0Y2g6IHtcbiAgICAnLS1uZ3hzbWstc3dpdGNoLXdpZHRoJzogJzIuMjVyZW0nLFxuICAgICctLW5neHNtay1zd2l0Y2gtaGVpZ2h0JzogJzEuMjVyZW0nLFxuICAgICctLW5neHNtay1zd2l0Y2gtcmFkaXVzJzogJ3ZhcigtLW5neHNtay1yYWRpdXMtZnVsbCknLFxuICAgICctLW5neHNtay1zd2l0Y2gtYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLW91dGxpbmUtc3Ryb25nKScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC10aHVtYi1zaXplJzogJzAuODc1cmVtJyxcbiAgICAnLS1uZ3hzbWstc3dpdGNoLXRodW1iLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlKScsXG4gICAgJy0tbmd4c21rLXN3aXRjaC1jaGVja2VkLWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1wcmltYXJ5KScsXG4gIH0sXG4gIHNwcmVhZHNoZWV0OiB7XG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlKScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWhlYWRlci1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3Itc3VyZmFjZS12YXJpYW50KScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWhlYWRlci1jb2xvcic6ICd2YXIoLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZS12YXJpYW50KScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWJvcmRlcic6ICd2YXIoLS1uZ3hzbWstY29sb3Itb3V0bGluZSknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1ncmlkLWNvbG9yJzogJ3ZhcigtLW5neHNtay1jb2xvci1vdXRsaW5lLXZhcmlhbnQpJyxcbiAgICAnLS1uZ3hzbWstc3ByZWFkc2hlZXQtaG92ZXItYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UtaG92ZXIpJyxcbiAgICAnLS1uZ3hzbWstc3ByZWFkc2hlZXQtc2VsZWN0ZWQtYmcnOlxuICAgICAgJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSkgMTIlLCB0cmFuc3BhcmVudCknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1hY3RpdmUtYm9yZGVyJzogJ3ZhcigtLW5neHNtay1jb2xvci1wcmltYXJ5KScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWZvbnQnOiAndmFyKC0tbmd4c21rLWZvbnQtc2FucyknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1mb250LW1vbm8nOiAndmFyKC0tbmd4c21rLWZvbnQtbW9ubyknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1yb3ctaGVpZ2h0JzogJzIuMjVyZW0nLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1oZWFkZXItaGVpZ2h0JzogJzIuNXJlbScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWNlbGwtcGFkZGluZyc6ICc2cHggMTBweCcsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWNlbGwtZm9udC1zaXplJzogJ3ZhcigtLW5neHNtay10ZXh0LWJvZHktc20tc2l6ZSknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1zY3JvbGxiYXItc2l6ZSc6ICc4cHgnLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1zaGFkb3cnOiAndmFyKC0tbmd4c21rLXNoYWRvdy1zbSknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1sZyknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1lZGl0LWJnJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdXJmYWNlKScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWVkaXQtYm9yZGVyJzogJ3ZhcigtLW5neHNtay1jb2xvci1wcmltYXJ5KScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LXJvdy1ob3Zlci1iZyc6ICd2YXIoLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1ob3ZlciknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1jb2wtaG92ZXItYmcnOlxuICAgICAgJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSkgNiUsIHRyYW5zcGFyZW50KScsXG4gICAgJy0tbmd4c21rLXNwcmVhZHNoZWV0LWZyb3plbi1zaGFkb3cnOiAnMnB4IDAgNHB4IHJnYmEoMCwwLDAsMC4wOCknLFxuICAgICctLW5neHNtay1zcHJlYWRzaGVldC1zZWxlY3Rpb24tcmFuZ2UnOlxuICAgICAgJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSkgOCUsIHRyYW5zcGFyZW50KScsXG4gIH0sXG4gIGlucHV0R3JvdXA6IHtcbiAgICAnLS1uZ3hzbWstaW5wdXQtZ3JvdXAtYmcnOiAndmFyKC0tbmd4c21rLWNvbG9yLXN1cmZhY2UpJyxcbiAgICAnLS1uZ3hzbWstaW5wdXQtZ3JvdXAtYm9yZGVyJzogJ3ZhcigtLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyknLFxuICAgICctLW5neHNtay1pbnB1dC1ncm91cC1yYWRpdXMnOiAndmFyKC0tbmd4c21rLXJhZGl1cy1tZCknLFxuICAgICctLW5neHNtay1pbnB1dC1ncm91cC1zaGFkb3cnOiAnbm9uZScsXG4gICAgJy0tbmd4c21rLWlucHV0LWdyb3VwLWZvY3VzLWJvcmRlcic6ICd2YXIoLS1uZ3hzbWstY29sb3ItcHJpbWFyeSknLFxuICAgICctLW5neHNtay1pbnB1dC1ncm91cC1mb2N1cy1zaGFkb3cnOlxuICAgICAgJzAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbmd4c21rLWNvbG9yLXByaW1hcnkpIDE1JSwgdHJhbnNwYXJlbnQpJyxcbiAgICAnLS1uZ3hzbWstaW5wdXQtZ3JvdXAtZXJyb3ItYm9yZGVyJzogJ3ZhcigtLW5neHNtay1jb2xvci1lcnJvciknLFxuICAgICctLW5neHNtay1pbnB1dC1ncm91cC1lcnJvci1mb2N1cy1zaGFkb3cnOlxuICAgICAgJzAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbmd4c21rLWNvbG9yLWVycm9yKSAxNSUsIHRyYW5zcGFyZW50KScsXG4gICAgJy0tbmd4c21rLWlucHV0LWdyb3VwLXN1Y2Nlc3MtYm9yZGVyJzogJ3ZhcigtLW5neHNtay1jb2xvci1zdWNjZXNzKScsXG4gICAgJy0tbmd4c21rLWlucHV0LWdyb3VwLXdhcm5pbmctYm9yZGVyJzogJ3ZhcigtLW5neHNtay1jb2xvci13YXJuaW5nKScsXG4gICAgJy0tbmd4c21rLWlucHV0LWdyb3VwLWhlaWdodCc6ICcyLjVyZW0nLFxuICAgICctLW5neHNtay1pbnB1dC1ncm91cC1wYWRkaW5nJzogJzAuNzVyZW0nLFxuICAgICctLW5neHNtay1pbnB1dC1ncm91cC1nYXAnOiAndmFyKC0tbmd4c21rLXNwYWNlLTIpJyxcbiAgICAnLS1uZ3hzbWstaW5wdXQtZ3JvdXAtZm9udCc6ICd2YXIoLS1uZ3hzbWstZm9udC1zYW5zKScsXG4gIH0sXG59O1xuXG4vKiogVG9rZW5zIHRoYXQgZG8gbm90IGNoYW5nZSBiZXR3ZWVuIGxpZ2h0IGFuZCBkYXJrIG1vZGUuICovXG5mdW5jdGlvbiBzdGF0aWNWYXJzKHRoZW1lOiBSZXNvbHZlZFRoZW1lKTogVmFycyB7XG4gIGNvbnN0IHZhcnM6IFZhcnMgPSB7XG4gICAgLi4uc2NhbGVWYXJzKCdicmFuZCcsIHRoZW1lLmJyYW5kKSxcbiAgICAuLi5zY2FsZVZhcnMoJ3NlY29uZGFyeScsIHRoZW1lLnNlY29uZGFyeSksXG4gICAgLi4uc2NhbGVWYXJzKCduZXV0cmFsJywgdGhlbWUubmV1dHJhbCksXG4gICAgJy0tbmd4c21rLWZvbnQtc2Fucyc6IHRoZW1lLmZvbnRGYW1pbHkuc2FucyxcbiAgICAnLS1uZ3hzbWstZm9udC1tb25vJzogdGhlbWUuZm9udEZhbWlseS5tb25vLFxuICAgICctLW5neHNtay1yYWRpdXMtYmFzZSc6IHRoZW1lLnJhZGl1c1t0aGVtZS5yYWRpdXNCYXNlXSxcbiAgICAnLS1uZ3hzbWstY29udHJvbC1oZWlnaHQnOiBDT05UUk9MX0hFSUdIVCxcblxuICAgIC8vIE1vdGlvbiBUb2tlbnNcbiAgICAnLS1uZ3hzbWstbW90aW9uLWR1cmF0aW9uJzogJ3ZhcigtLW5neHNtay1kdXJhdGlvbi1ub3JtYWwpJyxcbiAgICAnLS1uZ3hzbWstbW90aW9uLWVhc2UnOiAndmFyKC0tbmd4c21rLWVhc2UtaW4tb3V0KScsXG5cbiAgICAvLyBJbnRlcmFjdGl2ZS1zdGF0ZSBtb3Rpb246IHNoYXJlZCBsaWZ0L3ByZXNzIHRyYW5zZm9ybXMuIE5ldXRyYWxpemVkIHRvXG4gICAgLy8gYG5vbmVgIHVuZGVyIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24gKHNlZSBidWlsZFRoZW1lQ3NzKS5cbiAgICAnLS1uZ3hzbWstaG92ZXItbGlmdCc6ICd0cmFuc2xhdGVZKC0xcHgpJyxcbiAgICAnLS1uZ3hzbWstcHJlc3Mtc2NhbGUnOiAnc2NhbGUoMC45OCknLFxuXG4gICAgLy8gRm9jdXMgcmluZzogVEhFIGZvY3VzIGluZGljYXRvciBmb3IgZXZlcnkgY29tcG9uZW50LiBBbGlhc2VzIHRoZVxuICAgIC8vIG1vZGUtYXdhcmUgLS1uZ3hzbWstc2hhZG93LWZvY3VzOyB0aGUgZXJyb3IgdmFyaWFudCBkZXJpdmVzIGZyb20gdGhlXG4gICAgLy8gc2VtYW50aWMgZXJyb3Igcm9sZSBzbyBpbnZhbGlkIGNvbnRyb2xzIHJpbmcgcmVkIGluIGJvdGggbW9kZXMuXG4gICAgJy0tbmd4c21rLWZvY3VzLXJpbmcnOiAndmFyKC0tbmd4c21rLXNoYWRvdy1mb2N1cyknLFxuICAgICctLW5neHNtay1mb2N1cy1yaW5nLWVycm9yJzpcbiAgICAgICcwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW5neHNtay1jb2xvci1lcnJvcikgMTUlLCB0cmFuc3BhcmVudCksICcgK1xuICAgICAgJzAgMCAwIDRweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbmd4c21rLWNvbG9yLWVycm9yKSA0NSUsIHRyYW5zcGFyZW50KScsXG5cbiAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgdG9rZW4gZGVmYXVsdHNcbiAgICAuLi5PYmplY3QudmFsdWVzKENPTVBPTkVOVF9UT0tFTl9ERUZBVUxUUykucmVkdWNlKFxuICAgICAgKG1lcmdlZCwgdG9rZW5zKSA9PiAoeyAuLi5tZXJnZWQsIC4uLnRva2VucyB9KSxcbiAgICAgIHt9IGFzIFZhcnMsXG4gICAgKSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhDT05UUk9MX0hFSUdIVFMpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstY29udHJvbC1oZWlnaHQtJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhPUEFDSVRZKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLW9wYWNpdHktJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhJQ09OX1NJWkUpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstaWNvbi0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFRSQUNLSU5HKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXRyYWNraW5nLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9XRUlHSFQpKSB7XG4gICAgdmFyc1tgLS1uZ3hzbWstZm9udC13ZWlnaHQtJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhMRUFESU5HKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLWxlYWRpbmctJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5zcGFjaW5nKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXNwYWNlLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUucmFkaXVzKSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXJhZGl1cy0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNoYWRvdykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1zaGFkb3ctJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGVtZS5kdXJhdGlvbikpIHtcbiAgICB2YXJzW2AtLW5neHNtay1kdXJhdGlvbi0ke2tleX1gXSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLmVhc2luZykpIHtcbiAgICB2YXJzW2AtLW5neHNtay1lYXNlLSR7a2V5fWBdID0gdmFsdWU7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhlbWUuekluZGV4KSkge1xuICAgIHZhcnNbYC0tbmd4c21rLXotJHtrZXl9YF0gPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHNpemVzID0geyBsYXJnZTogJ2xnJywgbWVkaXVtOiAnbWQnLCBzbWFsbDogJ3NtJyB9IGFzIGNvbnN0O1xuICBmb3IgKGNvbnN0IFtyb2xlLCBzdHlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnR5cG9ncmFwaHkpKSB7XG4gICAgZm9yIChjb25zdCBbc2l6ZSwgc3VmZml4XSBvZiBPYmplY3QuZW50cmllcyhzaXplcykpIHtcbiAgICAgIGNvbnN0IHN0eWxlOiBUeXBlU3R5bGUgPSBzdHlsZXNbc2l6ZSBhcyBUeXBlUm9sZVNpemVdO1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS1zaXplYF0gPSBzdHlsZS5zaXplO1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS1saW5lYF0gPSBzdHlsZS5saW5lSGVpZ2h0O1xuICAgICAgdmFyc1tgLS1uZ3hzbWstdGV4dC0ke3JvbGV9LSR7c3VmZml4fS13ZWlnaHRgXSA9IHN0eWxlLndlaWdodDtcbiAgICB9XG4gIH1cblxuICAvLyBFeHRyYS1zbWFsbCBib2R5IHRleHQgZm9yIGRlbnNlIG1ldGFkYXRhIHJvd3M7IGJlbG93IHRoZSBzbWFsbGVzdFxuICAvLyBUeXBlUm9sZVNpemUgc28gaXQgaXMgZW1pdHRlZCBvdXRzaWRlIHRoZSByb2xlIGxvb3AuXG4gIHZhcnNbJy0tbmd4c21rLXRleHQtYm9keS14cy1zaXplJ10gPSAnMC42ODc1cmVtJztcbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLWxpbmUnXSA9ICcxcmVtJztcbiAgdmFyc1snLS1uZ3hzbWstdGV4dC1ib2R5LXhzLXdlaWdodCddID0gJzQwMCc7XG5cbiAgcmV0dXJuIHZhcnM7XG59XG5cbi8qKiBTZW1hbnRpYyByb2xlIHRva2VucyBmb3IgbGlnaHQgbW9kZS4gKi9cbmZ1bmN0aW9uIGxpZ2h0VmFycyh0aGVtZTogUmVzb2x2ZWRUaGVtZSk6IFZhcnMge1xuICBjb25zdCB2YXJzOiBWYXJzID0ge1xuICAgICdjb2xvci1zY2hlbWUnOiAnbGlnaHQnLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnknOiB0aGVtZS5icmFuZEJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnknOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktaG92ZXInOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5icmFuZEJhc2UsIC04KSxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1hY3RpdmUnOiBzaGlmdExpZ2h0bmVzcyh0aGVtZS5icmFuZEJhc2UsIC0xNCksXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbMTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tcHJpbWFyeS1jb250YWluZXInOiB0aGVtZS5icmFuZFs5MDBdLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXNlY29uZGFyeSc6IHRoZW1lLnNlY29uZGFyeUJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXNlY29uZGFyeSc6ICcjRkZGRkZGJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5LWhvdmVyJzogc2hpZnRMaWdodG5lc3ModGhlbWUuc2Vjb25kYXJ5QmFzZSwgLTgpLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktYWN0aXZlJzogc2hpZnRMaWdodG5lc3ModGhlbWUuc2Vjb25kYXJ5QmFzZSwgLTE0KSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5LWNvbnRhaW5lcic6IHRoZW1lLnNlY29uZGFyeVsxMDBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1zZWNvbmRhcnktY29udGFpbmVyJzogdGhlbWUuc2Vjb25kYXJ5WzkwMF0sXG5cbiAgICAvLyBEZWZhdWx0IGxpZ2h0IHRoZW1lOiBjb29sLWdyZXkgYm9keSwgd2hpdGUgY2FyZHMgZmxvYXRpbmcgb24gdG9wLCBoYWlybGluZSBib3JkZXJzLlxuICAgICctLW5neHNtay1jb2xvci1iYWNrZ3JvdW5kJzogdGhlbWUubmV1dHJhbFs1MF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLWJhY2tncm91bmQnOiAnIzBBMTMxNycsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UnOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UnOiAnIzBBMTMxNycsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtdmFyaWFudCc6IHRoZW1lLm5ldXRyYWxbMTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc3VyZmFjZS12YXJpYW50JzogdGhlbWUubmV1dHJhbFs1MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWhvdmVyJzogJ3JnYig1IDU0IDg5IC8gMC4wNSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWFjdGl2ZSc6ICdyZ2IoNSA1NCA4OSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWNvbnRhaW5lcic6ICcjRkZGRkZGJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZSc6ICdyZ2IoNSA1NCA4OSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1vdXRsaW5lLXN0cm9uZyc6IHRoZW1lLm5ldXRyYWxbMjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS12YXJpYW50JzogJ3JnYig1IDU0IDg5IC8gMC4wNiknLFxuXG4gICAgLy8gRWxldmF0aW9uIGxhZGRlclxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTEnOiAnI0ZGRkZGRicsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtMic6IHRoZW1lLm5ldXRyYWxbNTBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTMnOiB0aGVtZS5uZXV0cmFsWzEwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtNCc6IHRoZW1lLm5ldXRyYWxbMjAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS01JzogdGhlbWUubmV1dHJhbFszMDBdLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXJpbmcnOiB0aGVtZS5icmFuZEJhc2UsXG4gICAgJy0tbmd4c21rLWNvbG9yLWJhY2tkcm9wJzogJ3JnYigxIDE4IDQwIC8gMC40KScsXG4gICAgJy0tbmd4c21rLXNoYWRvdy1mb2N1cyc6IGAwIDAgMCAycHggJHt0aGVtZS5icmFuZFsxMDBdfSwgMCAwIDAgNHB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kQmFzZX0gNDUlLCB0cmFuc3BhcmVudClgLFxuXG4gICAgLy8gQ2F0ZWdvcmljYWwgY2hhcnQgcGFsZXR0ZSDigJQgYSBmaXhlZCA4LWh1ZSBxdWFsaXRhdGl2ZSBzZXQgKE5PVCBkZXJpdmVkXG4gICAgLy8gZnJvbSB0aGUgYnJhbmQsIHNvIGFkamFjZW50IHNlcmllcyBzdGF5IGRpc3Rpbmd1aXNoYWJsZSBhY3Jvc3MgdGhlbWVzKSxcbiAgICAvLyBzdGVwcGVkIGZvciB0aGUgbGlnaHQgc3VyZmFjZS4gVmFsaWRhdGVkIGZvciB0aGUgbGlnaHQgY2hhcnQgc3VyZmFjZTpcbiAgICAvLyBDVkQgd29yc3QtYWRqYWNlbnQgzpRFIDI0LjIsIGNocm9tYS9saWdodG5lc3MgaW4tYmFuZC4gQ2hhcnRzIHJlYWQgdGhlc2VcbiAgICAvLyB2aWEgZ2V0Q29tcHV0ZWRTdHlsZTsgY29uc3VtZXJzIGNhbiBvdmVycmlkZSBhbnkgc2xvdCB0byByZWJyYW5kIHNlcmllcy5cbiAgICAnLS1uZ3hzbWstY2hhcnQtMSc6ICcjMkE3OEQ2JyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtMic6ICcjMUJBRjdBJyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtMyc6ICcjRURBMTAwJyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtNCc6ICcjMDA4MzAwJyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtNSc6ICcjNEEzQUE3JyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtNic6ICcjRTM0OTQ4JyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtNyc6ICcjRTg3QkE0JyxcbiAgICAnLS1uZ3hzbWstY2hhcnQtOCc6ICcjRUI2ODM0JyxcbiAgfTtcblxuICBjb25zdCB0ZXJ0aWFyeSA9IGRlcml2ZVNjYWxlKHJvdGF0ZUh1ZSh0aGVtZS5icmFuZEJhc2UsIDY0KSk7XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLXRlcnRpYXJ5J10gPSB0ZXJ0aWFyeVs1MDBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci1vbi10ZXJ0aWFyeSddID0gJyNGRkZGRkYnO1xuICB2YXJzWyctLW5neHNtay1jb2xvci10ZXJ0aWFyeS1jb250YWluZXInXSA9IHRlcnRpYXJ5WzEwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbOTAwXTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBoZXhdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNlbWFudGljKSkge1xuICAgIGNvbnN0IHNjYWxlID0gZGVyaXZlU2NhbGUoaGV4KTtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci0ke25hbWV9YF0gPSBoZXg7XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfWBdID0gJyNGRkZGRkYnO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLSR7bmFtZX0tY29udGFpbmVyYF0gPSBzY2FsZVsxMDBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLW9uLSR7bmFtZX0tY29udGFpbmVyYF0gPSBzY2FsZVs4MDBdO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4udmFycywgLi4udGhlbWUub3ZlcnJpZGVzLmxpZ2h0IH07XG59XG5cbi8qKiBTZW1hbnRpYyByb2xlIHRva2VucyBmb3IgZGFyayBtb2RlLiAqL1xuZnVuY3Rpb24gZGFya1ZhcnModGhlbWU6IFJlc29sdmVkVGhlbWUpOiBWYXJzIHtcbiAgY29uc3QgdmFyczogVmFycyA9IHtcbiAgICAnY29sb3Itc2NoZW1lJzogJ2RhcmsnLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXByaW1hcnknOiB0aGVtZS5icmFuZFs0MDBdLFxuICAgICctLW5neHNtay1jb2xvci1vbi1wcmltYXJ5JzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWhvdmVyJzogdGhlbWUuYnJhbmRbMzAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3ItcHJpbWFyeS1hY3RpdmUnOiB0aGVtZS5icmFuZFsyMDBdLFxuICAgICctLW5neHNtay1jb2xvci1wcmltYXJ5LWNvbnRhaW5lcic6IHRoZW1lLmJyYW5kWzkwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXByaW1hcnktY29udGFpbmVyJzogdGhlbWUuYnJhbmRbMTAwXSxcblxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnknOiB0aGVtZS5zZWNvbmRhcnlbNDAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itb24tc2Vjb25kYXJ5JzogJyNGRkZGRkYnLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktaG92ZXInOiB0aGVtZS5zZWNvbmRhcnlbMzAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc2Vjb25kYXJ5LWFjdGl2ZSc6IHRoZW1lLnNlY29uZGFyeVsyMDBdLFxuICAgICctLW5neHNtay1jb2xvci1zZWNvbmRhcnktY29udGFpbmVyJzogdGhlbWUuc2Vjb25kYXJ5WzkwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXNlY29uZGFyeS1jb250YWluZXInOiB0aGVtZS5zZWNvbmRhcnlbMTAwXSxcblxuICAgIC8vIERlZmF1bHQgZGFyayB0aGVtZTogbmVhci1uZXV0cmFsIGNoYXJjb2FsIGJvZHksIHNsaWdodGx5IGxpZ2h0ZXIgY2FyZCxcbiAgICAvLyBsaWdodGVyIHN0aWxsIGZvciBwb3BvdmVyczsgaGFpcmxpbmUgbGlnaHQtb24tZGFyayBib3JkZXJzLlxuICAgICctLW5neHNtay1jb2xvci1iYWNrZ3JvdW5kJzogJyMxMTExMTInLFxuICAgICctLW5neHNtay1jb2xvci1vbi1iYWNrZ3JvdW5kJzogJyNERkUyRTUnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlJzogJyMxRjFGMjInLFxuICAgICctLW5neHNtay1jb2xvci1vbi1zdXJmYWNlJzogJyNERkUyRTUnLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLXZhcmlhbnQnOiAnIzI4MjkyQycsXG4gICAgJy0tbmd4c21rLWNvbG9yLW9uLXN1cmZhY2UtdmFyaWFudCc6ICcjQUFBRkI1JyxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS1ob3Zlcic6ICdyZ2IoMjU1IDI1NSAyNTUgLyAwLjA1KScsXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtYWN0aXZlJzogJ3JnYigyNTUgMjU1IDI1NSAvIDAuMSknLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLWNvbnRhaW5lcic6ICcjMjgyOTJDJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZSc6ICdyZ2IoMjQyIDI0NCAyNDYgLyAwLjEpJyxcbiAgICAnLS1uZ3hzbWstY29sb3Itb3V0bGluZS1zdHJvbmcnOiAnIzQ5NEQ1MycsXG4gICAgJy0tbmd4c21rLWNvbG9yLW91dGxpbmUtdmFyaWFudCc6ICdyZ2IoMjQyIDI0NCAyNDYgLyAwLjA2KScsXG5cbiAgICAvLyBFbGV2YXRpb24gbGFkZGVyXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtMSc6IHRoZW1lLm5ldXRyYWxbODAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS0yJzogdGhlbWUubmV1dHJhbFs3MDBdLFxuICAgICctLW5neHNtay1jb2xvci1zdXJmYWNlLTMnOiB0aGVtZS5uZXV0cmFsWzYwMF0sXG4gICAgJy0tbmd4c21rLWNvbG9yLXN1cmZhY2UtNCc6IHRoZW1lLm5ldXRyYWxbNTAwXSxcbiAgICAnLS1uZ3hzbWstY29sb3Itc3VyZmFjZS01JzogdGhlbWUubmV1dHJhbFs0MDBdLFxuXG4gICAgJy0tbmd4c21rLWNvbG9yLXJpbmcnOiB0aGVtZS5icmFuZFs0MDBdLFxuICAgICctLW5neHNtay1jb2xvci1iYWNrZHJvcCc6ICdyZ2IoMTcgMTcgMTggLyAwLjYpJyxcbiAgICAnLS1uZ3hzbWstc2hhZG93LWZvY3VzJzogYDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgJHt0aGVtZS5icmFuZFs0MDBdfSAyNSUsIHRyYW5zcGFyZW50KSwgMCAwIDAgNHB4IGNvbG9yLW1peChpbiBzcmdiLCAke3RoZW1lLmJyYW5kWzQwMF19IDQ1JSwgdHJhbnNwYXJlbnQpYCxcblxuICAgIC8vIENhdGVnb3JpY2FsIGNoYXJ0IHBhbGV0dGUg4oCUIHRoZSBzYW1lIGVpZ2h0IGh1ZXMgYXMgbGlnaHQsIHJlLXN0ZXBwZWQgZm9yXG4gICAgLy8gdGhlIGRhcmsgc3VyZmFjZSAobm90IGEgZGlmZmVyZW50IHBhbGV0dGUpLiBWYWxpZGF0ZWQgZm9yIHRoZSBkYXJrIGNoYXJ0XG4gICAgLy8gc3VyZmFjZTogYWxsIHNsb3RzIOKJpSAzOjEgY29udHJhc3QsIENWRCB3b3JzdC1hZGphY2VudCDOlEUgMTAuMyAoZmxvb3IgYmFuZCxcbiAgICAvLyByZWxpZXMgb24gdGhlIGxlZ2VuZC9sYWJlbHMgY2hhcnRzIGFscmVhZHkgcmVuZGVyIGZvciBzZWNvbmRhcnkgZW5jb2RpbmcpLlxuICAgICctLW5neHNtay1jaGFydC0xJzogJyMzOTg3RTUnLFxuICAgICctLW5neHNtay1jaGFydC0yJzogJyMxOTlFNzAnLFxuICAgICctLW5neHNtay1jaGFydC0zJzogJyNDOTg1MDAnLFxuICAgICctLW5neHNtay1jaGFydC00JzogJyMwMDgzMDAnLFxuICAgICctLW5neHNtay1jaGFydC01JzogJyM5MDg1RTknLFxuICAgICctLW5neHNtay1jaGFydC02JzogJyNFNjY3NjcnLFxuICAgICctLW5neHNtay1jaGFydC03JzogJyNENTUxODEnLFxuICAgICctLW5neHNtay1jaGFydC04JzogJyNEOTU5MjYnLFxuICB9O1xuXG4gIGNvbnN0IHRlcnRpYXJ5ID0gZGVyaXZlU2NhbGUocm90YXRlSHVlKHRoZW1lLmJyYW5kQmFzZSwgNjQpKTtcbiAgdmFyc1snLS1uZ3hzbWstY29sb3ItdGVydGlhcnknXSA9IHRlcnRpYXJ5WzQwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5J10gPSB0ZXJ0aWFyeVs5NTBdO1xuICB2YXJzWyctLW5neHNtay1jb2xvci10ZXJ0aWFyeS1jb250YWluZXInXSA9IHRlcnRpYXJ5WzkwMF07XG4gIHZhcnNbJy0tbmd4c21rLWNvbG9yLW9uLXRlcnRpYXJ5LWNvbnRhaW5lciddID0gdGVydGlhcnlbMTAwXTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBoZXhdIG9mIE9iamVjdC5lbnRyaWVzKHRoZW1lLnNlbWFudGljKSkge1xuICAgIGNvbnN0IHNjYWxlID0gZGVyaXZlU2NhbGUoaGV4KTtcbiAgICB2YXJzW2AtLW5neHNtay1jb2xvci0ke25hbWV9YF0gPSBzY2FsZVs0MDBdO1xuICAgIHZhcnNbYC0tbmd4c21rLWNvbG9yLW9uLSR7bmFtZX1gXSA9IHNjYWxlWzk1MF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3ItJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzk1MF07XG4gICAgdmFyc1tgLS1uZ3hzbWstY29sb3Itb24tJHtuYW1lfS1jb250YWluZXJgXSA9IHNjYWxlWzMwMF07XG4gIH1cblxuICByZXR1cm4geyAuLi52YXJzLCAuLi50aGVtZS5vdmVycmlkZXMuZGFyayB9O1xufVxuXG5mdW5jdGlvbiBibG9jayhzZWxlY3Rvcjogc3RyaW5nLCB2YXJzOiBWYXJzLCBpbmRlbnQgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXModmFycykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtpbmRlbnR9ICAke25hbWV9OiAke3ZhbHVlfTtgKTtcbiAgcmV0dXJuIGAke2luZGVudH0ke3NlbGVjdG9yfSB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2luZGVudH19YDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSB0aGVtZSBjb25maWcgaW50byBhIENTUyBzdHlsZXNoZWV0IG9mIGAtLW5neHNtay0qYCBjdXN0b21cbiAqIHByb3BlcnRpZXMuIEVtaXRzIHN0YXRpYyB0b2tlbnMgcGx1cyBsaWdodC1tb2RlIHJvbGVzIG9uIGA6cm9vdGAsIGFuZFxuICogZGFyay1tb2RlIHJvbGVzIGFjY29yZGluZyB0byB0aGUgY29uZmlndXJlZCBkYXJrLW1vZGUgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRoZW1lQ3NzKGNvbmZpZzogVGhlbWVDb25maWcgfCBSZXNvbHZlZFRoZW1lKTogc3RyaW5nIHtcbiAgY29uc3QgdGhlbWUgPVxuICAgICdicmFuZCcgaW4gY29uZmlnICYmICdzcGFjaW5nJyBpbiAoY29uZmlnIGFzIG9iamVjdClcbiAgICAgID8gKGNvbmZpZyBhcyBSZXNvbHZlZFRoZW1lKVxuICAgICAgOiByZXNvbHZlVGhlbWUoY29uZmlnIGFzIFRoZW1lQ29uZmlnKTtcblxuICBjb25zdCByb290ID0gYmxvY2soJzpyb290JywgeyAuLi5zdGF0aWNWYXJzKHRoZW1lKSwgLi4ubGlnaHRWYXJzKHRoZW1lKSB9KTtcbiAgY29uc3QgZGFyayA9IGRhcmtWYXJzKHRoZW1lKTtcblxuICBsZXQgZGFya0Jsb2NrOiBzdHJpbmc7XG4gIHN3aXRjaCAodGhlbWUuZGFya01vZGUuc3RyYXRlZ3kpIHtcbiAgICBjYXNlICdtZWRpYSc6XG4gICAgICBkYXJrQmxvY2sgPSBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzeXN0ZW0nOiB7XG4gICAgICAvLyBgbGlnaHQtZGFyaygpYCBzdXBwb3J0IGlzIHBlci1wcm9wZXJ0eTsgdGhlIGNsYXNzIGJsb2NrIHN0aWxsIHNlcnZlc1xuICAgICAgLy8gYXMgdGhlIG92ZXJyaWRlIGhvb2ssIHNvIGBzeXN0ZW1gIGJlaGF2ZXMgYXMgbWVkaWEgKyBjbGFzcy5cbiAgICAgIGNvbnN0IGNuID0gdGhlbWUuZGFya01vZGUuY2xhc3NOYW1lO1xuICAgICAgZGFya0Jsb2NrID0gW1xuICAgICAgICBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xcbiR7YmxvY2soJzpyb290JywgZGFyaywgJyAgJyl9XFxufWAsXG4gICAgICAgIGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayksXG4gICAgICBdLmpvaW4oJ1xcblxcbicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIGA6cm9vdC48Y2xhc3M+YCAoc3BlY2lmaWNpdHkgMCwyLDApIHBsdXMgYSBgYm9keWAgdmFyaWFudCBkZWZlbmQgdGhlXG4gICAgICAvLyBkYXJrIHRva2VucyBhZ2FpbnN0IHRoaXJkLXBhcnR5IHN0eWxlc2hlZXRzIHRoYXQgcmVkZWZpbmUgYC0tbmd4c21rLSpgXG4gICAgICAvLyBvbiBhIHBsYWluIGA6cm9vdGAgKDAsMSwwKSDigJQgdGhvc2Ugd291bGQgb3RoZXJ3aXNlIHdpbiBieSBzb3VyY2Ugb3JkZXJcbiAgICAgIC8vIHdoZW4gaW5qZWN0ZWQgaW50byA8aGVhZD4gYWZ0ZXIgdGhpcyBzaGVldC4gVGhlIGJhcmUgYC48Y2xhc3M+YCBrZWVwc1xuICAgICAgLy8gc2NvcGVkIChub24tcm9vdCkgZGFyayByZWdpb25zIHdvcmtpbmcuXG4gICAgICBjb25zdCBjbiA9IHRoZW1lLmRhcmtNb2RlLmNsYXNzTmFtZTtcbiAgICAgIGRhcmtCbG9jayA9IGJsb2NrKGA6cm9vdC4ke2NufSwgOnJvb3QuJHtjbn0gYm9keSwgLiR7Y259YCwgZGFyayk7XG4gICAgfVxuICB9XG5cbiAgLy8gWmVybyBldmVyeSBkdXJhdGlvbiB0b2tlbiAoY29tcG9uZW50cyBhbmltYXRlIHdpdGggLS1uZ3hzbWstZHVyYXRpb24tKlxuICAvLyBkaXJlY3RseSkgYW5kIG5ldXRyYWxpemUgdGhlIHNoYXJlZCB0cmFuc2Zvcm1zIHNvIEFMTCB0b2tlbi1kcml2ZW4gbW90aW9uXG4gIC8vIHN0b3BzLiBgLm5neHNtay1yZWR1Y2UtbW90aW9uYCBvZmZlcnMgdGhlIHNhbWUgYXMgYW4gYXBwLWxldmVsIG9wdC1pbi5cbiAgY29uc3QgcmVkdWNlZFZhcnM6IFZhcnMgPSB7XG4gICAgJy0tbmd4c21rLW1vdGlvbi1kdXJhdGlvbic6ICcwbXMnLFxuICAgICctLW5neHNtay1ob3Zlci1saWZ0JzogJ25vbmUnLFxuICAgICctLW5neHNtay1wcmVzcy1zY2FsZSc6ICdub25lJyxcbiAgfTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhlbWUuZHVyYXRpb24pKSB7XG4gICAgcmVkdWNlZFZhcnNbYC0tbmd4c21rLWR1cmF0aW9uLSR7a2V5fWBdID0gJzBtcyc7XG4gIH1cbiAgY29uc3QgcmVkdWNlZE1vdGlvbiA9IFtcbiAgICBgQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcXG4ke2Jsb2NrKCc6cm9vdCcsIHJlZHVjZWRWYXJzLCAnICAnKX1cXG59YCxcbiAgICBibG9jaygnOnJvb3Qubmd4c21rLXJlZHVjZS1tb3Rpb24sIC5uZ3hzbWstcmVkdWNlLW1vdGlvbicsIHJlZHVjZWRWYXJzKSxcbiAgXS5qb2luKCdcXG5cXG4nKTtcbiAgcmV0dXJuIGAvKiBHZW5lcmF0ZWQgYnkgQG5neHNtay90aGVtZSDigJQgZG8gbm90IGVkaXQgYnkgaGFuZC4gKi9cXG4ke3Jvb3R9XFxuXFxuJHtkYXJrQmxvY2t9XFxuXFxuJHtyZWR1Y2VkTW90aW9ufVxcbmA7XG59XG4iXX0=
@@ -0,0 +1,81 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Injectable, inject } from '@angular/core';
3
+ import { buildThemeCss } from './css';
4
+ import { resolveTheme } from './define-config';
5
+ import { ionicVarsAdapter } from './token-adapter';
6
+ import * as i0 from "@angular/core";
7
+ const STYLE_ID = 'ngxsmk-theme';
8
+ const IONIC_STYLE_ID = 'ngxsmk-ionic-theme';
9
+ /**
10
+ * Injects generated theme CSS into the document at runtime.
11
+ *
12
+ * Decoupled from dark-mode switching so consumers who only need
13
+ * token injection (e.g. the CLI theme-preview) don't pull in
14
+ * class-toggle / localStorage / matchMedia logic.
15
+ *
16
+ * SSR-safe: all DOM access goes through the injected document.
17
+ */
18
+ export class NgxThemeInjectorService {
19
+ constructor() {
20
+ this.document = inject(DOCUMENT);
21
+ }
22
+ /**
23
+ * Apply a theme at runtime. Generates token CSS from the config and swaps
24
+ * it into a dedicated `<style>` element, overriding the build-time theme.
25
+ *
26
+ * @param adapter Optional output adapter. Defaults to the standard NGXSMK
27
+ * `--ngxsmk-*` CSS variables. Pass `ionicVarsAdapter` to also generate
28
+ * `--ion-*` variables for Ionic components.
29
+ */
30
+ applyTheme(config, adapter) {
31
+ const head = this.document.head;
32
+ let style = this.document.getElementById(STYLE_ID);
33
+ if (!style) {
34
+ style = this.document.createElement('style');
35
+ style.id = STYLE_ID;
36
+ head.appendChild(style);
37
+ }
38
+ let css = buildThemeCss(config);
39
+ if (adapter) {
40
+ const resolved = resolveTheme(config);
41
+ const platformVars = adapter.vars(resolved);
42
+ css += '\n' + this.buildAdapterCss(adapter.name, platformVars);
43
+ }
44
+ style.textContent = css;
45
+ }
46
+ /**
47
+ * Apply Ionic-specific token variables alongside the standard NGXSMK theme.
48
+ * Generates `--ion-*` variables derived from the same `ThemeConfig`.
49
+ */
50
+ applyIonicTheme(config) {
51
+ const head = this.document.head;
52
+ let style = this.document.getElementById(IONIC_STYLE_ID);
53
+ if (!style) {
54
+ style = this.document.createElement('style');
55
+ style.id = IONIC_STYLE_ID;
56
+ head.appendChild(style);
57
+ }
58
+ const resolved = resolveTheme(config);
59
+ const vars = ionicVarsAdapter.vars(resolved);
60
+ style.textContent = this.buildAdapterCss('ionic', vars);
61
+ }
62
+ /** Remove a runtime-applied theme, falling back to the build-time CSS. */
63
+ clearTheme() {
64
+ this.document.getElementById(STYLE_ID)?.remove();
65
+ }
66
+ /** Remove the Ionic adapter stylesheet. */
67
+ clearIonicTheme() {
68
+ this.document.getElementById(IONIC_STYLE_ID)?.remove();
69
+ }
70
+ buildAdapterCss(adapterName, vars) {
71
+ const lines = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`);
72
+ return `/* @ngxsmk/theme — ${adapterName} adapter */\n:root {\n${lines.join('\n')}\n}`;
73
+ }
74
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxThemeInjectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
75
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxThemeInjectorService, providedIn: 'root' }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxThemeInjectorService, decorators: [{
78
+ type: Injectable,
79
+ args: [{ providedIn: 'root' }]
80
+ }] });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUtaW5qZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvdGhlbWUtaW5qZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUd2RSxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUM7QUFDaEMsTUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUM7QUFFNUM7Ozs7Ozs7O0dBUUc7QUFFSCxNQUFNLE9BQU8sdUJBQXVCO0lBRHBDO1FBRW1CLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0E4RDlDO0lBNURDOzs7Ozs7O09BT0c7SUFDSCxVQUFVLENBQUMsTUFBbUIsRUFBRSxPQUE0QjtRQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQTRCLENBQUM7UUFDOUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLEtBQUssQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsTUFBbUI7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUE0QixDQUFDO1FBQ3BGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxLQUFLLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVPLGVBQWUsQ0FBQyxXQUFtQixFQUFFLElBQTRCO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsT0FBTyxzQkFBc0IsV0FBVyx5QkFBeUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3pGLENBQUM7OEdBOURVLHVCQUF1QjtrSEFBdkIsdUJBQXVCLGNBRFYsTUFBTTs7MkZBQ25CLHVCQUF1QjtrQkFEbkMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGJ1aWxkVGhlbWVDc3MgfSBmcm9tICcuL2Nzcyc7XG5pbXBvcnQgeyByZXNvbHZlVGhlbWUgfSBmcm9tICcuL2RlZmluZS1jb25maWcnO1xuaW1wb3J0IHsgVG9rZW5PdXRwdXRBZGFwdGVyLCBpb25pY1ZhcnNBZGFwdGVyIH0gZnJvbSAnLi90b2tlbi1hZGFwdGVyJztcbmltcG9ydCB7IFRoZW1lQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IFNUWUxFX0lEID0gJ25neHNtay10aGVtZSc7XG5jb25zdCBJT05JQ19TVFlMRV9JRCA9ICduZ3hzbWstaW9uaWMtdGhlbWUnO1xuXG4vKipcbiAqIEluamVjdHMgZ2VuZXJhdGVkIHRoZW1lIENTUyBpbnRvIHRoZSBkb2N1bWVudCBhdCBydW50aW1lLlxuICpcbiAqIERlY291cGxlZCBmcm9tIGRhcmstbW9kZSBzd2l0Y2hpbmcgc28gY29uc3VtZXJzIHdobyBvbmx5IG5lZWRcbiAqIHRva2VuIGluamVjdGlvbiAoZS5nLiB0aGUgQ0xJIHRoZW1lLXByZXZpZXcpIGRvbid0IHB1bGwgaW5cbiAqIGNsYXNzLXRvZ2dsZSAvIGxvY2FsU3RvcmFnZSAvIG1hdGNoTWVkaWEgbG9naWMuXG4gKlxuICogU1NSLXNhZmU6IGFsbCBET00gYWNjZXNzIGdvZXMgdGhyb3VnaCB0aGUgaW5qZWN0ZWQgZG9jdW1lbnQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmd4VGhlbWVJbmplY3RvclNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAvKipcbiAgICogQXBwbHkgYSB0aGVtZSBhdCBydW50aW1lLiBHZW5lcmF0ZXMgdG9rZW4gQ1NTIGZyb20gdGhlIGNvbmZpZyBhbmQgc3dhcHNcbiAgICogaXQgaW50byBhIGRlZGljYXRlZCBgPHN0eWxlPmAgZWxlbWVudCwgb3ZlcnJpZGluZyB0aGUgYnVpbGQtdGltZSB0aGVtZS5cbiAgICpcbiAgICogQHBhcmFtIGFkYXB0ZXIgT3B0aW9uYWwgb3V0cHV0IGFkYXB0ZXIuIERlZmF1bHRzIHRvIHRoZSBzdGFuZGFyZCBOR1hTTUtcbiAgICogICBgLS1uZ3hzbWstKmAgQ1NTIHZhcmlhYmxlcy4gUGFzcyBgaW9uaWNWYXJzQWRhcHRlcmAgdG8gYWxzbyBnZW5lcmF0ZVxuICAgKiAgIGAtLWlvbi0qYCB2YXJpYWJsZXMgZm9yIElvbmljIGNvbXBvbmVudHMuXG4gICAqL1xuICBhcHBseVRoZW1lKGNvbmZpZzogVGhlbWVDb25maWcsIGFkYXB0ZXI/OiBUb2tlbk91dHB1dEFkYXB0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy5kb2N1bWVudC5oZWFkO1xuICAgIGxldCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVfSUQpIGFzIEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghc3R5bGUpIHtcbiAgICAgIHN0eWxlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUuaWQgPSBTVFlMRV9JRDtcbiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cblxuICAgIGxldCBjc3MgPSBidWlsZFRoZW1lQ3NzKGNvbmZpZyk7XG5cbiAgICBpZiAoYWRhcHRlcikge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlVGhlbWUoY29uZmlnKTtcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmFycyA9IGFkYXB0ZXIudmFycyhyZXNvbHZlZCk7XG4gICAgICBjc3MgKz0gJ1xcbicgKyB0aGlzLmJ1aWxkQWRhcHRlckNzcyhhZGFwdGVyLm5hbWUsIHBsYXRmb3JtVmFycyk7XG4gICAgfVxuXG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgSW9uaWMtc3BlY2lmaWMgdG9rZW4gdmFyaWFibGVzIGFsb25nc2lkZSB0aGUgc3RhbmRhcmQgTkdYU01LIHRoZW1lLlxuICAgKiBHZW5lcmF0ZXMgYC0taW9uLSpgIHZhcmlhYmxlcyBkZXJpdmVkIGZyb20gdGhlIHNhbWUgYFRoZW1lQ29uZmlnYC5cbiAgICovXG4gIGFwcGx5SW9uaWNUaGVtZShjb25maWc6IFRoZW1lQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZG9jdW1lbnQuaGVhZDtcbiAgICBsZXQgc3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKElPTklDX1NUWUxFX0lEKSBhcyBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXN0eWxlKSB7XG4gICAgICBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLmlkID0gSU9OSUNfU1RZTEVfSUQ7XG4gICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVUaGVtZShjb25maWcpO1xuICAgIGNvbnN0IHZhcnMgPSBpb25pY1ZhcnNBZGFwdGVyLnZhcnMocmVzb2x2ZWQpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gdGhpcy5idWlsZEFkYXB0ZXJDc3MoJ2lvbmljJywgdmFycyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgcnVudGltZS1hcHBsaWVkIHRoZW1lLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGJ1aWxkLXRpbWUgQ1NTLiAqL1xuICBjbGVhclRoZW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVfSUQpPy5yZW1vdmUoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgdGhlIElvbmljIGFkYXB0ZXIgc3R5bGVzaGVldC4gKi9cbiAgY2xlYXJJb25pY1RoZW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoSU9OSUNfU1RZTEVfSUQpPy5yZW1vdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBZGFwdGVyQ3NzKGFkYXB0ZXJOYW1lOiBzdHJpbmcsIHZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXModmFycykubWFwKChbaywgdl0pID0+IGAgICR7a306ICR7dn07YCk7XG4gICAgcmV0dXJuIGAvKiBAbmd4c21rL3RoZW1lIOKAlCAke2FkYXB0ZXJOYW1lfSBhZGFwdGVyICovXFxuOnJvb3Qge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxufWA7XG4gIH1cbn1cbiJdfQ==
@@ -1,20 +1,21 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import { Injectable, computed, effect, inject, signal } from '@angular/core';
3
- import { buildThemeCss } from './css';
3
+ import { NgxThemeInjectorService } from './theme-injector.service';
4
4
  import * as i0 from "@angular/core";
5
5
  const STORAGE_KEY = 'ngxsmk-theme-mode';
6
- const STYLE_ID = 'ngxsmk-theme';
7
6
  /**
8
7
  * Runtime theme control: dark-mode switching (class strategy) and dynamic
9
8
  * theme application by injecting generated token CSS into the document.
10
9
  *
10
+ * CSS injection is delegated to {@link NgxThemeInjectorService} for
11
+ * consumers who only need token injection without dark-mode logic.
12
+ *
11
13
  * SSR-safe: all DOM access goes through the injected document and degrades
12
14
  * gracefully when `window`/`matchMedia` are unavailable.
13
15
  */
14
16
  export class NgxsmkThemeService {
15
17
  constructor() {
16
- // Inject DOCUMENT first so that restoreMode() and matchSystemDark()
17
- // can safely access it when the signals are initialised below.
18
+ this.injector = inject(NgxThemeInjectorService);
18
19
  this.document = inject(DOCUMENT);
19
20
  this.mode = signal(this.restoreMode());
20
21
  this.systemDark = signal(this.matchSystemDark());
@@ -37,23 +38,21 @@ export class NgxsmkThemeService {
37
38
  toggle() {
38
39
  this.setMode(this.isDark() ? 'light' : 'dark');
39
40
  }
40
- /**
41
- * Apply a theme at runtime. Generates token CSS from the config and swaps
42
- * it into a dedicated `<style>` element, overriding the build-time theme.
43
- */
44
- applyTheme(config) {
45
- const head = this.document.head;
46
- let style = this.document.getElementById(STYLE_ID);
47
- if (!style) {
48
- style = this.document.createElement('style');
49
- style.id = STYLE_ID;
50
- head.appendChild(style);
51
- }
52
- style.textContent = buildThemeCss(config);
41
+ /** @see NgxThemeInjectorService.applyTheme */
42
+ applyTheme(config, adapter) {
43
+ this.injector.applyTheme(config, adapter);
53
44
  }
54
- /** Remove a runtime-applied theme, falling back to the build-time CSS. */
45
+ /** @see NgxThemeInjectorService.applyIonicTheme */
46
+ applyIonicTheme(config) {
47
+ this.injector.applyIonicTheme(config);
48
+ }
49
+ /** @see NgxThemeInjectorService.clearTheme */
55
50
  clearTheme() {
56
- this.document.getElementById(STYLE_ID)?.remove();
51
+ this.injector.clearTheme();
52
+ }
53
+ /** @see NgxThemeInjectorService.clearIonicTheme */
54
+ clearIonicTheme() {
55
+ this.injector.clearIonicTheme();
57
56
  }
58
57
  restoreMode() {
59
58
  try {
@@ -77,4 +76,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
77
76
  type: Injectable,
78
77
  args: [{ providedIn: 'root' }]
79
78
  }], ctorParameters: () => [] });
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFLdEMsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUM7QUFDeEMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDO0FBRWhDOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFXN0I7UUFDRSxvRUFBb0U7UUFDcEUsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFZLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQ3RFLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3RGLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0VBQXdFO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsTUFBbUI7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUE0QixDQUFDO1FBQzlFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxLQUFLLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxLQUFLLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdFLElBQUksTUFBTSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyQkFBMkI7UUFDN0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO0lBQ2xHLENBQUM7OEdBN0VVLGtCQUFrQjtrSEFBbEIsa0JBQWtCLGNBREwsTUFBTTs7MkZBQ25CLGtCQUFrQjtrQkFEOUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYnVpbGRUaGVtZUNzcyB9IGZyb20gJy4vY3NzJztcbmltcG9ydCB7IFRoZW1lQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFRoZW1lTW9kZSA9ICdsaWdodCcgfCAnZGFyaycgfCAnc3lzdGVtJztcblxuY29uc3QgU1RPUkFHRV9LRVkgPSAnbmd4c21rLXRoZW1lLW1vZGUnO1xuY29uc3QgU1RZTEVfSUQgPSAnbmd4c21rLXRoZW1lJztcblxuLyoqXG4gKiBSdW50aW1lIHRoZW1lIGNvbnRyb2w6IGRhcmstbW9kZSBzd2l0Y2hpbmcgKGNsYXNzIHN0cmF0ZWd5KSBhbmQgZHluYW1pY1xuICogdGhlbWUgYXBwbGljYXRpb24gYnkgaW5qZWN0aW5nIGdlbmVyYXRlZCB0b2tlbiBDU1MgaW50byB0aGUgZG9jdW1lbnQuXG4gKlxuICogU1NSLXNhZmU6IGFsbCBET00gYWNjZXNzIGdvZXMgdGhyb3VnaCB0aGUgaW5qZWN0ZWQgZG9jdW1lbnQgYW5kIGRlZ3JhZGVzXG4gKiBncmFjZWZ1bGx5IHdoZW4gYHdpbmRvd2AvYG1hdGNoTWVkaWFgIGFyZSB1bmF2YWlsYWJsZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZ3hzbWtUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudDtcblxuICAvKiogVXNlciBwcmVmZXJlbmNlOiBleHBsaWNpdCBsaWdodC9kYXJrIG9yIGZvbGxvdyB0aGUgT1MuICovXG4gIHJlYWRvbmx5IG1vZGU6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxUaGVtZU1vZGU+PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN5c3RlbURhcms6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxib29sZWFuPj47XG5cbiAgLyoqIEVmZmVjdGl2ZSBkYXJrbmVzcyBhZnRlciByZXNvbHZpbmcgYHN5c3RlbWAgYWdhaW5zdCB0aGUgT1Mgc2V0dGluZy4gKi9cbiAgcmVhZG9ubHkgaXNEYXJrOiBSZXR1cm5UeXBlPHR5cGVvZiBjb21wdXRlZDxib29sZWFuPj47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5qZWN0IERPQ1VNRU5UIGZpcnN0IHNvIHRoYXQgcmVzdG9yZU1vZGUoKSBhbmQgbWF0Y2hTeXN0ZW1EYXJrKClcbiAgICAvLyBjYW4gc2FmZWx5IGFjY2VzcyBpdCB3aGVuIHRoZSBzaWduYWxzIGFyZSBpbml0aWFsaXNlZCBiZWxvdy5cbiAgICB0aGlzLmRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAgIHRoaXMubW9kZSA9IHNpZ25hbDxUaGVtZU1vZGU+KHRoaXMucmVzdG9yZU1vZGUoKSk7XG4gICAgdGhpcy5zeXN0ZW1EYXJrID0gc2lnbmFsKHRoaXMubWF0Y2hTeXN0ZW1EYXJrKCkpO1xuICAgIHRoaXMuaXNEYXJrID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgIHRoaXMubW9kZSgpID09PSAnc3lzdGVtJyA/IHRoaXMuc3lzdGVtRGFyaygpIDogdGhpcy5tb2RlKCkgPT09ICdkYXJrJyxcbiAgICApO1xuXG4gICAgY29uc3QgbWVkaWEgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5tYXRjaE1lZGlhPy4oJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKTtcbiAgICBtZWRpYT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHRoaXMuc3lzdGVtRGFyay5zZXQoZS5tYXRjaGVzKSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZGFyaycsIHRoaXMuaXNEYXJrKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBUaGVtZU1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUuc2V0KG1vZGUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5sb2NhbFN0b3JhZ2U/LnNldEl0ZW0oU1RPUkFHRV9LRVksIG1vZGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3RvcmFnZSB1bmF2YWlsYWJsZSAoU1NSLCBwcml2YWN5IG1vZGUpIOKAlCBwcmVmZXJlbmNlIGlzIHNlc3Npb24tb25seS5cbiAgICB9XG4gIH1cblxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRNb2RlKHRoaXMuaXNEYXJrKCkgPyAnbGlnaHQnIDogJ2RhcmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIHRoZW1lIGF0IHJ1bnRpbWUuIEdlbmVyYXRlcyB0b2tlbiBDU1MgZnJvbSB0aGUgY29uZmlnIGFuZCBzd2Fwc1xuICAgKiBpdCBpbnRvIGEgZGVkaWNhdGVkIGA8c3R5bGU+YCBlbGVtZW50LCBvdmVycmlkaW5nIHRoZSBidWlsZC10aW1lIHRoZW1lLlxuICAgKi9cbiAgYXBwbHlUaGVtZShjb25maWc6IFRoZW1lQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZG9jdW1lbnQuaGVhZDtcbiAgICBsZXQgc3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNUWUxFX0lEKSBhcyBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXN0eWxlKSB7XG4gICAgICBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLmlkID0gU1RZTEVfSUQ7XG4gICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBidWlsZFRoZW1lQ3NzKGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgcnVudGltZS1hcHBsaWVkIHRoZW1lLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGJ1aWxkLXRpbWUgQ1NTLiAqL1xuICBjbGVhclRoZW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVfSUQpPy5yZW1vdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU1vZGUoKTogVGhlbWVNb2RlIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldz8ubG9jYWxTdG9yYWdlPy5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQgPT09ICdsaWdodCcgfHwgc3RvcmVkID09PSAnZGFyaycgfHwgc3RvcmVkID09PSAnc3lzdGVtJykge1xuICAgICAgICByZXR1cm4gc3RvcmVkO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQuXG4gICAgfVxuICAgIHJldHVybiAnc3lzdGVtJztcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hTeXN0ZW1EYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5tYXRjaE1lZGlhPy4oJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzID8/IGZhbHNlO1xuICB9XG59XG4iXX0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3RoZW1lL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBTW5FLE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDO0FBRXhDOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFZN0I7UUFWaUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBVzFELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFZLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQ3RFLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3RGLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0VBQXdFO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsVUFBVSxDQUFDLE1BQW1CLEVBQUUsT0FBNEI7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsZUFBZSxDQUFDLE1BQW1CO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsVUFBVTtRQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdFLElBQUksTUFBTSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyQkFBMkI7UUFDN0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO0lBQ2xHLENBQUM7OEdBNUVVLGtCQUFrQjtrSEFBbEIsa0JBQWtCLGNBREwsTUFBTTs7MkZBQ25CLGtCQUFrQjtrQkFEOUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4VGhlbWVJbmplY3RvclNlcnZpY2UgfSBmcm9tICcuL3RoZW1lLWluamVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9rZW5PdXRwdXRBZGFwdGVyIH0gZnJvbSAnLi90b2tlbi1hZGFwdGVyJztcbmltcG9ydCB7IFRoZW1lQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFRoZW1lTW9kZSA9ICdsaWdodCcgfCAnZGFyaycgfCAnc3lzdGVtJztcblxuY29uc3QgU1RPUkFHRV9LRVkgPSAnbmd4c21rLXRoZW1lLW1vZGUnO1xuXG4vKipcbiAqIFJ1bnRpbWUgdGhlbWUgY29udHJvbDogZGFyay1tb2RlIHN3aXRjaGluZyAoY2xhc3Mgc3RyYXRlZ3kpIGFuZCBkeW5hbWljXG4gKiB0aGVtZSBhcHBsaWNhdGlvbiBieSBpbmplY3RpbmcgZ2VuZXJhdGVkIHRva2VuIENTUyBpbnRvIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBDU1MgaW5qZWN0aW9uIGlzIGRlbGVnYXRlZCB0byB7QGxpbmsgTmd4VGhlbWVJbmplY3RvclNlcnZpY2V9IGZvclxuICogY29uc3VtZXJzIHdobyBvbmx5IG5lZWQgdG9rZW4gaW5qZWN0aW9uIHdpdGhvdXQgZGFyay1tb2RlIGxvZ2ljLlxuICpcbiAqIFNTUi1zYWZlOiBhbGwgRE9NIGFjY2VzcyBnb2VzIHRocm91Z2ggdGhlIGluamVjdGVkIGRvY3VtZW50IGFuZCBkZWdyYWRlc1xuICogZ3JhY2VmdWxseSB3aGVuIGB3aW5kb3dgL2BtYXRjaE1lZGlhYCBhcmUgdW5hdmFpbGFibGUuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmd4c21rVGhlbWVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoTmd4VGhlbWVJbmplY3RvclNlcnZpY2UpO1xuXG4gIC8qKiBVc2VyIHByZWZlcmVuY2U6IGV4cGxpY2l0IGxpZ2h0L2Rhcmsgb3IgZm9sbG93IHRoZSBPUy4gKi9cbiAgcmVhZG9ubHkgbW9kZTogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFRoZW1lTW9kZT4+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3lzdGVtRGFyazogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPGJvb2xlYW4+PjtcblxuICAvKiogRWZmZWN0aXZlIGRhcmtuZXNzIGFmdGVyIHJlc29sdmluZyBgc3lzdGVtYCBhZ2FpbnN0IHRoZSBPUyBzZXR0aW5nLiAqL1xuICByZWFkb25seSBpc0Rhcms6IFJldHVyblR5cGU8dHlwZW9mIGNvbXB1dGVkPGJvb2xlYW4+PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAgIHRoaXMubW9kZSA9IHNpZ25hbDxUaGVtZU1vZGU+KHRoaXMucmVzdG9yZU1vZGUoKSk7XG4gICAgdGhpcy5zeXN0ZW1EYXJrID0gc2lnbmFsKHRoaXMubWF0Y2hTeXN0ZW1EYXJrKCkpO1xuICAgIHRoaXMuaXNEYXJrID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgIHRoaXMubW9kZSgpID09PSAnc3lzdGVtJyA/IHRoaXMuc3lzdGVtRGFyaygpIDogdGhpcy5tb2RlKCkgPT09ICdkYXJrJyxcbiAgICApO1xuXG4gICAgY29uc3QgbWVkaWEgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5tYXRjaE1lZGlhPy4oJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKTtcbiAgICBtZWRpYT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHRoaXMuc3lzdGVtRGFyay5zZXQoZS5tYXRjaGVzKSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZGFyaycsIHRoaXMuaXNEYXJrKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBUaGVtZU1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUuc2V0KG1vZGUpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5sb2NhbFN0b3JhZ2U/LnNldEl0ZW0oU1RPUkFHRV9LRVksIG1vZGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3RvcmFnZSB1bmF2YWlsYWJsZSAoU1NSLCBwcml2YWN5IG1vZGUpIOKAlCBwcmVmZXJlbmNlIGlzIHNlc3Npb24tb25seS5cbiAgICB9XG4gIH1cblxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRNb2RlKHRoaXMuaXNEYXJrKCkgPyAnbGlnaHQnIDogJ2RhcmsnKTtcbiAgfVxuXG4gIC8qKiBAc2VlIE5neFRoZW1lSW5qZWN0b3JTZXJ2aWNlLmFwcGx5VGhlbWUgKi9cbiAgYXBwbHlUaGVtZShjb25maWc6IFRoZW1lQ29uZmlnLCBhZGFwdGVyPzogVG9rZW5PdXRwdXRBZGFwdGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbmplY3Rvci5hcHBseVRoZW1lKGNvbmZpZywgYWRhcHRlcik7XG4gIH1cblxuICAvKiogQHNlZSBOZ3hUaGVtZUluamVjdG9yU2VydmljZS5hcHBseUlvbmljVGhlbWUgKi9cbiAgYXBwbHlJb25pY1RoZW1lKGNvbmZpZzogVGhlbWVDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmluamVjdG9yLmFwcGx5SW9uaWNUaGVtZShjb25maWcpO1xuICB9XG5cbiAgLyoqIEBzZWUgTmd4VGhlbWVJbmplY3RvclNlcnZpY2UuY2xlYXJUaGVtZSAqL1xuICBjbGVhclRoZW1lKCk6IHZvaWQge1xuICAgIHRoaXMuaW5qZWN0b3IuY2xlYXJUaGVtZSgpO1xuICB9XG5cbiAgLyoqIEBzZWUgTmd4VGhlbWVJbmplY3RvclNlcnZpY2UuY2xlYXJJb25pY1RoZW1lICovXG4gIGNsZWFySW9uaWNUaGVtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmluamVjdG9yLmNsZWFySW9uaWNUaGVtZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlTW9kZSgpOiBUaGVtZU1vZGUge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5sb2NhbFN0b3JhZ2U/LmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgaWYgKHN0b3JlZCA9PT0gJ2xpZ2h0JyB8fCBzdG9yZWQgPT09ICdkYXJrJyB8fCBzdG9yZWQgPT09ICdzeXN0ZW0nKSB7XG4gICAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gZGVmYXVsdC5cbiAgICB9XG4gICAgcmV0dXJuICdzeXN0ZW0nO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaFN5c3RlbURhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc/Lm1hdGNoTWVkaWE/LignKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMgPz8gZmFsc2U7XG4gIH1cbn1cbiJdfQ==