ngx-edu-sharing-metaqs2 0.9.32 → 0.9.35
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 +31 -0
- package/_index.scss +8 -0
- package/esm2022/lib/collection-count-history/collection-count-history.component.mjs +46 -32
- package/esm2022/lib/collection-count-history/monthpicker/monthpicker.component.mjs +7 -4
- package/esm2022/lib/components/donut-chart/donut-chart.component.mjs +14 -14
- package/esm2022/lib/components/donut-chart/donut-chart.model.mjs +1 -1
- package/esm2022/lib/components/donut-chart/donut-chart.pipe.mjs +6 -5
- package/esm2022/lib/components/donut-chart-tooltip/donut-chart-tooltip.component.mjs +79 -0
- package/esm2022/lib/components/filter/datepicker/datepicker.component.mjs +3 -8
- package/esm2022/lib/components/node-list/node-list.component.mjs +13 -9
- package/esm2022/lib/components/quality-matrix/quality_matrix.mjs +195 -36
- package/esm2022/lib/components/quality-matrix/scroll-marker.directive.mjs +17 -0
- package/esm2022/lib/config-helper.service.mjs +5 -4
- package/esm2022/lib/core/tooltip.service.mjs +146 -0
- package/esm2022/lib/counts-with-history/counts-with-history.component.mjs +87 -84
- package/esm2022/lib/java-api/api/authProxyController.service.mjs +12 -93
- package/esm2022/lib/java-api/api/collectionAPI.service.mjs +91 -178
- package/esm2022/lib/java-api/api/editorsAPI.service.mjs +14 -102
- package/esm2022/lib/java-api/api/filterAPI.service.mjs +50 -129
- package/esm2022/lib/java-api/api/replicationSourceAPI.service.mjs +20 -130
- package/esm2022/lib/java-api/api.base.service.mjs +66 -0
- package/esm2022/lib/java-api/configuration.mjs +9 -1
- package/esm2022/lib/java-api/model/missingAttributeResult.mjs +2 -0
- package/esm2022/lib/java-api/model/models.mjs +2 -1
- package/esm2022/lib/ng-meta-widgets-lib.module.mjs +19 -12
- package/esm2022/lib/tree-collection-details/tree-collection-details.component.mjs +3 -7
- package/esm2022/lib/tree-search-counts/tree-search-counts.component.mjs +4 -6
- package/esm2022/public-api.mjs +6 -4
- package/esm2022/web-components.mjs +36 -0
- package/fesm2022/ngx-edu-sharing-metaqs2.mjs +1170 -1239
- package/fesm2022/ngx-edu-sharing-metaqs2.mjs.map +1 -1
- package/lib/collection-count-history/collection-count-history.component.d.ts +1 -0
- package/lib/collection-count-history/monthpicker/monthpicker.component.d.ts +2 -1
- package/lib/components/donut-chart/donut-chart.component.d.ts +1 -1
- package/lib/components/donut-chart/donut-chart.model.d.ts +1 -0
- package/lib/components/donut-chart/donut-chart.pipe.d.ts +1 -1
- package/lib/components/donut-chart-tooltip/donut-chart-tooltip.component.d.ts +14 -0
- package/lib/components/node-list/node-list.component.d.ts +9 -5
- package/lib/components/quality-matrix/quality_matrix.d.ts +25 -6
- package/lib/components/quality-matrix/scroll-marker.directive.d.ts +7 -0
- package/lib/config-helper.service.d.ts +2 -0
- package/lib/core/tooltip.service.d.ts +61 -0
- package/lib/counts-with-history/counts-with-history.component.d.ts +27 -25
- package/lib/java-api/api/authProxyController.service.d.ts +4 -9
- package/lib/java-api/api/collectionAPI.service.d.ts +47 -25
- package/lib/java-api/api/editorsAPI.service.d.ts +5 -10
- package/lib/java-api/api/filterAPI.service.d.ts +27 -9
- package/lib/java-api/api/replicationSourceAPI.service.d.ts +4 -9
- package/lib/java-api/api.base.service.d.ts +12 -0
- package/lib/java-api/configuration.d.ts +3 -1
- package/lib/java-api/model/missingAttributeResult.d.ts +16 -0
- package/lib/java-api/model/models.d.ts +1 -0
- package/lib/ng-meta-widgets-lib.module.d.ts +34 -32
- package/package.json +4 -1
- package/public-api.d.ts +5 -3
- package/web-components.d.ts +7 -0
- package/esm2022/lib/materialtypes-by-sources/materialtypes-by-sources.component.mjs +0 -148
- package/lib/materialtypes-by-sources/materialtypes-by-sources.component.d.ts +0 -43
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
1
|
+
import { Inject, Injectable, InjectionToken } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
export class NgMetaWidgetsLibConfiguration {
|
|
4
4
|
}
|
|
5
|
+
export const NG_META_WIDGETS_LIB_CONFIGURATION = new InjectionToken('NG_META_WIDGETS_LIB_CONFIGURATION');
|
|
5
6
|
/**
|
|
6
7
|
* helper class to provide configuration values
|
|
7
8
|
*/
|
|
@@ -19,13 +20,13 @@ export class ConfigHelperService {
|
|
|
19
20
|
get eduSharingPath() {
|
|
20
21
|
return this.config.eduSharingPath;
|
|
21
22
|
}
|
|
22
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigHelperService, deps: [{ token:
|
|
23
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigHelperService, deps: [{ token: NG_META_WIDGETS_LIB_CONFIGURATION }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
23
24
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigHelperService }); }
|
|
24
25
|
}
|
|
25
26
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ConfigHelperService, decorators: [{
|
|
26
27
|
type: Injectable
|
|
27
28
|
}], ctorParameters: () => [{ type: NgMetaWidgetsLibConfiguration, decorators: [{
|
|
28
29
|
type: Inject,
|
|
29
|
-
args: [
|
|
30
|
+
args: [NG_META_WIDGETS_LIB_CONFIGURATION]
|
|
30
31
|
}] }] });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWV0YS13aWRnZXRzLWxpYi9zcmMvbGliL2NvbmZpZy1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRW5FLE1BQU0sT0FBTyw2QkFBNkI7Q0FHekM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLGNBQWMsQ0FDakUsbUNBQW1DLENBQ3BDLENBQUM7QUFFRjs7R0FFRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFBOEQsTUFBcUM7UUFBckMsV0FBTSxHQUFOLE1BQU0sQ0FBK0I7UUFDakcscUNBQXFDO0lBQ3ZDLENBQUM7SUFFTSxXQUFXLENBQUMsTUFBOEM7UUFDL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDcEMsQ0FBQzsrR0FmVSxtQkFBbUIsa0JBQ1YsaUNBQWlDO21IQUQxQyxtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVU7OzBCQUVJLE1BQU07MkJBQUMsaUNBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgTmdNZXRhV2lkZ2V0c0xpYkNvbmZpZ3VyYXRpb24ge1xuICBhcGlQYXRoOiBzdHJpbmc7XG4gIGVkdVNoYXJpbmdQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBOR19NRVRBX1dJREdFVFNfTElCX0NPTkZJR1VSQVRJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdNZXRhV2lkZ2V0c0xpYkNvbmZpZ3VyYXRpb24+KFxuICAnTkdfTUVUQV9XSURHRVRTX0xJQl9DT05GSUdVUkFUSU9OJ1xuKTtcblxuLyoqXG4gKiBoZWxwZXIgY2xhc3MgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uIHZhbHVlc1xuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29uZmlnSGVscGVyU2VydmljZSBpbXBsZW1lbnRzIENvbmZpZ0hlbHBlciB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkdfTUVUQV9XSURHRVRTX0xJQl9DT05GSUdVUkFUSU9OKSBwdWJsaWMgY29uZmlnOiBOZ01ldGFXaWRnZXRzTGliQ29uZmlndXJhdGlvbikge1xuICAgIC8vIGFwcGx5IGFwaSBwYXRoIGdpdmVuIGluIHdpbmRvdyB1cmxcbiAgfVxuXG4gIHB1YmxpYyBwYXRjaENvbmZpZyhjb25maWc6IFBhcnRpYWw8TmdNZXRhV2lkZ2V0c0xpYkNvbmZpZ3VyYXRpb24+KSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi5jb25maWcgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBpUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWR1U2hhcmluZ1BhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmVkdVNoYXJpbmdQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnSGVscGVyIHtcbiAgZ2V0IGFwaVBhdGgoKTogc3RyaW5nO1xuXG4gIGdldCBlZHVTaGFyaW5nUGF0aCgpOiBzdHJpbmc7XG5cbiAgcGF0Y2hDb25maWcoY29uZmlnOiBQYXJ0aWFsPE5nTWV0YVdpZGdldHNMaWJDb25maWd1cmF0aW9uPik6IHZvaWQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { inject, Injectable, InjectionToken, Injector, Renderer2 } from '@angular/core';
|
|
2
|
+
import { Overlay, OverlayRef } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export const TOOLTIP_DATA = new InjectionToken('TOOLTIP_DATA');
|
|
6
|
+
export const TOOLTIP_REF = new InjectionToken('TOOLTIP_REF');
|
|
7
|
+
const noop = Object.freeze(() => { });
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export class TooltipRefImpl {
|
|
12
|
+
constructor(renderer, overlay, openTimeout = 0, closeTimeout = 0, onOpen = noop, onClose = noop) {
|
|
13
|
+
this.renderer = renderer;
|
|
14
|
+
this.overlay = overlay;
|
|
15
|
+
this.openTimeout = openTimeout;
|
|
16
|
+
this.closeTimeout = closeTimeout;
|
|
17
|
+
this.onOpen = onOpen;
|
|
18
|
+
this.onClose = onClose;
|
|
19
|
+
}
|
|
20
|
+
cancelCloseAction() {
|
|
21
|
+
clearTimeout(this.closeTimeoutRef);
|
|
22
|
+
this.closeTimeoutRef = undefined;
|
|
23
|
+
}
|
|
24
|
+
open() {
|
|
25
|
+
this.openTimeoutRef = setTimeout(this.openTooltip.bind(this), this.openTimeout); // typescript bug (typescript mistakenly uses NodeJS.Timeout instead of number as return type of setTimeout)
|
|
26
|
+
}
|
|
27
|
+
openTooltip() {
|
|
28
|
+
this.openTimeoutRef = undefined;
|
|
29
|
+
this.component = this.overlay.attach(this.portal);
|
|
30
|
+
this.unlistenMouseEnter = this.renderer.listen(this.overlay.overlayElement, 'mouseenter', this.cancelCloseAction.bind(this));
|
|
31
|
+
this.unlistenMouseLeave = this.renderer.listen(this.overlay.overlayElement, 'mouseleave', this.markForClose.bind(this));
|
|
32
|
+
this.onOpen();
|
|
33
|
+
}
|
|
34
|
+
markForClose() {
|
|
35
|
+
if (this.openTimeoutRef) {
|
|
36
|
+
// not yet opened, cancel open action
|
|
37
|
+
clearTimeout(this.openTimeoutRef);
|
|
38
|
+
this.openTimeoutRef = undefined;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (this.closeTimeoutRef) {
|
|
42
|
+
// already marked for close
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.closeTimeoutRef = setTimeout(this.closeTooltip.bind(this), this.closeTimeout); // typescript bug (typescript mistakenly uses NodeJS.Timeout instead of number as return type of setTimeout)
|
|
46
|
+
}
|
|
47
|
+
closeTooltip() {
|
|
48
|
+
this.overlay.detach();
|
|
49
|
+
this.onClose();
|
|
50
|
+
this.closeTimeoutRef = undefined;
|
|
51
|
+
this.unlistenMouseEnter?.();
|
|
52
|
+
this.unlistenMouseLeave?.();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export const centerPositionStrategy = [
|
|
56
|
+
{
|
|
57
|
+
originX: 'center',
|
|
58
|
+
originY: 'center',
|
|
59
|
+
overlayX: 'start',
|
|
60
|
+
overlayY: 'top',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
originX: 'center',
|
|
64
|
+
originY: 'center',
|
|
65
|
+
overlayX: 'start',
|
|
66
|
+
overlayY: 'bottom',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
originX: 'center',
|
|
70
|
+
originY: 'center',
|
|
71
|
+
overlayX: 'end',
|
|
72
|
+
overlayY: 'top',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
originX: 'center',
|
|
76
|
+
originY: 'center',
|
|
77
|
+
overlayX: 'end',
|
|
78
|
+
overlayY: 'bottom',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
export const borderPositionStrategy = [
|
|
82
|
+
{
|
|
83
|
+
originX: 'center',
|
|
84
|
+
originY: 'bottom',
|
|
85
|
+
overlayX: 'start',
|
|
86
|
+
overlayY: 'top',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
originX: 'center',
|
|
90
|
+
originY: 'bottom',
|
|
91
|
+
overlayX: 'end',
|
|
92
|
+
overlayY: 'top',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
originX: 'center',
|
|
96
|
+
originY: 'top',
|
|
97
|
+
overlayX: 'start',
|
|
98
|
+
overlayY: 'bottom',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
originX: 'center',
|
|
102
|
+
originY: 'top',
|
|
103
|
+
overlayX: 'end',
|
|
104
|
+
overlayY: 'bottom',
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
export class TooltipService {
|
|
108
|
+
constructor() {
|
|
109
|
+
this.overlay = inject(Overlay);
|
|
110
|
+
this.renderer = inject(Renderer2);
|
|
111
|
+
}
|
|
112
|
+
create(component, config) {
|
|
113
|
+
const overlayRef = this.overlay.create(config.overlayConfig ?? {
|
|
114
|
+
hasBackdrop: false,
|
|
115
|
+
disposeOnNavigation: true,
|
|
116
|
+
});
|
|
117
|
+
const tooltipRef = new TooltipRefImpl(this.renderer, overlayRef, config.openTimeout ?? 0, config.closeTimeout ?? 0, config.onOpen ?? noop, config.onClose ?? noop);
|
|
118
|
+
tooltipRef.portal = new ComponentPortal(component, null, Injector.create({
|
|
119
|
+
providers: [
|
|
120
|
+
{
|
|
121
|
+
provide: OverlayRef,
|
|
122
|
+
useValue: overlayRef,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
provide: TOOLTIP_DATA,
|
|
126
|
+
useValue: config.data,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
provide: TOOLTIP_REF,
|
|
130
|
+
useValue: tooltipRef,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
parent: config.injector,
|
|
134
|
+
}));
|
|
135
|
+
return tooltipRef;
|
|
136
|
+
}
|
|
137
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
138
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipService, providedIn: 'root' }); }
|
|
139
|
+
}
|
|
140
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipService, decorators: [{
|
|
141
|
+
type: Injectable,
|
|
142
|
+
args: [{
|
|
143
|
+
providedIn: 'root',
|
|
144
|
+
}]
|
|
145
|
+
}] });
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWV0YS13aWRnZXRzLWxpYi9zcmMvbGliL2NvcmUvdG9vbHRpcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQXFCLE9BQU8sRUFBaUIsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUV0RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQVUsY0FBYyxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFzQixhQUFhLENBQUMsQ0FBQztBQVlsRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0FBRXJDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFRekIsWUFDbUIsUUFBbUIsRUFDcEIsT0FBbUIsRUFDbEIsY0FBYyxDQUFDLEVBQ2YsZUFBZSxDQUFDLEVBQ2hCLFNBQVMsSUFBSSxFQUNiLFVBQVUsSUFBSTtRQUxkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBSTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFJO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYixZQUFPLEdBQVAsT0FBTyxDQUFPO0lBQzlCLENBQUM7SUFFRyxpQkFBaUI7UUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxJQUFJLENB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QUNyQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUk7aUJBQ3RCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxXQUFXO29CQUNwQixRQUFRLEVBQUUsVUFBVTtpQkFDckI7YUFDRjtZQUNELE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUTtTQUN4QixDQUFDLENBQ0gsQ0FBQztRQUVGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7K0dBOUNVLGNBQWM7bUhBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBpbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3RvciwgUmVuZGVyZXIyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5leHBvcnQgY29uc3QgVE9PTFRJUF9EQVRBID0gbmV3IEluamVjdGlvblRva2VuPHVua25vd24+KCdUT09MVElQX0RBVEEnKTtcbmV4cG9ydCBjb25zdCBUT09MVElQX1JFRiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUb29sdGlwUmVmPHVua25vd24+PignVE9PTFRJUF9SRUYnKTtcblxuZXhwb3J0IGludGVyZmFjZSBUb29sdGlwUmVmPFQ+IHtcbiAgbWFya0ZvckNsb3NlKCk6IHZvaWQ7XG4gIGNhbmNlbENsb3NlQWN0aW9uKCk6IHZvaWQ7XG5cbiAgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheVJlZjtcbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnRSZWY8VD4gfCB1bmRlZmluZWQ7XG5cbiAgb3BlbigpOiB2b2lkO1xufVxuXG5jb25zdCBub29wID0gT2JqZWN0LmZyZWV6ZSgoKSA9PiB7fSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sdGlwUmVmSW1wbDxUPiBpbXBsZW1lbnRzIFRvb2x0aXBSZWY8VD4ge1xuICBwdWJsaWMgb3BlblRpbWVvdXRSZWY6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGNsb3NlVGltZW91dFJlZjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY29tcG9uZW50OiBDb21wb25lbnRSZWY8VD47XG4gIHByaXZhdGUgdW5saXN0ZW5Nb3VzZUVudGVyOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVubGlzdGVuTW91c2VMZWF2ZTogKCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHBvcnRhbDogQ29tcG9uZW50UG9ydGFsPFQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHVibGljIHJlYWRvbmx5IG92ZXJsYXk6IE92ZXJsYXlSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVuVGltZW91dCA9IDAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbG9zZVRpbWVvdXQgPSAwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25PcGVuID0gbm9vcCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uQ2xvc2UgPSBub29wXG4gICkge31cblxuICBwdWJsaWMgY2FuY2VsQ2xvc2VBY3Rpb24oKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0UmVmKTtcbiAgICB0aGlzLmNsb3NlVGltZW91dFJlZiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuKCkge1xuICAgIHRoaXMub3BlblRpbWVvdXRSZWYgPSBzZXRUaW1lb3V0KHRoaXMub3BlblRvb2x0aXAuYmluZCh0aGlzKSwgdGhpcy5vcGVuVGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7IC8vIHR5cGVzY3JpcHQgYnVnICh0eXBlc2NyaXB0IG1pc3Rha2VubHkgdXNlcyBOb2RlSlMuVGltZW91dCBpbnN0ZWFkIG9mIG51bWJlciBhcyByZXR1cm4gdHlwZSBvZiBzZXRUaW1lb3V0KVxuICB9XG5cbiAgcHVibGljIG9wZW5Ub29sdGlwKCkge1xuICAgIHRoaXMub3BlblRpbWVvdXRSZWYgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb21wb25lbnQgPSB0aGlzLm92ZXJsYXkuYXR0YWNoKHRoaXMucG9ydGFsKTtcbiAgICB0aGlzLnVubGlzdGVuTW91c2VFbnRlciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgdGhpcy5vdmVybGF5Lm92ZXJsYXlFbGVtZW50LFxuICAgICAgJ21vdXNlZW50ZXInLFxuICAgICAgdGhpcy5jYW5jZWxDbG9zZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgKTtcbiAgICB0aGlzLnVubGlzdGVuTW91c2VMZWF2ZSA9IHRoaXMucmVuZGVyZXIubGlzdGVuKFxuICAgICAgdGhpcy5vdmVybGF5Lm92ZXJsYXlFbGVtZW50LFxuICAgICAgJ21vdXNlbGVhdmUnLFxuICAgICAgdGhpcy5tYXJrRm9yQ2xvc2UuYmluZCh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5vbk9wZW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrRm9yQ2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlblRpbWVvdXRSZWYpIHtcbiAgICAgIC8vIG5vdCB5ZXQgb3BlbmVkLCBjYW5jZWwgb3BlbiBhY3Rpb25cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9wZW5UaW1lb3V0UmVmKTtcbiAgICAgIHRoaXMub3BlblRpbWVvdXRSZWYgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlVGltZW91dFJlZikge1xuICAgICAgLy8gYWxyZWFkeSBtYXJrZWQgZm9yIGNsb3NlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2VUaW1lb3V0UmVmID0gc2V0VGltZW91dCh0aGlzLmNsb3NlVG9vbHRpcC5iaW5kKHRoaXMpLCB0aGlzLmNsb3NlVGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7IC8vIHR5cGVzY3JpcHQgYnVnICh0eXBlc2NyaXB0IG1pc3Rha2VubHkgdXNlcyBOb2RlSlMuVGltZW91dCBpbnN0ZWFkIG9mIG51bWJlciBhcyByZXR1cm4gdHlwZSBvZiBzZXRUaW1lb3V0KVxuICB9XG5cbiAgcHVibGljIGNsb3NlVG9vbHRpcCgpIHtcbiAgICB0aGlzLm92ZXJsYXkuZGV0YWNoKCk7XG4gICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgdGhpcy5jbG9zZVRpbWVvdXRSZWYgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlRW50ZXI/LigpO1xuICAgIHRoaXMudW5saXN0ZW5Nb3VzZUxlYXZlPy4oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2VudGVyUG9zaXRpb25TdHJhdGVneTogQXJyYXk8Q29ubmVjdGVkUG9zaXRpb24+ID0gW1xuICB7XG4gICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgb3ZlcmxheVk6ICd0b3AnLFxuICB9LFxuICB7XG4gICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICB9LFxuICB7XG4gICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgfSxcbiAge1xuICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgYm9yZGVyUG9zaXRpb25TdHJhdGVneTogQXJyYXk8Q29ubmVjdGVkUG9zaXRpb24+ID0gW1xuICB7XG4gICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgb3ZlcmxheVk6ICd0b3AnLFxuICB9LFxuICB7XG4gICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgfSxcbiAge1xuICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgIG9yaWdpblk6ICd0b3AnLFxuICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgfSxcbiAge1xuICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgIG9yaWdpblk6ICd0b3AnLFxuICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gIH0sXG5dO1xuXG4vLyBnZW5lcmljIGFyZ3VtZW50IFQgaXMgbmVjZXNzYXJ5IGZvciB0eXBlc2NyaXB0IHRvIGNoZWNrIHRoZSBkYXRhIHBhc3NlZCB0byB0aGUgY29uZmlnXG5leHBvcnQgdHlwZSBEYXRhVG9vbHRpcEhlbHBlcjxUPiA9IHtcbiAgLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gbWFrZSB0eXBlc2NyaXB0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBEYXRhVG9vbHRpcEhlbHBlciBhbmQgdW5rbm93blxuICBba2V5IGluIG5ldmVyXTogVDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRvb2x0aXA8VD4gZXh0ZW5kcyBEYXRhVG9vbHRpcEhlbHBlcjxUPiB7fVxuXG50eXBlIERhdGFUeXBlT2ZUb29sdGlwPFQ+ID0gVCBleHRlbmRzIERhdGFUb29sdGlwPGluZmVyIFU+ID8gVSA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2x0aXBDb25maWc8VERhdGE+IHtcbiAgaW5qZWN0b3I/OiBJbmplY3RvcjtcbiAgY2xvc2VUaW1lb3V0PzogbnVtYmVyO1xuICBvcGVuVGltZW91dD86IG51bWJlcjtcbiAgZGF0YTogVERhdGE7XG4gIG9uQ2xvc2U/OiAoKSA9PiB2b2lkO1xuICBvbk9wZW4/OiAoKSA9PiB2b2lkO1xuICBvdmVybGF5Q29uZmlnPzogT3ZlcmxheUNvbmZpZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcHVibGljIGNyZWF0ZTxUQ29tcG9uZW50IGV4dGVuZHMgRGF0YVRvb2x0aXA8RGF0YVR5cGVPZlRvb2x0aXA8VENvbXBvbmVudD4+PihcbiAgICBjb21wb25lbnQ6IFR5cGU8VENvbXBvbmVudD4sXG4gICAgY29uZmlnOiBUb29sdGlwQ29uZmlnPERhdGFUeXBlT2ZUb29sdGlwPFRDb21wb25lbnQ+PlxuICApOiBUb29sdGlwUmVmPFRDb21wb25lbnQ+IHtcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgIGNvbmZpZy5vdmVybGF5Q29uZmlnID8/IHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICBkaXNwb3NlT25OYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCB0b29sdGlwUmVmID0gbmV3IFRvb2x0aXBSZWZJbXBsPFRDb21wb25lbnQ+KFxuICAgICAgdGhpcy5yZW5kZXJlcixcbiAgICAgIG92ZXJsYXlSZWYsXG4gICAgICBjb25maWcub3BlblRpbWVvdXQgPz8gMCxcbiAgICAgIGNvbmZpZy5jbG9zZVRpbWVvdXQgPz8gMCxcbiAgICAgIGNvbmZpZy5vbk9wZW4gPz8gbm9vcCxcbiAgICAgIGNvbmZpZy5vbkNsb3NlID8/IG5vb3BcbiAgICApO1xuICAgIHRvb2x0aXBSZWYucG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIG51bGwsXG4gICAgICBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBPdmVybGF5UmVmLFxuICAgICAgICAgICAgdXNlVmFsdWU6IG92ZXJsYXlSZWYsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUT09MVElQX0RBVEEsXG4gICAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLmRhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUT09MVElQX1JFRixcbiAgICAgICAgICAgIHVzZVZhbHVlOiB0b29sdGlwUmVmLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHBhcmVudDogY29uZmlnLmluamVjdG9yLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRvb2x0aXBSZWY7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { Component, Input, signal } from '@angular/core';
|
|
1
|
+
import { Component, computed, effect, Input, signal } from '@angular/core';
|
|
2
2
|
import { MatCard, MatCardContent, MatCardHeader, MatCardModule, MatCardTitle } from '@angular/material/card';
|
|
3
3
|
import { MatTooltip } from '@angular/material/tooltip';
|
|
4
4
|
import { MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, MatTableModule } from '@angular/material/table';
|
|
5
|
-
import { BehaviorSubject,
|
|
5
|
+
import { BehaviorSubject, zip } from 'rxjs';
|
|
6
6
|
import { TranslateModule } from '@ngx-translate/core';
|
|
7
|
-
import { AsyncPipe,
|
|
7
|
+
import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
|
|
8
8
|
import { DateTime } from 'luxon';
|
|
9
|
-
import { finalize, map, skipWhile,
|
|
10
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
9
|
+
import { filter, finalize, map, skipWhile, switchMap, take, tap } from 'rxjs/operators';
|
|
10
|
+
import { FormControl, FormGroup, FormsModule } from '@angular/forms';
|
|
11
11
|
import { DatepickerComponent } from '../components/filter/datepicker/datepicker.component';
|
|
12
12
|
import { MatIcon } from '@angular/material/icon';
|
|
13
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
14
|
+
import { MatSlideToggle } from '@angular/material/slide-toggle';
|
|
13
15
|
import { ProgressSpinnerComponent } from '../components/loading_indicator/progress-spinner/progress-spinner.component';
|
|
14
16
|
import * as i0 from "@angular/core";
|
|
15
17
|
import * as i1 from "../meta-api.service";
|
|
@@ -17,16 +19,19 @@ import * as i2 from "../components/editorial-link-service/editorial-link.service
|
|
|
17
19
|
import * as i3 from "@angular/material/card";
|
|
18
20
|
import * as i4 from "@angular/material/table";
|
|
19
21
|
import * as i5 from "@ngx-translate/core";
|
|
22
|
+
import * as i6 from "@angular/forms";
|
|
20
23
|
export class CountsWithHistoryComponent {
|
|
21
|
-
constructor(metaApi, linkService) {
|
|
24
|
+
constructor(metaApi, destroyRef, linkService) {
|
|
22
25
|
this.metaApi = metaApi;
|
|
26
|
+
this.destroyRef = destroyRef;
|
|
23
27
|
this.linkService = linkService;
|
|
24
|
-
this.
|
|
28
|
+
this.loadingCount = signal(0);
|
|
29
|
+
this.isLoading = computed(() => this.loadingCount() > 0);
|
|
25
30
|
this.timeFilterLoaded = signal(false);
|
|
26
|
-
this.destroyed$ = new Subject();
|
|
27
31
|
this.recentTypeCount$ = new BehaviorSubject({ columns: [], rows: [] });
|
|
28
32
|
this.pastTypeCount$ = new BehaviorSubject({ columns: [], rows: [] });
|
|
29
|
-
this.
|
|
33
|
+
this.DateTime = DateTime;
|
|
34
|
+
this.columns = signal([]);
|
|
30
35
|
this.apiMethod = 'getMaterialTypeCountsByReplicationSource';
|
|
31
36
|
this.columnTranslationkey = null;
|
|
32
37
|
/* In this widget's backend we do have data for today
|
|
@@ -36,72 +41,83 @@ export class CountsWithHistoryComponent {
|
|
|
36
41
|
start: new FormControl(),
|
|
37
42
|
end: new FormControl(DateTime.utc().startOf('day'), { nonNullable: true }),
|
|
38
43
|
});
|
|
39
|
-
this.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return this.columns.map((c) => c.id + '_recent');
|
|
49
|
-
}
|
|
50
|
-
get pastColumns() {
|
|
51
|
-
return this.columns.map((c) => c.id + '_past');
|
|
52
|
-
}
|
|
53
|
-
get allColumns() {
|
|
54
|
-
return this.pastColumns.flatMap((e, i) => [e, this.recentColumns[i]]);
|
|
55
|
-
}
|
|
56
|
-
registerDateRangeFilter() {
|
|
57
|
-
/* we cannot use the takeUntilDestroyed() helper here,
|
|
58
|
-
* because this method is indirectly called in the finalization of the getTimerangeFilter() call
|
|
59
|
-
*/
|
|
60
|
-
this.range.controls.end.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe((date) => {
|
|
61
|
-
this.getCountByDate(date).subscribe((response) => {
|
|
62
|
-
this.recentTypeCount$.next(response);
|
|
63
|
-
});
|
|
44
|
+
this.isHistoryEnabled = signal(false);
|
|
45
|
+
this.allColumns = computed(() => {
|
|
46
|
+
if (!this.isHistoryEnabled()) {
|
|
47
|
+
return this.recentColumns();
|
|
48
|
+
}
|
|
49
|
+
return this.pastColumns().flatMap((e, i) => [e, this.recentColumns()[i]]);
|
|
50
|
+
});
|
|
51
|
+
this.typeColumns = computed(() => {
|
|
52
|
+
return this.columns().map((c) => c.id + '_type');
|
|
64
53
|
});
|
|
65
|
-
this.
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
|
|
54
|
+
this.recentColumns = computed(() => {
|
|
55
|
+
return this.columns().map((c) => c.id + '_recent');
|
|
56
|
+
});
|
|
57
|
+
this.pastColumns = computed(() => {
|
|
58
|
+
return this.columns().map((c) => c.id + '_past');
|
|
59
|
+
});
|
|
60
|
+
effect(() => {
|
|
61
|
+
this.range.controls.end.reset();
|
|
62
|
+
if (!this.isHistoryEnabled()) {
|
|
63
|
+
this.range.controls.start.setValue(this.range.controls.end.value.startOf('day'));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.range.controls.start.reset();
|
|
67
|
+
}
|
|
69
68
|
});
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.
|
|
74
|
-
.
|
|
70
|
+
ngOnInit() {
|
|
71
|
+
this.getAvailableDateRange()
|
|
72
|
+
.pipe(tap((rangeFilter) => {
|
|
73
|
+
const startDate = this.getStartDateOfRange(rangeFilter);
|
|
74
|
+
//this is to have a default value for the start date => the min date of the range
|
|
75
|
+
this.range.setControl('start', new FormControl(startDate, { nonNullable: true }));
|
|
76
|
+
}), finalize(() => {
|
|
75
77
|
this.timeFilterLoaded.set(true);
|
|
76
|
-
this.registerDateRangeFilter();
|
|
77
78
|
this.range.controls.start.reset();
|
|
78
|
-
}))
|
|
79
|
-
.subscribe(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
79
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
80
|
+
.subscribe();
|
|
81
|
+
this.getCountByDate(this.range.controls.end.value)
|
|
82
|
+
.pipe(tap((response) => {
|
|
83
|
+
this.columns.set(response.columns.slice());
|
|
84
|
+
this.recentTypeCount$.next(response);
|
|
85
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
86
|
+
.subscribe();
|
|
87
|
+
this.getValuesInDateRange()
|
|
88
|
+
.pipe(tap(([past, recent]) => {
|
|
89
|
+
this.pastTypeCount$.next(past);
|
|
90
|
+
this.recentTypeCount$.next(recent);
|
|
91
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
92
|
+
.subscribe();
|
|
93
|
+
}
|
|
94
|
+
getStartDateOfRange(rangeFilter) {
|
|
95
|
+
return DateTime.fromISO(rangeFilter.values.find((v) => v.id === 'rangeStart')?.label, {
|
|
96
|
+
zone: 'utc',
|
|
97
|
+
}).startOf('day');
|
|
98
|
+
}
|
|
99
|
+
columnIdent(_index, col) {
|
|
100
|
+
return col.id;
|
|
101
|
+
}
|
|
102
|
+
getAvailableDateRange() {
|
|
103
|
+
this.loadingCount.update((it) => it + 1);
|
|
104
|
+
return this.metaApi.getTimerangeFilter().pipe(filter((filter) => filter != null), finalize(() => this.loadingCount.update((it) => it - 1)));
|
|
105
|
+
}
|
|
106
|
+
getValuesInDateRange() {
|
|
107
|
+
return this.range.valueChanges.pipe(filter((range) => !!range.start?.isValid && !!range.end?.isValid), switchMap((range) => {
|
|
108
|
+
return zip(this.getCountByDate(range.start), this.getCountByDate(range.end));
|
|
109
|
+
}));
|
|
88
110
|
}
|
|
89
111
|
getCountByDate(date) {
|
|
90
|
-
this.
|
|
112
|
+
this.loadingCount.update((it) => it + 1);
|
|
91
113
|
const filter = {
|
|
92
114
|
field: 'asOf',
|
|
93
115
|
values: [{ id: date.toISO({ includeOffset: false }), label: '' }],
|
|
94
116
|
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// typesript gets confused here
|
|
100
|
-
// @ts-ignore
|
|
101
|
-
finalize(() => this.isLoading.set(false)), map((response) => {
|
|
102
|
-
response.rows.sort((a, b) => a.meta.label.localeCompare(b.meta.label));
|
|
103
|
-
return response;
|
|
104
|
-
}));
|
|
117
|
+
return this.metaApi[this.apiMethod]([filter]).pipe(finalize(() => this.loadingCount.update((it) => it - 1)), map((response) => ({
|
|
118
|
+
...response,
|
|
119
|
+
rows: response.rows.toSorted((a, b) => a.meta.label.localeCompare(b.meta.label)),
|
|
120
|
+
})));
|
|
105
121
|
}
|
|
106
122
|
pastTypeCount(row, columnid) {
|
|
107
123
|
if (!this.pastTypeCount$.value.rows.length) {
|
|
@@ -127,22 +143,8 @@ export class CountsWithHistoryComponent {
|
|
|
127
143
|
return this.linkService.createLinkForCountsWithHistory(this.sourceType, sourceId, issueId);
|
|
128
144
|
}));
|
|
129
145
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
this.getCountByDate(this.range.controls.end.value)
|
|
133
|
-
.pipe(tap((response) => {
|
|
134
|
-
this.columns = response.columns.slice();
|
|
135
|
-
}))
|
|
136
|
-
.subscribe((response) => {
|
|
137
|
-
this.recentTypeCount$.next(response);
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
ngOnDestroy() {
|
|
141
|
-
this.destroyed$.next();
|
|
142
|
-
this.destroyed$.complete();
|
|
143
|
-
}
|
|
144
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, deps: [{ token: i1.MetaApiService }, { token: i2.EditorialLinkService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
145
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CountsWithHistoryComponent, isStandalone: true, selector: "metaqs2-counts-with-history", inputs: { apiMethod: "apiMethod", columnTranslationkey: "columnTranslationkey", pageTitle: "pageTitle", sourceType: "sourceType" }, ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >\n {{columnTranslationkey ? (columnTranslationkey + col.label | translate ) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? 'n/a' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ProgressSpinnerComponent, selector: "metaqs2-progress-spinner", inputs: ["color", "diameter", "strokeWidth", "backdropEnabled", "positionGloballyCenter", "displayProgressSpinner"] }] }); }
|
|
146
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, deps: [{ token: i1.MetaApiService }, { token: i0.DestroyRef }, { token: i2.EditorialLinkService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
147
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CountsWithHistoryComponent, isStandalone: true, selector: "metaqs2-counts-with-history", inputs: { apiMethod: "apiMethod", columnTranslationkey: "columnTranslationkey", pageTitle: "pageTitle", sourceType: "sourceType" }, ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate }}{{ isLoading() ? \": Lade neue Daten.\" : \"\" }}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content class=\"toolbar\">\n <metaqs2-datepicker [disabled]=\"isLoading() || !isHistoryEnabled()\" [inputGroup]=\"range\" *ngIf=\"timeFilterLoaded() && isHistoryEnabled()\"></metaqs2-datepicker>\n <div style=\"flex: 1 1 auto\"></div>\n <mat-slide-toggle [ngModel]=\"isHistoryEnabled()\" (ngModelChange)=\"isHistoryEnabled.set($event)\" [disabled]=\"isLoading()\" *ngIf=\"timeFilterLoaded()\">\n <label>Zeige historische Daten</label>\n </mat-slide-toggle>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [class.while-loading]=\"isLoading()\" mat-table [dataSource]=\"recentTypeCount$.value.rows\"\n class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th [attr.rowspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef>\n <div>Quelle</div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [matTooltip]=\"row.meta.alt_label\"\n class=\"label-col\"\n >\n {{ row.meta.label }}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_type'\">\n <th [attr.colspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef [matTooltip]=\"col.label\">\n {{ columnTranslationkey ? (columnTranslationkey + col.label | translate) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef\n matTooltip=\"no tooltip\">{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}\n </th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? '\u2013' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\">\n {{ (pastTypeCount$ | async)?.rows?.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\" >\n <ng-container *ngIf=\"(pastTypeCount$ | async)?.rows?.length && pastTypeCount(row, col.id) as trend\">\n <span [class]=\"trend.trend\"> {{ trend.value ?? '\u2013' }}\n <mat-icon *ngIf=\"trend.value\" aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{ trend.trend }}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns()); sticky:true;\"></tr>\n <tr [hidden]=\"!isHistoryEnabled()\" mat-header-row *matHeaderRowDef=\"allColumns(); sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns())\"></tr>\n\n </table>\n</mat-card>\n", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}.actionbar{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ProgressSpinnerComponent, selector: "metaqs2-progress-spinner", inputs: ["color", "diameter", "strokeWidth", "backdropEnabled", "positionGloballyCenter", "displayProgressSpinner"] }] }); }
|
|
146
148
|
}
|
|
147
149
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, decorators: [{
|
|
148
150
|
type: Component,
|
|
@@ -162,13 +164,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
162
164
|
MatRowDef,
|
|
163
165
|
NgForOf,
|
|
164
166
|
DatepickerComponent,
|
|
165
|
-
NgClass,
|
|
166
167
|
MatIcon,
|
|
167
168
|
NgIf,
|
|
169
|
+
FormsModule,
|
|
170
|
+
MatSlideToggle,
|
|
168
171
|
AsyncPipe,
|
|
169
172
|
ProgressSpinnerComponent,
|
|
170
|
-
], template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content
|
|
171
|
-
}], ctorParameters: () => [{ type: i1.MetaApiService }, { type: i2.EditorialLinkService }], propDecorators: { apiMethod: [{
|
|
173
|
+
], template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate }}{{ isLoading() ? \": Lade neue Daten.\" : \"\" }}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content class=\"toolbar\">\n <metaqs2-datepicker [disabled]=\"isLoading() || !isHistoryEnabled()\" [inputGroup]=\"range\" *ngIf=\"timeFilterLoaded() && isHistoryEnabled()\"></metaqs2-datepicker>\n <div style=\"flex: 1 1 auto\"></div>\n <mat-slide-toggle [ngModel]=\"isHistoryEnabled()\" (ngModelChange)=\"isHistoryEnabled.set($event)\" [disabled]=\"isLoading()\" *ngIf=\"timeFilterLoaded()\">\n <label>Zeige historische Daten</label>\n </mat-slide-toggle>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [class.while-loading]=\"isLoading()\" mat-table [dataSource]=\"recentTypeCount$.value.rows\"\n class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th [attr.rowspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef>\n <div>Quelle</div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [matTooltip]=\"row.meta.alt_label\"\n class=\"label-col\"\n >\n {{ row.meta.label }}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_type'\">\n <th [attr.colspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef [matTooltip]=\"col.label\">\n {{ columnTranslationkey ? (columnTranslationkey + col.label | translate) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef\n matTooltip=\"no tooltip\">{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}\n </th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? '\u2013' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\">\n {{ (pastTypeCount$ | async)?.rows?.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\" >\n <ng-container *ngIf=\"(pastTypeCount$ | async)?.rows?.length && pastTypeCount(row, col.id) as trend\">\n <span [class]=\"trend.trend\"> {{ trend.value ?? '\u2013' }}\n <mat-icon *ngIf=\"trend.value\" aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{ trend.trend }}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns()); sticky:true;\"></tr>\n <tr [hidden]=\"!isHistoryEnabled()\" mat-header-row *matHeaderRowDef=\"allColumns(); sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns())\"></tr>\n\n </table>\n</mat-card>\n", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}.actionbar{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:.5rem}\n"] }]
|
|
174
|
+
}], ctorParameters: () => [{ type: i1.MetaApiService }, { type: i0.DestroyRef }, { type: i2.EditorialLinkService }], propDecorators: { apiMethod: [{
|
|
172
175
|
type: Input,
|
|
173
176
|
args: [{ required: true }]
|
|
174
177
|
}], columnTranslationkey: [{
|
|
@@ -179,4 +182,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
179
182
|
type: Input,
|
|
180
183
|
args: [{ required: true }]
|
|
181
184
|
}] } });
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3BFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENB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QyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDOytHQTVKVSwwQkFBMEI7bUdBQTFCLDBCQUEwQiwyTkM3Q3ZDLDY4R0EyRFcsNHpCRHRDUCxhQUFhLG1aQUtiLFVBQVUsZ1JBQ1YsY0FBYyxzZ0NBRWQsZUFBZSw0RkFLZixPQUFPLG1IQUNQLG1CQUFtQixtR0FDbkIsT0FBTyxvRkFDUCxPQUFPLDJJQUNQLElBQUksd0ZBQ0osU0FBUyw4Q0FDVCx3QkFBd0I7OzRGQUtmLDBCQUEwQjtrQkE1QnRDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksV0FDUDt3QkFDUCxhQUFhO3dCQUNiLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixjQUFjO3dCQUNkLFFBQVE7d0JBQ1IsZUFBZTt3QkFDZixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsTUFBTTt3QkFDTixTQUFTO3dCQUNULE9BQU87d0JBQ1AsbUJBQW1CO3dCQUNuQixPQUFPO3dCQUNQLE9BQU87d0JBQ1AsSUFBSTt3QkFDSixTQUFTO3dCQUNULHdCQUF3QjtxQkFDekI7c0hBYUQsU0FBUztzQkFEUixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFHekIsb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLFNBQVM7c0JBRFIsS0FBSztnQkFHTixVQUFVO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2FyZCwgTWF0Q2FyZENvbnRlbnQsIE1hdENhcmRIZWFkZXIsIE1hdENhcmRNb2R1bGUsIE1hdENhcmRUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0SGVhZGVyUm93LCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvdywgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1ldGFBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vbWV0YS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXIsIE1hdHJpeFJvd1dpdGhDb3VudHMsIE1hdHJpeFdpdGhDb3VudHMsIFF1YWxpdHlNYXRyaXhIZWFkZXIgfSBmcm9tICcuLi9qYXZhLWFwaSc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAsIHNraXBXaGlsZSwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsdGVyL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgRWRpdG9yaWFsTGlua1NlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL2VkaXRvcmlhbC1saW5rLXNlcnZpY2UvZWRpdG9yaWFsLWxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2xvYWRpbmdfaW5kaWNhdG9yL3Byb2dyZXNzLXNwaW5uZXIvcHJvZ3Jlc3Mtc3Bpbm5lci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZXRhcXMyLWNvdW50cy13aXRoLWhpc3RvcnknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0Q2FyZE1vZHVsZSxcbiAgICBNYXRDYXJkLFxuICAgIE1hdENhcmRIZWFkZXIsXG4gICAgTWF0Q2FyZFRpdGxlLFxuICAgIE1hdENhcmRDb250ZW50LFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0VGFibGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdEhlYWRlclJvdyxcbiAgICBNYXRIZWFkZXJSb3dEZWYsXG4gICAgTWF0Um93LFxuICAgIE1hdFJvd0RlZixcbiAgICBOZ0Zvck9mLFxuICAgIERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRJY29uLFxuICAgIE5nSWYsXG4gICAgQXN5bmNQaXBlLFxuICAgIFByb2dyZXNzU3Bpbm5lckNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIENvdW50c1dpdGhIaXN0b3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNMb2FkaW5nID0gc2lnbmFsKHRydWUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUZpbHRlckxvYWRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSByZWNlbnRUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRyaXhXaXRoQ291bnRzPih7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhc3RUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRyaXhXaXRoQ291bnRzPih7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9KTtcbiAgcHJpdmF0ZSBjb2x1bW5zOiBRdWFsaXR5TWF0cml4SGVhZGVyW10gPSBbXTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBhcGlNZXRob2Q6IGtleW9mIE1ldGFBcGlTZXJ2aWNlID0gJ2dldE1hdGVyaWFsVHlwZUNvdW50c0J5UmVwbGljYXRpb25Tb3VyY2UnO1xuICBASW5wdXQoKVxuICBjb2x1bW5UcmFuc2xhdGlvbmtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzb3VyY2VUeXBlOiAncmVwbGljYXRpb25Tb3VyY2UnIHwgJ2NvbGxlY3Rpb24nO1xuXG4gIC8qIEluIHRoaXMgd2lkZ2V0J3MgYmFja2VuZCB3ZSBkbyBoYXZlIGRhdGEgZm9yIHRvZGF5XG4gICAqIHRoZXJlZm9yZSB3ZSBzZXQgdGhlIGVuZCBkYXRlIHRvIHRvZGF5IGFuZCB1c2UgdGhlIHRpbWVyYW5nZSgpIGVuZHBvaW50IHRvIG9ubHkgc2V0IHRoZSBzdGFydCBkYXRlXG4gICAqL1xuICByZWFkb25seSByYW5nZTogRm9ybUdyb3VwPHtcbiAgICBzdGFydDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICAgIGVuZDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICB9PiA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbChEYXRlVGltZS51dGMoKS5zdGFydE9mKCdkYXknKSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtZXRhQXBpOiBNZXRhQXBpU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBsaW5rU2VydmljZTogRWRpdG9yaWFsTGlua1NlcnZpY2UpIHt9XG4gIGNvbHVtbklkZW50KF9pbmRleDogbnVtYmVyLCBjb2w6IFF1YWxpdHlNYXRyaXhIZWFkZXIpIHtcbiAgICByZXR1cm4gY29sLmlkO1xuICB9XG5cbiAgZ2V0IHR5cGVDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCArICdfdHlwZScpO1xuICB9XG5cbiAgZ2V0IHJlY2VudENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLmlkICsgJ19yZWNlbnQnKTtcbiAgfVxuXG4gIGdldCBwYXN0Q29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMuaWQgKyAnX3Bhc3QnKTtcbiAgfVxuXG4gIGdldCBhbGxDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wYXN0Q29sdW1ucy5mbGF0TWFwKChlLCBpKSA9PiBbZSwgdGhpcy5yZWNlbnRDb2x1bW5zW2ldXSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyRGF0ZVJhbmdlRmlsdGVyKCkge1xuICAgIC8qIHdlIGNhbm5vdCB1c2UgdGhlIHRha2VVbnRpbERlc3Ryb3llZCgpIGhlbHBlciBoZXJlLFxuICAgICAqIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgaW5kaXJlY3RseSBjYWxsZWQgaW4gdGhlIGZpbmFsaXphdGlvbiBvZiB0aGUgZ2V0VGltZXJhbmdlRmlsdGVyKCkgY2FsbFxuICAgICAqL1xuICAgIHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q291bnRCeURhdGUoZGF0ZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnJlY2VudFR5cGVDb3VudCQubmV4dChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q291bnRCeURhdGUoZGF0ZSkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnBhc3RUeXBlQ291bnQkLm5leHQocmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpbWVSYW5nZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhQXBpXG4gICAgICAuZ2V0VGltZXJhbmdlRmlsdGVyKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50aW1lRmlsdGVyTG9hZGVkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyRGF0ZVJhbmdlRmlsdGVyKCk7XG4gICAgICAgICAgdGhpcy5yYW5nZS5jb250cm9scy5zdGFydC5yZXNldCgpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmFuZ2VGaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKHJhbmdlRmlsdGVyKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhyYW5nZUZpbHRlci52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gJ3JhbmdlU3RhcnQnKT8ubGFiZWwhLCB7XG4gICAgICAgICAgICB6b25lOiAndXRjJyxcbiAgICAgICAgICB9KS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICAvL3RoaXMgaXMgdG8gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdGFydCBkYXRlID0+IHRoZSBtaW4gZGF0ZSBvZiB0aGUgcmFuZ2VcbiAgICAgICAgICB0aGlzLnJhbmdlLnNldENvbnRyb2woJ3N0YXJ0JywgbmV3IEZvcm1Db250cm9sPERhdGVUaW1lPihzdGFydERhdGUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q291bnRCeURhdGUoZGF0ZTogRGF0ZVRpbWUpOiBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+IHtcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgY29uc3QgZmlsdGVyOiBGaWx0ZXIgPSB7XG4gICAgICBmaWVsZDogJ2FzT2YnLFxuICAgICAgdmFsdWVzOiBbeyBpZDogZGF0ZS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pISwgbGFiZWw6ICcnIH1dLFxuICAgIH07XG4gICAgLy8gdHlwZSBvZiB0aGlzLm1ldGFBcGlbdGhpcy5hcGlNZXRob2RdKFtmaWx0ZXJdKSBpcyBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+XG4gICAgLy8gYnV0IHR5cGVzY3JpcHQgZG9lcyBub3Qga25vdyB0aGF0XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB0aGlzLm1ldGFBcGlbdGhpcy5hcGlNZXRob2RdKFtmaWx0ZXJdKS5waXBlKFxuICAgICAgLy8gdHlwZXNyaXB0IGdldHMgY29uZnVzZWQgaGVyZVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKSksXG4gICAgICBtYXAoKHJlc3BvbnNlOiBNYXRyaXhXaXRoQ291bnRzKSA9PiB7XG4gICAgICAgIHJlc3BvbnNlLnJvd3Muc29ydCgoYSwgYikgPT4gYS5tZXRhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5tZXRhLmxhYmVsKSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXN0VHlwZUNvdW50KHJvdzogTWF0cml4Um93V2l0aENvdW50cywgY29sdW1uaWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBwYXN0X3JvdyA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5maW5kKChwcikgPT4gcHIubWV0YS5pZCA9PSByb3cubWV0YS5pZCk7XG4gICAgY29uc3QgcGFzdF9jb2x1bW4gPSB0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLmNvbHVtbnMuZmluZCgoYykgPT4gYy5pZCA9PSBjb2x1bW5pZCk7XG4gICAgaWYgKCFwYXN0X3JvdyB8fCAhcGFzdF9jb2x1bW4pIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSByb3cuY291bnRzW2NvbHVtbmlkXTtcbiAgICBjb25zdCBwYXN0VmFsdWUgPSBwYXN0X3Jvdy5jb3VudHNbY29sdW1uaWRdO1xuXG4gICAgY29uc3QgZGVsdGEgPSAoY3VycmVudFZhbHVlIHx8IDApIC0gKHBhc3RWYWx1ZSB8fCAwKTtcbiAgICBjb25zdCB0cmVuZCA9IGRlbHRhID09PSAwID8gJ3RyZW5kaW5nX2ZsYXQnIDogZGVsdGEgPCAwID8gJ3RyZW5kaW5nX2Rvd24nIDogJ3RyZW5kaW5nX3VwJztcbiAgICByZXR1cm4geyBkZWx0YSwgdHJlbmQsIHZhbHVlOiBwYXN0VmFsdWUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvcGVuSW5FZGl0b3Ioc291cmNlSWQ6IHN0cmluZywgaXNzdWVJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc291cmNlVHlwZSA9PT0gJ3JlcGxpY2F0aW9uU291cmNlJykge1xuICAgICAgLy8gZmluZCB0aGUgbG9uZyBuYW1lIGZvciB0aGUgc291cmNlXG4gICAgICBzb3VyY2VJZCA9IHRoaXMucmVjZW50VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHIpID0+IHIubWV0YS5pZCA9PT0gc291cmNlSWQpPy5tZXRhLmxhYmVsIHx8IHNvdXJjZUlkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5saW5rU2VydmljZS50eXBlc0xvYWRlZCQucGlwZShcbiAgICAgIHNraXBXaGlsZSgobG9hZGVkKSA9PiAhbG9hZGVkKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5rU2VydmljZS5jcmVhdGVMaW5rRm9yQ291bnRzV2l0aEhpc3RvcnkodGhpcy5zb3VyY2VUeXBlLCBzb3VyY2VJZCwgaXNzdWVJZCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFRpbWVSYW5nZUZpbHRlcigpO1xuICAgIHRoaXMuZ2V0Q291bnRCeURhdGUodGhpcy5yYW5nZS5jb250cm9scy5lbmQudmFsdWUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnMuc2xpY2UoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGVUaW1lID0gRGF0ZVRpbWU7XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJyYWlzZWRcIj5cbiAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cInBhZ2VUaXRsZVwiPlxuICAgIDxtYXQtY2FyZC10aXRsZSBkYXRhLXRlc3QtaWQ9XCJwYWdlLXRpdGxlXCI+XG4gICAgICBRdWFsaXTDpHRzbWV0cmlrOiB7eyBwYWdlVGl0bGUgfCB0cmFuc2xhdGV9fXt7aXNMb2FkaW5nKCkgPyBcIjogTGFkZSBuZXVlIERhdGVuLlwiIDogXCJcIn19XG4gICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgPC9tYXQtY2FyZC1oZWFkZXI+XG4gIDwhLS0gY29uc2lkZXIgdG8gcHV0IHRoZSBmaWx0ZXIgaW4gdGhlIHRhYmxlIGhlYWRlciB0byBhdm9pZCB0aGF0IGl0IGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3LS0+XG4gIDwhLS0gc2hvdyB0aGUgZmlsdGVyIGFmdGVyIHRoZSB2YWx1ZXMgYXJlIGxvYWRlZCB0byBhdm9pZCBsb2FkaW5nIGN1cnJlbnQgZGF0YSB0d2ljZSAtLT5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgKm5nSWY9XCJ0aW1lRmlsdGVyTG9hZGVkKClcIj5cbiAgICA8bWV0YXFzMi1kYXRlcGlja2VyIFtkaXNhYmxlZF09XCJpc0xvYWRpbmcoKVwiIFtpbnB1dEdyb3VwXT1cInJhbmdlXCIgPjwvbWV0YXFzMi1kYXRlcGlja2VyPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPlxuPG1hdC1jYXJkPlxuICA8bWV0YXFzMi1wcm9ncmVzcy1zcGlubmVyIFtkaXNwbGF5UHJvZ3Jlc3NTcGlubmVyXT1cImlzTG9hZGluZygpXCI+PC9tZXRhcXMyLXByb2dyZXNzLXNwaW5uZXI+XG4gIDx0YWJsZSBbbmdDbGFzc109XCJ7J3doaWxlLWxvYWRpbmcnOiBpc0xvYWRpbmcoKX1cIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVjZW50VHlwZUNvdW50JC52YWx1ZS5yb3dzXCIgY2xhc3M9XCJxdWFsaXR5LW1hdHJpeFwiPlxuICAgIDwhLS0gRGVmaW5lIGNvbHVtbnMgb2YgdGFibGUgLS0+XG4gICAgPCEtLSBSb3cgSGVhZGVyIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhYmVsLWNvbFwiIHN0aWNreT5cbiAgICAgIDx0aCByb3dzcGFuPVwiMlwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5RdWVsbGU8L3RoPlxuICAgICAgPHRkXG4gICAgICAgIG1hdC1jZWxsXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJ7e3Jvdy5tZXRhLmFsdF9sYWJlbH19XCJcbiAgICAgICAgY2xhc3M9XCJsYWJlbC1jb2xcIlxuICAgICAgPlxuICAgICAgICB7e3Jvdy5tZXRhLmxhYmVsfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ190eXBlJ1wiPlxuICAgICAgPHRoIGNvbHNwYW49XCIyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdFRvb2x0aXA9XCJ7e2NvbC5sYWJlbH19XCIgPlxuICAgICAgICB7e2NvbHVtblRyYW5zbGF0aW9ua2V5ID8gKGNvbHVtblRyYW5zbGF0aW9ua2V5ICsgY29sLmxhYmVsIHwgdHJhbnNsYXRlICkgOiBjb2wubGFiZWwgfX1cbiAgICAgIDwvdGg+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiByZWNlbnRUeXBlQ291bnQkLnZhbHVlLmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIiBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcmVjZW50J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiID57eyByYW5nZS5jb250cm9scy5lbmQudmFsdWUudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9TSE9SVCkgfX08L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICA8YSBbYXR0ci5ocmVmXT1cIm9wZW5JbkVkaXRvcihyb3cubWV0YS5pZCwgY29sLmlkKSB8IGFzeW5jXCIgdGFyZ2V0PVwiZWRpdG9yX2Zyb250ZW5kXCI+e3sgcm93LmNvdW50c1tjb2wuaWRdID8/ICduL2EnIH19PC9hPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG9sZGVyIGRhdGUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3Bhc3QnXCI+XG4gICAgICA8dGggY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiID5cbiAgICAgICAge3sgcGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGggPyByYW5nZS5jb250cm9scy5zdGFydC52YWx1ZS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSA6ICdubyBwYXN0IGRhdGEnIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicGFzdC1kYXRhLWNlbGxcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmxlbmd0aCAmJiBwYXN0VHlwZUNvdW50KHJvdywgY29sLmlkKSBhcyB0cmVuZFwiPlxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInRyZW5kLnRyZW5kXCI+IHt7IHRyZW5kLnZhbHVlID8/ICduL2EnIH19PG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRyZW5kLnRyZW5kXCIgW2ZvbnRJY29uXT1cInRyZW5kLnRyZW5kIVwiIC8+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiPnt7dHJlbmQudHJlbmR9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gZ2VuZXJhdGUgYWN0dWFsIHRhYmxlIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydsYWJlbC1jb2wnXS5jb25jYXQodHlwZUNvbHVtbnMpOyBzdGlja3k6dHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiYWxsQ29sdW1uczsgc3RpY2t5OiB0cnVlO1wiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnbGFiZWwtY29sJ10uY29uY2F0KGFsbENvbHVtbnMpXCI+PC90cj5cblxuICA8L3RhYmxlPlxuPC9tYXQtY2FyZD4iXX0=
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckgsT0FBTyxFQUFFLGVBQWUsRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcs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c0JBRG5CLEtBQUs7Z0JBR04sU0FBUztzQkFEUixLQUFLO2dCQUdOLFVBQVU7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIElucHV0LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2FyZCwgTWF0Q2FyZENvbnRlbnQsIE1hdENhcmRIZWFkZXIsIE1hdENhcmRNb2R1bGUsIE1hdENhcmRUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0SGVhZGVyUm93LCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvdywgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yT2YsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWV0YUFwaVNlcnZpY2UgfSBmcm9tICcuLi9tZXRhLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlciwgTWF0cml4Um93V2l0aENvdW50cywgTWF0cml4V2l0aENvdW50cywgUXVhbGl0eU1hdHJpeEhlYWRlciB9IGZyb20gJy4uL2phdmEtYXBpJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgZmlsdGVyLCBmaW5hbGl6ZSwgbWFwLCBza2lwV2hpbGUsIHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWx0ZXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2xvYWRpbmdfaW5kaWNhdG9yL3Byb2dyZXNzLXNwaW5uZXIvcHJvZ3Jlc3Mtc3Bpbm5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWRpdG9yaWFsTGlua1NlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL2VkaXRvcmlhbC1saW5rLXNlcnZpY2UvZWRpdG9yaWFsLWxpbmsuc2VydmljZSc7XG5cbnR5cGUgUGlja0tleXNCeVByb3BlcnR5VHlwZTxUT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBUUHJvcGVydHlUeXBlPiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVE9iamVjdF06IFRPYmplY3RbVEtleV0gZXh0ZW5kcyBUUHJvcGVydHlUeXBlID8gVEtleSA6IG5ldmVyO1xufVtrZXlvZiBUT2JqZWN0XTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWV0YXFzMi1jb3VudHMtd2l0aC1oaXN0b3J5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdENhcmRNb2R1bGUsXG4gICAgTWF0Q2FyZCxcbiAgICBNYXRDYXJkSGVhZGVyLFxuICAgIE1hdENhcmRUaXRsZSxcbiAgICBNYXRDYXJkQ29udGVudCxcbiAgICBNYXRUb29sdGlwLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFRhYmxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRIZWFkZXJSb3csXG4gICAgTWF0SGVhZGVyUm93RGVmLFxuICAgIE1hdFJvdyxcbiAgICBNYXRSb3dEZWYsXG4gICAgTmdGb3JPZixcbiAgICBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgIE1hdEljb24sXG4gICAgTmdJZixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgUHJvZ3Jlc3NTcGlubmVyQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ291bnRzV2l0aEhpc3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9hZGluZ0NvdW50ID0gc2lnbmFsKDApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNMb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5sb2FkaW5nQ291bnQoKSA+IDApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUZpbHRlckxvYWRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSByZWNlbnRUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRyaXhXaXRoQ291bnRzPih7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhc3RUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXRyaXhXaXRoQ291bnRzPih7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGVUaW1lID0gRGF0ZVRpbWU7XG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsKFtdIGFzIEFycmF5PFF1YWxpdHlNYXRyaXhIZWFkZXI+KTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBhcGlNZXRob2Q6IFBpY2tLZXlzQnlQcm9wZXJ0eVR5cGU8TWV0YUFwaVNlcnZpY2UsIChpdDogQXJyYXk8RmlsdGVyPikgPT4gT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPj4gPVxuICAgICdnZXRNYXRlcmlhbFR5cGVDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlJztcbiAgQElucHV0KClcbiAgY29sdW1uVHJhbnNsYXRpb25rZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKVxuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc291cmNlVHlwZTogJ3JlcGxpY2F0aW9uU291cmNlJyB8ICdjb2xsZWN0aW9uJztcblxuICAvKiBJbiB0aGlzIHdpZGdldCdzIGJhY2tlbmQgd2UgZG8gaGF2ZSBkYXRhIGZvciB0b2RheVxuICAgKiB0aGVyZWZvcmUgd2Ugc2V0IHRoZSBlbmQgZGF0ZSB0byB0b2RheSBhbmQgdXNlIHRoZSB0aW1lcmFuZ2UoKSBlbmRwb2ludCB0byBvbmx5IHNldCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2U6IEZvcm1Hcm91cDx7XG4gICAgc3RhcnQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgICBlbmQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgfT4gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woRGF0ZVRpbWUudXRjKCkuc3RhcnRPZignZGF5JyksIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gIH0pO1xuICByZWFkb25seSBpc0hpc3RvcnlFbmFibGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBhbGxDb2x1bW5zID0gY29tcHV0ZWQ8QXJyYXk8c3RyaW5nPj4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc0hpc3RvcnlFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlY2VudENvbHVtbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFzdENvbHVtbnMoKS5mbGF0TWFwKChlLCBpKSA9PiBbZSwgdGhpcy5yZWNlbnRDb2x1bW5zKClbaV1dKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdHlwZUNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucygpLm1hcCgoYykgPT4gYy5pZCArICdfdHlwZScpO1xuICB9KTtcblxuICByZWFkb25seSByZWNlbnRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMoKS5tYXAoKGMpID0+IGMuaWQgKyAnX3JlY2VudCcpO1xuICB9KTtcblxuICByZWFkb25seSBwYXN0Q29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zKCkubWFwKChjKSA9PiBjLmlkICsgJ19wYXN0Jyk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBtZXRhQXBpOiBNZXRhQXBpU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpbmtTZXJ2aWNlOiBFZGl0b3JpYWxMaW5rU2VydmljZVxuICApIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5yYW5nZS5jb250cm9scy5lbmQucmVzZXQoKTtcbiAgICAgIGlmICghdGhpcy5pc0hpc3RvcnlFbmFibGVkKCkpIHtcbiAgICAgICAgdGhpcy5yYW5nZS5jb250cm9scy5zdGFydC5zZXRWYWx1ZSh0aGlzLnJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZS5zdGFydE9mKCdkYXknKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnJlc2V0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldEF2YWlsYWJsZURhdGVSYW5nZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyYW5nZUZpbHRlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuZ2V0U3RhcnREYXRlT2ZSYW5nZShyYW5nZUZpbHRlcik7XG4gICAgICAgICAgLy90aGlzIGlzIHRvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RhcnQgZGF0ZSA9PiB0aGUgbWluIGRhdGUgb2YgdGhlIHJhbmdlXG4gICAgICAgICAgdGhpcy5yYW5nZS5zZXRDb250cm9sKCdzdGFydCcsIG5ldyBGb3JtQ29udHJvbDxEYXRlVGltZTx0cnVlPj4oc3RhcnREYXRlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbWVGaWx0ZXJMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMucmFuZ2UuY29udHJvbHMuc3RhcnQucmVzZXQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5nZXRDb3VudEJ5RGF0ZSh0aGlzLnJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNldChyZXNwb25zZS5jb2x1bW5zLnNsaWNlKCkpO1xuICAgICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5nZXRWYWx1ZXNJbkRhdGVSYW5nZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChbcGFzdCwgcmVjZW50XSkgPT4ge1xuICAgICAgICAgIHRoaXMucGFzdFR5cGVDb3VudCQubmV4dChwYXN0KTtcbiAgICAgICAgICB0aGlzLnJlY2VudFR5cGVDb3VudCQubmV4dChyZWNlbnQpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnREYXRlT2ZSYW5nZShyYW5nZUZpbHRlcjogRmlsdGVyKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21JU08ocmFuZ2VGaWx0ZXIudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09ICdyYW5nZVN0YXJ0Jyk/LmxhYmVsISwge1xuICAgICAgem9uZTogJ3V0YycsXG4gICAgfSkuc3RhcnRPZignZGF5JykgYXMgRGF0ZVRpbWU8dHJ1ZT47XG4gIH1cblxuICBjb2x1bW5JZGVudChfaW5kZXg6IG51bWJlciwgY29sOiBRdWFsaXR5TWF0cml4SGVhZGVyKSB7XG4gICAgcmV0dXJuIGNvbC5pZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXZhaWxhYmxlRGF0ZVJhbmdlKCkge1xuICAgIHRoaXMubG9hZGluZ0NvdW50LnVwZGF0ZSgoaXQpID0+IGl0ICsgMSk7XG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaS5nZXRUaW1lcmFuZ2VGaWx0ZXIoKS5waXBlKFxuICAgICAgZmlsdGVyKChmaWx0ZXIpOiBmaWx0ZXIgaXMgRmlsdGVyID0+IGZpbHRlciAhPSBudWxsKSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZ0NvdW50LnVwZGF0ZSgoaXQpID0+IGl0IC0gMSkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVzSW5EYXRlUmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2UudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBmaWx0ZXIoXG4gICAgICAgIChyYW5nZSk6IHJhbmdlIGlzIHsgc3RhcnQ6IERhdGVUaW1lPHRydWU+OyBlbmQ6IERhdGVUaW1lPHRydWU+IH0gPT5cbiAgICAgICAgICAhIXJhbmdlLnN0YXJ0Py5pc1ZhbGlkICYmICEhcmFuZ2UuZW5kPy5pc1ZhbGlkXG4gICAgICApLFxuICAgICAgc3dpdGNoTWFwKChyYW5nZSkgPT4ge1xuICAgICAgICByZXR1cm4gemlwKHRoaXMuZ2V0Q291bnRCeURhdGUocmFuZ2Uuc3RhcnQpLCB0aGlzLmdldENvdW50QnlEYXRlKHJhbmdlLmVuZCkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudEJ5RGF0ZShkYXRlOiBEYXRlVGltZSk6IE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz4ge1xuICAgIHRoaXMubG9hZGluZ0NvdW50LnVwZGF0ZSgoaXQpID0+IGl0ICsgMSk7XG4gICAgY29uc3QgZmlsdGVyOiBGaWx0ZXIgPSB7XG4gICAgICBmaWVsZDogJ2FzT2YnLFxuICAgICAgdmFsdWVzOiBbeyBpZDogZGF0ZS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pISwgbGFiZWw6ICcnIH1dLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmdDb3VudC51cGRhdGUoKGl0KSA9PiBpdCAtIDEpKSxcbiAgICAgIG1hcCgocmVzcG9uc2UpID0+ICh7XG4gICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICByb3dzOiByZXNwb25zZS5yb3dzLnRvU29ydGVkKChhLCBiKSA9PiBhLm1ldGEubGFiZWwubG9jYWxlQ29tcGFyZShiLm1ldGEubGFiZWwpKSxcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFzdFR5cGVDb3VudChcbiAgICByb3c6IE1hdHJpeFJvd1dpdGhDb3VudHMsXG4gICAgY29sdW1uaWQ6IHN0cmluZ1xuICApOiB7IGRlbHRhPzogbnVtYmVyOyB0cmVuZD86IHN0cmluZzsgdmFsdWU/OiBudW1iZXIgfSB7XG4gICAgaWYgKCF0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3Rfcm93ID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHByKSA9PiBwci5tZXRhLmlkID09IHJvdy5tZXRhLmlkKTtcbiAgICBjb25zdCBwYXN0X2NvbHVtbiA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09IGNvbHVtbmlkKTtcbiAgICBpZiAoIXBhc3Rfcm93IHx8ICFwYXN0X2NvbHVtbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJvdy5jb3VudHNbY29sdW1uaWRdO1xuICAgIGNvbnN0IHBhc3RWYWx1ZSA9IHBhc3Rfcm93LmNvdW50c1tjb2x1bW5pZF07XG5cbiAgICBjb25zdCBkZWx0YSA9IChjdXJyZW50VmFsdWUgfHwgMCkgLSAocGFzdFZhbHVlIHx8IDApO1xuICAgIGNvbnN0IHRyZW5kID0gZGVsdGEgPT09IDAgPyAndHJlbmRpbmdfZmxhdCcgOiBkZWx0YSA8IDAgPyAndHJlbmRpbmdfZG93bicgOiAndHJlbmRpbmdfdXAnO1xuICAgIHJldHVybiB7IGRlbHRhLCB0cmVuZCwgdmFsdWU6IHBhc3RWYWx1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG9wZW5JbkVkaXRvcihzb3VyY2VJZDogc3RyaW5nLCBpc3N1ZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5zb3VyY2VUeXBlID09PSAncmVwbGljYXRpb25Tb3VyY2UnKSB7XG4gICAgICAvLyBmaW5kIHRoZSBsb25nIG5hbWUgZm9yIHRoZSBzb3VyY2VcbiAgICAgIHNvdXJjZUlkID0gdGhpcy5yZWNlbnRUeXBlQ291bnQkLnZhbHVlLnJvd3MuZmluZCgocikgPT4gci5tZXRhLmlkID09PSBzb3VyY2VJZCk/Lm1ldGEubGFiZWwgfHwgc291cmNlSWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpbmtTZXJ2aWNlLnR5cGVzTG9hZGVkJC5waXBlKFxuICAgICAgc2tpcFdoaWxlKChsb2FkZWQpID0+ICFsb2FkZWQpLFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtTZXJ2aWNlLmNyZWF0ZUxpbmtGb3JDb3VudHNXaXRoSGlzdG9yeSh0aGlzLnNvdXJjZVR5cGUsIHNvdXJjZUlkLCBpc3N1ZUlkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJyYWlzZWRcIj5cbiAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cInBhZ2VUaXRsZVwiPlxuICAgIDxtYXQtY2FyZC10aXRsZSBkYXRhLXRlc3QtaWQ9XCJwYWdlLXRpdGxlXCI+XG4gICAgICBRdWFsaXTDpHRzbWV0cmlrOiB7eyBwYWdlVGl0bGUgfCB0cmFuc2xhdGUgfX17eyBpc0xvYWRpbmcoKSA/IFwiOiBMYWRlIG5ldWUgRGF0ZW4uXCIgOiBcIlwiIH19XG4gICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgPC9tYXQtY2FyZC1oZWFkZXI+XG4gIDwhLS0gY29uc2lkZXIgdG8gcHV0IHRoZSBmaWx0ZXIgaW4gdGhlIHRhYmxlIGhlYWRlciB0byBhdm9pZCB0aGF0IGl0IGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3LS0+XG4gIDwhLS0gc2hvdyB0aGUgZmlsdGVyIGFmdGVyIHRoZSB2YWx1ZXMgYXJlIGxvYWRlZCB0byBhdm9pZCBsb2FkaW5nIGN1cnJlbnQgZGF0YSB0d2ljZSAtLT5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJ0b29sYmFyXCI+XG4gICAgPG1ldGFxczItZGF0ZXBpY2tlciBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nKCkgfHwgIWlzSGlzdG9yeUVuYWJsZWQoKVwiIFtpbnB1dEdyb3VwXT1cInJhbmdlXCIgKm5nSWY9XCJ0aW1lRmlsdGVyTG9hZGVkKCkgJiYgaXNIaXN0b3J5RW5hYmxlZCgpXCI+PC9tZXRhcXMyLWRhdGVwaWNrZXI+XG4gICAgPGRpdiBzdHlsZT1cImZsZXg6IDEgMSBhdXRvXCI+PC9kaXY+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgW25nTW9kZWxdPVwiaXNIaXN0b3J5RW5hYmxlZCgpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiaXNIaXN0b3J5RW5hYmxlZC5zZXQoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJpc0xvYWRpbmcoKVwiICpuZ0lmPVwidGltZUZpbHRlckxvYWRlZCgpXCI+XG4gICAgICA8bGFiZWw+WmVpZ2UgaGlzdG9yaXNjaGUgRGF0ZW48L2xhYmVsPlxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbjxtYXQtY2FyZD5cbiAgPG1ldGFxczItcHJvZ3Jlc3Mtc3Bpbm5lciBbZGlzcGxheVByb2dyZXNzU3Bpbm5lcl09XCJpc0xvYWRpbmcoKVwiPjwvbWV0YXFzMi1wcm9ncmVzcy1zcGlubmVyPlxuICA8dGFibGUgW2NsYXNzLndoaWxlLWxvYWRpbmddPVwiaXNMb2FkaW5nKClcIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVjZW50VHlwZUNvdW50JC52YWx1ZS5yb3dzXCJcbiAgICAgICAgIGNsYXNzPVwicXVhbGl0eS1tYXRyaXhcIj5cbiAgICA8IS0tIERlZmluZSBjb2x1bW5zIG9mIHRhYmxlIC0tPlxuICAgIDwhLS0gUm93IEhlYWRlciBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYWJlbC1jb2xcIiBzdGlja3k+XG4gICAgICA8dGggW2F0dHIucm93c3Bhbl09XCJpc0hpc3RvcnlFbmFibGVkKCkgPyAnMicgOiAnMSdcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgIDxkaXY+UXVlbGxlPC9kaXY+XG4gICAgICA8L3RoPlxuICAgICAgPHRkXG4gICAgICAgIG1hdC1jZWxsXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInJvdy5tZXRhLmFsdF9sYWJlbFwiXG4gICAgICAgIGNsYXNzPVwibGFiZWwtY29sXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93Lm1ldGEubGFiZWwgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIChyZWNlbnRUeXBlQ291bnQkIHwgYXN5bmMpPy5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCJcbiAgICAgICAgICAgICAgICAgIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ190eXBlJ1wiPlxuICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiaXNIaXN0b3J5RW5hYmxlZCgpID8gJzInIDogJzEnXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFttYXRUb29sdGlwXT1cImNvbC5sYWJlbFwiPlxuICAgICAgICB7eyBjb2x1bW5UcmFuc2xhdGlvbmtleSA/IChjb2x1bW5UcmFuc2xhdGlvbmtleSArIGNvbC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2wubGFiZWwgfX1cbiAgICAgIDwvdGg+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiAocmVjZW50VHlwZUNvdW50JCB8IGFzeW5jKT8uY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiXG4gICAgICAgICAgICAgICAgICBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcmVjZW50J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCI+e3sgcmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICA8YSBbYXR0ci5ocmVmXT1cIm9wZW5JbkVkaXRvcihyb3cubWV0YS5pZCwgY29sLmlkKSB8IGFzeW5jXCIgdGFyZ2V0PVwiZWRpdG9yX2Zyb250ZW5kXCI+e3sgcm93LmNvdW50c1tjb2wuaWRdID8/ICfigJMnIH19PC9hPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG9sZGVyIGRhdGUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgKHJlY2VudFR5cGVDb3VudCQgfCBhc3luYyk/LmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIlxuICAgICAgICAgICAgICAgICAgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3Bhc3QnXCI+XG4gICAgICA8dGggY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiPlxuICAgICAgICB7eyAocGFzdFR5cGVDb3VudCQgfCBhc3luYyk/LnJvd3M/Lmxlbmd0aCA/IHJhbmdlLmNvbnRyb2xzLnN0YXJ0LnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIDogJ25vIHBhc3QgZGF0YScgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztcIiA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIocGFzdFR5cGVDb3VudCQgfCBhc3luYyk/LnJvd3M/Lmxlbmd0aCAmJiBwYXN0VHlwZUNvdW50KHJvdywgY29sLmlkKSBhcyB0cmVuZFwiPlxuICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJ0cmVuZC50cmVuZFwiPiB7eyB0cmVuZC52YWx1ZSA/PyAn4oCTJyB9fVxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwidHJlbmQudmFsdWVcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVuZC50cmVuZFwiIFtmb250SWNvbl09XCJ0cmVuZC50cmVuZCFcIiAvPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57eyB0cmVuZC50cmVuZCB9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gZ2VuZXJhdGUgYWN0dWFsIHRhYmxlIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydsYWJlbC1jb2wnXS5jb25jYXQodHlwZUNvbHVtbnMoKSk7IHN0aWNreTp0cnVlO1wiPjwvdHI+XG4gICAgPHRyIFtoaWRkZW5dPVwiIWlzSGlzdG9yeUVuYWJsZWQoKVwiIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJhbGxDb2x1bW5zKCk7IHN0aWNreTogdHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2xhYmVsLWNvbCddLmNvbmNhdChhbGxDb2x1bW5zKCkpXCI+PC90cj5cblxuICA8L3RhYmxlPlxuPC9tYXQtY2FyZD5cbiJdfQ==
|