bways-report 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +293 -464
- package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
- package/esm2022/lib/core/index.mjs +2 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
- package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
- package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
- package/esm2022/lib/data-access/adapters/index.mjs +8 -1
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
- package/esm2022/lib/features/designer/designer.component.mjs +43 -2
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
- package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
- package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
- package/esm2022/lib/features/embed/index.mjs +5 -0
- package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
- package/esm2022/lib/features/index.mjs +2 -1
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
- package/esm2022/lib/features/routing/index.mjs +2 -2
- package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
- package/esm2022/lib/features/routing/report-routes.mjs +42 -1
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
- package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
- package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
- package/esm2022/lib/provide-reporting.mjs +137 -7
- package/fesm2022/bways-report.mjs +4053 -840
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +161 -0
- package/lib/core/index.d.ts +1 -0
- package/lib/core/models/report-definition.model.d.ts +16 -0
- package/lib/core/services/report-session-context.service.d.ts +1 -0
- package/lib/core/tokens/reporting-config.token.d.ts +16 -0
- package/lib/core/utils/data-normalization.util.d.ts +10 -0
- package/lib/core/utils/report-parameter.util.d.ts +18 -1
- package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
- package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
- package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
- package/lib/data-access/adapters/index.d.ts +7 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
- package/lib/features/designer/designer.component.d.ts +4 -0
- package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
- package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
- package/lib/features/embed/bways-report-page.component.d.ts +61 -0
- package/lib/features/embed/index.d.ts +4 -0
- package/lib/features/embed/inject-report-menu.d.ts +44 -0
- package/lib/features/index.d.ts +1 -0
- package/lib/features/persistence/services/report-store.service.d.ts +5 -0
- package/lib/features/routing/index.d.ts +1 -1
- package/lib/features/routing/models/report-route.models.d.ts +3 -0
- package/lib/features/routing/report-routes.d.ts +40 -0
- package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
- package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
- package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
- package/lib/provide-reporting.d.ts +22 -6
- package/package.json +1 -1
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input, signal, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { RouterModule } from '@angular/router';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
|
|
6
|
+
import { injectReportMenu, injectReportMenuGroups } from './inject-report-menu';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/router";
|
|
9
|
+
import * as i2 from "@angular/forms";
|
|
10
|
+
/**
|
|
11
|
+
* Drop-in menu component for bways-report.
|
|
12
|
+
*
|
|
13
|
+
* Automatically displays saved and published report pages from the backend or storage.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```html
|
|
17
|
+
* <!-- Sidebar navigation -->
|
|
18
|
+
* <bways-report-menu variant="sidebar" />
|
|
19
|
+
*
|
|
20
|
+
* <!-- Horizontal navigation bar -->
|
|
21
|
+
* <bways-report-menu variant="navbar" />
|
|
22
|
+
*
|
|
23
|
+
* <!-- Header dropdown button -->
|
|
24
|
+
* <bways-report-menu variant="dropdown" />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class BwaysReportMenuComponent {
|
|
28
|
+
variant = input('sidebar');
|
|
29
|
+
basePath = input(undefined);
|
|
30
|
+
title = input('Reports');
|
|
31
|
+
showIcons = input(true);
|
|
32
|
+
allowSearch = input(false);
|
|
33
|
+
includeDrafts = input(false);
|
|
34
|
+
searchQuery = signal('');
|
|
35
|
+
isOpen = signal(false);
|
|
36
|
+
collapsedGroups = signal(new Set());
|
|
37
|
+
rawMenu = injectReportMenu();
|
|
38
|
+
rawGroups = injectReportMenuGroups();
|
|
39
|
+
totalItems = computed(() => this.rawMenu().length);
|
|
40
|
+
filteredFlatItems = computed(() => {
|
|
41
|
+
const q = this.searchQuery().trim().toLowerCase();
|
|
42
|
+
const items = this.rawMenu();
|
|
43
|
+
if (!q)
|
|
44
|
+
return items;
|
|
45
|
+
return items.filter((item) => item.name.toLowerCase().includes(q) ||
|
|
46
|
+
item.category.toLowerCase().includes(q) ||
|
|
47
|
+
item.slug.toLowerCase().includes(q));
|
|
48
|
+
});
|
|
49
|
+
filteredGroups = computed(() => {
|
|
50
|
+
const q = this.searchQuery().trim().toLowerCase();
|
|
51
|
+
const groups = this.rawGroups();
|
|
52
|
+
if (!q)
|
|
53
|
+
return groups;
|
|
54
|
+
return groups
|
|
55
|
+
.map((g) => ({
|
|
56
|
+
...g,
|
|
57
|
+
items: g.items.filter((item) => item.name.toLowerCase().includes(q) ||
|
|
58
|
+
item.category.toLowerCase().includes(q) ||
|
|
59
|
+
item.slug.toLowerCase().includes(q)),
|
|
60
|
+
}))
|
|
61
|
+
.filter((g) => g.items.length > 0);
|
|
62
|
+
});
|
|
63
|
+
isGroupCollapsed(category) {
|
|
64
|
+
return this.collapsedGroups().has(category);
|
|
65
|
+
}
|
|
66
|
+
toggleGroup(category) {
|
|
67
|
+
const set = new Set(this.collapsedGroups());
|
|
68
|
+
if (set.has(category)) {
|
|
69
|
+
set.delete(category);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
set.add(category);
|
|
73
|
+
}
|
|
74
|
+
this.collapsedGroups.set(set);
|
|
75
|
+
}
|
|
76
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
77
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BwaysReportMenuComponent, isStandalone: true, selector: "bways-report-menu", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, showIcons: { classPropertyName: "showIcons", publicName: "showIcons", isSignal: true, isRequired: false, transformFunction: null }, allowSearch: { classPropertyName: "allowSearch", publicName: "allowSearch", isSignal: true, isRequired: false, transformFunction: null }, includeDrafts: { classPropertyName: "includeDrafts", publicName: "includeDrafts", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
78
|
+
<!-- ═══════════════ SIDEBAR VARIANT ═══════════════ -->
|
|
79
|
+
@if (variant() === 'sidebar') {
|
|
80
|
+
<nav class="rpt-menu-sidebar" [attr.aria-label]="title()">
|
|
81
|
+
@if (title()) {
|
|
82
|
+
<div class="rpt-menu-sidebar-header">
|
|
83
|
+
<div class="rpt-menu-header-left">
|
|
84
|
+
<rpt-icon name="file-text" [size]="16" class="rpt-menu-header-icon" />
|
|
85
|
+
<span class="rpt-menu-title">{{ title() }}</span>
|
|
86
|
+
</div>
|
|
87
|
+
<span class="rpt-menu-count-badge">{{ totalItems() }}</span>
|
|
88
|
+
</div>
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@if (allowSearch()) {
|
|
92
|
+
<div class="rpt-menu-search-box">
|
|
93
|
+
<rpt-icon name="search" [size]="13" class="rpt-search-icon" />
|
|
94
|
+
<input
|
|
95
|
+
type="text"
|
|
96
|
+
class="rpt-search-input"
|
|
97
|
+
placeholder="Search reports..."
|
|
98
|
+
[ngModel]="searchQuery()"
|
|
99
|
+
(ngModelChange)="searchQuery.set($event)"
|
|
100
|
+
/>
|
|
101
|
+
@if (searchQuery()) {
|
|
102
|
+
<button
|
|
103
|
+
type="button"
|
|
104
|
+
class="rpt-search-clear"
|
|
105
|
+
(click)="searchQuery.set('')"
|
|
106
|
+
aria-label="Clear search"
|
|
107
|
+
>
|
|
108
|
+
×
|
|
109
|
+
</button>
|
|
110
|
+
}
|
|
111
|
+
</div>
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@if (filteredGroups().length === 0) {
|
|
115
|
+
<div class="rpt-menu-empty">
|
|
116
|
+
<p>No reports found.</p>
|
|
117
|
+
</div>
|
|
118
|
+
} @else {
|
|
119
|
+
<div class="rpt-menu-groups-container">
|
|
120
|
+
@for (group of filteredGroups(); track group.category) {
|
|
121
|
+
<div class="rpt-menu-group">
|
|
122
|
+
@if (filteredGroups().length > 1 || group.category !== 'General') {
|
|
123
|
+
<div
|
|
124
|
+
class="rpt-group-heading"
|
|
125
|
+
(click)="toggleGroup(group.category)"
|
|
126
|
+
role="button"
|
|
127
|
+
tabindex="0"
|
|
128
|
+
>
|
|
129
|
+
<span class="rpt-group-title">{{ group.displayName }}</span>
|
|
130
|
+
<rpt-icon
|
|
131
|
+
[name]="isGroupCollapsed(group.category) ? 'chevron-right' : 'chevron-down'"
|
|
132
|
+
[size]="12"
|
|
133
|
+
class="rpt-group-arrow"
|
|
134
|
+
/>
|
|
135
|
+
</div>
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@if (!isGroupCollapsed(group.category)) {
|
|
139
|
+
<ul class="rpt-group-items">
|
|
140
|
+
@for (item of group.items; track item.slug) {
|
|
141
|
+
<li class="rpt-item-row">
|
|
142
|
+
<a
|
|
143
|
+
[routerLink]="item.route"
|
|
144
|
+
routerLinkActive="rpt-active-link"
|
|
145
|
+
class="rpt-menu-link"
|
|
146
|
+
[title]="item.name"
|
|
147
|
+
>
|
|
148
|
+
@if (showIcons()) {
|
|
149
|
+
<rpt-icon
|
|
150
|
+
[name]="item.icon || 'file-text'"
|
|
151
|
+
[size]="15"
|
|
152
|
+
class="rpt-item-icon"
|
|
153
|
+
/>
|
|
154
|
+
}
|
|
155
|
+
<span class="rpt-item-text">{{ item.name }}</span>
|
|
156
|
+
@if (item.isDraft) {
|
|
157
|
+
<span class="rpt-draft-chip">draft</span>
|
|
158
|
+
}
|
|
159
|
+
</a>
|
|
160
|
+
</li>
|
|
161
|
+
}
|
|
162
|
+
</ul>
|
|
163
|
+
}
|
|
164
|
+
</div>
|
|
165
|
+
}
|
|
166
|
+
</div>
|
|
167
|
+
}
|
|
168
|
+
</nav>
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
<!-- ═══════════════ NAVBAR VARIANT ═══════════════ -->
|
|
172
|
+
@else if (variant() === 'navbar') {
|
|
173
|
+
<nav class="rpt-menu-navbar" [attr.aria-label]="title()">
|
|
174
|
+
<ul class="rpt-navbar-list">
|
|
175
|
+
@for (item of filteredFlatItems(); track item.slug) {
|
|
176
|
+
<li class="rpt-navbar-item">
|
|
177
|
+
<a
|
|
178
|
+
[routerLink]="item.route"
|
|
179
|
+
routerLinkActive="rpt-active-link"
|
|
180
|
+
class="rpt-navbar-link"
|
|
181
|
+
[title]="item.name"
|
|
182
|
+
>
|
|
183
|
+
@if (showIcons()) {
|
|
184
|
+
<rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
|
|
185
|
+
}
|
|
186
|
+
<span>{{ item.name }}</span>
|
|
187
|
+
</a>
|
|
188
|
+
</li>
|
|
189
|
+
}
|
|
190
|
+
</ul>
|
|
191
|
+
</nav>
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
<!-- ═══════════════ DROPDOWN VARIANT ═══════════════ -->
|
|
195
|
+
@else if (variant() === 'dropdown') {
|
|
196
|
+
<div class="rpt-menu-dropdown-wrapper">
|
|
197
|
+
<button
|
|
198
|
+
type="button"
|
|
199
|
+
class="rpt-dropdown-trigger"
|
|
200
|
+
(click)="isOpen.set(!isOpen())"
|
|
201
|
+
[attr.aria-expanded]="isOpen()"
|
|
202
|
+
>
|
|
203
|
+
<rpt-icon name="file-text" [size]="15" />
|
|
204
|
+
<span>{{ title() }}</span>
|
|
205
|
+
<rpt-icon
|
|
206
|
+
[name]="isOpen() ? 'chevron-down' : 'chevron-down'"
|
|
207
|
+
[size]="12"
|
|
208
|
+
class="rpt-trigger-arrow"
|
|
209
|
+
/>
|
|
210
|
+
</button>
|
|
211
|
+
|
|
212
|
+
@if (isOpen()) {
|
|
213
|
+
<div class="rpt-dropdown-backdrop" (click)="isOpen.set(false)"></div>
|
|
214
|
+
<div class="rpt-dropdown-panel" role="menu">
|
|
215
|
+
@if (allowSearch()) {
|
|
216
|
+
<div class="rpt-dropdown-search">
|
|
217
|
+
<input
|
|
218
|
+
type="text"
|
|
219
|
+
class="rpt-dropdown-search-input"
|
|
220
|
+
placeholder="Filter reports..."
|
|
221
|
+
[ngModel]="searchQuery()"
|
|
222
|
+
(ngModelChange)="searchQuery.set($event)"
|
|
223
|
+
(click)="$event.stopPropagation()"
|
|
224
|
+
/>
|
|
225
|
+
</div>
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
<div class="rpt-dropdown-items-list">
|
|
229
|
+
@for (item of filteredFlatItems(); track item.slug) {
|
|
230
|
+
<a
|
|
231
|
+
[routerLink]="item.route"
|
|
232
|
+
class="rpt-dropdown-item"
|
|
233
|
+
(click)="isOpen.set(false)"
|
|
234
|
+
role="menuitem"
|
|
235
|
+
>
|
|
236
|
+
@if (showIcons()) {
|
|
237
|
+
<rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
|
|
238
|
+
}
|
|
239
|
+
<span class="rpt-dropdown-item-name">{{ item.name }}</span>
|
|
240
|
+
@if (item.category && item.category !== 'General') {
|
|
241
|
+
<span class="rpt-dropdown-item-cat">{{ item.category }}</span>
|
|
242
|
+
}
|
|
243
|
+
</a>
|
|
244
|
+
} @empty {
|
|
245
|
+
<div class="rpt-dropdown-empty">No reports available</div>
|
|
246
|
+
}
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
}
|
|
250
|
+
</div>
|
|
251
|
+
}
|
|
252
|
+
`, isInline: true, styles: [":host{display:block;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);--rpt-menu-bg: var(--rpt-surface-bg, #ffffff);--rpt-menu-text: var(--rpt-text-color, #1e293b);--rpt-menu-text-muted: var(--rpt-text-muted, #64748b);--rpt-menu-hover-bg: var(--rpt-bg-subtle, #f1f5f9);--rpt-menu-active-bg: var(--rpt-primary-light, #eff6ff);--rpt-menu-active-text: var(--rpt-primary, #2563eb);--rpt-menu-border: var(--rpt-border-color, #e2e8f0)}.rpt-menu-sidebar{display:flex;flex-direction:column;width:100%;box-sizing:border-box;background:var(--rpt-menu-bg)}.rpt-menu-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-menu-header-left{display:flex;align-items:center;gap:8px}.rpt-menu-header-icon{color:var(--rpt-menu-active-text)}.rpt-menu-title{font-size:.8125rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-menu-text-muted)}.rpt-menu-count-badge{font-size:.6875rem;font-weight:600;background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text-muted);padding:1px 6px;border-radius:9999px}.rpt-menu-search-box{position:relative;padding:8px 12px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-search-icon{position:absolute;left:20px;top:50%;transform:translateY(-50%);color:var(--rpt-menu-text-muted)}.rpt-search-input{width:100%;box-sizing:border-box;padding:6px 26px 6px 28px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:6px;outline:none;background:#f8fafc;color:var(--rpt-menu-text);transition:all .15s ease}.rpt-search-input:focus{background:#fff;border-color:var(--rpt-menu-active-text);box-shadow:0 0 0 2px #2563eb26}.rpt-search-clear{position:absolute;right:18px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--rpt-menu-text-muted);cursor:pointer;font-size:1rem;padding:0}.rpt-menu-groups-container{display:flex;flex-direction:column;padding:6px 0;gap:4px}.rpt-menu-group{display:flex;flex-direction:column}.rpt-group-heading{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;font-size:.725rem;font-weight:600;color:var(--rpt-menu-text-muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s ease}.rpt-group-heading:hover{color:var(--rpt-menu-text)}.rpt-group-items{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:2px}.rpt-item-row{padding:0 8px}.rpt-menu-link{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-menu-link:hover{background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text)}.rpt-menu-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-item-icon{color:var(--rpt-menu-text-muted);flex-shrink:0}.rpt-menu-link.rpt-active-link .rpt-item-icon{color:var(--rpt-menu-active-text)}.rpt-item-text{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-draft-chip{font-size:.625rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef3c7;color:#92400e;text-transform:uppercase}.rpt-menu-empty{padding:24px 16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}.rpt-menu-navbar{display:flex;align-items:center;width:100%}.rpt-navbar-list{display:flex;align-items:center;gap:4px;list-style:none;padding:0;margin:0}.rpt-navbar-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-navbar-link:hover{background:var(--rpt-menu-hover-bg)}.rpt-navbar-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-menu-dropdown-wrapper{position:relative;display:inline-block}.rpt-dropdown-trigger{display:inline-flex;align-items:center;gap:7px;padding:7px 14px;border-radius:6px;border:1px solid var(--rpt-menu-border);background:var(--rpt-menu-bg);color:var(--rpt-menu-text);font-size:.835rem;font-weight:500;cursor:pointer;transition:all .15s ease}.rpt-dropdown-trigger:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-backdrop{position:fixed;inset:0;z-index:99}.rpt-dropdown-panel{position:absolute;top:calc(100% + 4px);left:0;min-width:240px;max-width:320px;max-height:380px;background:#fff;border:1px solid var(--rpt-menu-border);border-radius:8px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:100;overflow-y:auto;display:flex;flex-direction:column}.rpt-dropdown-search{padding:8px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-dropdown-search-input{width:100%;box-sizing:border-box;padding:6px 10px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:4px;outline:none}.rpt-dropdown-items-list{padding:4px 0;display:flex;flex-direction:column}.rpt-dropdown-item{display:flex;align-items:center;gap:8px;padding:8px 12px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;transition:background .15s ease}.rpt-dropdown-item:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-dropdown-item-cat{font-size:.6875rem;color:var(--rpt-menu-text-muted);background:var(--rpt-menu-hover-bg);padding:1px 6px;border-radius:4px}.rpt-dropdown-empty{padding:16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
253
|
+
}
|
|
254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportMenuComponent, decorators: [{
|
|
255
|
+
type: Component,
|
|
256
|
+
args: [{ selector: 'bways-report-menu', standalone: true, imports: [CommonModule, RouterModule, FormsModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
257
|
+
<!-- ═══════════════ SIDEBAR VARIANT ═══════════════ -->
|
|
258
|
+
@if (variant() === 'sidebar') {
|
|
259
|
+
<nav class="rpt-menu-sidebar" [attr.aria-label]="title()">
|
|
260
|
+
@if (title()) {
|
|
261
|
+
<div class="rpt-menu-sidebar-header">
|
|
262
|
+
<div class="rpt-menu-header-left">
|
|
263
|
+
<rpt-icon name="file-text" [size]="16" class="rpt-menu-header-icon" />
|
|
264
|
+
<span class="rpt-menu-title">{{ title() }}</span>
|
|
265
|
+
</div>
|
|
266
|
+
<span class="rpt-menu-count-badge">{{ totalItems() }}</span>
|
|
267
|
+
</div>
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
@if (allowSearch()) {
|
|
271
|
+
<div class="rpt-menu-search-box">
|
|
272
|
+
<rpt-icon name="search" [size]="13" class="rpt-search-icon" />
|
|
273
|
+
<input
|
|
274
|
+
type="text"
|
|
275
|
+
class="rpt-search-input"
|
|
276
|
+
placeholder="Search reports..."
|
|
277
|
+
[ngModel]="searchQuery()"
|
|
278
|
+
(ngModelChange)="searchQuery.set($event)"
|
|
279
|
+
/>
|
|
280
|
+
@if (searchQuery()) {
|
|
281
|
+
<button
|
|
282
|
+
type="button"
|
|
283
|
+
class="rpt-search-clear"
|
|
284
|
+
(click)="searchQuery.set('')"
|
|
285
|
+
aria-label="Clear search"
|
|
286
|
+
>
|
|
287
|
+
×
|
|
288
|
+
</button>
|
|
289
|
+
}
|
|
290
|
+
</div>
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
@if (filteredGroups().length === 0) {
|
|
294
|
+
<div class="rpt-menu-empty">
|
|
295
|
+
<p>No reports found.</p>
|
|
296
|
+
</div>
|
|
297
|
+
} @else {
|
|
298
|
+
<div class="rpt-menu-groups-container">
|
|
299
|
+
@for (group of filteredGroups(); track group.category) {
|
|
300
|
+
<div class="rpt-menu-group">
|
|
301
|
+
@if (filteredGroups().length > 1 || group.category !== 'General') {
|
|
302
|
+
<div
|
|
303
|
+
class="rpt-group-heading"
|
|
304
|
+
(click)="toggleGroup(group.category)"
|
|
305
|
+
role="button"
|
|
306
|
+
tabindex="0"
|
|
307
|
+
>
|
|
308
|
+
<span class="rpt-group-title">{{ group.displayName }}</span>
|
|
309
|
+
<rpt-icon
|
|
310
|
+
[name]="isGroupCollapsed(group.category) ? 'chevron-right' : 'chevron-down'"
|
|
311
|
+
[size]="12"
|
|
312
|
+
class="rpt-group-arrow"
|
|
313
|
+
/>
|
|
314
|
+
</div>
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
@if (!isGroupCollapsed(group.category)) {
|
|
318
|
+
<ul class="rpt-group-items">
|
|
319
|
+
@for (item of group.items; track item.slug) {
|
|
320
|
+
<li class="rpt-item-row">
|
|
321
|
+
<a
|
|
322
|
+
[routerLink]="item.route"
|
|
323
|
+
routerLinkActive="rpt-active-link"
|
|
324
|
+
class="rpt-menu-link"
|
|
325
|
+
[title]="item.name"
|
|
326
|
+
>
|
|
327
|
+
@if (showIcons()) {
|
|
328
|
+
<rpt-icon
|
|
329
|
+
[name]="item.icon || 'file-text'"
|
|
330
|
+
[size]="15"
|
|
331
|
+
class="rpt-item-icon"
|
|
332
|
+
/>
|
|
333
|
+
}
|
|
334
|
+
<span class="rpt-item-text">{{ item.name }}</span>
|
|
335
|
+
@if (item.isDraft) {
|
|
336
|
+
<span class="rpt-draft-chip">draft</span>
|
|
337
|
+
}
|
|
338
|
+
</a>
|
|
339
|
+
</li>
|
|
340
|
+
}
|
|
341
|
+
</ul>
|
|
342
|
+
}
|
|
343
|
+
</div>
|
|
344
|
+
}
|
|
345
|
+
</div>
|
|
346
|
+
}
|
|
347
|
+
</nav>
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
<!-- ═══════════════ NAVBAR VARIANT ═══════════════ -->
|
|
351
|
+
@else if (variant() === 'navbar') {
|
|
352
|
+
<nav class="rpt-menu-navbar" [attr.aria-label]="title()">
|
|
353
|
+
<ul class="rpt-navbar-list">
|
|
354
|
+
@for (item of filteredFlatItems(); track item.slug) {
|
|
355
|
+
<li class="rpt-navbar-item">
|
|
356
|
+
<a
|
|
357
|
+
[routerLink]="item.route"
|
|
358
|
+
routerLinkActive="rpt-active-link"
|
|
359
|
+
class="rpt-navbar-link"
|
|
360
|
+
[title]="item.name"
|
|
361
|
+
>
|
|
362
|
+
@if (showIcons()) {
|
|
363
|
+
<rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
|
|
364
|
+
}
|
|
365
|
+
<span>{{ item.name }}</span>
|
|
366
|
+
</a>
|
|
367
|
+
</li>
|
|
368
|
+
}
|
|
369
|
+
</ul>
|
|
370
|
+
</nav>
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
<!-- ═══════════════ DROPDOWN VARIANT ═══════════════ -->
|
|
374
|
+
@else if (variant() === 'dropdown') {
|
|
375
|
+
<div class="rpt-menu-dropdown-wrapper">
|
|
376
|
+
<button
|
|
377
|
+
type="button"
|
|
378
|
+
class="rpt-dropdown-trigger"
|
|
379
|
+
(click)="isOpen.set(!isOpen())"
|
|
380
|
+
[attr.aria-expanded]="isOpen()"
|
|
381
|
+
>
|
|
382
|
+
<rpt-icon name="file-text" [size]="15" />
|
|
383
|
+
<span>{{ title() }}</span>
|
|
384
|
+
<rpt-icon
|
|
385
|
+
[name]="isOpen() ? 'chevron-down' : 'chevron-down'"
|
|
386
|
+
[size]="12"
|
|
387
|
+
class="rpt-trigger-arrow"
|
|
388
|
+
/>
|
|
389
|
+
</button>
|
|
390
|
+
|
|
391
|
+
@if (isOpen()) {
|
|
392
|
+
<div class="rpt-dropdown-backdrop" (click)="isOpen.set(false)"></div>
|
|
393
|
+
<div class="rpt-dropdown-panel" role="menu">
|
|
394
|
+
@if (allowSearch()) {
|
|
395
|
+
<div class="rpt-dropdown-search">
|
|
396
|
+
<input
|
|
397
|
+
type="text"
|
|
398
|
+
class="rpt-dropdown-search-input"
|
|
399
|
+
placeholder="Filter reports..."
|
|
400
|
+
[ngModel]="searchQuery()"
|
|
401
|
+
(ngModelChange)="searchQuery.set($event)"
|
|
402
|
+
(click)="$event.stopPropagation()"
|
|
403
|
+
/>
|
|
404
|
+
</div>
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
<div class="rpt-dropdown-items-list">
|
|
408
|
+
@for (item of filteredFlatItems(); track item.slug) {
|
|
409
|
+
<a
|
|
410
|
+
[routerLink]="item.route"
|
|
411
|
+
class="rpt-dropdown-item"
|
|
412
|
+
(click)="isOpen.set(false)"
|
|
413
|
+
role="menuitem"
|
|
414
|
+
>
|
|
415
|
+
@if (showIcons()) {
|
|
416
|
+
<rpt-icon [name]="item.icon || 'file-text'" [size]="14" />
|
|
417
|
+
}
|
|
418
|
+
<span class="rpt-dropdown-item-name">{{ item.name }}</span>
|
|
419
|
+
@if (item.category && item.category !== 'General') {
|
|
420
|
+
<span class="rpt-dropdown-item-cat">{{ item.category }}</span>
|
|
421
|
+
}
|
|
422
|
+
</a>
|
|
423
|
+
} @empty {
|
|
424
|
+
<div class="rpt-dropdown-empty">No reports available</div>
|
|
425
|
+
}
|
|
426
|
+
</div>
|
|
427
|
+
</div>
|
|
428
|
+
}
|
|
429
|
+
</div>
|
|
430
|
+
}
|
|
431
|
+
`, styles: [":host{display:block;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);--rpt-menu-bg: var(--rpt-surface-bg, #ffffff);--rpt-menu-text: var(--rpt-text-color, #1e293b);--rpt-menu-text-muted: var(--rpt-text-muted, #64748b);--rpt-menu-hover-bg: var(--rpt-bg-subtle, #f1f5f9);--rpt-menu-active-bg: var(--rpt-primary-light, #eff6ff);--rpt-menu-active-text: var(--rpt-primary, #2563eb);--rpt-menu-border: var(--rpt-border-color, #e2e8f0)}.rpt-menu-sidebar{display:flex;flex-direction:column;width:100%;box-sizing:border-box;background:var(--rpt-menu-bg)}.rpt-menu-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-menu-header-left{display:flex;align-items:center;gap:8px}.rpt-menu-header-icon{color:var(--rpt-menu-active-text)}.rpt-menu-title{font-size:.8125rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-menu-text-muted)}.rpt-menu-count-badge{font-size:.6875rem;font-weight:600;background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text-muted);padding:1px 6px;border-radius:9999px}.rpt-menu-search-box{position:relative;padding:8px 12px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-search-icon{position:absolute;left:20px;top:50%;transform:translateY(-50%);color:var(--rpt-menu-text-muted)}.rpt-search-input{width:100%;box-sizing:border-box;padding:6px 26px 6px 28px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:6px;outline:none;background:#f8fafc;color:var(--rpt-menu-text);transition:all .15s ease}.rpt-search-input:focus{background:#fff;border-color:var(--rpt-menu-active-text);box-shadow:0 0 0 2px #2563eb26}.rpt-search-clear{position:absolute;right:18px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--rpt-menu-text-muted);cursor:pointer;font-size:1rem;padding:0}.rpt-menu-groups-container{display:flex;flex-direction:column;padding:6px 0;gap:4px}.rpt-menu-group{display:flex;flex-direction:column}.rpt-group-heading{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;font-size:.725rem;font-weight:600;color:var(--rpt-menu-text-muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s ease}.rpt-group-heading:hover{color:var(--rpt-menu-text)}.rpt-group-items{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:2px}.rpt-item-row{padding:0 8px}.rpt-menu-link{display:flex;align-items:center;gap:9px;padding:7px 10px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-menu-link:hover{background:var(--rpt-menu-hover-bg);color:var(--rpt-menu-text)}.rpt-menu-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-item-icon{color:var(--rpt-menu-text-muted);flex-shrink:0}.rpt-menu-link.rpt-active-link .rpt-item-icon{color:var(--rpt-menu-active-text)}.rpt-item-text{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-draft-chip{font-size:.625rem;font-weight:600;padding:1px 5px;border-radius:4px;background:#fef3c7;color:#92400e;text-transform:uppercase}.rpt-menu-empty{padding:24px 16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}.rpt-menu-navbar{display:flex;align-items:center;width:100%}.rpt-navbar-list{display:flex;align-items:center;gap:4px;list-style:none;padding:0;margin:0}.rpt-navbar-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;font-weight:500;transition:all .15s ease}.rpt-navbar-link:hover{background:var(--rpt-menu-hover-bg)}.rpt-navbar-link.rpt-active-link{background:var(--rpt-menu-active-bg);color:var(--rpt-menu-active-text);font-weight:600}.rpt-menu-dropdown-wrapper{position:relative;display:inline-block}.rpt-dropdown-trigger{display:inline-flex;align-items:center;gap:7px;padding:7px 14px;border-radius:6px;border:1px solid var(--rpt-menu-border);background:var(--rpt-menu-bg);color:var(--rpt-menu-text);font-size:.835rem;font-weight:500;cursor:pointer;transition:all .15s ease}.rpt-dropdown-trigger:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-backdrop{position:fixed;inset:0;z-index:99}.rpt-dropdown-panel{position:absolute;top:calc(100% + 4px);left:0;min-width:240px;max-width:320px;max-height:380px;background:#fff;border:1px solid var(--rpt-menu-border);border-radius:8px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:100;overflow-y:auto;display:flex;flex-direction:column}.rpt-dropdown-search{padding:8px;border-bottom:1px solid var(--rpt-menu-border)}.rpt-dropdown-search-input{width:100%;box-sizing:border-box;padding:6px 10px;font-size:.8125rem;border:1px solid var(--rpt-menu-border);border-radius:4px;outline:none}.rpt-dropdown-items-list{padding:4px 0;display:flex;flex-direction:column}.rpt-dropdown-item{display:flex;align-items:center;gap:8px;padding:8px 12px;color:var(--rpt-menu-text);text-decoration:none;font-size:.835rem;transition:background .15s ease}.rpt-dropdown-item:hover{background:var(--rpt-menu-hover-bg)}.rpt-dropdown-item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rpt-dropdown-item-cat{font-size:.6875rem;color:var(--rpt-menu-text-muted);background:var(--rpt-menu-hover-bg);padding:1px 6px;border-radius:4px}.rpt-dropdown-empty{padding:16px;text-align:center;color:var(--rpt-menu-text-muted);font-size:.8125rem}\n"] }]
|
|
432
|
+
}] });
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYndheXMtcmVwb3J0LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZW1iZWQvYndheXMtcmVwb3J0LW1lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFFUixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBS2hGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBb2hCSCxNQUFNLE9BQU8sd0JBQXdCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLENBQW9CLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLFFBQVEsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELEtBQUssR0FBRyxLQUFLLENBQVMsU0FBUyxDQUFDLENBQUM7SUFDakMsU0FBUyxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNqQyxXQUFXLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLGFBQWEsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFdEMsV0FBVyxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLGVBQWUsR0FBRyxNQUFNLENBQWMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdCLFNBQVMsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO0lBRTdDLFVBQVUsR0FBRyxRQUFRLENBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTNELGlCQUFpQixHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQzNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQ2pCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN0QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFTSxjQUFjLEdBQUcsUUFBUSxDQUFvQixHQUFHLEVBQUU7UUFDekQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sTUFBTSxDQUFDO1FBRXRCLE9BQU8sTUFBTTthQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNYLEdBQUcsQ0FBQztZQUNKLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDdEM7U0FDRixDQUFDLENBQUM7YUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7d0dBM0RVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLDgyQkE5Z0J6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStLVCxpaUxBakxTLFlBQVksOEJBQUUsWUFBWSxnZkFBRSxXQUFXLCttQkFBRSxnQkFBZ0I7OzRGQWdoQnhELHdCQUF3QjtrQkFuaEJwQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFDbkQsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStLVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgaW5qZWN0UmVwb3J0TWVudSwgaW5qZWN0UmVwb3J0TWVudUdyb3VwcyB9IGZyb20gJy4vaW5qZWN0LXJlcG9ydC1tZW51JztcbmltcG9ydCB7IFJlcG9ydE1lbnVHcm91cCwgUmVwb3J0TWVudUl0ZW0gfSBmcm9tICcuLi9yb3V0aW5nL21vZGVscy9yZXBvcnQtcm91dGUubW9kZWxzJztcblxuZXhwb3J0IHR5cGUgUmVwb3J0TWVudVZhcmlhbnQgPSAnc2lkZWJhcicgfCAnbmF2YmFyJyB8ICdkcm9wZG93bic7XG5cbi8qKlxuICogRHJvcC1pbiBtZW51IGNvbXBvbmVudCBmb3IgYndheXMtcmVwb3J0LlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZGlzcGxheXMgc2F2ZWQgYW5kIHB1Ymxpc2hlZCByZXBvcnQgcGFnZXMgZnJvbSB0aGUgYmFja2VuZCBvciBzdG9yYWdlLlxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPCEtLSBTaWRlYmFyIG5hdmlnYXRpb24gLS0+XG4gKiA8YndheXMtcmVwb3J0LW1lbnUgdmFyaWFudD1cInNpZGViYXJcIiAvPlxuICpcbiAqIDwhLS0gSG9yaXpvbnRhbCBuYXZpZ2F0aW9uIGJhciAtLT5cbiAqIDxid2F5cy1yZXBvcnQtbWVudSB2YXJpYW50PVwibmF2YmFyXCIgLz5cbiAqXG4gKiA8IS0tIEhlYWRlciBkcm9wZG93biBidXR0b24gLS0+XG4gKiA8YndheXMtcmVwb3J0LW1lbnUgdmFyaWFudD1cImRyb3Bkb3duXCIgLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdid2F5cy1yZXBvcnQtbWVudScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJvdXRlck1vZHVsZSwgRm9ybXNNb2R1bGUsIFJwdEljb25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBTSURFQkFSIFZBUklBTlQg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIEBpZiAodmFyaWFudCgpID09PSAnc2lkZWJhcicpIHtcbiAgICAgIDxuYXYgY2xhc3M9XCJycHQtbWVudS1zaWRlYmFyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aXRsZSgpXCI+XG4gICAgICAgIEBpZiAodGl0bGUoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbWVudS1zaWRlYmFyLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tZW51LWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZmlsZS10ZXh0XCIgW3NpemVdPVwiMTZcIiBjbGFzcz1cInJwdC1tZW51LWhlYWRlci1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtbWVudS10aXRsZVwiPnt7IHRpdGxlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LW1lbnUtY291bnQtYmFkZ2VcIj57eyB0b3RhbEl0ZW1zKCkgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGFsbG93U2VhcmNoKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1lbnUtc2VhcmNoLWJveFwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzZWFyY2hcIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwicnB0LXNlYXJjaC1pY29uXCIgLz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHJlcG9ydHMuLi5cIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hRdWVyeSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoUXVlcnkuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIEBpZiAoc2VhcmNoUXVlcnkoKSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtc2VhcmNoLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoUXVlcnkuc2V0KCcnKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAmdGltZXM7XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZEdyb3VwcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbWVudS1lbXB0eVwiPlxuICAgICAgICAgICAgPHA+Tm8gcmVwb3J0cyBmb3VuZC48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbWVudS1ncm91cHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICBAZm9yIChncm91cCBvZiBmaWx0ZXJlZEdyb3VwcygpOyB0cmFjayBncm91cC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1lbnUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGZpbHRlcmVkR3JvdXBzKCkubGVuZ3RoID4gMSB8fCBncm91cC5jYXRlZ29yeSAhPT0gJ0dlbmVyYWwnKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWdyb3VwLWhlYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlR3JvdXAoZ3JvdXAuY2F0ZWdvcnkpXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWdyb3VwLXRpdGxlXCI+e3sgZ3JvdXAuZGlzcGxheU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImlzR3JvdXBDb2xsYXBzZWQoZ3JvdXAuY2F0ZWdvcnkpID8gJ2NoZXZyb24tcmlnaHQnIDogJ2NoZXZyb24tZG93bidcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1ncm91cC1hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKCFpc0dyb3VwQ29sbGFwc2VkKGdyb3VwLmNhdGVnb3J5KSkge1xuICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwicnB0LWdyb3VwLWl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZ3JvdXAuaXRlbXM7IHRyYWNrIGl0ZW0uc2x1Zykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInJwdC1pdGVtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXRlbS5yb3V0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJycHQtYWN0aXZlLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1tZW51LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93SWNvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5pY29uIHx8ICdmaWxlLXRleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWl0ZW0taWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1pdGVtLXRleHRcIj57eyBpdGVtLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pc0RyYWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZHJhZnQtY2hpcFwiPmRyYWZ0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L25hdj5cbiAgICB9XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBOQVZCQVIgVkFSSUFOVCDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgQGVsc2UgaWYgKHZhcmlhbnQoKSA9PT0gJ25hdmJhcicpIHtcbiAgICAgIDxuYXYgY2xhc3M9XCJycHQtbWVudS1uYXZiYXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRpdGxlKClcIj5cbiAgICAgICAgPHVsIGNsYXNzPVwicnB0LW5hdmJhci1saXN0XCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWx0ZXJlZEZsYXRJdGVtcygpOyB0cmFjayBpdGVtLnNsdWcpIHtcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cInJwdC1uYXZiYXItaXRlbVwiPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVcIlxuICAgICAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJycHQtYWN0aXZlLWxpbmtcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LW5hdmJhci1saW5rXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ljb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJpdGVtLmljb24gfHwgJ2ZpbGUtdGV4dCdcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG4gICAgICA8L25hdj5cbiAgICB9XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBEUk9QRE9XTiBWQVJJQU5UIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAtLT5cbiAgICBAZWxzZSBpZiAodmFyaWFudCgpID09PSAnZHJvcGRvd24nKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LW1lbnUtZHJvcGRvd24td3JhcHBlclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJycHQtZHJvcGRvd24tdHJpZ2dlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImlzT3Blbi5zZXQoIWlzT3BlbigpKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImZpbGUtdGV4dFwiIFtzaXplXT1cIjE1XCIgLz5cbiAgICAgICAgICA8c3Bhbj57eyB0aXRsZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDxycHQtaWNvblxuICAgICAgICAgICAgW25hbWVdPVwiaXNPcGVuKCkgPyAnY2hldnJvbi1kb3duJyA6ICdjaGV2cm9uLWRvd24nXCJcbiAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgIGNsYXNzPVwicnB0LXRyaWdnZXItYXJyb3dcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIEBpZiAoaXNPcGVuKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWRyb3Bkb3duLWJhY2tkcm9wXCIgKGNsaWNrKT1cImlzT3Blbi5zZXQoZmFsc2UpXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcm9wZG93bi1wYW5lbFwiIHJvbGU9XCJtZW51XCI+XG4gICAgICAgICAgICBAaWYgKGFsbG93U2VhcmNoKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcm9wZG93bi1zZWFyY2hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWRyb3Bkb3duLXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciByZXBvcnRzLi4uXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFF1ZXJ5KClcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoUXVlcnkuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJvcGRvd24taXRlbXMtbGlzdFwiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpbHRlcmVkRmxhdEl0ZW1zKCk7IHRyYWNrIGl0ZW0uc2x1Zykge1xuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnJvdXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93SWNvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiaXRlbS5pY29uIHx8ICdmaWxlLXRleHQnXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZHJvcGRvd24taXRlbS1uYW1lXCI+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmNhdGVnb3J5ICYmIGl0ZW0uY2F0ZWdvcnkgIT09ICdHZW5lcmFsJykge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1kcm9wZG93bi1pdGVtLWNhdFwiPnt7IGl0ZW0uY2F0ZWdvcnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcm9wZG93bi1lbXB0eVwiPk5vIHJlcG9ydHMgYXZhaWxhYmxlPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIHNhbnMtc2VyaWYpO1xuICAgICAgLS1ycHQtbWVudS1iZzogdmFyKC0tcnB0LXN1cmZhY2UtYmcsICNmZmZmZmYpO1xuICAgICAgLS1ycHQtbWVudS10ZXh0OiB2YXIoLS1ycHQtdGV4dC1jb2xvciwgIzFlMjkzYik7XG4gICAgICAtLXJwdC1tZW51LXRleHQtbXV0ZWQ6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIC0tcnB0LW1lbnUtaG92ZXItYmc6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmMWY1ZjkpO1xuICAgICAgLS1ycHQtbWVudS1hY3RpdmUtYmc6IHZhcigtLXJwdC1wcmltYXJ5LWxpZ2h0LCAjZWZmNmZmKTtcbiAgICAgIC0tcnB0LW1lbnUtYWN0aXZlLXRleHQ6IHZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIC0tcnB0LW1lbnUtYm9yZGVyOiB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICB9XG5cbiAgICAvKiDilIDilIDilIAgU0lERUJBUiBTVFlMRVMg4pSA4pSA4pSAICovXG4gICAgLnJwdC1tZW51LXNpZGViYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1iZyk7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LXNpZGViYXItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWhlYWRlci1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWhlYWRlci1pY29uIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS1hY3RpdmUtdGV4dCk7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1jb3VudC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjg3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1ob3Zlci1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dC1tdXRlZCk7XG4gICAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1zZWFyY2gtYm94IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgfVxuXG4gICAgLnJwdC1zZWFyY2gtaWNvbiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBsZWZ0OiAyMHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dC1tdXRlZCk7XG4gICAgfVxuXG4gICAgLnJwdC1zZWFyY2gtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZzogNnB4IDI2cHggNnB4IDI4cHg7XG4gICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0KTtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtc2VhcmNoLWlucHV0OmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1tZW51LWFjdGl2ZS10ZXh0KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE1KTtcbiAgICB9XG5cbiAgICAucnB0LXNlYXJjaC1jbGVhciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogMThweDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0LW11dGVkKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWdyb3Vwcy1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBwYWRkaW5nOiA2cHggMDtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB9XG5cbiAgICAucnB0LWdyb3VwLWhlYWRpbmcge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiA2cHggMTRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1ncm91cC1oZWFkaW5nOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0KTtcbiAgICB9XG5cbiAgICAucnB0LWdyb3VwLWl0ZW1zIHtcbiAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDJweDtcbiAgICB9XG5cbiAgICAucnB0LWl0ZW0tcm93IHtcbiAgICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1saW5rIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA5cHg7XG4gICAgICBwYWRkaW5nOiA3cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0KTtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgIGZvbnQtc2l6ZTogMC44MzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWxpbms6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LW1lbnUtaG92ZXItYmcpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQpO1xuICAgIH1cblxuICAgIC5ycHQtbWVudS1saW5rLnJwdC1hY3RpdmUtbGluayB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1hY3RpdmUtYmcpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LWFjdGl2ZS10ZXh0KTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuXG4gICAgLnJwdC1pdGVtLWljb24ge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWxpbmsucnB0LWFjdGl2ZS1saW5rIC5ycHQtaXRlbS1pY29uIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS1hY3RpdmUtdGV4dCk7XG4gICAgfVxuXG4gICAgLnJwdC1pdGVtLXRleHQge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgLnJwdC1kcmFmdC1jaGlwIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWYzYzc7XG4gICAgICBjb2xvcjogIzkyNDAwZTtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1tZW51LWVtcHR5IHtcbiAgICAgIHBhZGRpbmc6IDI0cHggMTZweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0LW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgIH1cblxuICAgIC8qIOKUgOKUgOKUgCBOQVZCQVIgU1RZTEVTIOKUgOKUgOKUgCAqL1xuICAgIC5ycHQtbWVudS1uYXZiYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAucnB0LW5hdmJhci1saXN0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG5cbiAgICAucnB0LW5hdmJhci1saW5rIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDEycHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dCk7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBmb250LXNpemU6IDAuODM1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtbmF2YmFyLWxpbms6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LW1lbnUtaG92ZXItYmcpO1xuICAgIH1cblxuICAgIC5ycHQtbmF2YmFyLWxpbmsucnB0LWFjdGl2ZS1saW5rIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1tZW51LWFjdGl2ZS1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtYWN0aXZlLXRleHQpO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG5cbiAgICAvKiDilIDilIDilIAgRFJPUERPV04gU1RZTEVTIOKUgOKUgOKUgCAqL1xuICAgIC5ycHQtbWVudS1kcm9wZG93bi13cmFwcGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG5cbiAgICAucnB0LWRyb3Bkb3duLXRyaWdnZXIge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA3cHg7XG4gICAgICBwYWRkaW5nOiA3cHggMTRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1iZyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dCk7XG4gICAgICBmb250LXNpemU6IDAuODM1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24tdHJpZ2dlcjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1ob3Zlci1iZyk7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1iYWNrZHJvcCB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICBpbnNldDogMDtcbiAgICAgIHotaW5kZXg6IDk5O1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24tcGFuZWwge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpO1xuICAgICAgbGVmdDogMDtcbiAgICAgIG1pbi13aWR0aDogMjQwcHg7XG4gICAgICBtYXgtd2lkdGg6IDMyMHB4O1xuICAgICAgbWF4LWhlaWdodDogMzgwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LW1lbnUtYm9yZGVyKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDRweCA2cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB6LWluZGV4OiAxMDA7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1zZWFyY2gge1xuICAgICAgcGFkZGluZzogOHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1zZWFyY2gtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1tZW51LWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24taXRlbXMtbGlzdCB7XG4gICAgICBwYWRkaW5nOiA0cHggMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24taXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LW1lbnUtdGV4dCk7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBmb250LXNpemU6IDAuODM1cmVtO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtZHJvcGRvd24taXRlbTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtbWVudS1ob3Zlci1iZyk7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1pdGVtLW5hbWUge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1pdGVtLWNhdCB7XG4gICAgICBmb250LXNpemU6IDAuNjg3NXJlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtbWVudS10ZXh0LW11dGVkKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1tZW51LWhvdmVyLWJnKTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuXG4gICAgLnJwdC1kcm9wZG93bi1lbXB0eSB7XG4gICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1tZW51LXRleHQtbXV0ZWQpO1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgQndheXNSZXBvcnRNZW51Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdmFyaWFudCA9IGlucHV0PFJlcG9ydE1lbnVWYXJpYW50Pignc2lkZWJhcicpO1xuICByZWFkb25seSBiYXNlUGF0aCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCdSZXBvcnRzJyk7XG4gIHJlYWRvbmx5IHNob3dJY29ucyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBhbGxvd1NlYXJjaCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaW5jbHVkZURyYWZ0cyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBzZWFyY2hRdWVyeSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY29sbGFwc2VkR3JvdXBzID0gc2lnbmFsPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmF3TWVudSA9IGluamVjdFJlcG9ydE1lbnUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSByYXdHcm91cHMgPSBpbmplY3RSZXBvcnRNZW51R3JvdXBzKCk7XG5cbiAgcmVhZG9ubHkgdG90YWxJdGVtcyA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gdGhpcy5yYXdNZW51KCkubGVuZ3RoKTtcblxuICByZWFkb25seSBmaWx0ZXJlZEZsYXRJdGVtcyA9IGNvbXB1dGVkPFJlcG9ydE1lbnVJdGVtW10+KCgpID0+IHtcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hRdWVyeSgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5yYXdNZW51KCk7XG4gICAgaWYgKCFxKSByZXR1cm4gaXRlbXM7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fFxuICAgICAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHxcbiAgICAgICAgaXRlbS5zbHVnLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBmaWx0ZXJlZEdyb3VwcyA9IGNvbXB1dGVkPFJlcG9ydE1lbnVHcm91cFtdPigoKSA9PiB7XG4gICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoUXVlcnkoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBncm91cHMgPSB0aGlzLnJhd0dyb3VwcygpO1xuICAgIGlmICghcSkgcmV0dXJuIGdyb3VwcztcblxuICAgIHJldHVybiBncm91cHNcbiAgICAgIC5tYXAoKGcpID0+ICh7XG4gICAgICAgIC4uLmcsXG4gICAgICAgIGl0ZW1zOiBnLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8XG4gICAgICAgICAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHxcbiAgICAgICAgICAgIGl0ZW0uc2x1Zy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKGcpID0+IGcuaXRlbXMubGVuZ3RoID4gMCk7XG4gIH0pO1xuXG4gIGlzR3JvdXBDb2xsYXBzZWQoY2F0ZWdvcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbGxhcHNlZEdyb3VwcygpLmhhcyhjYXRlZ29yeSk7XG4gIH1cblxuICB0b2dnbGVHcm91cChjYXRlZ29yeTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLmNvbGxhcHNlZEdyb3VwcygpKTtcbiAgICBpZiAoc2V0LmhhcyhjYXRlZ29yeSkpIHtcbiAgICAgIHNldC5kZWxldGUoY2F0ZWdvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQuYWRkKGNhdGVnb3J5KTtcbiAgICB9XG4gICAgdGhpcy5jb2xsYXBzZWRHcm91cHMuc2V0KHNldCk7XG4gIH1cbn1cbiJdfQ==
|