@oneteme/jquery-organizer 0.0.1 → 0.0.3
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 +159 -60
- package/esm2022/lib/models/organizer-chart-adapter.mjs +98 -34
- package/esm2022/lib/models/organizer-chart-config.mjs +37 -0
- package/esm2022/lib/models/organizer-config.interface.mjs +1 -1
- package/esm2022/lib/models/organizer-utils.mjs +117 -1
- package/esm2022/lib/organizer-button/organizer-button.component.mjs +69 -20
- package/esm2022/lib/organizer-button/template-manager.utility.mjs +7 -0
- package/esm2022/lib/slice-panel/slice-panel.component.mjs +3 -3
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/oneteme-jquery-organizer.mjs +345 -77
- package/fesm2022/oneteme-jquery-organizer.mjs.map +1 -1
- package/lib/models/organizer-chart-adapter.d.ts +17 -10
- package/lib/models/organizer-chart-config.d.ts +32 -0
- package/lib/models/organizer-config.interface.d.ts +2 -0
- package/lib/models/organizer-utils.d.ts +4 -1
- package/lib/organizer-button/organizer-button.component.d.ts +1 -0
- package/lib/organizer-button/template-manager.utility.d.ts +4 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,11 @@ Bibliothèque Angular autonome pour la gestion décentralisée des configuration
|
|
|
7
7
|
- **Adapters** — Fonctions de conversion ChartConfig ↔ OrganizerConfig avec auto-détection d'unités
|
|
8
8
|
- **Facade** — Gestion centralisée d'état pour les champs visibles, regroupements, filtres
|
|
9
9
|
|
|
10
|
-
**
|
|
10
|
+
**Fonctionnalités principales** :
|
|
11
|
+
- **UnitConfig avec auto-scaling intelligent** des unités Y (ms → µs → s, etc.)
|
|
12
|
+
- **Template normalization** avec validation permissive des états et auto-détection de templates
|
|
13
|
+
- **Slice loading unification** dans le composant organizer (Promise/Observable dual-support)
|
|
14
|
+
- **Chart binding facade** pour simplifier l'intégration ChartConfig ↔ Organizer (50% réduction de boilerplate)
|
|
11
15
|
|
|
12
16
|
---
|
|
13
17
|
|
|
@@ -251,31 +255,87 @@ Valeur Format Raison
|
|
|
251
255
|
|
|
252
256
|
## Chart Adapter
|
|
253
257
|
|
|
254
|
-
Les fonctions `organizer-chart-adapter.ts`
|
|
258
|
+
Les fonctions `organizer-chart-adapter.ts` fournissent une façade complète pour l'intégration ChartConfig ↔ OrganizerConfig :
|
|
259
|
+
|
|
260
|
+
### Normalisation d'État (Étape 1)
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
// Valide permissivement un état contre une config
|
|
264
|
+
export function normalizeOrganizerState(
|
|
265
|
+
state: OrganizerState,
|
|
266
|
+
config: OrganizerConfig
|
|
267
|
+
): OrganizerState
|
|
268
|
+
// - Filtre les références invalides (selectedY, selectedGroupBy, selectedSlices)
|
|
269
|
+
// - Maintient les fallbacks si nécessaire
|
|
270
|
+
// - Auto-détecte le template matching l'état final
|
|
271
|
+
|
|
272
|
+
// Applique un template et recalcule le template actif
|
|
273
|
+
export function normalizeTemplateToState(
|
|
274
|
+
template: OrganizerTemplate,
|
|
275
|
+
currentState: OrganizerState,
|
|
276
|
+
config: OrganizerConfig
|
|
277
|
+
): OrganizerState
|
|
278
|
+
// - Applique les champs du template (xField, yField, groupBy, etc.)
|
|
279
|
+
// - Recalcule selectedTemplate en matchant l'état final contre tous les templates
|
|
280
|
+
// - Gère les fallbacks si le template n'est pas complet
|
|
281
|
+
|
|
282
|
+
// Trouve le template matching l'état courant
|
|
283
|
+
export function resolveMatchingTemplateId(
|
|
284
|
+
templates: OrganizerTemplate[],
|
|
285
|
+
state: OrganizerState,
|
|
286
|
+
config: OrganizerConfig
|
|
287
|
+
): string | undefined
|
|
288
|
+
// - Itère sur tous les templates et retourne le premier match
|
|
289
|
+
// - Utilisé pour auto-set selectedTemplate lors de changements d'état
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Façade de Binding (Étape 3)
|
|
255
293
|
|
|
256
294
|
```typescript
|
|
257
|
-
//
|
|
295
|
+
// Interface pour les callbacks
|
|
296
|
+
export interface OrganizerChartBridgeOptions {
|
|
297
|
+
onFetchSliceData?: (filterKey: string) => Observable<any[]> | Promise<any[]>;
|
|
298
|
+
onExportVisual?: () => void;
|
|
299
|
+
onExportData?: () => void;
|
|
300
|
+
switchView?: {
|
|
301
|
+
currentView: 'chart' | 'table';
|
|
302
|
+
onSwitch: (newView: 'chart' | 'table') => void;
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Construit un binding prêt à utiliser
|
|
307
|
+
export function buildOrganizerChartBinding(
|
|
308
|
+
chartConfig: any,
|
|
309
|
+
options: OrganizerChartBridgeOptions
|
|
310
|
+
): OrganizerChartBinding
|
|
311
|
+
// Retourne: { config: OrganizerConfig, state: OrganizerState }
|
|
312
|
+
// - Appelle chartConfigToOrganizer + normalizeOrganizerState
|
|
313
|
+
// - Injecte les options (callbacks, export, etc.)
|
|
314
|
+
|
|
315
|
+
// Gestion unifiée des événements organizer
|
|
316
|
+
export function handleOrganizerChartEvent(
|
|
317
|
+
event: OrganizerButtonEvent,
|
|
318
|
+
chartConfig: any,
|
|
319
|
+
currentBinding: OrganizerChartBinding,
|
|
320
|
+
options: OrganizerChartBridgeOptions
|
|
321
|
+
): { binding: OrganizerChartBinding, shouldRefetch: boolean }
|
|
322
|
+
// - Applique l'événement au ChartConfig
|
|
323
|
+
// - Reconstruit le binding
|
|
324
|
+
// - Retourne shouldRefetch = true si ySelected ou templateSelected
|
|
325
|
+
|
|
326
|
+
// Utilitaires (existants, maintenant intégrés à la façade)
|
|
258
327
|
export function chartConfigToOrganizer(
|
|
259
328
|
chartConfig: any,
|
|
260
329
|
options?: OrganizerChartBridgeOptions
|
|
261
330
|
): OrganizerConfig
|
|
262
331
|
|
|
263
|
-
// ChartConfig → OrganizerState
|
|
264
332
|
export function chartConfigToState(chartConfig: any): OrganizerState
|
|
265
333
|
|
|
266
|
-
// ChartConfig → Événement + État unifié
|
|
267
|
-
export function chartConfigToUnifiedState(
|
|
268
|
-
chartConfig: any,
|
|
269
|
-
viewMode?: 'chart' | 'table'
|
|
270
|
-
): OrganizerUnifiedState
|
|
271
|
-
|
|
272
|
-
// Applique un OrganizerEvent à ChartConfig
|
|
273
334
|
export function applyOrganizerEventToChart(
|
|
274
335
|
event: OrganizerButtonEvent,
|
|
275
336
|
chartConfig: any
|
|
276
337
|
): void
|
|
277
338
|
|
|
278
|
-
// Résout l'unité Y pour l'événement
|
|
279
339
|
export function resolveYUnit(
|
|
280
340
|
chartConfig: any,
|
|
281
341
|
selectedY?: string,
|
|
@@ -287,17 +347,12 @@ export function resolveYUnit(
|
|
|
287
347
|
|
|
288
348
|
## Intégration avec jquery-echarts
|
|
289
349
|
|
|
290
|
-
### Pattern
|
|
291
|
-
|
|
292
|
-
1. **Initialisation** : Construire OrganizerConfig depuis ChartConfig
|
|
293
|
-
2. **Réaction aux événements** : Appliquer OrganizerEvent à ChartConfig
|
|
294
|
-
3. **Refetch** : Recharger les données avec la nouvelle config
|
|
350
|
+
### Pattern Simplifié avec Binding Facade (v0.0.44+) ⭐ **Recommandé**
|
|
295
351
|
|
|
296
|
-
|
|
352
|
+
La **façade de binding** unifie les 3 étapes et réduit le boilerplate de ~50% :
|
|
297
353
|
|
|
298
354
|
```typescript
|
|
299
|
-
import {
|
|
300
|
-
import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart } from '@oneteme/jquery-organizer';
|
|
355
|
+
import { buildOrganizerChartBinding, handleOrganizerChartEvent, OrganizerChartBridgeOptions } from '@oneteme/jquery-organizer';
|
|
301
356
|
|
|
302
357
|
@Component({
|
|
303
358
|
selector: 'app-kpi',
|
|
@@ -312,44 +367,56 @@ import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart
|
|
|
312
367
|
`
|
|
313
368
|
})
|
|
314
369
|
export class KpiComponent {
|
|
315
|
-
$latency
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
chartConfig: REST_LATENCY_CHART_CONFIG('day'),
|
|
319
|
-
chartProvider: {},
|
|
320
|
-
data: []
|
|
321
|
-
};
|
|
370
|
+
$latency: any; // { config, state, chartProvider, data }
|
|
371
|
+
private $latencyChartConfig = REST_LATENCY_CHART_CONFIG('day');
|
|
372
|
+
@ViewChild('latencyChart') private _latencyChart: ChartComponent<any, any>;
|
|
322
373
|
|
|
323
374
|
ngOnInit() {
|
|
324
|
-
// Initialisation
|
|
325
|
-
this.$latency
|
|
326
|
-
|
|
375
|
+
// Initialisation unifiée via façade
|
|
376
|
+
this.$latency = buildOrganizerChartBinding(
|
|
377
|
+
this.$latencyChartConfig,
|
|
378
|
+
this._latencyOrganizerOptions()
|
|
379
|
+
);
|
|
327
380
|
this._fetchLatency();
|
|
328
381
|
}
|
|
329
382
|
|
|
330
383
|
onLatencyViewChange(event: OrganizerButtonEvent): void {
|
|
331
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
384
|
+
// Traitement événement + calcul intelligent du refetch
|
|
385
|
+
const result = handleOrganizerChartEvent(
|
|
386
|
+
event,
|
|
387
|
+
this.$latencyChartConfig,
|
|
388
|
+
this.$latency,
|
|
389
|
+
this._latencyOrganizerOptions()
|
|
390
|
+
);
|
|
391
|
+
this.$latency = result.binding;
|
|
336
392
|
|
|
337
|
-
// Refetch
|
|
338
|
-
|
|
393
|
+
// Refetch uniquement si nécessaire (ySelected, templateSelected, etc.)
|
|
394
|
+
if (result.shouldRefetch) {
|
|
395
|
+
this._fetchLatency();
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
private _latencyOrganizerOptions(): OrganizerChartBridgeOptions {
|
|
400
|
+
return {
|
|
401
|
+
onFetchSliceData: (filterKey: string) => this._fetchSliceData(filterKey),
|
|
402
|
+
onExportVisual: () => this._latencyChart?.exportImage('latence'),
|
|
403
|
+
onExportData: () => this._latencyChart?.exportData('latence')
|
|
404
|
+
};
|
|
339
405
|
}
|
|
340
406
|
|
|
341
407
|
private _fetchLatency(): void {
|
|
342
|
-
const cfg = this.$
|
|
408
|
+
const cfg = this.$latencyChartConfig;
|
|
343
409
|
const ind = cfg.indicators.items.find(i => i.selected);
|
|
410
|
+
const grp = cfg.groups.items.find(g => g.selected);
|
|
344
411
|
|
|
345
|
-
this._httpService.getLatency({ indicator: ind,
|
|
346
|
-
const series = buildSeries(cfg.series.items, ind,
|
|
412
|
+
this._httpService.getLatency({ indicator: ind, group: grp }).subscribe(data => {
|
|
413
|
+
const series = buildSeries(cfg.series.items, ind, grp, null, data);
|
|
347
414
|
|
|
348
|
-
// Injection de l'unité (simple string ou UnitConfig)
|
|
349
415
|
this.$latency.chartProvider = {
|
|
350
416
|
...this.BASE_CHART_PROVIDER,
|
|
351
417
|
series,
|
|
352
|
-
|
|
418
|
+
xtitle: grp?.menu?.label || 'Date', // Titre X dynamique
|
|
419
|
+
yUnit: ind?.unit // ← string | UnitConfig (auto-scaling)
|
|
353
420
|
};
|
|
354
421
|
|
|
355
422
|
this.$latency.data = data;
|
|
@@ -358,6 +425,43 @@ export class KpiComponent {
|
|
|
358
425
|
}
|
|
359
426
|
```
|
|
360
427
|
|
|
428
|
+
### Architecture des 3 Étapes
|
|
429
|
+
|
|
430
|
+
**Étape 1: Normalisation d'État**
|
|
431
|
+
- `normalizeOrganizerState()` valide les références et auto-détecte le template
|
|
432
|
+
- Utilisée automatiquement par `buildOrganizerChartBinding()`
|
|
433
|
+
- Stratégie permissive : filtre les références invalides sans levée d'exception
|
|
434
|
+
|
|
435
|
+
**Étape 2: Chargement des Slices (organizer-button.component.ts)**
|
|
436
|
+
- Méthode `syncSliceState()` gère Promise et Observable uniformément
|
|
437
|
+
- Unifie les chemins manuels (onSliceClick) et template-driven (onTemplateSelect)
|
|
438
|
+
- Émet sliceStateChange pour mise à jour du binding côté app
|
|
439
|
+
|
|
440
|
+
**Étape 3: Façade de Binding**
|
|
441
|
+
- `buildOrganizerChartBinding()` : Construction du binding initial
|
|
442
|
+
- `handleOrganizerChartEvent()` : Traitement unifié avec retour du shouldRefetch
|
|
443
|
+
- Encapsule applyOrganizerEventToChart + normalisation + refetch logic
|
|
444
|
+
|
|
445
|
+
### Pattern Détaillé (Utilitaires bas-niveau)
|
|
446
|
+
|
|
447
|
+
Pour des besoins avancés ou migration progressive :
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart } from '@oneteme/jquery-organizer';
|
|
451
|
+
|
|
452
|
+
onLatencyViewChange(event: OrganizerButtonEvent): void {
|
|
453
|
+
// Étape 1: Appliquer l'événement au ChartConfig
|
|
454
|
+
applyOrganizerEventToChart(event, this.$latencyChartConfig);
|
|
455
|
+
|
|
456
|
+
// Étape 2: Recalculer l'état (avec normalisation)
|
|
457
|
+
this.$latency.config = chartConfigToOrganizer(this.$latencyChartConfig);
|
|
458
|
+
this.$latency.state = chartConfigToState(this.$latencyChartConfig);
|
|
459
|
+
|
|
460
|
+
// Étape 3: Refetch
|
|
461
|
+
this._fetchLatency();
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
361
465
|
---
|
|
362
466
|
|
|
363
467
|
## Intégration avec jquery-table
|
|
@@ -397,11 +501,22 @@ export { OrganizerButtonModule } from './organizer-button.module';
|
|
|
397
501
|
export { SlicePanelComponent } from './slice-panel.component';
|
|
398
502
|
|
|
399
503
|
// Interfaces
|
|
400
|
-
export { OrganizerConfig, OrganizerState, OrganizerButtonEvent, OrganizerSliceState } from './organizer-config.interface';
|
|
504
|
+
export { OrganizerConfig, OrganizerState, OrganizerButtonEvent, OrganizerSliceState, OrganizerChartBinding } from './organizer-config.interface';
|
|
505
|
+
export { OrganizerChartBridgeOptions, OrganizerTemplate } from './organizer-chart-adapter';
|
|
401
506
|
export { SliceConfig, SliceColumnDef, SliceCategory } from './slice-panel.model';
|
|
402
507
|
|
|
403
|
-
// Adapters
|
|
508
|
+
// Adapters & Façade (v0.0.44+)
|
|
404
509
|
export {
|
|
510
|
+
// Binding Facade (recommandé)
|
|
511
|
+
buildOrganizerChartBinding,
|
|
512
|
+
handleOrganizerChartEvent,
|
|
513
|
+
|
|
514
|
+
// Normalisation d'état
|
|
515
|
+
normalizeOrganizerState,
|
|
516
|
+
normalizeTemplateToState,
|
|
517
|
+
resolveMatchingTemplateId,
|
|
518
|
+
|
|
519
|
+
// Utilitaires bas-niveau
|
|
405
520
|
chartConfigToOrganizer,
|
|
406
521
|
chartConfigToState,
|
|
407
522
|
chartConfigToUnifiedState,
|
|
@@ -418,22 +533,6 @@ export { OrganizerFacade } from './organizer-facade/organizer-facade';
|
|
|
418
533
|
|
|
419
534
|
---
|
|
420
535
|
|
|
421
|
-
## Changelog
|
|
422
|
-
|
|
423
|
-
### v0.0.43+ (2026-07-03)
|
|
424
|
-
- Ajout du support **UnitConfig** avec auto-scaling intelligent
|
|
425
|
-
- Exports des adapters (chartConfigToOrganizer, resolveYUnit, etc.)
|
|
426
|
-
- Renommage des propriétés OrganizerFacade (Column → Field) dans jquery-table
|
|
427
|
-
- Support des `ScaleConfig` pour conversion dynamique d'unités
|
|
428
|
-
- Formatage adaptatif de la précision (smartFormatY) en chart-utils
|
|
429
|
-
- Intégration complète avec REST_LATENCY_CHART_CONFIG
|
|
430
|
-
|
|
431
|
-
### v0.0.42
|
|
432
|
-
- Refactoring des exports publics
|
|
433
|
-
- Consolidation de SlicePanelComponent
|
|
434
|
-
|
|
435
|
-
---
|
|
436
|
-
|
|
437
536
|
## Support
|
|
438
537
|
|
|
439
538
|
Pour des questions ou des bugs, ouvrir une issue dans le repository jquery-charts.
|
|
@@ -1,14 +1,24 @@
|
|
|
1
|
-
import { buildYFields, resolveYKey } from './organizer-utils';
|
|
1
|
+
import { buildYFields, normalizeOrganizerState, resolveYKey } from './organizer-utils';
|
|
2
|
+
import { getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';
|
|
3
|
+
export { getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';
|
|
2
4
|
export function chartConfigToOrganizer(chartConfig, options = {}) {
|
|
3
|
-
if (!chartConfig)
|
|
5
|
+
if (!chartConfig) {
|
|
6
|
+
console.debug('[OrganizerChartAdapter] Empty chart config, returning empty organizer config');
|
|
4
7
|
return {};
|
|
8
|
+
}
|
|
9
|
+
console.debug('[OrganizerChartAdapter] Converting chart config to organizer', {
|
|
10
|
+
hasGroups: !!chartConfig.groups,
|
|
11
|
+
indicatorCount: chartConfig.indicators?.items?.length ?? 0,
|
|
12
|
+
filterCount: chartConfig.filters?.items?.length ?? 0
|
|
13
|
+
});
|
|
5
14
|
const { onFetchSliceData, onExportVisual, onExportData, switchView } = options;
|
|
6
|
-
const
|
|
7
|
-
const
|
|
15
|
+
const indicators = getIndicatorItems(chartConfig);
|
|
16
|
+
const activeIndicator = indicators.find(i => i.selected);
|
|
17
|
+
const baseXFields = getGroupItems(chartConfig)
|
|
8
18
|
.filter(g => !_isSynthetic(g))
|
|
9
19
|
.map(g => ({ id: g.key, label: g.menu.label || g.key }));
|
|
10
|
-
const yFields = buildYFields(
|
|
11
|
-
const stackFields = (activeIndicator
|
|
20
|
+
const yFields = buildYFields(indicators.map(i => ({ id: i.key, label: i.menu.label || i.key, group: i.group })));
|
|
21
|
+
const stackFields = getStackItems(activeIndicator)
|
|
12
22
|
.filter((s) => !_isSynthetic(s))
|
|
13
23
|
.map((s) => ({ id: s.key, label: s.menu.label || s.key }));
|
|
14
24
|
const seenKeys = new Set();
|
|
@@ -22,7 +32,8 @@ export function chartConfigToOrganizer(chartConfig, options = {}) {
|
|
|
22
32
|
xFields: mergedGroupFields,
|
|
23
33
|
yFields,
|
|
24
34
|
groups: mergedGroupFields,
|
|
25
|
-
slices: (chartConfig
|
|
35
|
+
slices: getFilterItems(chartConfig).map(f => ({ id: f.key, label: f.menu.label || f.key })),
|
|
36
|
+
templates: chartConfig.templates,
|
|
26
37
|
showReset: false,
|
|
27
38
|
onFetchSliceData,
|
|
28
39
|
showExport: !!(onExportVisual || onExportData),
|
|
@@ -32,20 +43,37 @@ export function chartConfigToOrganizer(chartConfig, options = {}) {
|
|
|
32
43
|
};
|
|
33
44
|
}
|
|
34
45
|
export function chartConfigToState(chartConfig) {
|
|
35
|
-
if (!chartConfig)
|
|
46
|
+
if (!chartConfig) {
|
|
47
|
+
console.debug('[OrganizerChartAdapter] Empty chart config for state conversion');
|
|
36
48
|
return {};
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
49
|
+
}
|
|
50
|
+
const indicators = getIndicatorItems(chartConfig);
|
|
51
|
+
const activeIndicator = indicators.find(i => i.selected);
|
|
52
|
+
const activeStack = getStackItems(activeIndicator).find((s) => s.selected);
|
|
53
|
+
const activeGroup = getGroupItems(chartConfig).find(g => g.selected);
|
|
54
|
+
const activeSlices = getFilterItems(chartConfig).filter(f => f.selected);
|
|
41
55
|
const indicatorGroup = activeIndicator?.group;
|
|
42
|
-
|
|
56
|
+
console.debug('[OrganizerChartAdapter] Current chart state', {
|
|
57
|
+
activeGroup: activeGroup?.key,
|
|
58
|
+
activeIndicator: activeIndicator?.key,
|
|
59
|
+
activeStack: activeStack?.key,
|
|
60
|
+
sliceCount: activeSlices.length
|
|
61
|
+
});
|
|
62
|
+
const state = {
|
|
43
63
|
selectedX: activeGroup?.key,
|
|
44
64
|
selectedY: indicatorGroup ?? activeIndicator?.key,
|
|
45
65
|
selectedYAggregate: indicatorGroup ? activeIndicator?.key : undefined,
|
|
46
66
|
selectedGroupBy: activeStack?.key,
|
|
47
67
|
selectedSlices: activeSlices.map(f => f.key),
|
|
48
68
|
};
|
|
69
|
+
const organizerConfig = chartConfigToOrganizer(chartConfig);
|
|
70
|
+
return normalizeOrganizerState(state, organizerConfig);
|
|
71
|
+
}
|
|
72
|
+
export function buildOrganizerChartBinding(chartConfig, options = {}) {
|
|
73
|
+
return {
|
|
74
|
+
config: chartConfigToOrganizer(chartConfig, options),
|
|
75
|
+
state: chartConfigToState(chartConfig)
|
|
76
|
+
};
|
|
49
77
|
}
|
|
50
78
|
export function chartConfigToUnifiedState(chartConfig, viewMode = 'chart') {
|
|
51
79
|
const state = chartConfigToState(chartConfig);
|
|
@@ -59,8 +87,11 @@ export function chartConfigToUnifiedState(chartConfig, viewMode = 'chart') {
|
|
|
59
87
|
};
|
|
60
88
|
}
|
|
61
89
|
export function applyOrganizerEventToChart(event, chartConfig) {
|
|
62
|
-
if (!chartConfig)
|
|
90
|
+
if (!chartConfig) {
|
|
91
|
+
console.debug('[OrganizerChartAdapter] Cannot apply event to empty chart config');
|
|
63
92
|
return;
|
|
93
|
+
}
|
|
94
|
+
console.debug('[OrganizerChartAdapter] Applying organizer event', { eventType: event.type, state: event.state });
|
|
64
95
|
const state = event.state;
|
|
65
96
|
_cleanSynthetics(chartConfig);
|
|
66
97
|
if (state.selectedX !== undefined)
|
|
@@ -73,11 +104,37 @@ export function applyOrganizerEventToChart(event, chartConfig) {
|
|
|
73
104
|
_applySliceSelection(state.selectedSlices, chartConfig);
|
|
74
105
|
event.resolvedYUnit = resolveYUnit(chartConfig, event.state.selectedY, event.state.selectedYAggregate);
|
|
75
106
|
}
|
|
107
|
+
export function handleOrganizerChartEvent(event, chartConfig, currentBinding, options = {}) {
|
|
108
|
+
console.debug('[OrganizerChartAdapter] Handling organizer event', { eventType: event.type });
|
|
109
|
+
if (event.type === 'viewSwitched') {
|
|
110
|
+
return {
|
|
111
|
+
binding: {
|
|
112
|
+
config: chartConfigToOrganizer(chartConfig, options),
|
|
113
|
+
state: { ...event.state }
|
|
114
|
+
},
|
|
115
|
+
shouldRefetch: false
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
applyOrganizerEventToChart(event, chartConfig);
|
|
119
|
+
if (event.type === 'ySelected' || event.type === 'templateSelected') {
|
|
120
|
+
return {
|
|
121
|
+
binding: buildOrganizerChartBinding(chartConfig, options),
|
|
122
|
+
shouldRefetch: true
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
binding: {
|
|
127
|
+
config: currentBinding?.config ?? chartConfigToOrganizer(chartConfig, options),
|
|
128
|
+
state: event.state
|
|
129
|
+
},
|
|
130
|
+
shouldRefetch: event.type !== 'sliceSelected'
|
|
131
|
+
};
|
|
132
|
+
}
|
|
76
133
|
export function resolveYUnit(chartConfig, selectedY, selectedYAggregate) {
|
|
77
134
|
if (!chartConfig || !selectedY)
|
|
78
135
|
return undefined;
|
|
79
136
|
const actualKey = resolveYKey(selectedY, selectedYAggregate);
|
|
80
|
-
return chartConfig.
|
|
137
|
+
return getIndicatorItems(chartConfig).find(i => i.key === actualKey)?.unit;
|
|
81
138
|
}
|
|
82
139
|
const _syntheticItems = new WeakSet();
|
|
83
140
|
function _makeSynthetic(item) {
|
|
@@ -88,24 +145,30 @@ function _isSynthetic(item) {
|
|
|
88
145
|
return _syntheticItems.has(item);
|
|
89
146
|
}
|
|
90
147
|
function _cleanSynthetics(chartConfig) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
148
|
+
if (chartConfig.groups?.items) {
|
|
149
|
+
chartConfig.groups.items = chartConfig.groups.items.filter(g => !_isSynthetic(g));
|
|
150
|
+
}
|
|
151
|
+
if (chartConfig.indicators?.items) {
|
|
152
|
+
chartConfig.indicators.items.forEach(ind => {
|
|
153
|
+
if (ind.extra?.stacks?.items) {
|
|
154
|
+
ind.extra.stacks.items = ind.extra.stacks.items.filter((s) => !_isSynthetic(s));
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
97
158
|
}
|
|
98
159
|
function _applyXSelection(selectedX, chartConfig) {
|
|
99
|
-
const
|
|
160
|
+
const groupItems = getGroupItems(chartConfig);
|
|
161
|
+
const isGroupItem = groupItems.some(g => g.key === selectedX);
|
|
100
162
|
if (isGroupItem) {
|
|
101
|
-
|
|
163
|
+
groupItems.forEach(g => { g.selected = g.key === selectedX; });
|
|
102
164
|
return;
|
|
103
165
|
}
|
|
104
|
-
const
|
|
166
|
+
const indicators = getIndicatorItems(chartConfig);
|
|
167
|
+
const allStacks = indicators.flatMap(i => getStackItems(i));
|
|
105
168
|
const stackItem = allStacks.find(s => s.key === selectedX);
|
|
106
169
|
if (stackItem) {
|
|
107
|
-
|
|
108
|
-
|
|
170
|
+
groupItems.forEach(g => { g.selected = false; });
|
|
171
|
+
groupItems.push(_makeSynthetic({
|
|
109
172
|
key: stackItem.key,
|
|
110
173
|
selected: true,
|
|
111
174
|
menu: stackItem.menu,
|
|
@@ -117,14 +180,15 @@ function _applyXSelection(selectedX, chartConfig) {
|
|
|
117
180
|
}
|
|
118
181
|
function _applyYSelection(selectedY, selectedYAggregate, chartConfig) {
|
|
119
182
|
const actualKey = resolveYKey(selectedY, selectedYAggregate);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
183
|
+
const indicators = getIndicatorItems(chartConfig);
|
|
184
|
+
indicators.forEach(i => { i.selected = i.key === actualKey; });
|
|
185
|
+
indicators.forEach(i => {
|
|
186
|
+
getStackItems(i).forEach((s) => { s.selected = false; });
|
|
123
187
|
});
|
|
124
188
|
}
|
|
125
189
|
function _applyGroupBySelection(effectiveGroupBy, chartConfig) {
|
|
126
|
-
const activeIndicator = chartConfig.
|
|
127
|
-
const stackItems = activeIndicator
|
|
190
|
+
const activeIndicator = getIndicatorItems(chartConfig).find(i => i.selected);
|
|
191
|
+
const stackItems = getStackItems(activeIndicator);
|
|
128
192
|
if (effectiveGroupBy === undefined) {
|
|
129
193
|
stackItems.forEach(s => { s.selected = false; });
|
|
130
194
|
return;
|
|
@@ -134,7 +198,7 @@ function _applyGroupBySelection(effectiveGroupBy, chartConfig) {
|
|
|
134
198
|
stackItems.forEach(s => { s.selected = s.key === effectiveGroupBy; });
|
|
135
199
|
return;
|
|
136
200
|
}
|
|
137
|
-
const groupItem = chartConfig.
|
|
201
|
+
const groupItem = getGroupItems(chartConfig).find(g => g.key === effectiveGroupBy);
|
|
138
202
|
if (groupItem && activeIndicator) {
|
|
139
203
|
stackItems.forEach(s => { s.selected = false; });
|
|
140
204
|
if (!activeIndicator.extra) {
|
|
@@ -159,6 +223,6 @@ function _applyGroupBySelection(effectiveGroupBy, chartConfig) {
|
|
|
159
223
|
}
|
|
160
224
|
}
|
|
161
225
|
function _applySliceSelection(selectedSlices, chartConfig) {
|
|
162
|
-
chartConfig.
|
|
226
|
+
getFilterItems(chartConfig).forEach(f => { f.selected = selectedSlices.includes(f.key); });
|
|
163
227
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvb3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXVDOUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxXQUFnQixFQUNoQixVQUF1QyxFQUFFO0lBRXpDLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDNUIsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQy9FLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU3RSxNQUFNLFdBQVcsR0FBc0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7U0FDckUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FDMUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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Q0wsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUF3QixFQUFFLFdBQWlDO0lBQ3ZGLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JnYW5pemVyQnV0dG9uRXZlbnQsIE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyU3RhdGUsIE9yZ2FuaXplclVuaWZpZWRTdGF0ZSwgT3JnYW5pemVyVmlld1NsaWNlLCBPcmdhbml6ZXJYRmllbGQgfSBmcm9tICcuL29yZ2FuaXplci1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IGJ1aWxkWUZpZWxkcywgcmVzb2x2ZVlLZXkgfSBmcm9tICcuL29yZ2FuaXplci11dGlscyc7XG5pbXBvcnQgeyBVbml0Q29uZmlnIH0gZnJvbSAnQG9uZXRlbWUvanF1ZXJ5LWNvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0SXRlbSB7XG4gIGtleTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgbWVudTogeyBsYWJlbDogc3RyaW5nIH07XG4gIHVuaXQ/OiBzdHJpbmcgfCBVbml0Q29uZmlnO1xuICBqcXVlcnk/OiB7XG4gICAgdmFsdWU6IChzPzogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgYnVpbGRBbGlhczogKHM/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBidWlsZE5hbWU/OiAoaXRlbTogYW55LCB2YWx1ZT86IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGJ1aWxkQ29sb3I/OiAodmFsdWU/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgfTtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGV4dHJhPzoge1xuICAgIHN0YWNrcz86IHsgb3B0aW9uYWw6IGJvb2xlYW47IGl0ZW1zOiBPcmdhbml6ZXJDaGFydEl0ZW1bXSB9O1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJDaGFydFNlY3Rpb24ge1xuICBvcHRpb25hbDogYm9vbGVhbjtcbiAgaXRlbXM6IE9yZ2FuaXplckNoYXJ0SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0Q29uZmlnIHtcbiAgZ3JvdXBzOiBPcmdhbml6ZXJDaGFydFNlY3Rpb247XG4gIGluZGljYXRvcnM6IE9yZ2FuaXplckNoYXJ0U2VjdGlvbjtcbiAgZmlsdGVycz86IE9yZ2FuaXplckNoYXJ0U2VjdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJDaGFydEJyaWRnZU9wdGlvbnMge1xuICBvbkZldGNoU2xpY2VEYXRhPzogT3JnYW5pemVyQ29uZmlnWydvbkZldGNoU2xpY2VEYXRhJ107XG4gIG9uRXhwb3J0VmlzdWFsPzogKCkgPT4gdm9pZDtcbiAgb25FeHBvcnREYXRhPzogKCkgPT4gdm9pZDtcbiAgc3dpdGNoVmlldz86IE9yZ2FuaXplckNvbmZpZ1snc3dpdGNoVmlldyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhcnRDb25maWdUb09yZ2FuaXplcihcbiAgY2hhcnRDb25maWc6IGFueSxcbiAgb3B0aW9uczogT3JnYW5pemVyQ2hhcnRCcmlkZ2VPcHRpb25zID0ge31cbik6IE9yZ2FuaXplckNvbmZpZyB7XG4gIGlmICghY2hhcnRDb25maWcpIHJldHVybiB7fTtcbiAgY29uc3QgeyBvbkZldGNoU2xpY2VEYXRhLCBvbkV4cG9ydFZpc3VhbCwgb25FeHBvcnREYXRhLCBzd2l0Y2hWaWV3IH0gPSBvcHRpb25zO1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBjaGFydENvbmZpZy5pbmRpY2F0b3JzPy5pdGVtcz8uZmluZChpID0+IGkuc2VsZWN0ZWQpO1xuXG4gIGNvbnN0IGJhc2VYRmllbGRzOiBPcmdhbml6ZXJYRmllbGRbXSA9IChjaGFydENvbmZpZy5ncm91cHM/Lml0ZW1zIHx8IFtdKVxuICAgIC5maWx0ZXIoZyA9PiAhX2lzU3ludGhldGljKGcpKVxuICAgIC5tYXAoZyA9PiAoeyBpZDogZy5rZXksIGxhYmVsOiBnLm1lbnUubGFiZWwgfHwgZy5rZXkgfSkpO1xuXG4gIGNvbnN0IHlGaWVsZHMgPSBidWlsZFlGaWVsZHMoXG4gICAgKGNoYXJ0Q29uZmlnLmluZGljYXRvcnM/Lml0ZW1zIHx8IFtdKS5tYXAoaSA9PiAoeyBpZDogaS5rZXksIGxhYmVsOiBpLm1lbnUubGFiZWwgfHwgaS5rZXksIGdyb3VwOiBpLmdyb3VwIH0pKVxuICApO1xuXG4gIGNvbnN0IHN0YWNrRmllbGRzID0gKGFjdGl2ZUluZGljYXRvcj8uZXh0cmE/LnN0YWNrcz8uaXRlbXMgfHwgW10pXG4gICAgLmZpbHRlcigoczogT3JnYW5pemVyQ2hhcnRJdGVtKSA9PiAhX2lzU3ludGhldGljKHMpKVxuICAgIC5tYXAoKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4gKHsgaWQ6IHMua2V5LCBsYWJlbDogcy5tZW51LmxhYmVsIHx8IHMua2V5IH0pKTtcblxuICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtZXJnZWRHcm91cEZpZWxkcyA9IFsuLi5iYXNlWEZpZWxkcywgLi4uc3RhY2tGaWVsZHNdLmZpbHRlcihmID0+IHtcbiAgICBpZiAoc2VlbktleXMuaGFzKGYuaWQpKSByZXR1cm4gZmFsc2U7XG4gICAgc2VlbktleXMuYWRkKGYuaWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHhGaWVsZHM6IG1lcmdlZEdyb3VwRmllbGRzLFxuICAgIHlGaWVsZHMsXG4gICAgZ3JvdXBzOiBtZXJnZWRHcm91cEZpZWxkcyxcbiAgICBzbGljZXM6IChjaGFydENvbmZpZy5maWx0ZXJzPy5pdGVtcyB8fCBbXSkubWFwKGYgPT4gKHsgaWQ6IGYua2V5LCBsYWJlbDogZi5tZW51LmxhYmVsIHx8IGYua2V5IH0pIGFzIE9yZ2FuaXplclZpZXdTbGljZSksXG4gICAgc2hvd1Jlc2V0OiBmYWxzZSxcbiAgICBvbkZldGNoU2xpY2VEYXRhLFxuICAgIHNob3dFeHBvcnQ6ICEhKG9uRXhwb3J0VmlzdWFsIHx8IG9uRXhwb3J0RGF0YSksXG4gICAgb25FeHBvcnRWaXN1YWwsXG4gICAgb25FeHBvcnREYXRhLFxuICAgIHN3aXRjaFZpZXcsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydENvbmZpZ1RvU3RhdGUoY2hhcnRDb25maWc6IGFueSk6IE9yZ2FuaXplclN0YXRlIHtcbiAgaWYgKCFjaGFydENvbmZpZykgcmV0dXJuIHt9O1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBjaGFydENvbmZpZy5pbmRpY2F0b3JzPy5pdGVtcz8uZmluZChpID0+IGkuc2VsZWN0ZWQpO1xuICBjb25zdCBhY3RpdmVTdGFjayA9IChhY3RpdmVJbmRpY2F0b3I/LmV4dHJhPy5zdGFja3M/Lml0ZW1zIHx8IFtdKS5maW5kKChzOiBPcmdhbml6ZXJDaGFydEl0ZW0pID0+IHMuc2VsZWN0ZWQpO1xuICBjb25zdCBhY3RpdmVHcm91cCA9IGNoYXJ0Q29uZmlnLmdyb3Vwcz8uaXRlbXM/LmZpbmQoZyA9PiBnLnNlbGVjdGVkKTtcbiAgY29uc3QgYWN0aXZlU2xpY2VzID0gKGNoYXJ0Q29uZmlnLmZpbHRlcnM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIoZiA9PiBmLnNlbGVjdGVkKTtcbiAgY29uc3QgaW5kaWNhdG9yR3JvdXAgPSBhY3RpdmVJbmRpY2F0b3I/Lmdyb3VwO1xuICByZXR1cm4ge1xuICAgIHNlbGVjdGVkWDogYWN0aXZlR3JvdXA/LmtleSxcbiAgICBzZWxlY3RlZFk6IGluZGljYXRvckdyb3VwID8/IGFjdGl2ZUluZGljYXRvcj8ua2V5LFxuICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogaW5kaWNhdG9yR3JvdXAgPyBhY3RpdmVJbmRpY2F0b3I/LmtleSA6IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RlZEdyb3VwQnk6IGFjdGl2ZVN0YWNrPy5rZXksXG4gICAgc2VsZWN0ZWRTbGljZXM6IGFjdGl2ZVNsaWNlcy5tYXAoZiA9PiBmLmtleSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydENvbmZpZ1RvVW5pZmllZFN0YXRlKFxuICBjaGFydENvbmZpZzogYW55LFxuICB2aWV3TW9kZTogJ2NoYXJ0JyB8ICd0YWJsZScgPSAnY2hhcnQnXG4pOiBPcmdhbml6ZXJVbmlmaWVkU3RhdGUge1xuICBjb25zdCBzdGF0ZSA9IGNoYXJ0Q29uZmlnVG9TdGF0ZShjaGFydENvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgdmlld01vZGUsXG4gICAgZGltZW5zaW9uOiBzdGF0ZS5zZWxlY3RlZFgsXG4gICAgbWV0cmljOiByZXNvbHZlWUtleShzdGF0ZS5zZWxlY3RlZFksIHN0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSksXG4gICAgbWV0cmljQWdncmVnYXRlOiBzdGF0ZS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgYnJlYWtkb3duOiBzdGF0ZS5zZWxlY3RlZEdyb3VwQnksXG4gICAgZmlsdGVyczogc3RhdGUuc2VsZWN0ZWRTbGljZXMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9yZ2FuaXplckV2ZW50VG9DaGFydChcbiAgZXZlbnQ6IE9yZ2FuaXplckJ1dHRvbkV2ZW50LFxuICBjaGFydENvbmZpZzogYW55XG4pOiB2b2lkIHtcbiAgaWYgKCFjaGFydENvbmZpZykgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlO1xuICBfY2xlYW5TeW50aGV0aWNzKGNoYXJ0Q29uZmlnKTtcbiAgaWYgKHN0YXRlLnNlbGVjdGVkWCAhPT0gdW5kZWZpbmVkKSBfYXBwbHlYU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGVkWCwgY2hhcnRDb25maWcpO1xuICBpZiAoc3RhdGUuc2VsZWN0ZWRZICE9PSB1bmRlZmluZWQpIF9hcHBseVlTZWxlY3Rpb24oc3RhdGUuc2VsZWN0ZWRZLCBzdGF0ZS5zZWxlY3RlZFlBZ2dyZWdhdGUsIGNoYXJ0Q29uZmlnKTtcbiAgY29uc3QgZWZmZWN0aXZlR3JvdXBCeSA9IHN0YXRlLnNlbGVjdGVkR3JvdXBCeSAhPT0gc3RhdGUuc2VsZWN0ZWRYID8gc3RhdGUuc2VsZWN0ZWRHcm91cEJ5IDogdW5kZWZpbmVkO1xuICBfYXBwbHlHcm91cEJ5U2VsZWN0aW9uKGVmZmVjdGl2ZUdyb3VwQnksIGNoYXJ0Q29uZmlnKTtcbiAgaWYgKHN0YXRlLnNlbGVjdGVkU2xpY2VzICE9PSB1bmRlZmluZWQpIF9hcHBseVNsaWNlU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGVkU2xpY2VzLCBjaGFydENvbmZpZyk7XG4gIGV2ZW50LnJlc29sdmVkWVVuaXQgPSByZXNvbHZlWVVuaXQoY2hhcnRDb25maWcsIGV2ZW50LnN0YXRlLnNlbGVjdGVkWSwgZXZlbnQuc3RhdGUuc2VsZWN0ZWRZQWdncmVnYXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZVW5pdChcbiAgY2hhcnRDb25maWc6IGFueSxcbiAgc2VsZWN0ZWRZOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBVbml0Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFydENvbmZpZyB8fCAhc2VsZWN0ZWRZKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBhY3R1YWxLZXkgPSByZXNvbHZlWUtleShzZWxlY3RlZFksIHNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gIHJldHVybiBjaGFydENvbmZpZy5pbmRpY2F0b3JzPy5pdGVtcz8uZmluZChpID0+IGkua2V5ID09PSBhY3R1YWxLZXkpPy51bml0O1xufVxuXG5jb25zdCBfc3ludGhldGljSXRlbXMgPSBuZXcgV2Vha1NldDxPcmdhbml6ZXJDaGFydEl0ZW0+KCk7XG5cbmZ1bmN0aW9uIF9tYWtlU3ludGhldGljKGl0ZW06IE9yZ2FuaXplckNoYXJ0SXRlbSk6IE9yZ2FuaXplckNoYXJ0SXRlbSB7XG4gIF9zeW50aGV0aWNJdGVtcy5hZGQoaXRlbSk7XG4gIHJldHVybiBpdGVtO1xufVxuXG5mdW5jdGlvbiBfaXNTeW50aGV0aWMoaXRlbTogT3JnYW5pemVyQ2hhcnRJdGVtKTogYm9vbGVhbiB7XG4gIHJldHVybiBfc3ludGhldGljSXRlbXMuaGFzKGl0ZW0pO1xufVxuXG5mdW5jdGlvbiBfY2xlYW5TeW50aGV0aWNzKGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMgPSBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZmlsdGVyKGcgPT4gIV9pc1N5bnRoZXRpYyhnKSk7XG4gIGNoYXJ0Q29uZmlnLmluZGljYXRvcnMuaXRlbXMuZm9yRWFjaChpbmQgPT4ge1xuICAgIGlmIChpbmQuZXh0cmE/LnN0YWNrcz8uaXRlbXMpIHtcbiAgICAgIGluZC5leHRyYS5zdGFja3MuaXRlbXMgPSBpbmQuZXh0cmEuc3RhY2tzLml0ZW1zLmZpbHRlcigoczogT3JnYW5pemVyQ2hhcnRJdGVtKSA9PiAhX2lzU3ludGhldGljKHMpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfYXBwbHlYU2VsZWN0aW9uKHNlbGVjdGVkWDogc3RyaW5nLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgaXNHcm91cEl0ZW0gPSBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuc29tZShnID0+IGcua2V5ID09PSBzZWxlY3RlZFgpO1xuICBpZiAoaXNHcm91cEl0ZW0pIHtcbiAgICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZm9yRWFjaChnID0+IHsgZy5zZWxlY3RlZCA9IGcua2V5ID09PSBzZWxlY3RlZFg7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBhbGxTdGFja3M6IE9yZ2FuaXplckNoYXJ0SXRlbVtdID0gY2hhcnRDb25maWcuaW5kaWNhdG9ycy5pdGVtcy5mbGF0TWFwKGkgPT4gaS5leHRyYT8uc3RhY2tzPy5pdGVtcyA/PyBbXSk7XG4gIGNvbnN0IHN0YWNrSXRlbSA9IGFsbFN0YWNrcy5maW5kKHMgPT4gcy5rZXkgPT09IHNlbGVjdGVkWCk7XG4gIGlmIChzdGFja0l0ZW0pIHtcbiAgICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZm9yRWFjaChnID0+IHsgZy5zZWxlY3RlZCA9IGZhbHNlOyB9KTtcbiAgICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMucHVzaChfbWFrZVN5bnRoZXRpYyh7XG4gICAgICBrZXk6IHN0YWNrSXRlbS5rZXksXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgIG1lbnU6IHN0YWNrSXRlbS5tZW51LFxuICAgICAganF1ZXJ5OiBzdGFja0l0ZW0uanF1ZXJ5XG4gICAgICAgID8geyB2YWx1ZTogKCkgPT4gc3RhY2tJdGVtLmpxdWVyeSEudmFsdWUoKSwgYnVpbGRBbGlhczogKCkgPT4gc3RhY2tJdGVtLmpxdWVyeSEuYnVpbGRBbGlhcygpIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseVlTZWxlY3Rpb24oc2VsZWN0ZWRZOiBzdHJpbmcsIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgYWN0dWFsS2V5ID0gcmVzb2x2ZVlLZXkoc2VsZWN0ZWRZLCBzZWxlY3RlZFlBZ2dyZWdhdGUpO1xuICBjaGFydENvbmZpZy5pbmRpY2F0b3JzLml0ZW1zLmZvckVhY2goaSA9PiB7IGkuc2VsZWN0ZWQgPSBpLmtleSA9PT0gYWN0dWFsS2V5OyB9KTtcbiAgY2hhcnRDb25maWcuaW5kaWNhdG9ycy5pdGVtcy5mb3JFYWNoKGkgPT4ge1xuICAgIGkuZXh0cmE/LnN0YWNrcz8uaXRlbXM/LmZvckVhY2goKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2FwcGx5R3JvdXBCeVNlbGVjdGlvbihlZmZlY3RpdmVHcm91cEJ5OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBjaGFydENvbmZpZy5pbmRpY2F0b3JzLml0ZW1zLmZpbmQoaSA9PiBpLnNlbGVjdGVkKTtcbiAgY29uc3Qgc3RhY2tJdGVtczogT3JnYW5pemVyQ2hhcnRJdGVtW10gPSBhY3RpdmVJbmRpY2F0b3I/LmV4dHJhPy5zdGFja3M/Lml0ZW1zID8/IFtdO1xuICBpZiAoZWZmZWN0aXZlR3JvdXBCeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpc1N0YWNrSXRlbSA9IHN0YWNrSXRlbXMuc29tZShzID0+IHMua2V5ID09PSBlZmZlY3RpdmVHcm91cEJ5KTtcbiAgaWYgKGlzU3RhY2tJdGVtKSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gcy5rZXkgPT09IGVmZmVjdGl2ZUdyb3VwQnk7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBncm91cEl0ZW0gPSBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZmluZChnID0+IGcua2V5ID09PSBlZmZlY3RpdmVHcm91cEJ5KTtcbiAgaWYgKGdyb3VwSXRlbSAmJiBhY3RpdmVJbmRpY2F0b3IpIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gICAgaWYgKCFhY3RpdmVJbmRpY2F0b3IuZXh0cmEpIHtcbiAgICAgIGFjdGl2ZUluZGljYXRvci5leHRyYSA9IHsgc3RhY2tzOiB7IG9wdGlvbmFsOiB0cnVlLCBpdGVtczogW10gfSB9O1xuICAgIH0gZWxzZSBpZiAoIWFjdGl2ZUluZGljYXRvci5leHRyYS5zdGFja3MpIHtcbiAgICAgIGFjdGl2ZUluZGljYXRvci5leHRyYS5zdGFja3MgPSB7IG9wdGlvbmFsOiB0cnVlLCBpdGVtczogW10gfTtcbiAgICB9XG4gICAgYWN0aXZlSW5kaWNhdG9yLmV4dHJhLnN0YWNrcy5pdGVtcy5wdXNoKF9tYWtlU3ludGhldGljKHtcbiAgICAgIGtleTogZ3JvdXBJdGVtLmtleSxcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgbWVudTogZ3JvdXBJdGVtLm1lbnUsXG4gICAgICBqcXVlcnk6IGdyb3VwSXRlbS5qcXVlcnkgPyB7XG4gICAgICAgIHZhbHVlOiAoKSA9PiBncm91cEl0ZW0uanF1ZXJ5IS52YWx1ZSgpLFxuICAgICAgICBidWlsZEFsaWFzOiAoKSA9PiBncm91cEl0ZW0uanF1ZXJ5IS5idWlsZEFsaWFzKCksXG4gICAgICAgIGJ1aWxkTmFtZTogKF9pdGVtOiBhbnksIHZhbHVlOiBzdHJpbmcpID0+IFN0cmluZyh2YWx1ZSksXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5U2xpY2VTZWxlY3Rpb24oc2VsZWN0ZWRTbGljZXM6IHN0cmluZ1tdLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY2hhcnRDb25maWcuZmlsdGVycz8uaXRlbXM/LmZvckVhY2goZiA9PiB7IGYuc2VsZWN0ZWQgPSBzZWxlY3RlZFNsaWNlcy5pbmNsdWRlcyhmLmtleSk7IH0pO1xufVxuIl19
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvb3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBNkIsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEgsT0FBTyxFQUF3QixhQUFhLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpJLE9BQU8sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQTBDakksTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxXQUFvRCxFQUNwRCxVQUF1QyxFQUFFO0lBRXpDLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxFQUFFO1FBQzVFLFNBQVMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU07UUFDL0IsY0FBYyxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO1FBQzFELFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztLQUNyRCxDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDL0UsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFD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Q0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUF3QixFQUFFLFdBQWlDO0lBQ3ZGLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ2FuaXplckJ1dHRvbkV2ZW50LCBPcmdhbml6ZXJDb25maWcsIE9yZ2FuaXplclN0YXRlLCBPcmdhbml6ZXJVbmlmaWVkU3RhdGUsIE9yZ2FuaXplclZpZXdTbGljZSwgT3JnYW5pemVyWEZpZWxkIH0gZnJvbSAnLi9vcmdhbml6ZXItY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZFlGaWVsZHMsIG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlLCByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkLCByZXNvbHZlWUtleSB9IGZyb20gJy4vb3JnYW5pemVyLXV0aWxzJztcbmltcG9ydCB7IFVuaXRDb25maWcgfSBmcm9tICdAb25ldGVtZS9qcXVlcnktY29yZSc7XG5pbXBvcnQgeyBPcmdhbml6ZXJDaGFydENvbmZpZywgZ2V0R3JvdXBJdGVtcywgZ2V0SW5kaWNhdG9ySXRlbXMsIGdldEZpbHRlckl0ZW1zLCBnZXRTdGFja0l0ZW1zIH0gZnJvbSAnLi9vcmdhbml6ZXItY2hhcnQtY29uZmlnJztcblxuZXhwb3J0IHsgT3JnYW5pemVyQ2hhcnRDb25maWcsIGdldEdyb3VwSXRlbXMsIGdldEluZGljYXRvckl0ZW1zLCBnZXRGaWx0ZXJJdGVtcywgZ2V0U3RhY2tJdGVtcyB9IGZyb20gJy4vb3JnYW5pemVyLWNoYXJ0LWNvbmZpZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQ2hhcnRJdGVtIHtcbiAga2V5OiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBtZW51OiB7IGxhYmVsOiBzdHJpbmcgfTtcbiAgdW5pdD86IHN0cmluZyB8IFVuaXRDb25maWc7XG4gIGpxdWVyeT86IHtcbiAgICB2YWx1ZTogKHM/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBidWlsZEFsaWFzOiAocz86IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGJ1aWxkTmFtZT86IChpdGVtOiBhbnksIHZhbHVlPzogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgYnVpbGRDb2xvcj86ICh2YWx1ZT86IHN0cmluZykgPT4gc3RyaW5nO1xuICB9O1xuICBncm91cD86IHN0cmluZztcbiAgZXh0cmE/OiB7XG4gICAgc3RhY2tzPzogeyBvcHRpb25hbDogYm9vbGVhbjsgaXRlbXM6IE9yZ2FuaXplckNoYXJ0SXRlbVtdIH07XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0U2VjdGlvbiB7XG4gIG9wdGlvbmFsOiBib29sZWFuO1xuICBpdGVtczogT3JnYW5pemVyQ2hhcnRJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQ2hhcnRCcmlkZ2VPcHRpb25zIHtcbiAgb25GZXRjaFNsaWNlRGF0YT86IE9yZ2FuaXplckNvbmZpZ1snb25GZXRjaFNsaWNlRGF0YSddO1xuICBvbkV4cG9ydFZpc3VhbD86ICgpID0+IHZvaWQ7XG4gIG9uRXhwb3J0RGF0YT86ICgpID0+IHZvaWQ7XG4gIHN3aXRjaFZpZXc/OiBPcmdhbml6ZXJDb25maWdbJ3N3aXRjaFZpZXcnXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJDaGFydEJpbmRpbmcge1xuICBjb25maWc6IE9yZ2FuaXplckNvbmZpZztcbiAgc3RhdGU6IE9yZ2FuaXplclN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0RXZlbnRSZXN1bHQge1xuICBiaW5kaW5nOiBPcmdhbml6ZXJDaGFydEJpbmRpbmc7XG4gIHNob3VsZFJlZmV0Y2g6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydENvbmZpZ1RvT3JnYW5pemVyKFxuICBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBPcmdhbml6ZXJDaGFydEJyaWRnZU9wdGlvbnMgPSB7fVxuKTogT3JnYW5pemVyQ29uZmlnIHtcbiAgaWYgKCFjaGFydENvbmZpZykge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJDaGFydEFkYXB0ZXJdIEVtcHR5IGNoYXJ0IGNvbmZpZywgcmV0dXJuaW5nIGVtcHR5IG9yZ2FuaXplciBjb25maWcnKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQ2hhcnRBZGFwdGVyXSBDb252ZXJ0aW5nIGNoYXJ0IGNvbmZpZyB0byBvcmdhbml6ZXInLCB7XG4gICAgaGFzR3JvdXBzOiAhIWNoYXJ0Q29uZmlnLmdyb3VwcyxcbiAgICBpbmRpY2F0b3JDb3VudDogY2hhcnRDb25maWcuaW5kaWNhdG9ycz8uaXRlbXM/Lmxlbmd0aCA/PyAwLFxuICAgIGZpbHRlckNvdW50OiBjaGFydENvbmZpZy5maWx0ZXJzPy5pdGVtcz8ubGVuZ3RoID8/IDBcbiAgfSk7XG5cbiAgY29uc3QgeyBvbkZldGNoU2xpY2VEYXRhLCBvbkV4cG9ydFZpc3VhbCwgb25FeHBvcnREYXRhLCBzd2l0Y2hWaWV3IH0gPSBvcHRpb25zO1xuICBjb25zdCBpbmRpY2F0b3JzID0gZ2V0SW5kaWNhdG9ySXRlbXMoY2hhcnRDb25maWcpO1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBpbmRpY2F0b3JzLmZpbmQoaSA9PiBpLnNlbGVjdGVkKTtcblxuICBjb25zdCBiYXNlWEZpZWxkczogT3JnYW5pemVyWEZpZWxkW10gPSBnZXRHcm91cEl0ZW1zKGNoYXJ0Q29uZmlnKVxuICAgIC5maWx0ZXIoZyA9PiAhX2lzU3ludGhldGljKGcpKVxuICAgIC5tYXAoZyA9PiAoeyBpZDogZy5rZXksIGxhYmVsOiBnLm1lbnUubGFiZWwgfHwgZy5rZXkgfSkpO1xuXG4gIGNvbnN0IHlGaWVsZHMgPSBidWlsZFlGaWVsZHMoXG4gICAgaW5kaWNhdG9ycy5tYXAoaSA9PiAoeyBpZDogaS5rZXksIGxhYmVsOiBpLm1lbnUubGFiZWwgfHwgaS5rZXksIGdyb3VwOiBpLmdyb3VwIH0pKVxuICApO1xuXG4gIGNvbnN0IHN0YWNrRmllbGRzID0gZ2V0U3RhY2tJdGVtcyhhY3RpdmVJbmRpY2F0b3IpXG4gICAgLmZpbHRlcigoczogT3JnYW5pemVyQ2hhcnRJdGVtKSA9PiAhX2lzU3ludGhldGljKHMpKVxuICAgIC5tYXAoKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4gKHsgaWQ6IHMua2V5LCBsYWJlbDogcy5tZW51LmxhYmVsIHx8IHMua2V5IH0pKTtcblxuICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtZXJnZWRHcm91cEZpZWxkcyA9IFsuLi5iYXNlWEZpZWxkcywgLi4uc3RhY2tGaWVsZHNdLmZpbHRlcihmID0+IHtcbiAgICBpZiAoc2VlbktleXMuaGFzKGYuaWQpKSByZXR1cm4gZmFsc2U7XG4gICAgc2VlbktleXMuYWRkKGYuaWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHhGaWVsZHM6IG1lcmdlZEdyb3VwRmllbGRzLFxuICAgIHlGaWVsZHMsXG4gICAgZ3JvdXBzOiBtZXJnZWRHcm91cEZpZWxkcyxcbiAgICBzbGljZXM6IGdldEZpbHRlckl0ZW1zKGNoYXJ0Q29uZmlnKS5tYXAoZiA9PiAoeyBpZDogZi5rZXksIGxhYmVsOiBmLm1lbnUubGFiZWwgfHwgZi5rZXkgfSkgYXMgT3JnYW5pemVyVmlld1NsaWNlKSxcbiAgICB0ZW1wbGF0ZXM6IGNoYXJ0Q29uZmlnLnRlbXBsYXRlcyxcbiAgICBzaG93UmVzZXQ6IGZhbHNlLFxuICAgIG9uRmV0Y2hTbGljZURhdGEsXG4gICAgc2hvd0V4cG9ydDogISEob25FeHBvcnRWaXN1YWwgfHwgb25FeHBvcnREYXRhKSxcbiAgICBvbkV4cG9ydFZpc3VhbCxcbiAgICBvbkV4cG9ydERhdGEsXG4gICAgc3dpdGNoVmlldyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0Q29uZmlnVG9TdGF0ZShjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogT3JnYW5pemVyU3RhdGUge1xuICBpZiAoIWNoYXJ0Q29uZmlnKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckNoYXJ0QWRhcHRlcl0gRW1wdHkgY2hhcnQgY29uZmlnIGZvciBzdGF0ZSBjb252ZXJzaW9uJyk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgaW5kaWNhdG9ycyA9IGdldEluZGljYXRvckl0ZW1zKGNoYXJ0Q29uZmlnKTtcbiAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gaW5kaWNhdG9ycy5maW5kKGkgPT4gaS5zZWxlY3RlZCk7XG4gIGNvbnN0IGFjdGl2ZVN0YWNrID0gZ2V0U3RhY2tJdGVtcyhhY3RpdmVJbmRpY2F0b3IpLmZpbmQoKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4gcy5zZWxlY3RlZCk7XG4gIGNvbnN0IGFjdGl2ZUdyb3VwID0gZ2V0R3JvdXBJdGVtcyhjaGFydENvbmZpZykuZmluZChnID0+IGcuc2VsZWN0ZWQpO1xuICBjb25zdCBhY3RpdmVTbGljZXMgPSBnZXRGaWx0ZXJJdGVtcyhjaGFydENvbmZpZykuZmlsdGVyKGYgPT4gZi5zZWxlY3RlZCk7XG4gIGNvbnN0IGluZGljYXRvckdyb3VwID0gYWN0aXZlSW5kaWNhdG9yPy5ncm91cDtcblxuICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQ2hhcnRBZGFwdGVyXSBDdXJyZW50IGNoYXJ0IHN0YXRlJywge1xuICAgIGFjdGl2ZUdyb3VwOiBhY3RpdmVHcm91cD8ua2V5LFxuICAgIGFjdGl2ZUluZGljYXRvcjogYWN0aXZlSW5kaWNhdG9yPy5rZXksXG4gICAgYWN0aXZlU3RhY2s6IGFjdGl2ZVN0YWNrPy5rZXksXG4gICAgc2xpY2VDb3VudDogYWN0aXZlU2xpY2VzLmxlbmd0aFxuICB9KTtcblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBzZWxlY3RlZFg6IGFjdGl2ZUdyb3VwPy5rZXksXG4gICAgc2VsZWN0ZWRZOiBpbmRpY2F0b3JHcm91cCA/PyBhY3RpdmVJbmRpY2F0b3I/LmtleSxcbiAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IGluZGljYXRvckdyb3VwID8gYWN0aXZlSW5kaWNhdG9yPy5rZXkgOiB1bmRlZmluZWQsXG4gICAgc2VsZWN0ZWRHcm91cEJ5OiBhY3RpdmVTdGFjaz8ua2V5LFxuICAgIHNlbGVjdGVkU2xpY2VzOiBhY3RpdmVTbGljZXMubWFwKGYgPT4gZi5rZXkpLFxuICB9O1xuICBjb25zdCBvcmdhbml6ZXJDb25maWcgPSBjaGFydENvbmZpZ1RvT3JnYW5pemVyKGNoYXJ0Q29uZmlnKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlKHN0YXRlLCBvcmdhbml6ZXJDb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcmdhbml6ZXJDaGFydEJpbmRpbmcoXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IE9yZ2FuaXplckNoYXJ0QnJpZGdlT3B0aW9ucyA9IHt9XG4pOiBPcmdhbml6ZXJDaGFydEJpbmRpbmcge1xuICByZXR1cm4ge1xuICAgIGNvbmZpZzogY2hhcnRDb25maWdUb09yZ2FuaXplcihjaGFydENvbmZpZywgb3B0aW9ucyksXG4gICAgc3RhdGU6IGNoYXJ0Q29uZmlnVG9TdGF0ZShjaGFydENvbmZpZylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0Q29uZmlnVG9VbmlmaWVkU3RhdGUoXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHZpZXdNb2RlOiAnY2hhcnQnIHwgJ3RhYmxlJyA9ICdjaGFydCdcbik6IE9yZ2FuaXplclVuaWZpZWRTdGF0ZSB7XG4gIGNvbnN0IHN0YXRlID0gY2hhcnRDb25maWdUb1N0YXRlKGNoYXJ0Q29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICB2aWV3TW9kZSxcbiAgICBkaW1lbnNpb246IHN0YXRlLnNlbGVjdGVkWCxcbiAgICBtZXRyaWM6IHJlc29sdmVZS2V5KHN0YXRlLnNlbGVjdGVkWSwgc3RhdGUuc2VsZWN0ZWRZQWdncmVnYXRlKSxcbiAgICBtZXRyaWNBZ2dyZWdhdGU6IHN0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSxcbiAgICBicmVha2Rvd246IHN0YXRlLnNlbGVjdGVkR3JvdXBCeSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5zZWxlY3RlZFNsaWNlcyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3JnYW5pemVyRXZlbnRUb0NoYXJ0KFxuICBldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQsXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBpZiAoIWNoYXJ0Q29uZmlnKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckNoYXJ0QWRhcHRlcl0gQ2Fubm90IGFwcGx5IGV2ZW50IHRvIGVtcHR5IGNoYXJ0IGNvbmZpZycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJDaGFydEFkYXB0ZXJdIEFwcGx5aW5nIG9yZ2FuaXplciBldmVudCcsIHsgZXZlbnRUeXBlOiBldmVudC50eXBlLCBzdGF0ZTogZXZlbnQuc3RhdGUgfSk7XG5cbiAgY29uc3Qgc3RhdGUgPSBldmVudC5zdGF0ZTtcbiAgX2NsZWFuU3ludGhldGljcyhjaGFydENvbmZpZyk7XG4gIGlmIChzdGF0ZS5zZWxlY3RlZFggIT09IHVuZGVmaW5lZCkgX2FwcGx5WFNlbGVjdGlvbihzdGF0ZS5zZWxlY3RlZFgsIGNoYXJ0Q29uZmlnKTtcbiAgaWYgKHN0YXRlLnNlbGVjdGVkWSAhPT0gdW5kZWZpbmVkKSBfYXBwbHlZU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGVkWSwgc3RhdGUuc2VsZWN0ZWRZQWdncmVnYXRlLCBjaGFydENvbmZpZyk7XG4gIGNvbnN0IGVmZmVjdGl2ZUdyb3VwQnkgPSBzdGF0ZS5zZWxlY3RlZEdyb3VwQnkgIT09IHN0YXRlLnNlbGVjdGVkWCA/IHN0YXRlLnNlbGVjdGVkR3JvdXBCeSA6IHVuZGVmaW5lZDtcbiAgX2FwcGx5R3JvdXBCeVNlbGVjdGlvbihlZmZlY3RpdmVHcm91cEJ5LCBjaGFydENvbmZpZyk7XG4gIGlmIChzdGF0ZS5zZWxlY3RlZFNsaWNlcyAhPT0gdW5kZWZpbmVkKSBfYXBwbHlTbGljZVNlbGVjdGlvbihzdGF0ZS5zZWxlY3RlZFNsaWNlcywgY2hhcnRDb25maWcpO1xuICBldmVudC5yZXNvbHZlZFlVbml0ID0gcmVzb2x2ZVlVbml0KGNoYXJ0Q29uZmlnLCBldmVudC5zdGF0ZS5zZWxlY3RlZFksIGV2ZW50LnN0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVPcmdhbml6ZXJDaGFydEV2ZW50KFxuICBldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQsXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRCaW5kaW5nOiBPcmdhbml6ZXJDaGFydEJpbmRpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IE9yZ2FuaXplckNoYXJ0QnJpZGdlT3B0aW9ucyA9IHt9XG4pOiBPcmdhbml6ZXJDaGFydEV2ZW50UmVzdWx0IHtcbiAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckNoYXJ0QWRhcHRlcl0gSGFuZGxpbmcgb3JnYW5pemVyIGV2ZW50JywgeyBldmVudFR5cGU6IGV2ZW50LnR5cGUgfSk7XG5cbiAgaWYgKGV2ZW50LnR5cGUgPT09ICd2aWV3U3dpdGNoZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJpbmRpbmc6IHtcbiAgICAgICAgY29uZmlnOiBjaGFydENvbmZpZ1RvT3JnYW5pemVyKGNoYXJ0Q29uZmlnLCBvcHRpb25zKSxcbiAgICAgICAgc3RhdGU6IHsgLi4uZXZlbnQuc3RhdGUgfVxuICAgICAgfSxcbiAgICAgIHNob3VsZFJlZmV0Y2g6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFwcGx5T3JnYW5pemVyRXZlbnRUb0NoYXJ0KGV2ZW50LCBjaGFydENvbmZpZyk7XG5cbiAgaWYgKGV2ZW50LnR5cGUgPT09ICd5U2VsZWN0ZWQnIHx8IGV2ZW50LnR5cGUgPT09ICd0ZW1wbGF0ZVNlbGVjdGVkJykge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kaW5nOiBidWlsZE9yZ2FuaXplckNoYXJ0QmluZGluZyhjaGFydENvbmZpZywgb3B0aW9ucyksXG4gICAgICBzaG91bGRSZWZldGNoOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmluZGluZzoge1xuICAgICAgY29uZmlnOiBjdXJyZW50QmluZGluZz8uY29uZmlnID8/IGNoYXJ0Q29uZmlnVG9Pcmdhbml6ZXIoY2hhcnRDb25maWcsIG9wdGlvbnMpLFxuICAgICAgc3RhdGU6IGV2ZW50LnN0YXRlXG4gICAgfSxcbiAgICBzaG91bGRSZWZldGNoOiBldmVudC50eXBlICE9PSAnc2xpY2VTZWxlY3RlZCdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZVW5pdChcbiAgY2hhcnRDb25maWc6IE9yZ2FuaXplckNoYXJ0Q29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc2VsZWN0ZWRZOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBVbml0Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFydENvbmZpZyB8fCAhc2VsZWN0ZWRZKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBhY3R1YWxLZXkgPSByZXNvbHZlWUtleShzZWxlY3RlZFksIHNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gIHJldHVybiBnZXRJbmRpY2F0b3JJdGVtcyhjaGFydENvbmZpZykuZmluZChpID0+IGkua2V5ID09PSBhY3R1YWxLZXkpPy51bml0O1xufVxuXG5jb25zdCBfc3ludGhldGljSXRlbXMgPSBuZXcgV2Vha1NldDxPcmdhbml6ZXJDaGFydEl0ZW0+KCk7XG5cbmZ1bmN0aW9uIF9tYWtlU3ludGhldGljKGl0ZW06IE9yZ2FuaXplckNoYXJ0SXRlbSk6IE9yZ2FuaXplckNoYXJ0SXRlbSB7XG4gIF9zeW50aGV0aWNJdGVtcy5hZGQoaXRlbSk7XG4gIHJldHVybiBpdGVtO1xufVxuXG5mdW5jdGlvbiBfaXNTeW50aGV0aWMoaXRlbTogT3JnYW5pemVyQ2hhcnRJdGVtKTogYm9vbGVhbiB7XG4gIHJldHVybiBfc3ludGhldGljSXRlbXMuaGFzKGl0ZW0pO1xufVxuXG5mdW5jdGlvbiBfY2xlYW5TeW50aGV0aWNzKGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBpZiAoY2hhcnRDb25maWcuZ3JvdXBzPy5pdGVtcykge1xuICAgIGNoYXJ0Q29uZmlnLmdyb3Vwcy5pdGVtcyA9IGNoYXJ0Q29uZmlnLmdyb3Vwcy5pdGVtcy5maWx0ZXIoZyA9PiAhX2lzU3ludGhldGljKGcpKTtcbiAgfVxuICBpZiAoY2hhcnRDb25maWcuaW5kaWNhdG9ycz8uaXRlbXMpIHtcbiAgICBjaGFydENvbmZpZy5pbmRpY2F0b3JzLml0ZW1zLmZvckVhY2goaW5kID0+IHtcbiAgICAgIGlmIChpbmQuZXh0cmE/LnN0YWNrcz8uaXRlbXMpIHtcbiAgICAgICAgaW5kLmV4dHJhLnN0YWNrcy5pdGVtcyA9IGluZC5leHRyYS5zdGFja3MuaXRlbXMuZmlsdGVyKChzOiBPcmdhbml6ZXJDaGFydEl0ZW0pID0+ICFfaXNTeW50aGV0aWMocykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseVhTZWxlY3Rpb24oc2VsZWN0ZWRYOiBzdHJpbmcsIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBncm91cEl0ZW1zID0gZ2V0R3JvdXBJdGVtcyhjaGFydENvbmZpZyk7XG4gIGNvbnN0IGlzR3JvdXBJdGVtID0gZ3JvdXBJdGVtcy5zb21lKGcgPT4gZy5rZXkgPT09IHNlbGVjdGVkWCk7XG4gIGlmIChpc0dyb3VwSXRlbSkge1xuICAgIGdyb3VwSXRlbXMuZm9yRWFjaChnID0+IHsgZy5zZWxlY3RlZCA9IGcua2V5ID09PSBzZWxlY3RlZFg7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpbmRpY2F0b3JzID0gZ2V0SW5kaWNhdG9ySXRlbXMoY2hhcnRDb25maWcpO1xuICBjb25zdCBhbGxTdGFja3M6IE9yZ2FuaXplckNoYXJ0SXRlbVtdID0gaW5kaWNhdG9ycy5mbGF0TWFwKGkgPT4gZ2V0U3RhY2tJdGVtcyhpKSk7XG4gIGNvbnN0IHN0YWNrSXRlbSA9IGFsbFN0YWNrcy5maW5kKHMgPT4gcy5rZXkgPT09IHNlbGVjdGVkWCk7XG4gIGlmIChzdGFja0l0ZW0pIHtcbiAgICBncm91cEl0ZW1zLmZvckVhY2goZyA9PiB7IGcuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gICAgZ3JvdXBJdGVtcy5wdXNoKF9tYWtlU3ludGhldGljKHtcbiAgICAgIGtleTogc3RhY2tJdGVtLmtleSxcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgbWVudTogc3RhY2tJdGVtLm1lbnUsXG4gICAgICBqcXVlcnk6IHN0YWNrSXRlbS5qcXVlcnlcbiAgICAgICAgPyB7IHZhbHVlOiAoKSA9PiBzdGFja0l0ZW0uanF1ZXJ5IS52YWx1ZSgpLCBidWlsZEFsaWFzOiAoKSA9PiBzdGFja0l0ZW0uanF1ZXJ5IS5idWlsZEFsaWFzKCkgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5WVNlbGVjdGlvbihzZWxlY3RlZFk6IHN0cmluZywgc2VsZWN0ZWRZQWdncmVnYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBhY3R1YWxLZXkgPSByZXNvbHZlWUtleShzZWxlY3RlZFksIHNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gIGNvbnN0IGluZGljYXRvcnMgPSBnZXRJbmRpY2F0b3JJdGVtcyhjaGFydENvbmZpZyk7XG4gIGluZGljYXRvcnMuZm9yRWFjaChpID0+IHsgaS5zZWxlY3RlZCA9IGkua2V5ID09PSBhY3R1YWxLZXk7IH0pO1xuICBpbmRpY2F0b3JzLmZvckVhY2goaSA9PiB7XG4gICAgZ2V0U3RhY2tJdGVtcyhpKS5mb3JFYWNoKChzOiBPcmdhbml6ZXJDaGFydEl0ZW0pID0+IHsgcy5zZWxlY3RlZCA9IGZhbHNlOyB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hcHBseUdyb3VwQnlTZWxlY3Rpb24oZWZmZWN0aXZlR3JvdXBCeTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gZ2V0SW5kaWNhdG9ySXRlbXMoY2hhcnRDb25maWcpLmZpbmQoaSA9PiBpLnNlbGVjdGVkKTtcbiAgY29uc3Qgc3RhY2tJdGVtczogT3JnYW5pemVyQ2hhcnRJdGVtW10gPSBnZXRTdGFja0l0ZW1zKGFjdGl2ZUluZGljYXRvcik7XG4gIGlmIChlZmZlY3RpdmVHcm91cEJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzU3RhY2tJdGVtID0gc3RhY2tJdGVtcy5zb21lKHMgPT4gcy5rZXkgPT09IGVmZmVjdGl2ZUdyb3VwQnkpO1xuICBpZiAoaXNTdGFja0l0ZW0pIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBzLmtleSA9PT0gZWZmZWN0aXZlR3JvdXBCeTsgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGdyb3VwSXRlbSA9IGdldEdyb3VwSXRlbXMoY2hhcnRDb25maWcpLmZpbmQoZyA9PiBnLmtleSA9PT0gZWZmZWN0aXZlR3JvdXBCeSk7XG4gIGlmIChncm91cEl0ZW0gJiYgYWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICAgIGlmICghYWN0aXZlSW5kaWNhdG9yLmV4dHJhKSB7XG4gICAgICBhY3RpdmVJbmRpY2F0b3IuZXh0cmEgPSB7IHN0YWNrczogeyBvcHRpb25hbDogdHJ1ZSwgaXRlbXM6IFtdIH0gfTtcbiAgICB9IGVsc2UgaWYgKCFhY3RpdmVJbmRpY2F0b3IuZXh0cmEuc3RhY2tzKSB7XG4gICAgICBhY3RpdmVJbmRpY2F0b3IuZXh0cmEuc3RhY2tzID0geyBvcHRpb25hbDogdHJ1ZSwgaXRlbXM6IFtdIH07XG4gICAgfVxuICAgIGFjdGl2ZUluZGljYXRvci5leHRyYS5zdGFja3MuaXRlbXMucHVzaChfbWFrZVN5bnRoZXRpYyh7XG4gICAgICBrZXk6IGdyb3VwSXRlbS5rZXksXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgIG1lbnU6IGdyb3VwSXRlbS5tZW51LFxuICAgICAganF1ZXJ5OiBncm91cEl0ZW0uanF1ZXJ5ID8ge1xuICAgICAgICB2YWx1ZTogKCkgPT4gZ3JvdXBJdGVtLmpxdWVyeSEudmFsdWUoKSxcbiAgICAgICAgYnVpbGRBbGlhczogKCkgPT4gZ3JvdXBJdGVtLmpxdWVyeSEuYnVpbGRBbGlhcygpLFxuICAgICAgICBidWlsZE5hbWU6IChfaXRlbTogYW55LCB2YWx1ZTogc3RyaW5nKSA9PiBTdHJpbmcodmFsdWUpLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseVNsaWNlU2VsZWN0aW9uKHNlbGVjdGVkU2xpY2VzOiBzdHJpbmdbXSwgY2hhcnRDb25maWc6IE9yZ2FuaXplckNoYXJ0Q29uZmlnKTogdm9pZCB7XG4gIGdldEZpbHRlckl0ZW1zKGNoYXJ0Q29uZmlnKS5mb3JFYWNoKGYgPT4geyBmLnNlbGVjdGVkID0gc2VsZWN0ZWRTbGljZXMuaW5jbHVkZXMoZi5rZXkpOyB9KTtcbn1cblxuIl19
|