bways-report 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +463 -316
  2. package/esm2022/lib/core/config/bways-report-config.mjs +31 -32
  3. package/esm2022/lib/core/models/index.mjs +1 -1
  4. package/esm2022/lib/core/models/report-api-endpoint.model.mjs +8 -0
  5. package/esm2022/lib/core/models/report-component.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  7. package/esm2022/lib/core/services/index.mjs +2 -1
  8. package/esm2022/lib/core/services/report-api-execution.service.mjs +210 -0
  9. package/esm2022/lib/core/services/report-data-discovery.service.mjs +76 -4
  10. package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
  11. package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
  12. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  13. package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
  14. package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +31 -1
  16. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +27 -2
  17. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
  18. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
  19. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
  20. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
  21. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
  22. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +28 -51
  23. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
  24. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
  25. package/esm2022/lib/data-access/adapters/index.mjs +1 -1
  26. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
  27. package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
  28. package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
  29. package/esm2022/lib/data-access/contracts/index.mjs +1 -1
  30. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  31. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
  32. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +536 -6
  33. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +55 -17
  34. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
  35. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +3 -3
  36. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  37. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +142 -8
  38. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  39. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +129 -28
  40. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +3 -3
  41. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  42. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +3 -3
  43. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +27 -13
  44. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
  45. package/esm2022/lib/features/designer/designer.component.mjs +109 -75
  46. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
  47. package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
  48. package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
  49. package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
  50. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +2 -1
  51. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
  52. package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
  53. package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
  54. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
  55. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
  56. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +6 -4
  57. package/esm2022/lib/features/routing/report-routes.mjs +6 -6
  58. package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
  59. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
  60. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +23 -4
  61. package/esm2022/lib/features/runtime/report-execution.service.mjs +36 -6
  62. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +54 -11
  63. package/esm2022/lib/features/runtime/report-runtime.component.mjs +105 -68
  64. package/esm2022/lib/features/runtime/rpt-report.component.mjs +50 -42
  65. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
  66. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +16 -7
  67. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +53 -1
  68. package/esm2022/lib/primitives/components/index.mjs +2 -1
  69. package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +428 -0
  70. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  71. package/esm2022/lib/provide-reporting.mjs +11 -29
  72. package/fesm2022/bways-report.mjs +3745 -1281
  73. package/fesm2022/bways-report.mjs.map +1 -1
  74. package/lib/core/config/bways-report-config.d.ts +27 -5
  75. package/lib/core/models/index.d.ts +2 -1
  76. package/lib/core/models/report-api-endpoint.model.d.ts +30 -0
  77. package/lib/core/models/report-component.model.d.ts +16 -4
  78. package/lib/core/models/report-datasource.model.d.ts +21 -2
  79. package/lib/core/services/index.d.ts +1 -0
  80. package/lib/core/services/report-api-execution.service.d.ts +41 -0
  81. package/lib/core/services/report-data-discovery.service.d.ts +23 -1
  82. package/lib/core/services/report-session-context.service.d.ts +9 -0
  83. package/lib/core/tokens/designer-config.token.d.ts +4 -0
  84. package/lib/core/tokens/reporting-config.token.d.ts +4 -0
  85. package/lib/core/utils/report-endpoint.util.d.ts +12 -0
  86. package/lib/core/utils/report-request-scope.d.ts +14 -0
  87. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +2 -0
  88. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +1 -0
  89. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
  90. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
  91. package/lib/data-access/adapters/endpoint-tokens.d.ts +7 -0
  92. package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
  93. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -4
  94. package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
  95. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
  96. package/lib/data-access/adapters/index.d.ts +1 -1
  97. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
  98. package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
  99. package/lib/data-access/adapters/session-headers.d.ts +3 -0
  100. package/lib/data-access/contracts/index.d.ts +1 -0
  101. package/lib/data-access/contracts/lookup.contract.d.ts +3 -0
  102. package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
  103. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +16 -0
  104. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
  105. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
  106. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +21 -3
  107. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -7
  108. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +2 -1
  109. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
  110. package/lib/features/designer/designer.component.d.ts +16 -2
  111. package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
  112. package/lib/features/designer/services/designer-config.service.d.ts +13 -0
  113. package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
  114. package/lib/features/persistence/services/report-store.service.d.ts +15 -1
  115. package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
  116. package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
  117. package/lib/features/runtime/report-execution.service.d.ts +4 -0
  118. package/lib/features/runtime/report-grid-bridge.component.d.ts +4 -1
  119. package/lib/features/runtime/report-runtime.component.d.ts +14 -1
  120. package/lib/features/runtime/rpt-report.component.d.ts +5 -0
  121. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
  122. package/lib/primitives/components/index.d.ts +2 -0
  123. package/lib/primitives/components/radio/rpt-radio.component.d.ts +77 -0
  124. package/package.json +2 -1
@@ -1,7 +1,10 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, signal, } from '@angular/core';
1
+ import { A11yModule } from '@angular/cdk/a11y';
2
+ import { generateId } from '../../../../core/utilities/id-generator';
3
+ import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, signal, } from '@angular/core';
2
4
  import { CommonModule } from '@angular/common';
3
5
  import { FormsModule } from '@angular/forms';
4
- import { Router } from '@angular/router';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { defer, finalize, of, switchMap, throwError, take } from 'rxjs';
5
8
  import { DialogRef, DIALOG_DATA } from '@angular/cdk/dialog';
6
9
  import { ReportStoreService } from '../../../persistence/services/report-store.service';
7
10
  import { ReportRuntimeComponent } from '../../../runtime/report-runtime.component';
@@ -9,6 +12,7 @@ import { RptIconComponent } from '../../../../primitives/components/icon/rpt-ico
9
12
  import { REPORTING_CONFIG } from '../../../../core/tokens/reporting-config.token';
10
13
  import * as i0 from "@angular/core";
11
14
  import * as i1 from "@angular/forms";
15
+ import * as i2 from "@angular/cdk/a11y";
12
16
  function toSlug(val) {
13
17
  return val
14
18
  .toLowerCase()
@@ -21,104 +25,302 @@ export class ReportSavedDialogComponent {
21
25
  dialogRef = inject((DialogRef));
22
26
  data = inject(DIALOG_DATA);
23
27
  store = inject(ReportStoreService);
28
+ destroyRef = inject(DestroyRef);
24
29
  reportingConfig = inject(REPORTING_CONFIG, { optional: true });
25
- router = inject(Router, { optional: true });
30
+ idCheck;
31
+ customSlug = !!this.data.report.slug;
26
32
  report = this.data.report;
27
33
  baseRoute = signal(this.data.routeBase || this.reportingConfig?.routeBase || 'reports');
28
- name = signal(this.report.name || 'Untitled Report');
34
+ reportId = signal(this.report.id);
35
+ isCheckingId = signal(false);
36
+ isPreparingSave = signal(false);
37
+ updateConfirmation = signal(null);
38
+ idAttempted = signal(false);
39
+ idStatus = signal('unchecked');
40
+ idMessage = signal('');
41
+ idChanged = computed(() => this.reportId().trim() !== this.report.id);
42
+ idError = computed(() => {
43
+ if (!this.attempted() && !this.idAttempted())
44
+ return null;
45
+ const id = this.reportId().trim();
46
+ if (!id)
47
+ return 'Enter a report ID.';
48
+ if (id.length > 100)
49
+ return 'Use a report ID of at most 100 characters.';
50
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(id))
51
+ return 'Use letters, numbers, underscores or hyphens, starting with a letter or number.';
52
+ if (id.toLowerCase() === 'new')
53
+ return 'Choose another ID; "new" is reserved for the report builder.';
54
+ return null;
55
+ });
56
+ name = signal(this.report.name || '');
57
+ description = signal(this.report.description || '');
58
+ category = signal(this.report.category || '');
29
59
  slug = signal(this.report.slug || toSlug(this.report.name || 'report'));
30
- menuGroup = signal(this.report.menuGroup || this.report.category || 'General');
60
+ menuGroup = signal(this.report.menuGroup || this.report.category || '');
31
61
  isPublished = signal(this.report.isPublished ?? true);
32
62
  copied = signal(false);
33
- savedStateMessage = signal(null);
34
- fullRoute = computed(() => {
35
- const base = this.baseRoute().replace(/^\/+|\/+$/g, '');
36
- const s = this.slug().replace(/^\/+|\/+$/g, '') || this.report.id;
37
- return `/${base}/${s}`;
63
+ isSaving = signal(false);
64
+ attempted = signal(false);
65
+ saveError = signal(null);
66
+ nameError = computed(() => this.attempted() && !this.name().trim() ? 'Enter a report name.' : null);
67
+ slugError = computed(() => {
68
+ if (!this.attempted())
69
+ return null;
70
+ if (!this.slug().trim())
71
+ return 'Enter a URL slug.';
72
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(this.slug().trim()))
73
+ return 'Use lowercase letters, numbers, and single hyphens.';
74
+ if (this.slug().trim() === 'new')
75
+ return 'Choose a different slug; "new" is reserved for the report builder.';
76
+ return null;
38
77
  });
78
+ fullRoute = computed(() => '/' + this.baseRoute().replace(/^\/+|\/+$/g, '') + '/' + this.slug().trim());
39
79
  currentPreviewDef = computed(() => ({
40
- ...this.report,
41
- name: this.name(),
42
- slug: this.slug(),
43
- menuGroup: this.menuGroup(),
44
- isPublished: this.isPublished(),
80
+ ...this.report, id: this.reportId().trim(), name: this.name(), description: this.description(), category: this.category(),
81
+ slug: this.slug(), menuGroup: this.menuGroup(), isPublished: this.isPublished(),
45
82
  }));
46
- onNameChange(newName) {
47
- this.name.set(newName);
48
- // If slug was auto-derived, keep it updated
49
- if (!this.report.slug) {
50
- this.slug.set(toSlug(newName));
51
- }
83
+ onIdChange(value) {
84
+ if (this.isSaving())
85
+ return;
86
+ this.idCheck?.unsubscribe();
87
+ this.isPreparingSave.set(false);
88
+ this.updateConfirmation.set(null);
89
+ this.isCheckingId.set(false);
90
+ this.reportId.set(value);
91
+ this.idStatus.set('unchecked');
92
+ this.idMessage.set('');
93
+ this.saveError.set(null);
94
+ }
95
+ randomizeId() {
96
+ const random = typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'
97
+ ? 'rpt-' + crypto.randomUUID() : generateId('rpt');
98
+ this.onIdChange(random);
99
+ }
100
+ verifyId() {
101
+ if (this.isSaving() || this.isCheckingId() || this.updateConfirmation())
102
+ return;
103
+ this.idAttempted.set(true);
104
+ if (this.idError())
105
+ return;
106
+ const id = this.reportId().trim();
107
+ this.isCheckingId.set(true);
108
+ this.idStatus.set('checking');
109
+ this.idMessage.set('Checking report ID...');
110
+ this.idCheck = defer(() => this.store.checkReportId(id)).pipe(take(1), takeUntilDestroyed(this.destroyRef), finalize(() => this.isCheckingId.set(false))).subscribe({
111
+ next: exists => {
112
+ if (this.reportId().trim() !== id)
113
+ return;
114
+ const current = exists && !this.idChanged();
115
+ this.idStatus.set(exists ? (current ? 'current' : 'duplicate') : 'available');
116
+ this.idMessage.set(exists ? (current ? 'This ID is already saved. Saving will ask before updating this report.'
117
+ : 'This report ID already exists. Saving will ask whether to update it.') : 'This report ID is available.');
118
+ this.isCheckingId.set(false);
119
+ },
120
+ error: error => {
121
+ if (this.reportId().trim() !== id)
122
+ return;
123
+ this.idStatus.set('error');
124
+ this.idMessage.set(error?.message || 'Could not verify the report ID. Please retry.');
125
+ },
126
+ });
127
+ }
128
+ onNameChange(value) {
129
+ this.name.set(value);
130
+ if (!this.customSlug)
131
+ this.slug.set(toSlug(value));
132
+ }
133
+ onSlugChange(value) {
134
+ this.customSlug = true;
135
+ this.slug.set(value);
52
136
  }
53
137
  copyRoute() {
54
138
  if (typeof navigator !== 'undefined' && navigator.clipboard) {
55
139
  navigator.clipboard.writeText(this.fullRoute()).then(() => {
56
140
  this.copied.set(true);
57
141
  setTimeout(() => this.copied.set(false), 2000);
58
- });
142
+ }).catch(() => this.saveError.set('Could not copy the report URL.'));
59
143
  }
60
144
  }
61
- saveUpdatedDefinition() {
62
- const updated = {
63
- ...this.report,
64
- name: this.name().trim() || this.report.name,
65
- slug: this.slug().trim() || toSlug(this.name()),
145
+ save(action = 'back_to_designer') {
146
+ if (this.isSaving() || this.isCheckingId() || this.updateConfirmation())
147
+ return;
148
+ this.attempted.set(true);
149
+ this.saveError.set(null);
150
+ if (this.idError() || this.nameError() || this.slugError())
151
+ return;
152
+ const reviewed = {
153
+ ...this.report, id: this.reportId().trim(),
154
+ name: this.name().trim(), slug: this.slug().trim(),
155
+ description: this.description().trim() || undefined,
156
+ category: this.category().trim() || undefined,
66
157
  menuGroup: this.menuGroup().trim() || undefined,
67
158
  isPublished: this.isPublished(),
68
- updatedAt: new Date().toISOString(),
69
159
  };
70
- // Save to persistence store so navigation & menu updates immediately
71
- this.store.saveReport(updated).subscribe({
72
- next: () => this.savedStateMessage.set('Settings synchronized'),
73
- error: (err) => console.warn('[ReportSavedDialog] Failed to sync settings:', err),
160
+ const contextKey = this.store.getStorageContextKey();
161
+ this.isCheckingId.set(true);
162
+ this.isPreparingSave.set(true);
163
+ this.idStatus.set('checking');
164
+ this.idMessage.set('Checking report ID...');
165
+ this.idCheck = defer(() => this.store.inspectReportId(reviewed.id)).pipe(take(1), switchMap(status => status.exists && (!Number.isInteger(status.version) || status.version < 0)
166
+ ? throwError(() => new Error('Could not read the current report version. Please retry.')) : of(status)), takeUntilDestroyed(this.destroyRef), finalize(() => { this.isCheckingId.set(false); this.isPreparingSave.set(false); })).subscribe({
167
+ next: status => {
168
+ this.isCheckingId.set(false);
169
+ this.isPreparingSave.set(false);
170
+ if (this.reportId().trim() !== reviewed.id || this.store.getStorageContextKey() !== contextKey) {
171
+ this.idStatus.set('error');
172
+ this.idMessage.set('Reporting context changed. Review the details and save again.');
173
+ return;
174
+ }
175
+ if (status.exists) {
176
+ this.idStatus.set(this.idChanged() ? 'duplicate' : 'current');
177
+ this.idMessage.set('This report ID already exists. Confirm the update or cancel.');
178
+ this.updateConfirmation.set({ report: reviewed, action, expectedVersion: status.version,
179
+ existingName: status.name || reviewed.id, contextKey });
180
+ }
181
+ else {
182
+ this.idStatus.set('available');
183
+ this.idMessage.set('This report ID is available.');
184
+ this.persist(reviewed, action, { createOnly: true });
185
+ }
186
+ },
187
+ error: error => {
188
+ this.idStatus.set('error');
189
+ this.idMessage.set(error?.message || 'Could not verify the report ID. Please retry.');
190
+ },
74
191
  });
75
- return updated;
76
192
  }
77
- close(action = 'back_to_designer') {
78
- const updated = this.saveUpdatedDefinition();
79
- this.dialogRef.close({ action, report: updated });
193
+ cancelUpdate() {
194
+ if (!this.isSaving())
195
+ this.updateConfirmation.set(null);
80
196
  }
81
- openLivePage() {
82
- const updated = this.saveUpdatedDefinition();
83
- this.dialogRef.close({ action: 'open_live_page', report: updated });
84
- const route = this.fullRoute();
85
- if (this.router) {
86
- this.router.navigateByUrl(route);
87
- }
88
- else if (typeof window !== 'undefined') {
89
- window.location.href = route;
197
+ confirmUpdate() {
198
+ const confirmation = this.updateConfirmation();
199
+ if (!confirmation || this.isSaving() || this.isCheckingId())
200
+ return;
201
+ this.updateConfirmation.set(null);
202
+ if (this.reportId().trim() !== confirmation.report.id || this.store.getStorageContextKey() !== confirmation.contextKey) {
203
+ this.saveError.set('Reporting context changed. Review the details and save again.');
204
+ return;
90
205
  }
206
+ this.persist(confirmation.report, confirmation.action, { expectedVersion: confirmation.expectedVersion });
207
+ }
208
+ persist(report, action, options) {
209
+ this.isSaving.set(true);
210
+ const previousDisableClose = this.dialogRef.disableClose;
211
+ this.dialogRef.disableClose = true;
212
+ defer(() => this.store.saveReport(report, options)).pipe(take(1), takeUntilDestroyed(this.destroyRef), finalize(() => {
213
+ this.isSaving.set(false);
214
+ this.dialogRef.disableClose = previousDisableClose;
215
+ })).subscribe({
216
+ next: saved => this.dialogRef.close({ action, report: saved }),
217
+ error: error => {
218
+ this.saveError.set(error?.message || 'The report could not be saved. Please try again.');
219
+ if (/already exists/i.test(error?.message || '')) {
220
+ this.idStatus.set('duplicate');
221
+ this.idMessage.set('This ID was just saved by another request. Save again to confirm an update.');
222
+ }
223
+ },
224
+ });
225
+ }
226
+ close() {
227
+ if (!this.isSaving())
228
+ this.dialogRef.close();
229
+ }
230
+ openLivePage() {
231
+ this.save('open_live_page');
91
232
  }
92
233
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSavedDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
93
234
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportSavedDialogComponent, isStandalone: true, selector: "rpt-report-saved-dialog", ngImport: i0, template: `
94
- <div class="rpt-dialog-shell" role="dialog" aria-modal="true" aria-labelledby="dialog-title">
95
- <!-- Modal Header -->
96
- <div class="rpt-dialog-header">
235
+ <div class="rpt-dialog-shell" [attr.aria-busy]="isSaving() || isCheckingId()">
236
+ <!-- Review before the only persistence request -->
237
+ <div class="rpt-dialog-header" [attr.inert]="updateConfirmation() ? '' : null">
97
238
  <div class="rpt-header-left">
98
- <div class="rpt-success-icon-badge">
99
- <rpt-icon name="check" [size]="14" />
239
+ <div class="rpt-review-icon-badge">
240
+ <rpt-icon name="settings" [size]="14" />
100
241
  </div>
101
242
  <div>
102
- <h2 id="dialog-title" class="rpt-dialog-title">Report Saved Successfully</h2>
103
- <p class="rpt-dialog-subtitle">Configure page routing, navigation placement, and test the generated form.</p>
243
+ <h2 id="dialog-title" class="rpt-dialog-title">Review and Save Report</h2>
244
+ <p class="rpt-dialog-subtitle">Review the report details and preview, then save your changes.</p>
104
245
  </div>
105
246
  </div>
106
247
  <button
107
248
  type="button"
108
249
  class="rpt-dialog-close"
109
- (click)="close('back_to_designer')"
250
+ (click)="close()"
251
+ [disabled]="isSaving()"
110
252
  aria-label="Close dialog"
111
253
  >
112
- <rpt-icon name="x" [size]="14" />
254
+ <rpt-icon name="close" [size]="14" />
113
255
  </button>
114
256
  </div>
115
257
 
116
258
  <!-- Modal Body (Two-Column Split) -->
117
- <div class="rpt-dialog-body">
259
+ <div class="rpt-dialog-body" [attr.inert]="updateConfirmation() || isPreparingSave() ? '' : null">
118
260
  <!-- Left Column: Settings & Publishing -->
119
261
  <div class="rpt-settings-column">
120
262
  <div class="rpt-section-header">Page Navigation & Settings</div>
121
263
 
264
+ <div class="rpt-form-group">
265
+ <label class="rpt-label" for="rpt-dlg-id">Report ID</label>
266
+ <input id="rpt-dlg-id" type="text" class="rpt-input" autocomplete="off" spellcheck="false"
267
+ [ngModel]="reportId()" [ngModelOptions]="{standalone: true}" (ngModelChange)="onIdChange($event)"
268
+ [disabled]="isSaving()" [attr.aria-invalid]="idError() ? true : null"
269
+ [attr.aria-describedby]="idError() ? 'rpt-dlg-id-help rpt-dlg-id-error rpt-dlg-id-status' : 'rpt-dlg-id-help rpt-dlg-id-status'" placeholder="e.g. rpt-sales-summary" />
270
+ <div class="rpt-id-actions">
271
+ <button
272
+ type="button"
273
+ class="rpt-id-action-btn"
274
+ [disabled]="isSaving()"
275
+ (click)="randomizeId()"
276
+ title="Generate a random unique report ID"
277
+ >
278
+ <rpt-icon name="sparkles" [size]="12" />
279
+ <span>Random ID</span>
280
+ </button>
281
+ <button
282
+ type="button"
283
+ class="rpt-id-action-btn"
284
+ [class.is-checking]="isCheckingId()"
285
+ [disabled]="isSaving() || isCheckingId()"
286
+ (click)="verifyId()"
287
+ title="Verify ID availability in database"
288
+ >
289
+ @if (isCheckingId()) {
290
+ <rpt-icon name="refresh" [size]="12" class="rpt-spin" />
291
+ <span>Checking...</span>
292
+ } @else {
293
+ <rpt-icon name="search" [size]="12" />
294
+ <span>Verify ID</span>
295
+ }
296
+ </button>
297
+ </div>
298
+ <span id="rpt-dlg-id-help" class="rpt-help-text">An available ID creates a new report. An existing ID requires your confirmation before updating.</span>
299
+ @if (idError()) {
300
+ <p id="rpt-dlg-id-error" class="rpt-field-error" role="alert">{{ idError() }}</p>
301
+ }
302
+ <p id="rpt-dlg-id-status" class="rpt-id-status" role="status" aria-live="polite"
303
+ [class.rpt-id-status-success]="idStatus() === 'available' || idStatus() === 'current'"
304
+ [class.rpt-id-status-warning]="idStatus() === 'duplicate'"
305
+ [class.rpt-id-status-error]="idStatus() === 'error'"
306
+ [class.rpt-id-status-checking]="idStatus() === 'checking'">
307
+ @if (idMessage()) {
308
+ <span class="rpt-status-icon">
309
+ @if (idStatus() === 'available' || idStatus() === 'current') {
310
+ <rpt-icon name="check" [size]="11" />
311
+ } @else if (idStatus() === 'duplicate') {
312
+ <rpt-icon name="alert-triangle" [size]="11" />
313
+ } @else if (idStatus() === 'error') {
314
+ <rpt-icon name="close" [size]="11" />
315
+ } @else if (idStatus() === 'checking') {
316
+ <rpt-icon name="refresh" [size]="11" class="rpt-spin" />
317
+ }
318
+ </span>
319
+ <span>{{ idMessage() }}</span>
320
+ }
321
+ </p>
322
+ </div>
323
+
122
324
  <!-- Report Name -->
123
325
  <div class="rpt-form-group">
124
326
  <label class="rpt-label" for="rpt-dlg-name">Display Name</label>
@@ -127,11 +329,26 @@ export class ReportSavedDialogComponent {
127
329
  type="text"
128
330
  class="rpt-input"
129
331
  [ngModel]="name()"
332
+ [ngModelOptions]="{standalone: true}"
130
333
  (ngModelChange)="onNameChange($event)"
334
+ [disabled]="isSaving()"
335
+ [attr.aria-invalid]="nameError() ? true : null"
336
+ [attr.aria-describedby]="nameError() ? 'rpt-dlg-name-error' : null"
131
337
  placeholder="e.g. Sales Register"
132
338
  />
133
339
  </div>
134
340
 
341
+ @if (nameError()) {
342
+ <p id="rpt-dlg-name-error" class="rpt-field-error" role="alert">{{ nameError() }}</p>
343
+ }
344
+
345
+ <div class="rpt-form-group">
346
+ <label class="rpt-label" for="rpt-dlg-description">Description</label>
347
+ <textarea id="rpt-dlg-description" class="rpt-input" rows="2"
348
+ [ngModel]="description()" (ngModelChange)="description.set($event)"
349
+ [ngModelOptions]="{standalone: true}" [disabled]="isSaving()"></textarea>
350
+ </div>
351
+
135
352
  <!-- URL Slug -->
136
353
  <div class="rpt-form-group">
137
354
  <label class="rpt-label" for="rpt-dlg-slug">URL Slug</label>
@@ -142,14 +359,28 @@ export class ReportSavedDialogComponent {
142
359
  type="text"
143
360
  class="rpt-input rpt-slug-field"
144
361
  [ngModel]="slug()"
145
- (ngModelChange)="slug.set($event)"
362
+ [ngModelOptions]="{standalone: true}"
363
+ (ngModelChange)="onSlugChange($event)"
364
+ [disabled]="isSaving()"
365
+ [attr.aria-invalid]="slugError() ? true : null"
366
+ [attr.aria-describedby]="slugError() ? 'rpt-dlg-slug-error' : null"
146
367
  placeholder="sale-report"
147
368
  />
148
369
  </div>
370
+ @if (slugError()) {
371
+ <p id="rpt-dlg-slug-error" class="rpt-field-error" role="alert">{{ slugError() }}</p>
372
+ }
149
373
  <span class="rpt-help-text">Direct URL for users to view this report page.</span>
150
374
  </div>
151
375
 
152
- <!-- Menu Group / Category -->
376
+ <div class="rpt-form-group">
377
+ <label class="rpt-label" for="rpt-dlg-category">Category</label>
378
+ <input id="rpt-dlg-category" class="rpt-input" type="text"
379
+ [ngModel]="category()" (ngModelChange)="category.set($event)"
380
+ [ngModelOptions]="{standalone: true}" [disabled]="isSaving()" />
381
+ </div>
382
+
383
+ <!-- Menu Group -->
153
384
  <div class="rpt-form-group">
154
385
  <label class="rpt-label" for="rpt-dlg-group">Menu Group</label>
155
386
  <input
@@ -157,7 +388,9 @@ export class ReportSavedDialogComponent {
157
388
  type="text"
158
389
  class="rpt-input"
159
390
  [ngModel]="menuGroup()"
391
+ [ngModelOptions]="{standalone: true}"
160
392
  (ngModelChange)="menuGroup.set($event)"
393
+ [disabled]="isSaving()"
161
394
  placeholder="e.g. Sales, Finance, Operations"
162
395
  />
163
396
  <span class="rpt-help-text">Sidebar folder heading where this page appears.</span>
@@ -173,6 +406,7 @@ export class ReportSavedDialogComponent {
173
406
  <input
174
407
  type="checkbox"
175
408
  [checked]="isPublished()"
409
+ [disabled]="isSaving()"
176
410
  (change)="isPublished.set(!isPublished())"
177
411
  />
178
412
  <span class="rpt-slider"></span>
@@ -182,7 +416,7 @@ export class ReportSavedDialogComponent {
182
416
  <!-- Copy URL Box -->
183
417
  <div class="rpt-share-card">
184
418
  <div class="rpt-share-url-row">
185
- <span class="rpt-share-label">Live:</span>
419
+ <span class="rpt-share-label">Report URL:</span>
186
420
  <code class="rpt-share-code">{{ fullRoute() }}</code>
187
421
  <button
188
422
  type="button"
@@ -215,68 +449,179 @@ export class ReportSavedDialogComponent {
215
449
  </div>
216
450
  </div>
217
451
 
218
- <!-- Modal Footer -->
219
- <div class="rpt-dialog-footer">
220
- <div class="rpt-footer-left">
221
- @if (savedStateMessage()) {
222
- <span class="rpt-saved-pill">
223
- <rpt-icon name="check" [size]="11" />
224
- {{ savedStateMessage() }}
225
- </span>
452
+ <!-- Confirming here is the only operation that saves a definition. -->
453
+ <div class="rpt-dialog-footer" [attr.inert]="updateConfirmation() ? '' : null">
454
+ <div class="rpt-footer-left" aria-live="polite">
455
+ @if (saveError()) {
456
+ <p class="rpt-field-error" role="alert">{{ saveError() }}</p>
457
+ } @else {
458
+ <span class="rpt-help-text">{{ isSaving() ? 'Saving report...' : 'Changes are saved only after confirmation.' }}</span>
226
459
  }
227
460
  </div>
228
461
  <div class="rpt-footer-actions">
229
- <button
230
- type="button"
231
- class="rpt-btn rpt-btn-secondary"
232
- (click)="close('back_to_designer')"
233
- >
234
- Back to Designer
235
- </button>
236
- <button
237
- type="button"
238
- class="rpt-btn rpt-btn-primary"
239
- (click)="openLivePage()"
240
- >
241
- <rpt-icon name="external-link" [size]="12" />
242
- <span>Open Live Page</span>
462
+ <button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving()" (click)="close()">Cancel</button>
463
+ <button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving() || isCheckingId()" (click)="save('open_live_page')">Save and Open</button>
464
+ <button type="button" class="rpt-btn rpt-btn-primary" [disabled]="isSaving() || isCheckingId()" (click)="save()">
465
+ {{ isSaving() ? 'Saving...' : 'Save Report' }}
243
466
  </button>
244
467
  </div>
245
468
  </div>
469
+ @if (updateConfirmation(); as confirmation) {
470
+ <div class="rpt-update-overlay" role="alertdialog" aria-modal="true"
471
+ aria-labelledby="rpt-update-title" aria-describedby="rpt-update-description"
472
+ cdkTrapFocus [cdkTrapFocusAutoCapture]="true">
473
+ <div class="rpt-update-card">
474
+ <!-- Modal Header with Warning Icon Badge and Close Button -->
475
+ <div class="rpt-update-card-header">
476
+ <div class="rpt-update-icon-badge">
477
+ <rpt-icon name="alert-triangle" [size]="18" />
478
+ </div>
479
+ <div class="rpt-update-header-info">
480
+ <h3 id="rpt-update-title" class="rpt-update-title">Report ID already exists</h3>
481
+ <span class="rpt-update-subtitle">An existing report definition was found</span>
482
+ </div>
483
+ <button type="button" class="rpt-dialog-close" (click)="cancelUpdate()" aria-label="Cancel update" title="Cancel">
484
+ <rpt-icon name="close" [size]="13" />
485
+ </button>
486
+ </div>
487
+
488
+ <!-- Modal Content with Summary, Details Card, and Impact Notice -->
489
+ <div class="rpt-update-card-body">
490
+ <p id="rpt-update-description" class="rpt-update-prompt">
491
+ Report <strong>{{ confirmation.existingName }}</strong> already uses
492
+ ID <strong>{{ confirmation.report.id }}</strong> (version {{ confirmation.expectedVersion }}).
493
+ Do you want to update it with the reviewed report details?
494
+ </p>
495
+
496
+ <div class="rpt-conflict-card">
497
+ <div class="rpt-conflict-row">
498
+ <span class="rpt-conflict-label">Target ID</span>
499
+ <code class="rpt-conflict-code">{{ confirmation.report.id }}</code>
500
+ </div>
501
+ <div class="rpt-conflict-row">
502
+ <span class="rpt-conflict-label">Existing Report</span>
503
+ <span class="rpt-conflict-name">{{ confirmation.existingName }}</span>
504
+ </div>
505
+ <div class="rpt-conflict-row">
506
+ <span class="rpt-conflict-label">Current Version</span>
507
+ <span class="rpt-conflict-badge">v{{ confirmation.expectedVersion }}</span>
508
+ </div>
509
+ </div>
510
+
511
+ <div class="rpt-overwrite-notice">
512
+ <rpt-icon name="warning" [size]="13" />
513
+ <span>Saving will overwrite the existing definition in the database and increment the version.</span>
514
+ </div>
515
+ </div>
516
+
517
+ <!-- Action Buttons matching Library UI -->
518
+ <div class="rpt-update-actions">
519
+ <button type="button" cdkFocusInitial class="rpt-btn rpt-btn-secondary" (click)="cancelUpdate()">
520
+ Cancel
521
+ </button>
522
+ <button type="button" class="rpt-btn rpt-btn-primary rpt-btn-confirm-save" (click)="confirmUpdate()">
523
+ <rpt-icon name="save" [size]="13" />
524
+ <span>{{ confirmation.action === 'open_live_page' ? 'Update and Open' : 'Update Report' }}</span>
525
+ </button>
526
+ </div>
527
+ </div>
528
+ </div>
529
+ }
246
530
  </div>
247
- `, isInline: true, styles: [":host{display:flex;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{display:flex;flex-direction:column;width:min(840px,92vw);max-height:min(540px,84vh);background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-success-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#ecfdf5;border:1px solid #a7f3d0;color:#059669;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:360px;max-height:calc(84vh - 96px);overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:1fr;overflow-y:auto}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}.rpt-dialog-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
531
+ `, isInline: true, styles: ["@keyframes rptSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rpt-spin{display:inline-block;animation:rptSpin 1s linear infinite}@keyframes rptOverlayIn{0%{opacity:0}to{opacity:1}}@keyframes rptCardIn{0%{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-id-actions{display:flex;align-items:center;gap:6px;margin-top:4px}.rpt-id-action-btn{display:inline-flex;align-items:center;gap:5px;height:25px;padding:0 9px;font-size:.7rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:5px;cursor:pointer;transition:all .15s ease;box-sizing:border-box;white-space:nowrap;font-family:inherit;line-height:1}.rpt-id-action-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a;border-color:#94a3b8;box-shadow:0 1px 2px #0f172a0d}.rpt-id-action-btn:active:not(:disabled){background:#e2e8f0}.rpt-id-action-btn:disabled{opacity:.5;cursor:not-allowed}.rpt-id-action-btn.is-checking{color:#2563eb;border-color:#93c5fd;background:#eff6ff}.rpt-id-status{display:inline-flex;align-items:center;gap:5px;font-size:.72rem;line-height:1.3;margin:4px 0 0;padding:3px 8px;border-radius:5px;transition:all .15s ease;width:fit-content;max-width:100%;box-sizing:border-box}.rpt-id-status:empty{display:none}.rpt-status-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.rpt-id-status-success{color:#15803d;background:#f0fdf4;border:1px solid #bbf7d0}.rpt-id-status-warning{color:#b45309;background:#fffbeb;border:1px solid #fef3c7}.rpt-id-status-error{color:#b91c1c;background:#fef2f2;border:1px solid #fecaca}.rpt-id-status-checking{color:#1d4ed8;background:#eff6ff;border:1px solid #dbeafe}.rpt-update-overlay{position:absolute;inset:0;z-index:50;background:#0f172a73;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box;animation:rptOverlayIn .16s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card{box-sizing:border-box;width:min(440px,100%);max-height:94%;background:#fff;border-radius:10px;box-shadow:0 20px 45px -8px #0f172a52,0 0 0 1px #0f172a14;border:1px solid #e2e8f0;overflow:hidden;display:flex;flex-direction:column;animation:rptCardIn .18s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fffbeb;border-bottom:1px solid #fef3c7;flex-shrink:0}.rpt-update-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:#fef3c7;border:1px solid #fde68a;color:#b45309;flex-shrink:0}.rpt-update-header-info{flex:1;min-width:0}.rpt-update-title{margin:0;font-size:.925rem;font-weight:700;color:#92400e;line-height:1.25}.rpt-update-subtitle{font-size:.7rem;color:#b45309;margin-top:1px;display:block}.rpt-update-card-body{padding:14px 16px;display:flex;flex-direction:column;gap:11px;overflow-y:auto;box-sizing:border-box}.rpt-update-prompt{margin:0;font-size:.8rem;line-height:1.45;color:#334155}.rpt-conflict-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:7px;padding:9px 12px;display:flex;flex-direction:column;gap:7px}.rpt-conflict-row{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:.735rem}.rpt-conflict-label{color:#64748b;font-weight:500;flex-shrink:0}.rpt-conflict-code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;background:#e2e8f0;color:#0f172a;padding:2px 6px;border-radius:4px;font-weight:600}.rpt-conflict-name{font-weight:600;color:#0f172a;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-conflict-badge{font-size:.68rem;font-weight:600;padding:1px 7px;border-radius:9999px;background:#e0f2fe;color:#0369a1;border:1px solid #bae6fd}.rpt-overwrite-notice{display:flex;align-items:flex-start;gap:7px;font-size:.715rem;color:#b45309;background:#fffbeb;border:1px solid #fef3c7;padding:7px 10px;border-radius:6px;line-height:1.35}.rpt-overwrite-notice rpt-icon{flex-shrink:0;margin-top:1px}.rpt-update-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:10px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0}.rpt-btn-confirm-save{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-confirm-save:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}#rpt-dlg-id-error:empty,#rpt-dlg-id-status:empty{display:none}.rpt-dialog-footer,.rpt-footer-actions{flex-wrap:wrap;gap:8px}.rpt-btn,.rpt-dialog-close{min-height:36px}@media (max-width: 640px){.rpt-btn,.rpt-dialog-close{min-height:44px;min-width:44px}.rpt-footer-left{width:100%}}.rpt-field-error{color:#b91c1c;font-size:.8rem;margin:4px 0}button:disabled{opacity:.6;cursor:wait}textarea.rpt-input{resize:vertical;min-height:56px}.rpt-footer-left{min-width:0;padding-right:12px}:host{display:flex;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{position:relative;display:flex;flex-direction:column;width:min(840px,92vw);max-height:min(540px,84vh);background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-review-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#dbeafe;border:1px solid #a7f3d0;color:#1d4ed8;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:360px;max-height:calc(84vh - 96px);overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:1fr;overflow-y:auto}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}.rpt-dialog-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report", "resultData"], outputs: ["resetRequested", "execute", "executed", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
248
532
  }
249
533
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSavedDialogComponent, decorators: [{
250
534
  type: Component,
251
- args: [{ selector: 'rpt-report-saved-dialog', standalone: true, imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
252
- <div class="rpt-dialog-shell" role="dialog" aria-modal="true" aria-labelledby="dialog-title">
253
- <!-- Modal Header -->
254
- <div class="rpt-dialog-header">
535
+ args: [{ selector: 'rpt-report-saved-dialog', standalone: true, imports: [CommonModule, FormsModule, A11yModule, ReportRuntimeComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
536
+ <div class="rpt-dialog-shell" [attr.aria-busy]="isSaving() || isCheckingId()">
537
+ <!-- Review before the only persistence request -->
538
+ <div class="rpt-dialog-header" [attr.inert]="updateConfirmation() ? '' : null">
255
539
  <div class="rpt-header-left">
256
- <div class="rpt-success-icon-badge">
257
- <rpt-icon name="check" [size]="14" />
540
+ <div class="rpt-review-icon-badge">
541
+ <rpt-icon name="settings" [size]="14" />
258
542
  </div>
259
543
  <div>
260
- <h2 id="dialog-title" class="rpt-dialog-title">Report Saved Successfully</h2>
261
- <p class="rpt-dialog-subtitle">Configure page routing, navigation placement, and test the generated form.</p>
544
+ <h2 id="dialog-title" class="rpt-dialog-title">Review and Save Report</h2>
545
+ <p class="rpt-dialog-subtitle">Review the report details and preview, then save your changes.</p>
262
546
  </div>
263
547
  </div>
264
548
  <button
265
549
  type="button"
266
550
  class="rpt-dialog-close"
267
- (click)="close('back_to_designer')"
551
+ (click)="close()"
552
+ [disabled]="isSaving()"
268
553
  aria-label="Close dialog"
269
554
  >
270
- <rpt-icon name="x" [size]="14" />
555
+ <rpt-icon name="close" [size]="14" />
271
556
  </button>
272
557
  </div>
273
558
 
274
559
  <!-- Modal Body (Two-Column Split) -->
275
- <div class="rpt-dialog-body">
560
+ <div class="rpt-dialog-body" [attr.inert]="updateConfirmation() || isPreparingSave() ? '' : null">
276
561
  <!-- Left Column: Settings & Publishing -->
277
562
  <div class="rpt-settings-column">
278
563
  <div class="rpt-section-header">Page Navigation & Settings</div>
279
564
 
565
+ <div class="rpt-form-group">
566
+ <label class="rpt-label" for="rpt-dlg-id">Report ID</label>
567
+ <input id="rpt-dlg-id" type="text" class="rpt-input" autocomplete="off" spellcheck="false"
568
+ [ngModel]="reportId()" [ngModelOptions]="{standalone: true}" (ngModelChange)="onIdChange($event)"
569
+ [disabled]="isSaving()" [attr.aria-invalid]="idError() ? true : null"
570
+ [attr.aria-describedby]="idError() ? 'rpt-dlg-id-help rpt-dlg-id-error rpt-dlg-id-status' : 'rpt-dlg-id-help rpt-dlg-id-status'" placeholder="e.g. rpt-sales-summary" />
571
+ <div class="rpt-id-actions">
572
+ <button
573
+ type="button"
574
+ class="rpt-id-action-btn"
575
+ [disabled]="isSaving()"
576
+ (click)="randomizeId()"
577
+ title="Generate a random unique report ID"
578
+ >
579
+ <rpt-icon name="sparkles" [size]="12" />
580
+ <span>Random ID</span>
581
+ </button>
582
+ <button
583
+ type="button"
584
+ class="rpt-id-action-btn"
585
+ [class.is-checking]="isCheckingId()"
586
+ [disabled]="isSaving() || isCheckingId()"
587
+ (click)="verifyId()"
588
+ title="Verify ID availability in database"
589
+ >
590
+ @if (isCheckingId()) {
591
+ <rpt-icon name="refresh" [size]="12" class="rpt-spin" />
592
+ <span>Checking...</span>
593
+ } @else {
594
+ <rpt-icon name="search" [size]="12" />
595
+ <span>Verify ID</span>
596
+ }
597
+ </button>
598
+ </div>
599
+ <span id="rpt-dlg-id-help" class="rpt-help-text">An available ID creates a new report. An existing ID requires your confirmation before updating.</span>
600
+ @if (idError()) {
601
+ <p id="rpt-dlg-id-error" class="rpt-field-error" role="alert">{{ idError() }}</p>
602
+ }
603
+ <p id="rpt-dlg-id-status" class="rpt-id-status" role="status" aria-live="polite"
604
+ [class.rpt-id-status-success]="idStatus() === 'available' || idStatus() === 'current'"
605
+ [class.rpt-id-status-warning]="idStatus() === 'duplicate'"
606
+ [class.rpt-id-status-error]="idStatus() === 'error'"
607
+ [class.rpt-id-status-checking]="idStatus() === 'checking'">
608
+ @if (idMessage()) {
609
+ <span class="rpt-status-icon">
610
+ @if (idStatus() === 'available' || idStatus() === 'current') {
611
+ <rpt-icon name="check" [size]="11" />
612
+ } @else if (idStatus() === 'duplicate') {
613
+ <rpt-icon name="alert-triangle" [size]="11" />
614
+ } @else if (idStatus() === 'error') {
615
+ <rpt-icon name="close" [size]="11" />
616
+ } @else if (idStatus() === 'checking') {
617
+ <rpt-icon name="refresh" [size]="11" class="rpt-spin" />
618
+ }
619
+ </span>
620
+ <span>{{ idMessage() }}</span>
621
+ }
622
+ </p>
623
+ </div>
624
+
280
625
  <!-- Report Name -->
281
626
  <div class="rpt-form-group">
282
627
  <label class="rpt-label" for="rpt-dlg-name">Display Name</label>
@@ -285,11 +630,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
285
630
  type="text"
286
631
  class="rpt-input"
287
632
  [ngModel]="name()"
633
+ [ngModelOptions]="{standalone: true}"
288
634
  (ngModelChange)="onNameChange($event)"
635
+ [disabled]="isSaving()"
636
+ [attr.aria-invalid]="nameError() ? true : null"
637
+ [attr.aria-describedby]="nameError() ? 'rpt-dlg-name-error' : null"
289
638
  placeholder="e.g. Sales Register"
290
639
  />
291
640
  </div>
292
641
 
642
+ @if (nameError()) {
643
+ <p id="rpt-dlg-name-error" class="rpt-field-error" role="alert">{{ nameError() }}</p>
644
+ }
645
+
646
+ <div class="rpt-form-group">
647
+ <label class="rpt-label" for="rpt-dlg-description">Description</label>
648
+ <textarea id="rpt-dlg-description" class="rpt-input" rows="2"
649
+ [ngModel]="description()" (ngModelChange)="description.set($event)"
650
+ [ngModelOptions]="{standalone: true}" [disabled]="isSaving()"></textarea>
651
+ </div>
652
+
293
653
  <!-- URL Slug -->
294
654
  <div class="rpt-form-group">
295
655
  <label class="rpt-label" for="rpt-dlg-slug">URL Slug</label>
@@ -300,14 +660,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
300
660
  type="text"
301
661
  class="rpt-input rpt-slug-field"
302
662
  [ngModel]="slug()"
303
- (ngModelChange)="slug.set($event)"
663
+ [ngModelOptions]="{standalone: true}"
664
+ (ngModelChange)="onSlugChange($event)"
665
+ [disabled]="isSaving()"
666
+ [attr.aria-invalid]="slugError() ? true : null"
667
+ [attr.aria-describedby]="slugError() ? 'rpt-dlg-slug-error' : null"
304
668
  placeholder="sale-report"
305
669
  />
306
670
  </div>
671
+ @if (slugError()) {
672
+ <p id="rpt-dlg-slug-error" class="rpt-field-error" role="alert">{{ slugError() }}</p>
673
+ }
307
674
  <span class="rpt-help-text">Direct URL for users to view this report page.</span>
308
675
  </div>
309
676
 
310
- <!-- Menu Group / Category -->
677
+ <div class="rpt-form-group">
678
+ <label class="rpt-label" for="rpt-dlg-category">Category</label>
679
+ <input id="rpt-dlg-category" class="rpt-input" type="text"
680
+ [ngModel]="category()" (ngModelChange)="category.set($event)"
681
+ [ngModelOptions]="{standalone: true}" [disabled]="isSaving()" />
682
+ </div>
683
+
684
+ <!-- Menu Group -->
311
685
  <div class="rpt-form-group">
312
686
  <label class="rpt-label" for="rpt-dlg-group">Menu Group</label>
313
687
  <input
@@ -315,7 +689,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
315
689
  type="text"
316
690
  class="rpt-input"
317
691
  [ngModel]="menuGroup()"
692
+ [ngModelOptions]="{standalone: true}"
318
693
  (ngModelChange)="menuGroup.set($event)"
694
+ [disabled]="isSaving()"
319
695
  placeholder="e.g. Sales, Finance, Operations"
320
696
  />
321
697
  <span class="rpt-help-text">Sidebar folder heading where this page appears.</span>
@@ -331,6 +707,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
331
707
  <input
332
708
  type="checkbox"
333
709
  [checked]="isPublished()"
710
+ [disabled]="isSaving()"
334
711
  (change)="isPublished.set(!isPublished())"
335
712
  />
336
713
  <span class="rpt-slider"></span>
@@ -340,7 +717,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
340
717
  <!-- Copy URL Box -->
341
718
  <div class="rpt-share-card">
342
719
  <div class="rpt-share-url-row">
343
- <span class="rpt-share-label">Live:</span>
720
+ <span class="rpt-share-label">Report URL:</span>
344
721
  <code class="rpt-share-code">{{ fullRoute() }}</code>
345
722
  <button
346
723
  type="button"
@@ -373,35 +750,85 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
373
750
  </div>
374
751
  </div>
375
752
 
376
- <!-- Modal Footer -->
377
- <div class="rpt-dialog-footer">
378
- <div class="rpt-footer-left">
379
- @if (savedStateMessage()) {
380
- <span class="rpt-saved-pill">
381
- <rpt-icon name="check" [size]="11" />
382
- {{ savedStateMessage() }}
383
- </span>
753
+ <!-- Confirming here is the only operation that saves a definition. -->
754
+ <div class="rpt-dialog-footer" [attr.inert]="updateConfirmation() ? '' : null">
755
+ <div class="rpt-footer-left" aria-live="polite">
756
+ @if (saveError()) {
757
+ <p class="rpt-field-error" role="alert">{{ saveError() }}</p>
758
+ } @else {
759
+ <span class="rpt-help-text">{{ isSaving() ? 'Saving report...' : 'Changes are saved only after confirmation.' }}</span>
384
760
  }
385
761
  </div>
386
762
  <div class="rpt-footer-actions">
387
- <button
388
- type="button"
389
- class="rpt-btn rpt-btn-secondary"
390
- (click)="close('back_to_designer')"
391
- >
392
- Back to Designer
393
- </button>
394
- <button
395
- type="button"
396
- class="rpt-btn rpt-btn-primary"
397
- (click)="openLivePage()"
398
- >
399
- <rpt-icon name="external-link" [size]="12" />
400
- <span>Open Live Page</span>
763
+ <button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving()" (click)="close()">Cancel</button>
764
+ <button type="button" class="rpt-btn rpt-btn-secondary" [disabled]="isSaving() || isCheckingId()" (click)="save('open_live_page')">Save and Open</button>
765
+ <button type="button" class="rpt-btn rpt-btn-primary" [disabled]="isSaving() || isCheckingId()" (click)="save()">
766
+ {{ isSaving() ? 'Saving...' : 'Save Report' }}
401
767
  </button>
402
768
  </div>
403
769
  </div>
770
+ @if (updateConfirmation(); as confirmation) {
771
+ <div class="rpt-update-overlay" role="alertdialog" aria-modal="true"
772
+ aria-labelledby="rpt-update-title" aria-describedby="rpt-update-description"
773
+ cdkTrapFocus [cdkTrapFocusAutoCapture]="true">
774
+ <div class="rpt-update-card">
775
+ <!-- Modal Header with Warning Icon Badge and Close Button -->
776
+ <div class="rpt-update-card-header">
777
+ <div class="rpt-update-icon-badge">
778
+ <rpt-icon name="alert-triangle" [size]="18" />
779
+ </div>
780
+ <div class="rpt-update-header-info">
781
+ <h3 id="rpt-update-title" class="rpt-update-title">Report ID already exists</h3>
782
+ <span class="rpt-update-subtitle">An existing report definition was found</span>
783
+ </div>
784
+ <button type="button" class="rpt-dialog-close" (click)="cancelUpdate()" aria-label="Cancel update" title="Cancel">
785
+ <rpt-icon name="close" [size]="13" />
786
+ </button>
787
+ </div>
788
+
789
+ <!-- Modal Content with Summary, Details Card, and Impact Notice -->
790
+ <div class="rpt-update-card-body">
791
+ <p id="rpt-update-description" class="rpt-update-prompt">
792
+ Report <strong>{{ confirmation.existingName }}</strong> already uses
793
+ ID <strong>{{ confirmation.report.id }}</strong> (version {{ confirmation.expectedVersion }}).
794
+ Do you want to update it with the reviewed report details?
795
+ </p>
796
+
797
+ <div class="rpt-conflict-card">
798
+ <div class="rpt-conflict-row">
799
+ <span class="rpt-conflict-label">Target ID</span>
800
+ <code class="rpt-conflict-code">{{ confirmation.report.id }}</code>
801
+ </div>
802
+ <div class="rpt-conflict-row">
803
+ <span class="rpt-conflict-label">Existing Report</span>
804
+ <span class="rpt-conflict-name">{{ confirmation.existingName }}</span>
805
+ </div>
806
+ <div class="rpt-conflict-row">
807
+ <span class="rpt-conflict-label">Current Version</span>
808
+ <span class="rpt-conflict-badge">v{{ confirmation.expectedVersion }}</span>
809
+ </div>
810
+ </div>
811
+
812
+ <div class="rpt-overwrite-notice">
813
+ <rpt-icon name="warning" [size]="13" />
814
+ <span>Saving will overwrite the existing definition in the database and increment the version.</span>
815
+ </div>
816
+ </div>
817
+
818
+ <!-- Action Buttons matching Library UI -->
819
+ <div class="rpt-update-actions">
820
+ <button type="button" cdkFocusInitial class="rpt-btn rpt-btn-secondary" (click)="cancelUpdate()">
821
+ Cancel
822
+ </button>
823
+ <button type="button" class="rpt-btn rpt-btn-primary rpt-btn-confirm-save" (click)="confirmUpdate()">
824
+ <rpt-icon name="save" [size]="13" />
825
+ <span>{{ confirmation.action === 'open_live_page' ? 'Update and Open' : 'Update Report' }}</span>
826
+ </button>
827
+ </div>
828
+ </div>
829
+ </div>
830
+ }
404
831
  </div>
405
- `, styles: [":host{display:flex;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{display:flex;flex-direction:column;width:min(840px,92vw);max-height:min(540px,84vh);background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-success-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#ecfdf5;border:1px solid #a7f3d0;color:#059669;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:360px;max-height:calc(84vh - 96px);overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:1fr;overflow-y:auto}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}.rpt-dialog-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"] }]
832
+ `, styles: ["@keyframes rptSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rpt-spin{display:inline-block;animation:rptSpin 1s linear infinite}@keyframes rptOverlayIn{0%{opacity:0}to{opacity:1}}@keyframes rptCardIn{0%{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-id-actions{display:flex;align-items:center;gap:6px;margin-top:4px}.rpt-id-action-btn{display:inline-flex;align-items:center;gap:5px;height:25px;padding:0 9px;font-size:.7rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:5px;cursor:pointer;transition:all .15s ease;box-sizing:border-box;white-space:nowrap;font-family:inherit;line-height:1}.rpt-id-action-btn:hover:not(:disabled){background:#f1f5f9;color:#0f172a;border-color:#94a3b8;box-shadow:0 1px 2px #0f172a0d}.rpt-id-action-btn:active:not(:disabled){background:#e2e8f0}.rpt-id-action-btn:disabled{opacity:.5;cursor:not-allowed}.rpt-id-action-btn.is-checking{color:#2563eb;border-color:#93c5fd;background:#eff6ff}.rpt-id-status{display:inline-flex;align-items:center;gap:5px;font-size:.72rem;line-height:1.3;margin:4px 0 0;padding:3px 8px;border-radius:5px;transition:all .15s ease;width:fit-content;max-width:100%;box-sizing:border-box}.rpt-id-status:empty{display:none}.rpt-status-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.rpt-id-status-success{color:#15803d;background:#f0fdf4;border:1px solid #bbf7d0}.rpt-id-status-warning{color:#b45309;background:#fffbeb;border:1px solid #fef3c7}.rpt-id-status-error{color:#b91c1c;background:#fef2f2;border:1px solid #fecaca}.rpt-id-status-checking{color:#1d4ed8;background:#eff6ff;border:1px solid #dbeafe}.rpt-update-overlay{position:absolute;inset:0;z-index:50;background:#0f172a73;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box;animation:rptOverlayIn .16s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card{box-sizing:border-box;width:min(440px,100%);max-height:94%;background:#fff;border-radius:10px;box-shadow:0 20px 45px -8px #0f172a52,0 0 0 1px #0f172a14;border:1px solid #e2e8f0;overflow:hidden;display:flex;flex-direction:column;animation:rptCardIn .18s cubic-bezier(.16,1,.3,1) forwards}.rpt-update-card-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fffbeb;border-bottom:1px solid #fef3c7;flex-shrink:0}.rpt-update-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:#fef3c7;border:1px solid #fde68a;color:#b45309;flex-shrink:0}.rpt-update-header-info{flex:1;min-width:0}.rpt-update-title{margin:0;font-size:.925rem;font-weight:700;color:#92400e;line-height:1.25}.rpt-update-subtitle{font-size:.7rem;color:#b45309;margin-top:1px;display:block}.rpt-update-card-body{padding:14px 16px;display:flex;flex-direction:column;gap:11px;overflow-y:auto;box-sizing:border-box}.rpt-update-prompt{margin:0;font-size:.8rem;line-height:1.45;color:#334155}.rpt-conflict-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:7px;padding:9px 12px;display:flex;flex-direction:column;gap:7px}.rpt-conflict-row{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:.735rem}.rpt-conflict-label{color:#64748b;font-weight:500;flex-shrink:0}.rpt-conflict-code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;background:#e2e8f0;color:#0f172a;padding:2px 6px;border-radius:4px;font-weight:600}.rpt-conflict-name{font-weight:600;color:#0f172a;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-conflict-badge{font-size:.68rem;font-weight:600;padding:1px 7px;border-radius:9999px;background:#e0f2fe;color:#0369a1;border:1px solid #bae6fd}.rpt-overwrite-notice{display:flex;align-items:flex-start;gap:7px;font-size:.715rem;color:#b45309;background:#fffbeb;border:1px solid #fef3c7;padding:7px 10px;border-radius:6px;line-height:1.35}.rpt-overwrite-notice rpt-icon{flex-shrink:0;margin-top:1px}.rpt-update-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:10px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0}.rpt-btn-confirm-save{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-confirm-save:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}#rpt-dlg-id-error:empty,#rpt-dlg-id-status:empty{display:none}.rpt-dialog-footer,.rpt-footer-actions{flex-wrap:wrap;gap:8px}.rpt-btn,.rpt-dialog-close{min-height:36px}@media (max-width: 640px){.rpt-btn,.rpt-dialog-close{min-height:44px;min-width:44px}.rpt-footer-left{width:100%}}.rpt-field-error{color:#b91c1c;font-size:.8rem;margin:4px 0}button:disabled{opacity:.6;cursor:wait}textarea.rpt-input{resize:vertical;min-height:56px}.rpt-footer-left{min-width:0;padding-right:12px}:host{display:flex;align-items:center;justify-content:center;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif);color:#0f172a;box-sizing:border-box}.rpt-dialog-shell{position:relative;display:flex;flex-direction:column;width:min(840px,92vw);max-height:min(540px,84vh);background:#fff;border-radius:10px;box-shadow:0 20px 40px -12px #0f172a47,0 0 0 1px #0f172a14;overflow:hidden;box-sizing:border-box;animation:rptDialogIn .18s cubic-bezier(.16,1,.3,1) forwards}@keyframes rptDialogIn{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}.rpt-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;box-sizing:border-box}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-review-icon-badge{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#dbeafe;border:1px solid #a7f3d0;color:#1d4ed8;flex-shrink:0}.rpt-dialog-title{margin:0;font-size:.925rem;font-weight:700;color:#0f172a;line-height:1.25}.rpt-dialog-subtitle{margin:1px 0 0;font-size:.725rem;color:#64748b;line-height:1.2}.rpt-dialog-close{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-dialog-close:hover{background:#e2e8f0;color:#0f172a}.rpt-dialog-body{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:360px;max-height:calc(84vh - 96px);overflow:hidden;box-sizing:border-box}@media (max-width: 780px){.rpt-dialog-body{grid-template-columns:1fr;overflow-y:auto}}.rpt-settings-column{display:flex;flex-direction:column;gap:9px;padding:12px 14px;background:#f8fafc;border-right:1px solid #e2e8f0;overflow-y:auto;box-sizing:border-box}.rpt-section-header{font-size:.675rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#475569;margin-bottom:1px}.rpt-form-group{display:flex;flex-direction:column;gap:3px}.rpt-label{font-size:.725rem;font-weight:600;color:#334155}.rpt-input{width:100%;box-sizing:border-box;height:28px;padding:4px 8px;font-size:.775rem;border:1px solid #cbd5e1;border-radius:5px;background:#fff;color:#0f172a;outline:none;transition:all .12s ease}.rpt-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-input-wrapper{display:flex;align-items:center;background:#fff;border:1px solid #cbd5e1;border-radius:5px;height:28px;overflow:hidden;box-sizing:border-box;transition:all .12s ease}.rpt-slug-input-wrapper:focus-within{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb24}.rpt-slug-prefix{padding:0 0 0 8px;font-size:.725rem;color:#64748b;background:transparent;-webkit-user-select:none;user-select:none;line-height:28px}.rpt-slug-field{border:none!important;padding-left:2px!important;box-shadow:none!important;height:100%!important}.rpt-help-text{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-publish-card{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-sizing:border-box}.rpt-publish-text{display:flex;flex-direction:column;gap:1px}.rpt-publish-title{font-size:.75rem;font-weight:600;color:#0f172a}.rpt-publish-desc{font-size:.65rem;color:#64748b;line-height:1.2}.rpt-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.rpt-switch input{opacity:0;width:0;height:0}.rpt-slider{position:absolute;cursor:pointer;inset:0;background-color:#cbd5e1;transition:.18s;border-radius:9999px}.rpt-slider:before{position:absolute;content:\"\";height:14px;width:14px;left:2px;bottom:2px;background-color:#fff;transition:.18s;border-radius:50%}input:checked+.rpt-slider{background-color:#2563eb}input:checked+.rpt-slider:before{transform:translate(14px)}.rpt-share-card{padding:6px 9px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;box-sizing:border-box}.rpt-share-url-row{display:flex;align-items:center;gap:6px;overflow:hidden}.rpt-share-label{font-size:.675rem;font-weight:600;color:#1e40af;flex-shrink:0}.rpt-share-code{flex:1;font-size:.6875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#1e3a8a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rpt-btn-copy{display:inline-flex;align-items:center;gap:3px;padding:2px 6px;background:#fff;border:1px solid #93c5fd;border-radius:4px;font-size:.65rem;font-weight:600;color:#2563eb;cursor:pointer;flex-shrink:0;transition:all .12s ease;height:20px}.rpt-btn-copy:hover{background:#dbeafe}.rpt-preview-column{display:flex;flex-direction:column;background:#fff;overflow:hidden;min-width:0;box-sizing:border-box}.rpt-preview-header{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-bottom:1px solid #e2e8f0;background:#fff;flex-shrink:0;box-sizing:border-box}.rpt-preview-badge{display:flex;align-items:center;gap:6px;font-size:.725rem;font-weight:600;color:#0f172a}.rpt-live-dot{width:6px;height:6px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133}.rpt-preview-hint{font-size:.675rem;color:#64748b}.rpt-preview-runtime-wrapper{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 12px;background:#f8fafc;box-sizing:border-box}.rpt-preview-runtime-wrapper::-webkit-scrollbar,.rpt-settings-column::-webkit-scrollbar{width:5px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb,.rpt-settings-column::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:9999px}.rpt-preview-runtime-wrapper::-webkit-scrollbar-thumb:hover,.rpt-settings-column::-webkit-scrollbar-thumb:hover{background:#94a3b8}.rpt-preview-card-frame{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 1px 3px #0f172a0a;padding:10px;min-height:100%;box-sizing:border-box;overflow-x:hidden}.rpt-dialog-footer{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0;flex-shrink:0;box-sizing:border-box}.rpt-saved-pill{display:inline-flex;align-items:center;gap:4px;font-size:.7rem;font-weight:600;color:#15803d;background:#dcfce7;padding:2px 7px;border-radius:9999px}.rpt-footer-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.rpt-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 13px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .12s ease;border:1px solid transparent;box-sizing:border-box;line-height:1.4}.rpt-btn-secondary{background:#fff;border-color:#cbd5e1;color:#334155}.rpt-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8}.rpt-btn-primary{background:linear-gradient(135deg,#2563eb,#1d4ed8);color:#fff;box-shadow:0 1px 2px #2563eb33}.rpt-btn-primary:hover{background:linear-gradient(135deg,#1d4ed8,#1e40af);box-shadow:0 2px 4px #2563eb40}\n"] }]
406
833
  }] });
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2RpYWxvZ3MvcmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7O0FBWWxGLFNBQVMsTUFBTSxDQUFDLEdBQVc7SUFDekIsT0FBTyxHQUFHO1NBQ1AsV0FBVyxFQUFFO1NBQ2IsSUFBSSxFQUFFO1NBQ04sT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7U0FDeEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7U0FDeEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBa29CRCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3BCLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQSxTQUFrQyxDQUFBLENBQUMsQ0FBQztJQUN2RCxJQUFJLEdBQUcsTUFBTSxDQUF3QixXQUFXLENBQUMsQ0FBQztJQUNsRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbkMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEQsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFCLFNBQVMsR0FBRyxNQUFNLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FDcEUsQ0FBQztJQUVPLElBQUksR0FBRyxNQUFNLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUMsQ0FBQztJQUM3RCxJQUFJLEdBQUcsTUFBTSxDQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLFNBQVMsR0FBRyxNQUFNLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLENBQUM7SUFDdkYsV0FBVyxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUUvRCxNQUFNLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLGlCQUFpQixHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFaEQsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVNLGlCQUFpQixHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3RCxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7S0FDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSixZQUFZLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2Qiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLE9BQU8sR0FBcUI7WUFDaEMsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQzVDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLFNBQVM7WUFDL0MsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFFRixxRUFBcUU7UUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDO1lBQy9ELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLENBQUM7U0FDbEYsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFnRCxrQkFBa0I7UUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVwRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO3dHQXJGVSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtRkEzbkIzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBKVCw2ME5BNUpTLFlBQVksOEJBQUUsV0FBVywrbUJBQUUsc0JBQXNCLGlVQUFFLGdCQUFnQjs7NEZBNm5CbEUsMEJBQTBCO2tCQWhvQnRDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQzdELHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwSlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERpYWxvZ1JlZiwgRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dEYXRhIHtcbiAgcmVwb3J0OiBSZXBvcnREZWZpbml0aW9uO1xuICByb3V0ZUJhc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dSZXN1bHQge1xuICBhY3Rpb246ICdiYWNrX3RvX2Rlc2lnbmVyJyB8ICdvcGVuX2xpdmVfcGFnZSc7XG4gIHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbjtcbn1cblxuZnVuY3Rpb24gdG9TbHVnKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9bXlxcd1xccy1dL2csICcnKVxuICAgIC5yZXBsYWNlKC9bXFxzXy1dKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcmVwb3J0LXNhdmVkLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZXBvcnRSdW50aW1lQ29tcG9uZW50LCBScHRJY29uQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctc2hlbGxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJkaWFsb2ctdGl0bGVcIj5cbiAgICAgIDwhLS0gTW9kYWwgSGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInJwdC1kaWFsb2ctaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN1Y2Nlc3MtaWNvbi1iYWRnZVwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGVja1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgyIGlkPVwiZGlhbG9nLXRpdGxlXCIgY2xhc3M9XCJycHQtZGlhbG9nLXRpdGxlXCI+UmVwb3J0IFNhdmVkIFN1Y2Nlc3NmdWxseTwvaDI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1kaWFsb2ctc3VidGl0bGVcIj5Db25maWd1cmUgcGFnZSByb3V0aW5nLCBuYXZpZ2F0aW9uIHBsYWNlbWVudCwgYW5kIHRlc3QgdGhlIGdlbmVyYXRlZCBmb3JtLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInJwdC1kaWFsb2ctY2xvc2VcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZSgnYmFja190b19kZXNpZ25lcicpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgZGlhbG9nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwieFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNb2RhbCBCb2R5IChUd28tQ29sdW1uIFNwbGl0KSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJycHQtZGlhbG9nLWJvZHlcIj5cbiAgICAgICAgPCEtLSBMZWZ0IENvbHVtbjogU2V0dGluZ3MgJiBQdWJsaXNoaW5nIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNldHRpbmdzLWNvbHVtblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2VjdGlvbi1oZWFkZXJcIj5QYWdlIE5hdmlnYXRpb24gJiBTZXR0aW5nczwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZXBvcnQgTmFtZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctbmFtZVwiPkRpc3BsYXkgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJycHQtZGxnLW5hbWVcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwibmFtZSgpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25OYW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2FsZXMgUmVnaXN0ZXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVVJMIFNsdWcgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtbGFiZWxcIiBmb3I9XCJycHQtZGxnLXNsdWdcIj5VUkwgU2x1ZzwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNsdWctaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zbHVnLXByZWZpeFwiPi97eyBiYXNlUm91dGUoKSB9fS88L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwicnB0LWRsZy1zbHVnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtaW5wdXQgcnB0LXNsdWctZmllbGRcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNsdWcoKVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2x1Zy5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJzYWxlLXJlcG9ydFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPkRpcmVjdCBVUkwgZm9yIHVzZXJzIHRvIHZpZXcgdGhpcyByZXBvcnQgcGFnZS48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE1lbnUgR3JvdXAgLyBDYXRlZ29yeSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctZ3JvdXBcIj5NZW51IEdyb3VwPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInJwdC1kbGctZ3JvdXBcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWVudUdyb3VwKClcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtZW51R3JvdXAuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2FsZXMsIEZpbmFuY2UsIE9wZXJhdGlvbnNcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPlNpZGViYXIgZm9sZGVyIGhlYWRpbmcgd2hlcmUgdGhpcyBwYWdlIGFwcGVhcnMuPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBQdWJsaXNoIHRvIE1lbnUgVG9nZ2xlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHVibGlzaC1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXB1Ymxpc2gtdGV4dFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wdWJsaXNoLXRpdGxlXCI+UHVibGlzaCB0byBNZW51PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wdWJsaXNoLWRlc2NcIj5EaXNwbGF5IGluIHRoZSBzaWRlYmFyIG5hdmlnYXRpb24uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtc3dpdGNoXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQdWJsaXNoZWQoKVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJpc1B1Ymxpc2hlZC5zZXQoIWlzUHVibGlzaGVkKCkpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2xpZGVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ29weSBVUkwgQm94IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2hhcmUtY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zaGFyZS11cmwtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXNoYXJlLWxhYmVsXCI+TGl2ZTo8L3NwYW4+XG4gICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwicnB0LXNoYXJlLWNvZGVcIj57eyBmdWxsUm91dGUoKSB9fTwvY29kZT5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0bi1jb3B5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29weVJvdXRlKClcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjb3BpZWQoKSA/ICdDb3BpZWQhJyA6ICdDb3B5IFJvdXRlJ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiY29waWVkKCkgPyAnY2hlY2snIDogJ2NvcHknXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvcGllZCgpID8gJ0NvcGllZCcgOiAnQ29weScgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmlnaHQgQ29sdW1uOiBJbnRlcmFjdGl2ZSBGb3JtIExpdmUgUHJldmlldyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmV2aWV3LWNvbHVtblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1iYWRnZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1saXZlLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+TGl2ZSBHZW5lcmF0ZWQgRm9ybTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcHJldmlldy1oaW50XCI+SW50ZXJhY3RpdmUgcHJldmlldyBtYXRjaGluZyBydW50aW1lIHBhZ2U8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctcnVudGltZS13cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctY2FyZC1mcmFtZVwiPlxuICAgICAgICAgICAgICA8cnB0LXJ1bnRpbWUgW3JlcG9ydF09XCJjdXJyZW50UHJldmlld0RlZigpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZGFsIEZvb3RlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJycHQtZGlhbG9nLWZvb3RlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvb3Rlci1sZWZ0XCI+XG4gICAgICAgICAgQGlmIChzYXZlZFN0YXRlTWVzc2FnZSgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zYXZlZC1waWxsXCI+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgIHt7IHNhdmVkU3RhdGVNZXNzYWdlKCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInJwdC1idG4gcnB0LWJ0bi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlKCdiYWNrX3RvX2Rlc2lnbmVyJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEJhY2sgdG8gRGVzaWduZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5MaXZlUGFnZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImV4dGVybmFsLWxpbmtcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5PcGVuIExpdmUgUGFnZTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIHNhbnMtc2VyaWYpO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLXNoZWxsIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgd2lkdGg6IG1pbig4NDBweCwgOTJ2dyk7XG4gICAgICBtYXgtaGVpZ2h0OiBtaW4oNTQwcHgsIDg0dmgpO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDIwcHggNDBweCAtMTJweCByZ2JhKDE1LCAyMywgNDIsIDAuMjgpLCAwIDAgMCAxcHggcmdiYSgxNSwgMjMsIDQyLCAwLjA4KTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYW5pbWF0aW9uOiBycHREaWFsb2dJbiAxODBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBmb3J3YXJkcztcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdERpYWxvZ0luIHtcbiAgICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpIHRyYW5zbGF0ZVkoNHB4KTtcbiAgICAgIH1cbiAgICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTZweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LWhlYWRlci1sZWZ0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgIH1cblxuICAgIC5ycHQtc3VjY2Vzcy1pY29uLWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMjZweDtcbiAgICAgIGhlaWdodDogMjZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNlY2ZkZjU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYTdmM2QwO1xuICAgICAgY29sb3I6ICMwNTk2Njk7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy10aXRsZSB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDAuOTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjU7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctc3VidGl0bGUge1xuICAgICAgbWFyZ2luOiAxcHggMCAwIDA7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWNsb3NlIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctY2xvc2U6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMjgwcHggMWZyO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDM2MHB4O1xuICAgICAgbWF4LWhlaWdodDogY2FsYyg4NHZoIC0gOTZweCk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzgwcHgpIHtcbiAgICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogOXB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXNlY3Rpb24taGVhZGVyIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcbiAgICB9XG5cbiAgICAucnB0LWZvcm0tZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDNweDtcbiAgICB9XG5cbiAgICAucnB0LWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuXG4gICAgLnJwdC1pbnB1dCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6ICMyNTYzZWI7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNCk7XG4gICAgfVxuXG4gICAgLnJwdC1zbHVnLWlucHV0LXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGhlaWdodDogMjhweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1zbHVnLWlucHV0LXdyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE0KTtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctcHJlZml4IHtcbiAgICAgIHBhZGRpbmc6IDAgMCAwIDhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBsaW5lLWhlaWdodDogMjhweDtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctZmllbGQge1xuICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLnJwdC1oZWxwLXRleHQge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC1jYXJkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wdWJsaXNoLXRleHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDFweDtcbiAgICB9XG5cbiAgICAucnB0LXB1Ymxpc2gtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICB9XG5cbiAgICAvKiBDb21wYWN0IHRvZ2dsZSBzd2l0Y2ggKi9cbiAgICAucnB0LXN3aXRjaCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMThweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtc3dpdGNoIGlucHV0IHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB3aWR0aDogMDtcbiAgICAgIGhlaWdodDogMDtcbiAgICB9XG5cbiAgICAucnB0LXNsaWRlciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYmQ1ZTE7XG4gICAgICB0cmFuc2l0aW9uOiAwLjE4cztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LXNsaWRlcjpiZWZvcmUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY29udGVudDogXCJcIjtcbiAgICAgIGhlaWdodDogMTRweDtcbiAgICAgIHdpZHRoOiAxNHB4O1xuICAgICAgbGVmdDogMnB4O1xuICAgICAgYm90dG9tOiAycHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgIHRyYW5zaXRpb246IDAuMThzO1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIH1cblxuICAgIGlucHV0OmNoZWNrZWQgKyAucnB0LXNsaWRlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjU2M2ViO1xuICAgIH1cblxuICAgIGlucHV0OmNoZWNrZWQgKyAucnB0LXNsaWRlcjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE0cHgpO1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtY2FyZCB7XG4gICAgICBwYWRkaW5nOiA2cHggOXB4O1xuICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtdXJsLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG5cbiAgICAucnB0LXNoYXJlLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxZTQwYWY7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LXNoYXJlLWNvZGUge1xuICAgICAgZmxleDogMTtcbiAgICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7XG4gICAgICBjb2xvcjogIzFlM2E4YTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29weSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDNweDtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzkzYzVmZDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29weTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgIH1cblxuICAgIC8qIFByZXZpZXcgQ29sdW1uICovXG4gICAgLnJwdC1wcmV2aWV3LWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE0cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wcmV2aWV3LWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtbGl2ZS1kb3Qge1xuICAgICAgd2lkdGg6IDZweDtcbiAgICAgIGhlaWdodDogNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYmFja2dyb3VuZDogIzEwYjk4MTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDE2LCAxODUsIDEyOSwgMC4yKTtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctaGludCB7XG4gICAgICBmb250LXNpemU6IDAuNjc1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgfVxuXG4gICAgLnJwdC1wcmV2aWV3LXJ1bnRpbWUtd3JhcHBlciB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICB3aWR0aDogNXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjOTRhM2I4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1jYXJkLWZyYW1lIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMTUsIDIzLCA0MiwgMC4wNCk7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyogTW9kYWwgRm9vdGVyICovXG4gICAgLnJwdC1kaWFsb2ctZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1zYXZlZC1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgcGFkZGluZzogMnB4IDdweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LWZvb3Rlci1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICB9XG5cbiAgICAucnB0LWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIHBhZGRpbmc6IDVweCAxM3B4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjEycyBlYXNlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1zZWNvbmRhcnkge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogI2NiZDVlMTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgIH1cblxuICAgIC5ycHQtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3JkZXItY29sb3I6ICM5NGEzYjg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeSB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjU2M2ViLCAjMWQ0ZWQ4KTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMik7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWQ0ZWQ4LCAjMWU0MGFmKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KTtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTYXZlZERpYWxvZ0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmID0gaW5qZWN0KERpYWxvZ1JlZjxSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdD4pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBpbmplY3Q8UmVwb3J0U2F2ZWREaWFsb2dEYXRhPihESUFMT0dfREFUQSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoUmVwb3J0U3RvcmVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IHJlcG9ydCA9IHRoaXMuZGF0YS5yZXBvcnQ7XG4gIHJlYWRvbmx5IGJhc2VSb3V0ZSA9IHNpZ25hbDxzdHJpbmc+KFxuICAgIHRoaXMuZGF0YS5yb3V0ZUJhc2UgfHwgdGhpcy5yZXBvcnRpbmdDb25maWc/LnJvdXRlQmFzZSB8fCAncmVwb3J0cydcbiAgKTtcblxuICByZWFkb25seSBuYW1lID0gc2lnbmFsPHN0cmluZz4odGhpcy5yZXBvcnQubmFtZSB8fCAnVW50aXRsZWQgUmVwb3J0Jyk7XG4gIHJlYWRvbmx5IHNsdWcgPSBzaWduYWw8c3RyaW5nPih0aGlzLnJlcG9ydC5zbHVnIHx8IHRvU2x1Zyh0aGlzLnJlcG9ydC5uYW1lIHx8ICdyZXBvcnQnKSk7XG4gIHJlYWRvbmx5IG1lbnVHcm91cCA9IHNpZ25hbDxzdHJpbmc+KHRoaXMucmVwb3J0Lm1lbnVHcm91cCB8fCB0aGlzLnJlcG9ydC5jYXRlZ29yeSB8fCAnR2VuZXJhbCcpO1xuICByZWFkb25seSBpc1B1Ymxpc2hlZCA9IHNpZ25hbDxib29sZWFuPih0aGlzLnJlcG9ydC5pc1B1Ymxpc2hlZCA/PyB0cnVlKTtcblxuICByZWFkb25seSBjb3BpZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzYXZlZFN0YXRlTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBmdWxsUm91dGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuYmFzZVJvdXRlKCkucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgIGNvbnN0IHMgPSB0aGlzLnNsdWcoKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJykgfHwgdGhpcy5yZXBvcnQuaWQ7XG4gICAgcmV0dXJuIGAvJHtiYXNlfS8ke3N9YDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFByZXZpZXdEZWYgPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uPigoKSA9PiAoe1xuICAgIC4uLnRoaXMucmVwb3J0LFxuICAgIG5hbWU6IHRoaXMubmFtZSgpLFxuICAgIHNsdWc6IHRoaXMuc2x1ZygpLFxuICAgIG1lbnVHcm91cDogdGhpcy5tZW51R3JvdXAoKSxcbiAgICBpc1B1Ymxpc2hlZDogdGhpcy5pc1B1Ymxpc2hlZCgpLFxuICB9KSk7XG5cbiAgb25OYW1lQ2hhbmdlKG5ld05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmFtZS5zZXQobmV3TmFtZSk7XG4gICAgLy8gSWYgc2x1ZyB3YXMgYXV0by1kZXJpdmVkLCBrZWVwIGl0IHVwZGF0ZWRcbiAgICBpZiAoIXRoaXMucmVwb3J0LnNsdWcpIHtcbiAgICAgIHRoaXMuc2x1Zy5zZXQodG9TbHVnKG5ld05hbWUpKTtcbiAgICB9XG4gIH1cblxuICBjb3B5Um91dGUoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5jbGlwYm9hcmQpIHtcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuZnVsbFJvdXRlKCkpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNvcGllZC5zZXQodHJ1ZSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb3BpZWQuc2V0KGZhbHNlKSwgMjAwMCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzYXZlVXBkYXRlZERlZmluaXRpb24oKTogUmVwb3J0RGVmaW5pdGlvbiB7XG4gICAgY29uc3QgdXBkYXRlZDogUmVwb3J0RGVmaW5pdGlvbiA9IHtcbiAgICAgIC4uLnRoaXMucmVwb3J0LFxuICAgICAgbmFtZTogdGhpcy5uYW1lKCkudHJpbSgpIHx8IHRoaXMucmVwb3J0Lm5hbWUsXG4gICAgICBzbHVnOiB0aGlzLnNsdWcoKS50cmltKCkgfHwgdG9TbHVnKHRoaXMubmFtZSgpKSxcbiAgICAgIG1lbnVHcm91cDogdGhpcy5tZW51R3JvdXAoKS50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgaXNQdWJsaXNoZWQ6IHRoaXMuaXNQdWJsaXNoZWQoKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICAvLyBTYXZlIHRvIHBlcnNpc3RlbmNlIHN0b3JlIHNvIG5hdmlnYXRpb24gJiBtZW51IHVwZGF0ZXMgaW1tZWRpYXRlbHlcbiAgICB0aGlzLnN0b3JlLnNhdmVSZXBvcnQodXBkYXRlZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuc2F2ZWRTdGF0ZU1lc3NhZ2Uuc2V0KCdTZXR0aW5ncyBzeW5jaHJvbml6ZWQnKSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tSZXBvcnRTYXZlZERpYWxvZ10gRmFpbGVkIHRvIHN5bmMgc2V0dGluZ3M6JywgZXJyKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgY2xvc2UoYWN0aW9uOiAnYmFja190b19kZXNpZ25lcicgfCAnb3Blbl9saXZlX3BhZ2UnID0gJ2JhY2tfdG9fZGVzaWduZXInKTogdm9pZCB7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuc2F2ZVVwZGF0ZWREZWZpbml0aW9uKCk7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb24sIHJlcG9ydDogdXBkYXRlZCB9KTtcbiAgfVxuXG4gIG9wZW5MaXZlUGFnZSgpOiB2b2lkIHtcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5zYXZlVXBkYXRlZERlZmluaXRpb24oKTtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IGFjdGlvbjogJ29wZW5fbGl2ZV9wYWdlJywgcmVwb3J0OiB1cGRhdGVkIH0pO1xuXG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLmZ1bGxSb3V0ZSgpO1xuICAgIGlmICh0aGlzLnJvdXRlcikge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyb3V0ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByb3V0ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
834
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2RpYWxvZ3MvcmVwb3J0LXNhdmVkLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7OztBQW9CbEYsU0FBUyxNQUFNLENBQUMsR0FBVztJQUN6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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlTVCxxcVhBM1NTLFlBQVksOEJBQUUsV0FBVyw4bUJBQUUsVUFBVSwwTEFBRSxzQkFBc0Isc1dBQUUsZ0JBQWdCOzs0RkE0a0M5RSwwQkFBMEI7a0JBL2tDdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQ3pFLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlTVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBSZXBvcnRTYXZlT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9yZXBvcnQtcGVyc2lzdGVuY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlsaXRpZXMvaWQtZ2VuZXJhdG9yJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBkZWZlciwgZmluYWxpemUsIG9mLCBzd2l0Y2hNYXAsIHRocm93RXJyb3IsIHRha2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERpYWxvZ1JlZiwgRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dEYXRhIHtcbiAgcmVwb3J0OiBSZXBvcnREZWZpbml0aW9uO1xuICByb3V0ZUJhc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2F2ZWREaWFsb2dSZXN1bHQge1xuICBhY3Rpb246ICdiYWNrX3RvX2Rlc2lnbmVyJyB8ICdvcGVuX2xpdmVfcGFnZSc7XG4gIHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbjtcbn1cblxuaW50ZXJmYWNlIFVwZGF0ZUNvbmZpcm1hdGlvbiB7XG4gIHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbjtcbiAgYWN0aW9uOiBSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdFsnYWN0aW9uJ107XG4gIGV4cGVjdGVkVmVyc2lvbjogbnVtYmVyO1xuICBleGlzdGluZ05hbWU6IHN0cmluZztcbiAgY29udGV4dEtleTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiB0b1NsdWcodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UoL1teXFx3XFxzLV0vZywgJycpXG4gICAgLnJlcGxhY2UoL1tcXHNfLV0rL2csICctJylcbiAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCAnJyk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1yZXBvcnQtc2F2ZWQtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEExMXlNb2R1bGUsIFJlcG9ydFJ1bnRpbWVDb21wb25lbnQsIFJwdEljb25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LWRpYWxvZy1zaGVsbFwiIFthdHRyLmFyaWEtYnVzeV09XCJpc1NhdmluZygpIHx8IGlzQ2hlY2tpbmdJZCgpXCI+XG4gICAgICA8IS0tIFJldmlldyBiZWZvcmUgdGhlIG9ubHkgcGVyc2lzdGVuY2UgcmVxdWVzdCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJycHQtZGlhbG9nLWhlYWRlclwiIFthdHRyLmluZXJ0XT1cInVwZGF0ZUNvbmZpcm1hdGlvbigpID8gJycgOiBudWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXJldmlldy1pY29uLWJhZGdlXCI+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNldHRpbmdzXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDIgaWQ9XCJkaWFsb2ctdGl0bGVcIiBjbGFzcz1cInJwdC1kaWFsb2ctdGl0bGVcIj5SZXZpZXcgYW5kIFNhdmUgUmVwb3J0PC9oMj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWRpYWxvZy1zdWJ0aXRsZVwiPlJldmlldyB0aGUgcmVwb3J0IGRldGFpbHMgYW5kIHByZXZpZXcsIHRoZW4gc2F2ZSB5b3VyIGNoYW5nZXMuPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwicnB0LWRpYWxvZy1jbG9zZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgZGlhbG9nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvc2VcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9kYWwgQm9keSAoVHdvLUNvbHVtbiBTcGxpdCkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LWRpYWxvZy1ib2R5XCIgW2F0dHIuaW5lcnRdPVwidXBkYXRlQ29uZmlybWF0aW9uKCkgfHwgaXNQcmVwYXJpbmdTYXZlKCkgPyAnJyA6IG51bGxcIj5cbiAgICAgICAgPCEtLSBMZWZ0IENvbHVtbjogU2V0dGluZ3MgJiBQdWJsaXNoaW5nIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNldHRpbmdzLWNvbHVtblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2VjdGlvbi1oZWFkZXJcIj5QYWdlIE5hdmlnYXRpb24gJiBTZXR0aW5nczwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtbGFiZWxcIiBmb3I9XCJycHQtZGxnLWlkXCI+UmVwb3J0IElEPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cInJwdC1kbGctaWRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwicnB0LWlucHV0XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwicmVwb3J0SWQoKVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIiAobmdNb2RlbENoYW5nZSk9XCJvbklkQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiIFthdHRyLmFyaWEtaW52YWxpZF09XCJpZEVycm9yKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWRFcnJvcigpID8gJ3JwdC1kbGctaWQtaGVscCBycHQtZGxnLWlkLWVycm9yIHJwdC1kbGctaWQtc3RhdHVzJyA6ICdycHQtZGxnLWlkLWhlbHAgcnB0LWRsZy1pZC1zdGF0dXMnXCIgcGxhY2Vob2xkZXI9XCJlLmcuIHJwdC1zYWxlcy1zdW1tYXJ5XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtaWQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtaWQtYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyYW5kb21pemVJZCgpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkdlbmVyYXRlIGEgcmFuZG9tIHVuaXF1ZSByZXBvcnQgSURcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzcGFya2xlc1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5SYW5kb20gSUQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtaWQtYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWNoZWNraW5nXT1cImlzQ2hlY2tpbmdJZCgpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKSB8fCBpc0NoZWNraW5nSWQoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInZlcmlmeUlkKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiVmVyaWZ5IElEIGF2YWlsYWJpbGl0eSBpbiBkYXRhYmFzZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKGlzQ2hlY2tpbmdJZCgpKSB7XG4gICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZnJlc2hcIiBbc2l6ZV09XCIxMlwiIGNsYXNzPVwicnB0LXNwaW5cIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+Q2hlY2tpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNlYXJjaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlZlcmlmeSBJRDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBpZD1cInJwdC1kbGctaWQtaGVscFwiIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPkFuIGF2YWlsYWJsZSBJRCBjcmVhdGVzIGEgbmV3IHJlcG9ydC4gQW4gZXhpc3RpbmcgSUQgcmVxdWlyZXMgeW91ciBjb25maXJtYXRpb24gYmVmb3JlIHVwZGF0aW5nLjwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAoaWRFcnJvcigpKSB7XG4gICAgICAgICAgICAgIDxwIGlkPVwicnB0LWRsZy1pZC1lcnJvclwiIGNsYXNzPVwicnB0LWZpZWxkLWVycm9yXCIgcm9sZT1cImFsZXJ0XCI+e3sgaWRFcnJvcigpIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHAgaWQ9XCJycHQtZGxnLWlkLXN0YXR1c1wiIGNsYXNzPVwicnB0LWlkLXN0YXR1c1wiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBbY2xhc3MucnB0LWlkLXN0YXR1cy1zdWNjZXNzXT1cImlkU3RhdHVzKCkgPT09ICdhdmFpbGFibGUnIHx8IGlkU3RhdHVzKCkgPT09ICdjdXJyZW50J1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5ycHQtaWQtc3RhdHVzLXdhcm5pbmddPVwiaWRTdGF0dXMoKSA9PT0gJ2R1cGxpY2F0ZSdcIlxuICAgICAgICAgICAgICBbY2xhc3MucnB0LWlkLXN0YXR1cy1lcnJvcl09XCJpZFN0YXR1cygpID09PSAnZXJyb3InXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnJwdC1pZC1zdGF0dXMtY2hlY2tpbmddPVwiaWRTdGF0dXMoKSA9PT0gJ2NoZWNraW5nJ1wiPlxuICAgICAgICAgICAgICBAaWYgKGlkTWVzc2FnZSgpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc3RhdHVzLWljb25cIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaWRTdGF0dXMoKSA9PT0gJ2F2YWlsYWJsZScgfHwgaWRTdGF0dXMoKSA9PT0gJ2N1cnJlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpZFN0YXR1cygpID09PSAnZHVwbGljYXRlJykge1xuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoaWRTdGF0dXMoKSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoaWRTdGF0dXMoKSA9PT0gJ2NoZWNraW5nJykge1xuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZnJlc2hcIiBbc2l6ZV09XCIxMVwiIGNsYXNzPVwicnB0LXNwaW5cIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBpZE1lc3NhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZXBvcnQgTmFtZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctbmFtZVwiPkRpc3BsYXkgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJycHQtZGxnLW5hbWVcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwibmFtZSgpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTmFtZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibmFtZUVycm9yKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibmFtZUVycm9yKCkgPyAncnB0LWRsZy1uYW1lLWVycm9yJyA6IG51bGxcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gU2FsZXMgUmVnaXN0ZXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAobmFtZUVycm9yKCkpIHtcbiAgICAgICAgICAgIDxwIGlkPVwicnB0LWRsZy1uYW1lLWVycm9yXCIgY2xhc3M9XCJycHQtZmllbGQtZXJyb3JcIiByb2xlPVwiYWxlcnRcIj57eyBuYW1lRXJyb3IoKSB9fTwvcD5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctZGVzY3JpcHRpb25cIj5EZXNjcmlwdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJycHQtZGxnLWRlc2NyaXB0aW9uXCIgY2xhc3M9XCJycHQtaW5wdXRcIiByb3dzPVwiMlwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImRlc2NyaXB0aW9uKClcIiAobmdNb2RlbENoYW5nZSk9XCJkZXNjcmlwdGlvbi5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFVSTCBTbHVnIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LWxhYmVsXCIgZm9yPVwicnB0LWRsZy1zbHVnXCI+VVJMIFNsdWc8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zbHVnLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2x1Zy1wcmVmaXhcIj4ve3sgYmFzZVJvdXRlKCkgfX0vPC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInJwdC1kbGctc2x1Z1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWlucHV0IHJwdC1zbHVnLWZpZWxkXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzbHVnKClcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2x1Z0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNsdWdFcnJvcigpID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2x1Z0Vycm9yKCkgPyAncnB0LWRsZy1zbHVnLWVycm9yJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwic2FsZS1yZXBvcnRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKHNsdWdFcnJvcigpKSB7XG4gICAgICAgICAgICAgIDxwIGlkPVwicnB0LWRsZy1zbHVnLWVycm9yXCIgY2xhc3M9XCJycHQtZmllbGQtZXJyb3JcIiByb2xlPVwiYWxlcnRcIj57eyBzbHVnRXJyb3IoKSB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPkRpcmVjdCBVUkwgZm9yIHVzZXJzIHRvIHZpZXcgdGhpcyByZXBvcnQgcGFnZS48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1sYWJlbFwiIGZvcj1cInJwdC1kbGctY2F0ZWdvcnlcIj5DYXRlZ29yeTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJycHQtZGxnLWNhdGVnb3J5XCIgY2xhc3M9XCJycHQtaW5wdXRcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNhdGVnb3J5KClcIiAobmdNb2RlbENoYW5nZSk9XCJjYXRlZ29yeS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmcoKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE1lbnUgR3JvdXAgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtbGFiZWxcIiBmb3I9XCJycHQtZGxnLWdyb3VwXCI+TWVudSBHcm91cDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJycHQtZGxnLWdyb3VwXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInJwdC1pbnB1dFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm1lbnVHcm91cCgpXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1lbnVHcm91cC5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFNhbGVzLCBGaW5hbmNlLCBPcGVyYXRpb25zXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1oZWxwLXRleHRcIj5TaWRlYmFyIGZvbGRlciBoZWFkaW5nIHdoZXJlIHRoaXMgcGFnZSBhcHBlYXJzLjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUHVibGlzaCB0byBNZW51IFRvZ2dsZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXB1Ymxpc2gtY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wdWJsaXNoLXRleHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcHVibGlzaC10aXRsZVwiPlB1Ymxpc2ggdG8gTWVudTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcHVibGlzaC1kZXNjXCI+RGlzcGxheSBpbiB0aGUgc2lkZWJhciBuYXZpZ2F0aW9uLjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnB0LXN3aXRjaFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzUHVibGlzaGVkKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZygpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImlzUHVibGlzaGVkLnNldCghaXNQdWJsaXNoZWQoKSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1zbGlkZXJcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBDb3B5IFVSTCBCb3ggLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zaGFyZS1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNoYXJlLXVybC1yb3dcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2hhcmUtbGFiZWxcIj5SZXBvcnQgVVJMOjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJycHQtc2hhcmUtY29kZVwiPnt7IGZ1bGxSb3V0ZSgpIH19PC9jb2RlPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuLWNvcHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5Um91dGUoKVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImNvcGllZCgpID8gJ0NvcGllZCEnIDogJ0NvcHkgUm91dGUnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJjb3BpZWQoKSA/ICdjaGVjaycgOiAnY29weSdcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgY29waWVkKCkgPyAnQ29waWVkJyA6ICdDb3B5JyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBSaWdodCBDb2x1bW46IEludGVyYWN0aXZlIEZvcm0gTGl2ZSBQcmV2aWV3IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXZpZXctY29sdW1uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmV2aWV3LWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmV2aWV3LWJhZGdlXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWxpdmUtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj5MaXZlIEdlbmVyYXRlZCBGb3JtPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wcmV2aWV3LWhpbnRcIj5JbnRlcmFjdGl2ZSBwcmV2aWV3IG1hdGNoaW5nIHJ1bnRpbWUgcGFnZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJldmlldy1jYXJkLWZyYW1lXCI+XG4gICAgICAgICAgICAgIDxycHQtcnVudGltZSBbcmVwb3J0XT1cImN1cnJlbnRQcmV2aWV3RGVmKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29uZmlybWluZyBoZXJlIGlzIHRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IHNhdmVzIGEgZGVmaW5pdGlvbi4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LWRpYWxvZy1mb290ZXJcIiBbYXR0ci5pbmVydF09XCJ1cGRhdGVDb25maXJtYXRpb24oKSA/ICcnIDogbnVsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvb3Rlci1sZWZ0XCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgQGlmIChzYXZlRXJyb3IoKSkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJycHQtZmllbGQtZXJyb3JcIiByb2xlPVwiYWxlcnRcIj57eyBzYXZlRXJyb3IoKSB9fTwvcD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWhlbHAtdGV4dFwiPnt7IGlzU2F2aW5nKCkgPyAnU2F2aW5nIHJlcG9ydC4uLicgOiAnQ2hhbmdlcyBhcmUgc2F2ZWQgb25seSBhZnRlciBjb25maXJtYXRpb24uJyB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tc2Vjb25kYXJ5XCIgW2Rpc2FibGVkXT1cImlzU2F2aW5nKClcIiAoY2xpY2spPVwiY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXNlY29uZGFyeVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZygpIHx8IGlzQ2hlY2tpbmdJZCgpXCIgKGNsaWNrKT1cInNhdmUoJ29wZW5fbGl2ZV9wYWdlJylcIj5TYXZlIGFuZCBPcGVuPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZygpIHx8IGlzQ2hlY2tpbmdJZCgpXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgICAgICAgICAge3sgaXNTYXZpbmcoKSA/ICdTYXZpbmcuLi4nIDogJ1NhdmUgUmVwb3J0JyB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmICh1cGRhdGVDb25maXJtYXRpb24oKTsgYXMgY29uZmlybWF0aW9uKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtdXBkYXRlLW92ZXJsYXlcIiByb2xlPVwiYWxlcnRkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwicnB0LXVwZGF0ZS10aXRsZVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJycHQtdXBkYXRlLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXVwZGF0ZS1jYXJkXCI+XG4gICAgICAgICAgICA8IS0tIE1vZGFsIEhlYWRlciB3aXRoIFdhcm5pbmcgSWNvbiBCYWRnZSBhbmQgQ2xvc2UgQnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC11cGRhdGUtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC11cGRhdGUtaWNvbi1iYWRnZVwiPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiYWxlcnQtdHJpYW5nbGVcIiBbc2l6ZV09XCIxOFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXVwZGF0ZS1oZWFkZXItaW5mb1wiPlxuICAgICAgICAgICAgICAgIDxoMyBpZD1cInJwdC11cGRhdGUtdGl0bGVcIiBjbGFzcz1cInJwdC11cGRhdGUtdGl0bGVcIj5SZXBvcnQgSUQgYWxyZWFkeSBleGlzdHM8L2gzPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXVwZGF0ZS1zdWJ0aXRsZVwiPkFuIGV4aXN0aW5nIHJlcG9ydCBkZWZpbml0aW9uIHdhcyBmb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LWRpYWxvZy1jbG9zZVwiIChjbGljayk9XCJjYW5jZWxVcGRhdGUoKVwiIGFyaWEtbGFiZWw9XCJDYW5jZWwgdXBkYXRlXCIgdGl0bGU9XCJDYW5jZWxcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIE1vZGFsIENvbnRlbnQgd2l0aCBTdW1tYXJ5LCBEZXRhaWxzIENhcmQsIGFuZCBJbXBhY3QgTm90aWNlIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC11cGRhdGUtY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDxwIGlkPVwicnB0LXVwZGF0ZS1kZXNjcmlwdGlvblwiIGNsYXNzPVwicnB0LXVwZGF0ZS1wcm9tcHRcIj5cbiAgICAgICAgICAgICAgICBSZXBvcnQgPHN0cm9uZz57eyBjb25maXJtYXRpb24uZXhpc3RpbmdOYW1lIH19PC9zdHJvbmc+IGFscmVhZHkgdXNlc1xuICAgICAgICAgICAgICAgIElEIDxzdHJvbmc+e3sgY29uZmlybWF0aW9uLnJlcG9ydC5pZCB9fTwvc3Ryb25nPiAodmVyc2lvbiB7eyBjb25maXJtYXRpb24uZXhwZWN0ZWRWZXJzaW9uIH19KS5cbiAgICAgICAgICAgICAgICBEbyB5b3Ugd2FudCB0byB1cGRhdGUgaXQgd2l0aCB0aGUgcmV2aWV3ZWQgcmVwb3J0IGRldGFpbHM/XG4gICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWNvbmZsaWN0LWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWNvbmZsaWN0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY29uZmxpY3QtbGFiZWxcIj5UYXJnZXQgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cInJwdC1jb25mbGljdC1jb2RlXCI+e3sgY29uZmlybWF0aW9uLnJlcG9ydC5pZCB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWNvbmZsaWN0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY29uZmxpY3QtbGFiZWxcIj5FeGlzdGluZyBSZXBvcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1jb25mbGljdC1uYW1lXCI+e3sgY29uZmlybWF0aW9uLmV4aXN0aW5nTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWNvbmZsaWN0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY29uZmxpY3QtbGFiZWxcIj5DdXJyZW50IFZlcnNpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1jb25mbGljdC1iYWRnZVwiPnZ7eyBjb25maXJtYXRpb24uZXhwZWN0ZWRWZXJzaW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW92ZXJ3cml0ZS1ub3RpY2VcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cIndhcm5pbmdcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+U2F2aW5nIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyBkZWZpbml0aW9uIGluIHRoZSBkYXRhYmFzZSBhbmQgaW5jcmVtZW50IHRoZSB2ZXJzaW9uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyBtYXRjaGluZyBMaWJyYXJ5IFVJIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC11cGRhdGUtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWwgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNhbmNlbFVwZGF0ZSgpXCI+XG4gICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1idG4gcnB0LWJ0bi1wcmltYXJ5IHJwdC1idG4tY29uZmlybS1zYXZlXCIgKGNsaWNrKT1cImNvbmZpcm1VcGRhdGUoKVwiPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2F2ZVwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBjb25maXJtYXRpb24uYWN0aW9uID09PSAnb3Blbl9saXZlX3BhZ2UnID8gJ1VwZGF0ZSBhbmQgT3BlbicgOiAnVXBkYXRlIFJlcG9ydCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLyogS2V5ZnJhbWUgQW5pbWF0aW9ucyAqL1xuICAgIEBrZXlmcmFtZXMgcnB0U3BpbiB7XG4gICAgICBmcm9tIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxuICAgIH1cblxuICAgIC5ycHQtc3BpbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBhbmltYXRpb246IHJwdFNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0T3ZlcmxheUluIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB9XG4gICAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdENhcmRJbiB7XG4gICAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk2KSB0cmFuc2xhdGVZKDZweCk7XG4gICAgICB9XG4gICAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJRCBBY3Rpb25zICYgTWljcm8gVG9vbHMgKi9cbiAgICAucnB0LWlkLWFjdGlvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG5cbiAgICAucnB0LWlkLWFjdGlvbi1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBoZWlnaHQ6IDI1cHg7XG4gICAgICBwYWRkaW5nOiAwIDlweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICB9XG5cbiAgICAucnB0LWlkLWFjdGlvbi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTRhM2I4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMTUsIDIzLCA0MiwgMC4wNSk7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1hY3Rpb24tYnRuOmFjdGl2ZTpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgIH1cblxuICAgIC5ycHQtaWQtYWN0aW9uLWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cblxuICAgIC5ycHQtaWQtYWN0aW9uLWJ0bi5pcy1jaGVja2luZyB7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGJvcmRlci1jb2xvcjogIzkzYzVmZDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1zdGF0dXMge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmb250LXNpemU6IDAuNzJyZW07XG4gICAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgICAgbWFyZ2luOiA0cHggMCAwIDA7XG4gICAgICBwYWRkaW5nOiAzcHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtaWQtc3RhdHVzOmVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLnJwdC1zdGF0dXMtaWNvbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtaWQtc3RhdHVzLXN1Y2Nlc3Mge1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JiZjdkMDtcbiAgICB9XG5cbiAgICAucnB0LWlkLXN0YXR1cy13YXJuaW5nIHtcbiAgICAgIGNvbG9yOiAjYjQ1MzA5O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmJlYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZWYzYzc7XG4gICAgfVxuXG4gICAgLnJwdC1pZC1zdGF0dXMtZXJyb3Ige1xuICAgICAgY29sb3I6ICNiOTFjMWM7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlY2FjYTtcbiAgICB9XG5cbiAgICAucnB0LWlkLXN0YXR1cy1jaGVja2luZyB7XG4gICAgICBjb2xvcjogIzFkNGVkODtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGJlYWZlO1xuICAgIH1cblxuICAgIC8qIEV4aXN0aW5nIElEIFVwZGF0ZSBDb25maXJtYXRpb24gT3ZlcmxheSAmIENhcmQgKi9cbiAgICAucnB0LXVwZGF0ZS1vdmVybGF5IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgei1pbmRleDogNTA7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuNDUpO1xuICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7XG4gICAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigzcHgpO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYW5pbWF0aW9uOiBycHRPdmVybGF5SW4gMTYwbXMgY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSkgZm9yd2FyZHM7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtY2FyZCB7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgd2lkdGg6IG1pbig0NDBweCwgMTAwJSk7XG4gICAgICBtYXgtaGVpZ2h0OiA5NCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMjBweCA0NXB4IC04cHggcmdiYSgxNSwgMjMsIDQyLCAwLjMyKSwgMCAwIDAgMXB4IHJnYmEoMTUsIDIzLCA0MiwgMC4wOCk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYW5pbWF0aW9uOiBycHRDYXJkSW4gMTgwbXMgY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSkgZm9yd2FyZHM7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtY2FyZC1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZWYzYzc7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LXVwZGF0ZS1pY29uLWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWYzYzc7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmRlNjhhO1xuICAgICAgY29sb3I6ICNiNDUzMDk7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LXVwZGF0ZS1oZWFkZXItaW5mbyB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cblxuICAgIC5ycHQtdXBkYXRlLXRpdGxlIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGZvbnQtc2l6ZTogMC45MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICM5MjQwMGU7XG4gICAgICBsaW5lLWhlaWdodDogMS4yNTtcbiAgICB9XG5cbiAgICAucnB0LXVwZGF0ZS1zdWJ0aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiAjYjQ1MzA5O1xuICAgICAgbWFyZ2luLXRvcDogMXB4O1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtY2FyZC1ib2R5IHtcbiAgICAgIHBhZGRpbmc6IDE0cHggMTZweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAxMXB4O1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC11cGRhdGUtcHJvbXB0IHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgICBjb2xvcjogIzMzNDE1NTtcbiAgICB9XG5cbiAgICAucnB0LWNvbmZsaWN0LWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgICBwYWRkaW5nOiA5cHggMTJweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA3cHg7XG4gICAgfVxuXG4gICAgLnJwdC1jb25mbGljdC1yb3cge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBnYXA6IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuNzM1cmVtO1xuICAgIH1cblxuICAgIC5ycHQtY29uZmxpY3QtbGFiZWwge1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1jb25mbGljdC1jb2RlIHtcbiAgICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgbW9ub3NwYWNlO1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuXG4gICAgLnJwdC1jb25mbGljdC1uYW1lIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG5cbiAgICAucnB0LWNvbmZsaWN0LWJhZGdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42OHJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwYWRkaW5nOiAxcHggN3B4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgYmFja2dyb3VuZDogI2UwZjJmZTtcbiAgICAgIGNvbG9yOiAjMDM2OWExO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JhZTZmZDtcbiAgICB9XG5cbiAgICAucnB0LW92ZXJ3cml0ZS1ub3RpY2Uge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgZ2FwOiA3cHg7XG4gICAgICBmb250LXNpemU6IDAuNzE1cmVtO1xuICAgICAgY29sb3I6ICNiNDUzMDk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmYmViO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlZjNjNztcbiAgICAgIHBhZGRpbmc6IDdweCAxMHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMzU7XG4gICAgfVxuXG4gICAgLnJwdC1vdmVyd3JpdGUtbm90aWNlIHJwdC1pY29uIHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIH1cblxuICAgIC5ycHQtdXBkYXRlLWFjdGlvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1jb25maXJtLXNhdmUge1xuICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzI1NjNlYiwgIzFkNGVkOCk7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjIpO1xuICAgIH1cblxuICAgIC5ycHQtYnRuLWNvbmZpcm0tc2F2ZTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWQ0ZWQ4LCAjMWU0MGFmKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KTtcbiAgICB9XG4gICAgI3JwdC1kbGctaWQtZXJyb3I6ZW1wdHksICNycHQtZGxnLWlkLXN0YXR1czplbXB0eSB7IGRpc3BsYXk6IG5vbmU7IH1cbiAgICAucnB0LWRpYWxvZy1mb290ZXIsIC5ycHQtZm9vdGVyLWFjdGlvbnMgeyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4OyB9XG4gICAgLnJwdC1idG4sIC5ycHQtZGlhbG9nLWNsb3NlIHsgbWluLWhlaWdodDogMzZweDsgfVxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCkge1xuICAgICAgLnJwdC1idG4sIC5ycHQtZGlhbG9nLWNsb3NlIHsgbWluLWhlaWdodDogNDRweDsgbWluLXdpZHRoOiA0NHB4OyB9XG4gICAgICAucnB0LWZvb3Rlci1sZWZ0IHsgd2lkdGg6IDEwMCU7IH1cbiAgICB9XG4gICAgLnJwdC1maWVsZC1lcnJvciB7IGNvbG9yOiAjYjkxYzFjOyBmb250LXNpemU6IDAuOHJlbTsgbWFyZ2luOiA0cHggMDsgfVxuICAgIGJ1dHRvbjpkaXNhYmxlZCB7IG9wYWNpdHk6IDAuNjsgY3Vyc29yOiB3YWl0OyB9XG4gICAgdGV4dGFyZWEucnB0LWlucHV0IHsgcmVzaXplOiB2ZXJ0aWNhbDsgbWluLWhlaWdodDogNTZweDsgfVxuICAgIC5ycHQtZm9vdGVyLWxlZnQgeyBtaW4td2lkdGg6IDA7IHBhZGRpbmctcmlnaHQ6IDEycHg7IH1cbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBzYW5zLXNlcmlmKTtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy1zaGVsbCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHdpZHRoOiBtaW4oODQwcHgsIDkydncpO1xuICAgICAgbWF4LWhlaWdodDogbWluKDU0MHB4LCA4NHZoKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDQwcHggLTEycHggcmdiYSgxNSwgMjMsIDQyLCAwLjI4KSwgMCAwIDAgMXB4IHJnYmEoMTUsIDIzLCA0MiwgMC4wOCk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGFuaW1hdGlvbjogcnB0RGlhbG9nSW4gMTgwbXMgY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSkgZm9yd2FyZHM7XG4gICAgfVxuXG4gICAgQGtleWZyYW1lcyBycHREaWFsb2dJbiB7XG4gICAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSB0cmFuc2xhdGVZKDRweCk7XG4gICAgICB9XG4gICAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1oZWFkZXItbGVmdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTBweDtcbiAgICB9XG5cbiAgICAucnB0LXJldmlldy1pY29uLWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMjZweDtcbiAgICAgIGhlaWdodDogMjZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYTdmM2QwO1xuICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRpYWxvZy10aXRsZSB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDAuOTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjU7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctc3VidGl0bGUge1xuICAgICAgbWFyZ2luOiAxcHggMCAwIDA7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWNsb3NlIHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1kaWFsb2ctY2xvc2U6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMjgwcHggMWZyO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDM2MHB4O1xuICAgICAgbWF4LWhlaWdodDogY2FsYyg4NHZoIC0gOTZweCk7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzgwcHgpIHtcbiAgICAgIC5ycHQtZGlhbG9nLWJvZHkge1xuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucnB0LXNldHRpbmdzLWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogOXB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXNlY3Rpb24taGVhZGVyIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcbiAgICB9XG5cbiAgICAucnB0LWZvcm0tZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDNweDtcbiAgICB9XG5cbiAgICAucnB0LWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgfVxuXG4gICAgLnJwdC1pbnB1dCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6ICMyNTYzZWI7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNCk7XG4gICAgfVxuXG4gICAgLnJwdC1zbHVnLWlucHV0LXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGhlaWdodDogMjhweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1zbHVnLWlucHV0LXdyYXBwZXI6Zm9jdXMtd2l0aGluIHtcbiAgICAgIGJvcmRlci1jb2xvcjogIzI1NjNlYjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjE0KTtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctcHJlZml4IHtcbiAgICAgIHBhZGRpbmc6IDAgMCAwIDhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBsaW5lLWhlaWdodDogMjhweDtcbiAgICB9XG5cbiAgICAucnB0LXNsdWctZmllbGQge1xuICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLnJwdC1oZWxwLXRleHQge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC1jYXJkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wdWJsaXNoLXRleHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDFweDtcbiAgICB9XG5cbiAgICAucnB0LXB1Ymxpc2gtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtcHVibGlzaC1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICB9XG5cbiAgICAvKiBDb21wYWN0IHRvZ2dsZSBzd2l0Y2ggKi9cbiAgICAucnB0LXN3aXRjaCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMThweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtc3dpdGNoIGlucHV0IHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB3aWR0aDogMDtcbiAgICAgIGhlaWdodDogMDtcbiAgICB9XG5cbiAgICAucnB0LXNsaWRlciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjYmQ1ZTE7XG4gICAgICB0cmFuc2l0aW9uOiAwLjE4cztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LXNsaWRlcjpiZWZvcmUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY29udGVudDogXCJcIjtcbiAgICAgIGhlaWdodDogMTRweDtcbiAgICAgIHdpZHRoOiAxNHB4O1xuICAgICAgbGVmdDogMnB4O1xuICAgICAgYm90dG9tOiAycHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgIHRyYW5zaXRpb246IDAuMThzO1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIH1cblxuICAgIGlucHV0OmNoZWNrZWQgKyAucnB0LXNsaWRlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjU2M2ViO1xuICAgIH1cblxuICAgIGlucHV0OmNoZWNrZWQgKyAucnB0LXNsaWRlcjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE0cHgpO1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtY2FyZCB7XG4gICAgICBwYWRkaW5nOiA2cHggOXB4O1xuICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtc2hhcmUtdXJsLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG5cbiAgICAucnB0LXNoYXJlLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxZTQwYWY7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LXNoYXJlLWNvZGUge1xuICAgICAgZmxleDogMTtcbiAgICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7XG4gICAgICBjb2xvcjogIzFlM2E4YTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29weSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDNweDtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzkzYzVmZDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzIGVhc2U7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tY29weTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgIH1cblxuICAgIC8qIFByZXZpZXcgQ29sdW1uICovXG4gICAgLnJwdC1wcmV2aWV3LWNvbHVtbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE0cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wcmV2aWV3LWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtbGl2ZS1kb3Qge1xuICAgICAgd2lkdGg6IDZweDtcbiAgICAgIGhlaWdodDogNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYmFja2dyb3VuZDogIzEwYjk4MTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDE2LCAxODUsIDEyOSwgMC4yKTtcbiAgICB9XG5cbiAgICAucnB0LXByZXZpZXctaGludCB7XG4gICAgICBmb250LXNpemU6IDAuNjc1cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgfVxuXG4gICAgLnJwdC1wcmV2aWV3LXJ1bnRpbWUtd3JhcHBlciB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICB3aWR0aDogNXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjY2JkNWUxO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1ydW50aW1lLXdyYXBwZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyLFxuICAgIC5ycHQtc2V0dGluZ3MtY29sdW1uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjOTRhM2I4O1xuICAgIH1cblxuICAgIC5ycHQtcHJldmlldy1jYXJkLWZyYW1lIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMTUsIDIzLCA0MiwgMC4wNCk7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgbWluLWhlaWdodDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyogTW9kYWwgRm9vdGVyICovXG4gICAgLnJwdC1kaWFsb2ctZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1zYXZlZC1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGNmY2U3O1xuICAgICAgcGFkZGluZzogMnB4IDdweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICB9XG5cbiAgICAucnB0LWZvb3Rlci1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICB9XG5cbiAgICAucnB0LWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDVweDtcbiAgICAgIHBhZGRpbmc6IDVweCAxM3B4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjEycyBlYXNlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1zZWNvbmRhcnkge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogI2NiZDVlMTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgIH1cblxuICAgIC5ycHQtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBib3JkZXItY29sb3I6ICM5NGEzYjg7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeSB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjU2M2ViLCAjMWQ0ZWQ4KTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMik7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMWQ0ZWQ4LCAjMWU0MGFmKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KTtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTYXZlZERpYWxvZ0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmID0gaW5qZWN0KERpYWxvZ1JlZjxSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdD4pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBpbmplY3Q8UmVwb3J0U2F2ZWREaWFsb2dEYXRhPihESUFMT0dfREFUQSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoUmVwb3J0U3RvcmVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydGluZ0NvbmZpZyA9IGluamVjdChSRVBPUlRJTkdfQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIGlkQ2hlY2s/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY3VzdG9tU2x1ZyA9ICEhdGhpcy5kYXRhLnJlcG9ydC5zbHVnO1xuXG4gIHJlYWRvbmx5IHJlcG9ydCA9IHRoaXMuZGF0YS5yZXBvcnQ7XG4gIHJlYWRvbmx5IGJhc2VSb3V0ZSA9IHNpZ25hbCh0aGlzLmRhdGEucm91dGVCYXNlIHx8IHRoaXMucmVwb3J0aW5nQ29uZmlnPy5yb3V0ZUJhc2UgfHwgJ3JlcG9ydHMnKTtcbiAgcmVhZG9ubHkgcmVwb3J0SWQgPSBzaWduYWwodGhpcy5yZXBvcnQuaWQpO1xuICByZWFkb25seSBpc0NoZWNraW5nSWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBpc1ByZXBhcmluZ1NhdmUgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB1cGRhdGVDb25maXJtYXRpb24gPSBzaWduYWw8VXBkYXRlQ29uZmlybWF0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlkQXR0ZW1wdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaWRTdGF0dXMgPSBzaWduYWw8J3VuY2hlY2tlZCcgfCAnY2hlY2tpbmcnIHwgJ2F2YWlsYWJsZScgfCAnY3VycmVudCcgfCAnZHVwbGljYXRlJyB8ICdlcnJvcic+KCd1bmNoZWNrZWQnKTtcbiAgcmVhZG9ubHkgaWRNZXNzYWdlID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgaWRDaGFuZ2VkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZXBvcnRJZCgpLnRyaW0oKSAhPT0gdGhpcy5yZXBvcnQuaWQpO1xuICByZWFkb25seSBpZEVycm9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5hdHRlbXB0ZWQoKSAmJiAhdGhpcy5pZEF0dGVtcHRlZCgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0SWQoKS50cmltKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuICdFbnRlciBhIHJlcG9ydCBJRC4nO1xuICAgIGlmIChpZC5sZW5ndGggPiAxMDApIHJldHVybiAnVXNlIGEgcmVwb3J0IElEIG9mIGF0IG1vc3QgMTAwIGNoYXJhY3RlcnMuJztcbiAgICBpZiAoIS9eW2EtekEtWjAtOV1bYS16QS1aMC05Xy1dKiQvLnRlc3QoaWQpKSByZXR1cm4gJ1VzZSBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcyBvciBoeXBoZW5zLCBzdGFydGluZyB3aXRoIGEgbGV0dGVyIG9yIG51bWJlci4nO1xuICAgIGlmIChpZC50b0xvd2VyQ2FzZSgpID09PSAnbmV3JykgcmV0dXJuICdDaG9vc2UgYW5vdGhlciBJRDsgXCJuZXdcIiBpcyByZXNlcnZlZCBmb3IgdGhlIHJlcG9ydCBidWlsZGVyLic7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuICByZWFkb25seSBuYW1lID0gc2lnbmFsKHRoaXMucmVwb3J0Lm5hbWUgfHwgJycpO1xuICByZWFkb25seSBkZXNjcmlwdGlvbiA9IHNpZ25hbCh0aGlzLnJlcG9ydC5kZXNjcmlwdGlvbiB8fCAnJyk7XG4gIHJlYWRvbmx5IGNhdGVnb3J5ID0gc2lnbmFsKHRoaXMucmVwb3J0LmNhdGVnb3J5IHx8ICcnKTtcbiAgcmVhZG9ubHkgc2x1ZyA9IHNpZ25hbCh0aGlzLnJlcG9ydC5zbHVnIHx8IHRvU2x1Zyh0aGlzLnJlcG9ydC5uYW1lIHx8ICdyZXBvcnQnKSk7XG4gIHJlYWRvbmx5IG1lbnVHcm91cCA9IHNpZ25hbCh0aGlzLnJlcG9ydC5tZW51R3JvdXAgfHwgdGhpcy5yZXBvcnQuY2F0ZWdvcnkgfHwgJycpO1xuICByZWFkb25seSBpc1B1Ymxpc2hlZCA9IHNpZ25hbCh0aGlzLnJlcG9ydC5pc1B1Ymxpc2hlZCA/PyB0cnVlKTtcbiAgcmVhZG9ubHkgY29waWVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaXNTYXZpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBhdHRlbXB0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzYXZlRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IG5hbWVFcnJvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYXR0ZW1wdGVkKCkgJiYgIXRoaXMubmFtZSgpLnRyaW0oKSA/ICdFbnRlciBhIHJlcG9ydCBuYW1lLicgOiBudWxsKTtcbiAgcmVhZG9ubHkgc2x1Z0Vycm9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5hdHRlbXB0ZWQoKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnNsdWcoKS50cmltKCkpIHJldHVybiAnRW50ZXIgYSBVUkwgc2x1Zy4nO1xuICAgIGlmICghL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLy50ZXN0KHRoaXMuc2x1ZygpLnRyaW0oKSkpIHJldHVybiAnVXNlIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgc2luZ2xlIGh5cGhlbnMuJztcbiAgICBpZiAodGhpcy5zbHVnKCkudHJpbSgpID09PSAnbmV3JykgcmV0dXJuICdDaG9vc2UgYSBkaWZmZXJlbnQgc2x1ZzsgXCJuZXdcIiBpcyByZXNlcnZlZCBmb3IgdGhlIHJlcG9ydCBidWlsZGVyLic7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuICByZWFkb25seSBmdWxsUm91dGUgPSBjb21wdXRlZCgoKSA9PiAnLycgKyB0aGlzLmJhc2VSb3V0ZSgpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKSArICcvJyArIHRoaXMuc2x1ZygpLnRyaW0oKSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRQcmV2aWV3RGVmID0gY29tcHV0ZWQ8UmVwb3J0RGVmaW5pdGlvbj4oKCkgPT4gKHtcbiAgICAuLi50aGlzLnJlcG9ydCwgaWQ6IHRoaXMucmVwb3J0SWQoKS50cmltKCksIG5hbWU6IHRoaXMubmFtZSgpLCBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbigpLCBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSgpLFxuICAgIHNsdWc6IHRoaXMuc2x1ZygpLCBtZW51R3JvdXA6IHRoaXMubWVudUdyb3VwKCksIGlzUHVibGlzaGVkOiB0aGlzLmlzUHVibGlzaGVkKCksXG4gIH0pKTtcblxuICBvbklkQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZygpKSByZXR1cm47XG4gICAgdGhpcy5pZENoZWNrPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaXNQcmVwYXJpbmdTYXZlLnNldChmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVDb25maXJtYXRpb24uc2V0KG51bGwpO1xuICAgIHRoaXMuaXNDaGVja2luZ0lkLnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXBvcnRJZC5zZXQodmFsdWUpO1xuICAgIHRoaXMuaWRTdGF0dXMuc2V0KCd1bmNoZWNrZWQnKTtcbiAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJycpO1xuICAgIHRoaXMuc2F2ZUVycm9yLnNldChudWxsKTtcbiAgfVxuXG4gIHJhbmRvbWl6ZUlkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJhbmRvbSA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyAncnB0LScgKyBjcnlwdG8ucmFuZG9tVVVJRCgpIDogZ2VuZXJhdGVJZCgncnB0Jyk7XG4gICAgdGhpcy5vbklkQ2hhbmdlKHJhbmRvbSk7XG4gIH1cblxuICB2ZXJpZnlJZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZygpIHx8IHRoaXMuaXNDaGVja2luZ0lkKCkgfHwgdGhpcy51cGRhdGVDb25maXJtYXRpb24oKSkgcmV0dXJuO1xuICAgIHRoaXMuaWRBdHRlbXB0ZWQuc2V0KHRydWUpO1xuICAgIGlmICh0aGlzLmlkRXJyb3IoKSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gdGhpcy5yZXBvcnRJZCgpLnRyaW0oKTtcbiAgICB0aGlzLmlzQ2hlY2tpbmdJZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2NoZWNraW5nJyk7XG4gICAgdGhpcy5pZE1lc3NhZ2Uuc2V0KCdDaGVja2luZyByZXBvcnQgSUQuLi4nKTtcbiAgICB0aGlzLmlkQ2hlY2sgPSBkZWZlcigoKSA9PiB0aGlzLnN0b3JlLmNoZWNrUmVwb3J0SWQoaWQpKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc0NoZWNraW5nSWQuc2V0KGZhbHNlKSksXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogZXhpc3RzID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0SWQoKS50cmltKCkgIT09IGlkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleGlzdHMgJiYgIXRoaXMuaWRDaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMuaWRTdGF0dXMuc2V0KGV4aXN0cyA/IChjdXJyZW50ID8gJ2N1cnJlbnQnIDogJ2R1cGxpY2F0ZScpIDogJ2F2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoZXhpc3RzID8gKGN1cnJlbnQgPyAnVGhpcyBJRCBpcyBhbHJlYWR5IHNhdmVkLiBTYXZpbmcgd2lsbCBhc2sgYmVmb3JlIHVwZGF0aW5nIHRoaXMgcmVwb3J0LidcbiAgICAgICAgICA6ICdUaGlzIHJlcG9ydCBJRCBhbHJlYWR5IGV4aXN0cy4gU2F2aW5nIHdpbGwgYXNrIHdoZXRoZXIgdG8gdXBkYXRlIGl0LicpIDogJ1RoaXMgcmVwb3J0IElEIGlzIGF2YWlsYWJsZS4nKTtcbiAgICAgICAgdGhpcy5pc0NoZWNraW5nSWQuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZXBvcnRJZCgpLnRyaW0oKSAhPT0gaWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMuaWRNZXNzYWdlLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHZlcmlmeSB0aGUgcmVwb3J0IElELiBQbGVhc2UgcmV0cnkuJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25OYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWUuc2V0KHZhbHVlKTtcbiAgICBpZiAoIXRoaXMuY3VzdG9tU2x1ZykgdGhpcy5zbHVnLnNldCh0b1NsdWcodmFsdWUpKTtcbiAgfVxuXG4gIG9uU2x1Z0NoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXN0b21TbHVnID0gdHJ1ZTtcbiAgICB0aGlzLnNsdWcuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGNvcHlSb3V0ZSgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCkge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5mdWxsUm91dGUoKSkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29waWVkLnNldCh0cnVlKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvcGllZC5zZXQoZmFsc2UpLCAyMDAwKTtcbiAgICAgIH0pLmNhdGNoKCgpID0+IHRoaXMuc2F2ZUVycm9yLnNldCgnQ291bGQgbm90IGNvcHkgdGhlIHJlcG9ydCBVUkwuJykpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmUoYWN0aW9uOiBSZXBvcnRTYXZlZERpYWxvZ1Jlc3VsdFsnYWN0aW9uJ10gPSAnYmFja190b19kZXNpZ25lcicpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZygpIHx8IHRoaXMuaXNDaGVja2luZ0lkKCkgfHwgdGhpcy51cGRhdGVDb25maXJtYXRpb24oKSkgcmV0dXJuO1xuICAgIHRoaXMuYXR0ZW1wdGVkLnNldCh0cnVlKTtcbiAgICB0aGlzLnNhdmVFcnJvci5zZXQobnVsbCk7XG4gICAgaWYgKHRoaXMuaWRFcnJvcigpIHx8IHRoaXMubmFtZUVycm9yKCkgfHwgdGhpcy5zbHVnRXJyb3IoKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJldmlld2VkOiBSZXBvcnREZWZpbml0aW9uID0ge1xuICAgICAgLi4udGhpcy5yZXBvcnQsIGlkOiB0aGlzLnJlcG9ydElkKCkudHJpbSgpLFxuICAgICAgbmFtZTogdGhpcy5uYW1lKCkudHJpbSgpLCBzbHVnOiB0aGlzLnNsdWcoKS50cmltKCksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbigpLnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSgpLnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICBtZW51R3JvdXA6IHRoaXMubWVudUdyb3VwKCkudHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICAgIGlzUHVibGlzaGVkOiB0aGlzLmlzUHVibGlzaGVkKCksXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0S2V5ID0gdGhpcy5zdG9yZS5nZXRTdG9yYWdlQ29udGV4dEtleSgpO1xuICAgIHRoaXMuaXNDaGVja2luZ0lkLnNldCh0cnVlKTtcbiAgICB0aGlzLmlzUHJlcGFyaW5nU2F2ZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2NoZWNraW5nJyk7XG4gICAgdGhpcy5pZE1lc3NhZ2Uuc2V0KCdDaGVja2luZyByZXBvcnQgSUQuLi4nKTtcbiAgICB0aGlzLmlkQ2hlY2sgPSBkZWZlcigoKSA9PiB0aGlzLnN0b3JlLmluc3BlY3RSZXBvcnRJZChyZXZpZXdlZC5pZCkpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKHN0YXR1cyA9PiBzdGF0dXMuZXhpc3RzICYmICghTnVtYmVyLmlzSW50ZWdlcihzdGF0dXMudmVyc2lvbikgfHwgc3RhdHVzLnZlcnNpb24hIDwgMClcbiAgICAgICAgPyB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignQ291bGQgbm90IHJlYWQgdGhlIGN1cnJlbnQgcmVwb3J0IHZlcnNpb24uIFBsZWFzZSByZXRyeS4nKSkgOiBvZihzdGF0dXMpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLmlzQ2hlY2tpbmdJZC5zZXQoZmFsc2UpOyB0aGlzLmlzUHJlcGFyaW5nU2F2ZS5zZXQoZmFsc2UpOyB9KSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBzdGF0dXMgPT4ge1xuICAgICAgICB0aGlzLmlzQ2hlY2tpbmdJZC5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmlzUHJlcGFyaW5nU2F2ZS5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZXBvcnRJZCgpLnRyaW0oKSAhPT0gcmV2aWV3ZWQuaWQgfHwgdGhpcy5zdG9yZS5nZXRTdG9yYWdlQ29udGV4dEtleSgpICE9PSBjb250ZXh0S2V5KSB7XG4gICAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2Vycm9yJyk7XG4gICAgICAgICAgdGhpcy5pZE1lc3NhZ2Uuc2V0KCdSZXBvcnRpbmcgY29udGV4dCBjaGFuZ2VkLiBSZXZpZXcgdGhlIGRldGFpbHMgYW5kIHNhdmUgYWdhaW4uJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0dXMuZXhpc3RzKSB7XG4gICAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQodGhpcy5pZENoYW5nZWQoKSA/ICdkdXBsaWNhdGUnIDogJ2N1cnJlbnQnKTtcbiAgICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJ1RoaXMgcmVwb3J0IElEIGFscmVhZHkgZXhpc3RzLiBDb25maXJtIHRoZSB1cGRhdGUgb3IgY2FuY2VsLicpO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlybWF0aW9uLnNldCh7IHJlcG9ydDogcmV2aWV3ZWQsIGFjdGlvbiwgZXhwZWN0ZWRWZXJzaW9uOiBzdGF0dXMudmVyc2lvbiEsXG4gICAgICAgICAgICBleGlzdGluZ05hbWU6IHN0YXR1cy5uYW1lIHx8IHJldmlld2VkLmlkLCBjb250ZXh0S2V5IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaWRTdGF0dXMuc2V0KCdhdmFpbGFibGUnKTtcbiAgICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJ1RoaXMgcmVwb3J0IElEIGlzIGF2YWlsYWJsZS4nKTtcbiAgICAgICAgICB0aGlzLnBlcnNpc3QocmV2aWV3ZWQsIGFjdGlvbiwgeyBjcmVhdGVPbmx5OiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5pZFN0YXR1cy5zZXQoJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMuaWRNZXNzYWdlLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHZlcmlmeSB0aGUgcmVwb3J0IElELiBQbGVhc2UgcmV0cnkuJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1NhdmluZygpKSB0aGlzLnVwZGF0ZUNvbmZpcm1hdGlvbi5zZXQobnVsbCk7XG4gIH1cblxuICBjb25maXJtVXBkYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IHRoaXMudXBkYXRlQ29uZmlybWF0aW9uKCk7XG4gICAgaWYgKCFjb25maXJtYXRpb24gfHwgdGhpcy5pc1NhdmluZygpIHx8IHRoaXMuaXNDaGVja2luZ0lkKCkpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpcm1hdGlvbi5zZXQobnVsbCk7XG4gICAgaWYgKHRoaXMucmVwb3J0SWQoKS50cmltKCkgIT09IGNvbmZpcm1hdGlvbi5yZXBvcnQuaWQgfHwgdGhpcy5zdG9yZS5nZXRTdG9yYWdlQ29udGV4dEtleSgpICE9PSBjb25maXJtYXRpb24uY29udGV4dEtleSkge1xuICAgICAgdGhpcy5zYXZlRXJyb3Iuc2V0KCdSZXBvcnRpbmcgY29udGV4dCBjaGFuZ2VkLiBSZXZpZXcgdGhlIGRldGFpbHMgYW5kIHNhdmUgYWdhaW4uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVyc2lzdChjb25maXJtYXRpb24ucmVwb3J0LCBjb25maXJtYXRpb24uYWN0aW9uLCB7IGV4cGVjdGVkVmVyc2lvbjogY29uZmlybWF0aW9uLmV4cGVjdGVkVmVyc2lvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdChyZXBvcnQ6IFJlcG9ydERlZmluaXRpb24sIGFjdGlvbjogUmVwb3J0U2F2ZWREaWFsb2dSZXN1bHRbJ2FjdGlvbiddLCBvcHRpb25zOiBSZXBvcnRTYXZlT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IHByZXZpb3VzRGlzYWJsZUNsb3NlID0gdGhpcy5kaWFsb2dSZWYuZGlzYWJsZUNsb3NlO1xuICAgIHRoaXMuZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgZGVmZXIoKCkgPT4gdGhpcy5zdG9yZS5zYXZlUmVwb3J0KHJlcG9ydCwgb3B0aW9ucykpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNTYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gcHJldmlvdXNEaXNhYmxlQ2xvc2U7XG4gICAgICB9KSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBzYXZlZCA9PiB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IGFjdGlvbiwgcmVwb3J0OiBzYXZlZCB9KSxcbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZUVycm9yLnNldChlcnJvcj8ubWVzc2FnZSB8fCAnVGhlIHJlcG9ydCBjb3VsZCBub3QgYmUgc2F2ZWQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgIGlmICgvYWxyZWFkeSBleGlzdHMvaS50ZXN0KGVycm9yPy5tZXNzYWdlIHx8ICcnKSkge1xuICAgICAgICAgIHRoaXMuaWRTdGF0dXMuc2V0KCdkdXBsaWNhdGUnKTtcbiAgICAgICAgICB0aGlzLmlkTWVzc2FnZS5zZXQoJ1RoaXMgSUQgd2FzIGp1c3Qgc2F2ZWQgYnkgYW5vdGhlciByZXF1ZXN0LiBTYXZlIGFnYWluIHRvIGNvbmZpcm0gYW4gdXBkYXRlLicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU2F2aW5nKCkpIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gIH1cblxuICBvcGVuTGl2ZVBhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlKCdvcGVuX2xpdmVfcGFnZScpO1xuICB9XG59XG4iXX0=