@sachin9822/reports-lib 0.0.131 → 0.0.133
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +29 -22
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +2 -2
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +337 -0
- package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
- package/esm2020/lib/reports-lib-routing.module.mjs +16 -4
- package/esm2020/lib/reports-lib.module.mjs +25 -6
- package/esm2020/lib/services/report.service.mjs +27 -1
- package/esm2020/lib/shared/export.service.mjs +26 -8
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +2 -2
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +399 -0
- package/esm2020/public-api.mjs +8 -1
- package/fesm2015/sachin9822-reports-lib.mjs +892 -80
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -1
- package/fesm2020/sachin9822-reports-lib.mjs +873 -80
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -1
- package/lib/assets/config/app-config.json +3 -1
- package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +6 -2
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +93 -0
- package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +139 -0
- package/lib/reports-lib-routing.module.d.ts +2 -1
- package/lib/reports-lib.module.d.ts +12 -10
- package/lib/services/report.service.d.ts +7 -1
- package/lib/shared/search-filter/search-filter.component.d.ts +68 -0
- package/package.json +1 -1
- package/public-api.d.ts +6 -0
@@ -0,0 +1,399 @@
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
2
|
+
import { FormArray, FormGroup, Validators } from '@angular/forms';
|
3
|
+
import { ComponentLoadingState } from '../../models/transaction-enquiry-report/transaction-enquiry.model';
|
4
|
+
import { Subject } from 'rxjs';
|
5
|
+
import { takeUntil } from 'rxjs/operators';
|
6
|
+
import * as i0 from "@angular/core";
|
7
|
+
import * as i1 from "../../services/report.service";
|
8
|
+
import * as i2 from "@angular/forms";
|
9
|
+
import * as i3 from "../../services/config.service";
|
10
|
+
import * as i4 from "@angular/router";
|
11
|
+
import * as i5 from "@angular/common";
|
12
|
+
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
13
|
+
import * as i7 from "@ng-select/ng-select";
|
14
|
+
import * as i8 from "../loader/loader.component";
|
15
|
+
export class SearchFilterComponent {
|
16
|
+
constructor(reportService, fb, config) {
|
17
|
+
this.reportService = reportService;
|
18
|
+
this.fb = fb;
|
19
|
+
this.config = config;
|
20
|
+
this.searchClicked = new EventEmitter();
|
21
|
+
this.formValidationError = false;
|
22
|
+
this.destroy$ = new Subject();
|
23
|
+
this.loadingState = ComponentLoadingState.Complete;
|
24
|
+
this.ComponentLoadingState = ComponentLoadingState;
|
25
|
+
this.hasSearched = false;
|
26
|
+
this._errorMessage = '';
|
27
|
+
this.currentUser = '';
|
28
|
+
this.usernameMissing = false;
|
29
|
+
this.token = sessionStorage.getItem('access_token');
|
30
|
+
this.applicationType = 'ezremit';
|
31
|
+
this.companyCode = 'BH';
|
32
|
+
this.userReportDefaults = null;
|
33
|
+
this.companyReportConfig = null;
|
34
|
+
this.clients1 = [];
|
35
|
+
this.branches = [];
|
36
|
+
this.users = [];
|
37
|
+
this.currencies = [];
|
38
|
+
this.products = [];
|
39
|
+
this.transactionStatuses = [];
|
40
|
+
this.selectedStatuses = [];
|
41
|
+
this.showStatusDropdown = false;
|
42
|
+
this.visibleFieldKeys = [];
|
43
|
+
this.dateType = 1;
|
44
|
+
// Field visibility map, 'fromDate', 'toDate','product','userId','currency','transactionStatus','transactionNo'
|
45
|
+
this.visibleFieldsMap = {
|
46
|
+
'Transaction Enquiry': ['client', 'fromDate', 'toDate', 'branch', 'product', 'currency', 'userId', 'transactionStatus', 'transactionNo'],
|
47
|
+
'FC Ledger': ['client', 'fromDate', 'toDate', 'currency', 'product'],
|
48
|
+
'Branch Activity': ['branch', 'userId', 'fromDate', 'toDate'],
|
49
|
+
'ACC GL Details Enquiry': ['dateType', 'date'],
|
50
|
+
// Add more report types here
|
51
|
+
};
|
52
|
+
this.serviceUrl = this.config.get.serviceUrl;
|
53
|
+
let fossilUser = sessionStorage.getItem('fossilusername');
|
54
|
+
let ezremitUser = sessionStorage.getItem('ezremitusername');
|
55
|
+
if (fossilUser)
|
56
|
+
this.currentUser = fossilUser;
|
57
|
+
else if (ezremitUser)
|
58
|
+
this.currentUser = ezremitUser;
|
59
|
+
else {
|
60
|
+
this.currentUser = 'vipul.katale@xpressmoney.tech';
|
61
|
+
this.usernameMissing = true;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
get visibleFields() {
|
65
|
+
return this.visibleFieldsMap[this.ReportName] || [];
|
66
|
+
}
|
67
|
+
isFieldVisible(field) {
|
68
|
+
return this.visibleFields.includes(field);
|
69
|
+
}
|
70
|
+
ngOnInit() {
|
71
|
+
this.checkReport();
|
72
|
+
}
|
73
|
+
ngOnDestroy() {
|
74
|
+
this.destroy$.next();
|
75
|
+
this.destroy$.complete();
|
76
|
+
}
|
77
|
+
checkReport() {
|
78
|
+
if (this.ReportName == "Transaction Enquiry") {
|
79
|
+
this.currentUser = this.currentUser.replace(/"/g, '');
|
80
|
+
this.initializeForm();
|
81
|
+
this.subscribeToDateChanges();
|
82
|
+
this.loadInitialData();
|
83
|
+
}
|
84
|
+
if (this.ReportName == "ACC GL Details Enquiry") {
|
85
|
+
this.initializeForm();
|
86
|
+
}
|
87
|
+
}
|
88
|
+
loadInitialData() {
|
89
|
+
if (this.ReportName == 'Transaction Enquiry') {
|
90
|
+
this.loadInitialDatafortxnEnquiry();
|
91
|
+
}
|
92
|
+
}
|
93
|
+
initializeForm() {
|
94
|
+
if (this.ReportName == "Transaction Enquiry") {
|
95
|
+
this.searchForm = this.fb.group({
|
96
|
+
client: ['', Validators.required],
|
97
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
98
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
99
|
+
branch: ['', Validators.required],
|
100
|
+
userId: ['-1'],
|
101
|
+
currency: ['All'],
|
102
|
+
product: ['All', Validators.required],
|
103
|
+
transactionStatus: [['All'], Validators.required],
|
104
|
+
transactionNo: [''],
|
105
|
+
cardNo: [''],
|
106
|
+
idType: [''],
|
107
|
+
idNo: [''],
|
108
|
+
senderName: [''],
|
109
|
+
beneficiaryName: [''],
|
110
|
+
telNo: [''],
|
111
|
+
receiveAmount: [''],
|
112
|
+
branchName: [''],
|
113
|
+
country: [''],
|
114
|
+
});
|
115
|
+
this.selectedStatuses = ['All'];
|
116
|
+
}
|
117
|
+
if (this.ReportName == "ACC GL Details Enquiry") {
|
118
|
+
this.searchForm = this.fb.group({
|
119
|
+
date: [new Date().toISOString().split("T")[0], Validators.required],
|
120
|
+
dateType: [1, Validators.required]
|
121
|
+
});
|
122
|
+
}
|
123
|
+
}
|
124
|
+
async loadInitialDatafortxnEnquiry() {
|
125
|
+
this.loadingState = ComponentLoadingState.Loading;
|
126
|
+
this.errorMessage = '';
|
127
|
+
try {
|
128
|
+
const data = await this.reportService
|
129
|
+
.getPageLoadData(this.currentUser)
|
130
|
+
.pipe(takeUntil(this.destroy$))
|
131
|
+
.toPromise();
|
132
|
+
if (data) {
|
133
|
+
this.clients1 = data.clients || [];
|
134
|
+
this.currencies = data.currencies || [];
|
135
|
+
this.transactionStatuses = (data.transactionStatuses || []).filter(ts => ts.transactionStatus !== '');
|
136
|
+
if (!this.transactionStatuses.some(s => s.transactionStatus === 'All')) {
|
137
|
+
this.transactionStatuses.unshift({
|
138
|
+
transactionStatus: 'All',
|
139
|
+
});
|
140
|
+
}
|
141
|
+
this.setDefaultFormValues();
|
142
|
+
if (this.clients1.length === 1) {
|
143
|
+
this.searchForm.patchValue({
|
144
|
+
client: this.clients1[0].businessPartnerCode,
|
145
|
+
});
|
146
|
+
await this.onClientChange();
|
147
|
+
}
|
148
|
+
}
|
149
|
+
this.loadingState = ComponentLoadingState.Complete;
|
150
|
+
}
|
151
|
+
catch (error) {
|
152
|
+
this.errorMessage = 'Failed to load initial data';
|
153
|
+
this.loadingState = ComponentLoadingState.Error;
|
154
|
+
}
|
155
|
+
}
|
156
|
+
subscribeToDateChanges() {
|
157
|
+
this.searchForm.get('fromDate')?.valueChanges.subscribe(fromDateStr => {
|
158
|
+
const toDateControl = this.searchForm.get('toDate');
|
159
|
+
const toDateStr = toDateControl?.value;
|
160
|
+
if (!fromDateStr || !toDateStr)
|
161
|
+
return;
|
162
|
+
const fromDate = new Date(fromDateStr);
|
163
|
+
const toDate = new Date(toDateStr);
|
164
|
+
const maxToDate = new Date(fromDate);
|
165
|
+
maxToDate?.setDate(fromDate.getDate() + 31);
|
166
|
+
if (toDate > maxToDate) {
|
167
|
+
toDateControl?.patchValue(maxToDate.toISOString().split("T")[0]);
|
168
|
+
}
|
169
|
+
});
|
170
|
+
this.searchForm.get('toDate')?.valueChanges.subscribe(toDateStr => {
|
171
|
+
const fromDateControl = this.searchForm.get('fromDate');
|
172
|
+
const fromDateStr = fromDateControl?.value;
|
173
|
+
if (!toDateStr || !fromDateStr)
|
174
|
+
return;
|
175
|
+
const toDate = new Date(toDateStr);
|
176
|
+
const fromDate = new Date(fromDateStr);
|
177
|
+
const minFromDate = new Date(toDate);
|
178
|
+
minFromDate?.setDate(toDate.getDate() - 31);
|
179
|
+
if (fromDate < minFromDate) {
|
180
|
+
fromDateControl?.patchValue(minFromDate.toISOString().split("T")[0]);
|
181
|
+
}
|
182
|
+
});
|
183
|
+
}
|
184
|
+
setDefaultFormValues() {
|
185
|
+
if (this.userReportDefaults) {
|
186
|
+
this.searchForm.patchValue({
|
187
|
+
currency: this.userReportDefaults.LocalCurrency || 'All',
|
188
|
+
});
|
189
|
+
}
|
190
|
+
}
|
191
|
+
async onClientChange() {
|
192
|
+
this.loadingState = ComponentLoadingState.Loading;
|
193
|
+
if (this.ReportName == "Transaction Enquiry") {
|
194
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
195
|
+
if (!selectedClient)
|
196
|
+
return;
|
197
|
+
this.searchForm.patchValue({ branch: '', userId: '' });
|
198
|
+
this.branches = [];
|
199
|
+
this.products = [];
|
200
|
+
this.users = [];
|
201
|
+
try {
|
202
|
+
await Promise.all([
|
203
|
+
this.loadBranchesByAgent(selectedClient),
|
204
|
+
this.loadProductsByAgent(selectedClient),
|
205
|
+
]);
|
206
|
+
this.loadingState = ComponentLoadingState.Complete;
|
207
|
+
}
|
208
|
+
catch (err) {
|
209
|
+
this.errorMessage = 'Failed to load branch/product';
|
210
|
+
this.loadingState = ComponentLoadingState.Complete;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
async loadBranchesByAgent(agentCode) {
|
215
|
+
const branches = await this.reportService
|
216
|
+
.getBranchesByAgent(agentCode, this.currentUser)
|
217
|
+
.pipe(takeUntil(this.destroy$))
|
218
|
+
.toPromise();
|
219
|
+
this.branches = branches || [];
|
220
|
+
if (this.branches.length === 1) {
|
221
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
222
|
+
await this.loadUsersByBranch(agentCode, this.branches[0].branchCode);
|
223
|
+
}
|
224
|
+
else if (this.branches.some(b => b.branchCode === 'All')) {
|
225
|
+
this.searchForm.patchValue({ branch: 'All' });
|
226
|
+
await this.loadUsersByBranch(agentCode, 'All');
|
227
|
+
}
|
228
|
+
else {
|
229
|
+
this.searchForm.patchValue({ branch: '' });
|
230
|
+
this.users = [];
|
231
|
+
}
|
232
|
+
}
|
233
|
+
async loadProductsByAgent(agentCode) {
|
234
|
+
const products = await this.reportService
|
235
|
+
.getProductsByAgent(agentCode)
|
236
|
+
.pipe(takeUntil(this.destroy$))
|
237
|
+
.toPromise();
|
238
|
+
this.products = products || [];
|
239
|
+
}
|
240
|
+
async onBranchChange() {
|
241
|
+
this.loadingState = ComponentLoadingState.Loading;
|
242
|
+
if (this.ReportName == "Transaction Enquiry") {
|
243
|
+
const client = this.searchForm.get('client')?.value;
|
244
|
+
const branch = this.searchForm.get('branch')?.value;
|
245
|
+
if (client && branch) {
|
246
|
+
await this.loadUsersByBranch(client, branch);
|
247
|
+
this.loadingState = ComponentLoadingState.Complete;
|
248
|
+
}
|
249
|
+
else {
|
250
|
+
this.users = [];
|
251
|
+
this.loadingState = ComponentLoadingState.Complete;
|
252
|
+
}
|
253
|
+
}
|
254
|
+
}
|
255
|
+
async loadUsersByBranch(agentCode, branchCode) {
|
256
|
+
return new Promise((resolve, reject) => {
|
257
|
+
this.reportService
|
258
|
+
.getUsersByBranch(agentCode, branchCode)
|
259
|
+
.pipe(takeUntil(this.destroy$))
|
260
|
+
.subscribe({
|
261
|
+
next: (users) => {
|
262
|
+
this.users = users || [];
|
263
|
+
// Try to find a user indicating "All"
|
264
|
+
const allUser = this.users.find(u => u.userName === 'All' || u.userId === -1);
|
265
|
+
if (allUser) {
|
266
|
+
// If "All" is present, select it
|
267
|
+
this.searchForm.patchValue({ userId: allUser.userId });
|
268
|
+
}
|
269
|
+
else if (this.users.length === 1) {
|
270
|
+
// If only one user, select that user
|
271
|
+
this.searchForm.patchValue({ userId: this.users[0].userId });
|
272
|
+
}
|
273
|
+
else {
|
274
|
+
// Otherwise, clear user selection
|
275
|
+
this.searchForm.patchValue({ userId: '' });
|
276
|
+
}
|
277
|
+
resolve();
|
278
|
+
},
|
279
|
+
error: (err) => reject(err),
|
280
|
+
});
|
281
|
+
});
|
282
|
+
}
|
283
|
+
onSearch() {
|
284
|
+
if (this.ReportName == "Transaction Enquiry") {
|
285
|
+
this.hasSearched = true;
|
286
|
+
if (this.searchForm.invalid) {
|
287
|
+
this.formValidationError = true;
|
288
|
+
this.markFormGroupTouched(this.searchForm);
|
289
|
+
return;
|
290
|
+
}
|
291
|
+
this.formValidationError = false;
|
292
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
293
|
+
}
|
294
|
+
if (this.ReportName == "ACC GL Details Enquiry") {
|
295
|
+
const modal = {
|
296
|
+
selectedDateType: this.searchForm.controls["dateType"]?.value,
|
297
|
+
selectedDate: this.searchForm.controls["date"]?.value
|
298
|
+
};
|
299
|
+
this.searchClicked.emit(modal);
|
300
|
+
}
|
301
|
+
}
|
302
|
+
markFormGroupTouched(formGroup) {
|
303
|
+
Object.values(formGroup.controls).forEach(control => {
|
304
|
+
if (control instanceof FormGroup || control instanceof FormArray) {
|
305
|
+
this.markFormGroupTouched(control);
|
306
|
+
}
|
307
|
+
else {
|
308
|
+
control.markAsTouched();
|
309
|
+
}
|
310
|
+
});
|
311
|
+
}
|
312
|
+
buildSearchCriteria() {
|
313
|
+
if (this.ReportName == "Transaction Enquiry") {
|
314
|
+
const formValue = this.searchForm.value;
|
315
|
+
return {
|
316
|
+
bank: formValue.client,
|
317
|
+
fromDate: this.toIsoFormat(formValue.fromDate),
|
318
|
+
toDate: this.toIsoFormat(formValue.toDate),
|
319
|
+
branch: formValue.branch,
|
320
|
+
user: formValue.userId || '-1',
|
321
|
+
currency: formValue.currency,
|
322
|
+
product: formValue.product,
|
323
|
+
status: this.selectedStatuses.includes('All') ? [''] : this.selectedStatuses,
|
324
|
+
transactionNo: (formValue.transactionNo || '').trim(),
|
325
|
+
cardNo: formValue.cardNo || '',
|
326
|
+
idType: formValue.idType || '',
|
327
|
+
idNo: formValue.idNo || '',
|
328
|
+
senderName: formValue.senderName || '',
|
329
|
+
beneficiaryName: formValue.beneficiaryName || '',
|
330
|
+
telNo: formValue.telNo || '',
|
331
|
+
payoutAmount: formValue.receiveAmount || '',
|
332
|
+
branchName: formValue.branchName || '',
|
333
|
+
company: this.companyCode || '',
|
334
|
+
country: formValue.country || '',
|
335
|
+
sysUserID: this.currentUser,
|
336
|
+
};
|
337
|
+
}
|
338
|
+
}
|
339
|
+
toIsoFormat(dateInput) {
|
340
|
+
if (!dateInput)
|
341
|
+
return undefined;
|
342
|
+
// Handle { year, month, day }
|
343
|
+
if (typeof dateInput === 'object' &&
|
344
|
+
dateInput.year &&
|
345
|
+
dateInput.month &&
|
346
|
+
dateInput.day) {
|
347
|
+
const year = dateInput.year;
|
348
|
+
const month = String(dateInput.month).padStart(2, '0');
|
349
|
+
const day = String(dateInput.day).padStart(2, '0');
|
350
|
+
return `${year}-${month}-${day}`;
|
351
|
+
}
|
352
|
+
// Handle JS Date object
|
353
|
+
if (dateInput instanceof Date) {
|
354
|
+
if (isNaN(dateInput.getTime()))
|
355
|
+
return undefined;
|
356
|
+
const year = dateInput.getFullYear();
|
357
|
+
const month = String(dateInput.getMonth() + 1).padStart(2, '0');
|
358
|
+
const day = String(dateInput.getDate()).padStart(2, '0');
|
359
|
+
return `${year}-${month}-${day}`;
|
360
|
+
}
|
361
|
+
// Handle dd/MM/yyyy string
|
362
|
+
if (typeof dateInput === 'string' && dateInput.includes('/')) {
|
363
|
+
const parts = dateInput.split('/');
|
364
|
+
if (parts.length === 3) {
|
365
|
+
const [day, month, year] = parts;
|
366
|
+
return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;
|
367
|
+
}
|
368
|
+
}
|
369
|
+
// Handle ISO string (yyyy-MM-dd or yyyy-MM-ddTHH:mm:ss.sssZ)
|
370
|
+
if (typeof dateInput === 'string' && /^\d{4}-\d{2}-\d{2}/.test(dateInput)) {
|
371
|
+
// Use only date part if full ISO string
|
372
|
+
return dateInput.substring(0, 10);
|
373
|
+
}
|
374
|
+
return undefined;
|
375
|
+
}
|
376
|
+
get errorMessage() {
|
377
|
+
return this._errorMessage;
|
378
|
+
}
|
379
|
+
set errorMessage(value) {
|
380
|
+
this._errorMessage = value;
|
381
|
+
}
|
382
|
+
get isLoading() {
|
383
|
+
return this.loadingState === ComponentLoadingState.Loading;
|
384
|
+
}
|
385
|
+
get isError() {
|
386
|
+
return this.loadingState === ComponentLoadingState.Error;
|
387
|
+
}
|
388
|
+
}
|
389
|
+
SearchFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SearchFilterComponent, deps: [{ token: i1.ReportService }, { token: i2.FormBuilder }, { token: i3.ConfigService }], target: i0.ɵɵFactoryTarget.Component });
|
390
|
+
SearchFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SearchFilterComponent, selector: "lib-search-filter", inputs: { ReportName: "ReportName" }, outputs: { searchClicked: "searchClicked" }, ngImport: i0, template: "<h6 class=\"Breadcrumb\">\r\n <a class=\"BreadCrumbLink\" [routerLink]=\"['/reports']\">\r\n <h1>Reports</h1>\r\n </a>\r\n <a href=\"BreadCrumbLink\"></a>\r\n <span class=\"BreadCrumbArrow\"></span>\r\n <a class=\"BreadCrumbLink\">\r\n <h2>{{ ReportName }}</h2>\r\n </a>\r\n</h6>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section class=\"filter-section\">\r\n <form [formGroup]=\"searchForm\" (ngSubmit)=\"onSearch()\" class=\"report-filter-form\">\r\n <div class=\"row\">\r\n <div class=\"col-custom-10-5\">\r\n <div class=\"grid-container\">\r\n <div class=\"filter-grid\">\r\n\r\n <!-- Dynamically render filters in order -->\r\n <ng-container *ngFor=\"let field of visibleFields\">\r\n <ng-container [ngSwitch]=\"field\">\r\n\r\n <!-- Client -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'client'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"clients1\" bindLabel=\"businessPartnerName\" bindValue=\"businessPartnerCode\"\r\n placeholder=\"Select Client\" [clearable]=\"false\" formControlName=\"client\" required\r\n (change)=\"onClientChange()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Branch -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'branch'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Branch<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"branches\" bindLabel=\"businessPartnerBranch\" bindValue=\"branchCode\"\r\n placeholder=\"Select Branch\" [clearable]=\"false\" formControlName=\"branch\" required\r\n (change)=\"onBranchChange()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- From Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'fromDate'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">From Date<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group date-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #fromDateInput=\"ngbDatepicker\" formControlName=\"fromDate\" autocomplete=\"off\" />\r\n <button class=\"input-group-button cal\" (click)=\"fromDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- To Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'toDate'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">To Date<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group date-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" formControlName=\"toDate\" autocomplete=\"off\" />\r\n <button class=\"input-group-button cal\" (click)=\"toDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Product -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'product'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Product</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"products\" bindLabel=\"productName\" bindValue=\"productCode\"\r\n placeholder=\"Select Product\" [clearable]=\"false\" formControlName=\"product\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'userId'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">User<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"users\" bindLabel=\"userName\" bindValue=\"userId\" placeholder=\"Select User\"\r\n [clearable]=\"false\" formControlName=\"userId\" required>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Currency -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'currency'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Currency</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"currencies\" bindLabel=\"currencyCode\" bindValue=\"currencyCode\"\r\n placeholder=\"Select Currency\" [clearable]=\"false\" formControlName=\"currency\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Transaction Status (Multi-select) -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionStatus'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Trans. Status<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select class=\"transaction-status-select\" [items]=\"transactionStatuses\"\r\n bindLabel=\"transactionStatus\" bindValue=\"transactionStatus\" [multiple]=\"true\"\r\n placeholder=\"Select Transaction Status\" formControlName=\"transactionStatus\"\r\n [closeOnSelect]=\"false\" [clearable]=\"false\" [searchable]=\"false\" required>\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input type=\"checkbox\" [checked]=\"item$.selected\" /> {{ item.transactionStatus }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Transaction No -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionNo'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Trans. Number</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <input class=\"form-control dpicker\" formControlName=\"transactionNo\"\r\n placeholder=\"Enter transaction number\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Value Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'valueDate'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-3\">\r\n <label class=\"form-label label-data\">Value Date<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-9\">\r\n <div class=\"input-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" formControlName=\"toDate\" autocomplete=\"off\" />\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toDateInput.toggle()\">\r\n <i class=\"fa fa-calendar\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Date Type -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'dateType'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Date Type</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select placeholder=\"- Please select -\" formControlName=\"dateType\" [clearable]=\"false\"\r\n required>\r\n <ng-option [value]=\"1\">\r\n Value Date\r\n </ng-option>\r\n <ng-option [value]=\"2\">\r\n Posting Date\r\n </ng-option>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'date'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Date</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group date-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" formControlName=\"date\" autocomplete=\"off\" />\r\n <button class=\"input-group-button cal\" (click)=\"toDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-custom-1-5\">\r\n <!-- View Report Button (Always at Top-Right) -->\r\n <div class=\"form-field view-report-btn\">\r\n <button type=\"submit\" class=\"btn btn-report\">View</button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</section>\r\n<hr>\r\n<!-- Error Messages -->\r\n<div class=\"alert alert-danger mt-3\" *ngIf=\"formValidationError && hasSearched\">\r\n Please fill all required fields before submitting the form.\r\n</div>\r\n\r\n<div class=\"alert alert-danger mt-3\" *ngIf=\"errorMessage && loadingState === ComponentLoadingState.Error\">\r\n {{ errorMessage }}\r\n <button type=\"button\" class=\"btn-close\" (click)=\"errorMessage = ''\"></button>\r\n</div>", styles: ["@charset \"UTF-8\";.filter-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;grid-column:span 3}.form-field{display:flex;flex-direction:column;padding:0 4px 0 0!important;min-width:0}.col-custom-10-5{flex:0 0 87.5%!important;max-width:87.5%!important}.col-custom-1-5{flex:0 0 12.5%!important;max-width:12.5%!important}::ng-deep .ng-select .ng-select-container .ng-value-container{overflow:visible;flex-wrap:nowrap}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}::ng-deep .ng-select .ng-select-container{height:32px!important;min-height:32px!important;font-size:12px!important;align-items:center}.form-label{margin-bottom:0!important}.date-group{height:32px!important}::ng-deep .transaction-status-select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{padding:4px 0!important}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-top:0}::ng-deep .ng-dropdown-panel .ng-option{font-size:12px}.btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px;padding:4px 15px!important;margin-left:10px!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}.fa-calendar{--fa: \"\\f073\" !important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2;margin-left:0!important}.cal:focus{box-shadow:none!important}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}@media (max-width: 768px){.filter-grid{grid-template-columns:1fr;gap:12px}}\n"], dependencies: [{ kind: "directive", type: i4.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i7.NgOptionComponent, selector: "ng-option", inputs: ["value", "disabled"] }, { kind: "directive", type: i7.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "component", type: i8.LoaderComponent, selector: "app-loader" }] });
|
391
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SearchFilterComponent, decorators: [{
|
392
|
+
type: Component,
|
393
|
+
args: [{ selector: 'lib-search-filter', template: "<h6 class=\"Breadcrumb\">\r\n <a class=\"BreadCrumbLink\" [routerLink]=\"['/reports']\">\r\n <h1>Reports</h1>\r\n </a>\r\n <a href=\"BreadCrumbLink\"></a>\r\n <span class=\"BreadCrumbArrow\"></span>\r\n <a class=\"BreadCrumbLink\">\r\n <h2>{{ ReportName }}</h2>\r\n </a>\r\n</h6>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section class=\"filter-section\">\r\n <form [formGroup]=\"searchForm\" (ngSubmit)=\"onSearch()\" class=\"report-filter-form\">\r\n <div class=\"row\">\r\n <div class=\"col-custom-10-5\">\r\n <div class=\"grid-container\">\r\n <div class=\"filter-grid\">\r\n\r\n <!-- Dynamically render filters in order -->\r\n <ng-container *ngFor=\"let field of visibleFields\">\r\n <ng-container [ngSwitch]=\"field\">\r\n\r\n <!-- Client -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'client'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"clients1\" bindLabel=\"businessPartnerName\" bindValue=\"businessPartnerCode\"\r\n placeholder=\"Select Client\" [clearable]=\"false\" formControlName=\"client\" required\r\n (change)=\"onClientChange()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Branch -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'branch'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Branch<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"branches\" bindLabel=\"businessPartnerBranch\" bindValue=\"branchCode\"\r\n placeholder=\"Select Branch\" [clearable]=\"false\" formControlName=\"branch\" required\r\n (change)=\"onBranchChange()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- From Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'fromDate'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">From Date<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group date-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #fromDateInput=\"ngbDatepicker\" formControlName=\"fromDate\" autocomplete=\"off\" />\r\n <button class=\"input-group-button cal\" (click)=\"fromDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- To Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'toDate'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">To Date<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group date-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" formControlName=\"toDate\" autocomplete=\"off\" />\r\n <button class=\"input-group-button cal\" (click)=\"toDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Product -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'product'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Product</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"products\" bindLabel=\"productName\" bindValue=\"productCode\"\r\n placeholder=\"Select Product\" [clearable]=\"false\" formControlName=\"product\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'userId'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">User<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"users\" bindLabel=\"userName\" bindValue=\"userId\" placeholder=\"Select User\"\r\n [clearable]=\"false\" formControlName=\"userId\" required>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Currency -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'currency'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Currency</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"currencies\" bindLabel=\"currencyCode\" bindValue=\"currencyCode\"\r\n placeholder=\"Select Currency\" [clearable]=\"false\" formControlName=\"currency\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Transaction Status (Multi-select) -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionStatus'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Trans. Status<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select class=\"transaction-status-select\" [items]=\"transactionStatuses\"\r\n bindLabel=\"transactionStatus\" bindValue=\"transactionStatus\" [multiple]=\"true\"\r\n placeholder=\"Select Transaction Status\" formControlName=\"transactionStatus\"\r\n [closeOnSelect]=\"false\" [clearable]=\"false\" [searchable]=\"false\" required>\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input type=\"checkbox\" [checked]=\"item$.selected\" /> {{ item.transactionStatus }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Transaction No -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionNo'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Trans. Number</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <input class=\"form-control dpicker\" formControlName=\"transactionNo\"\r\n placeholder=\"Enter transaction number\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Value Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'valueDate'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-3\">\r\n <label class=\"form-label label-data\">Value Date<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-9\">\r\n <div class=\"input-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" formControlName=\"toDate\" autocomplete=\"off\" />\r\n <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"toDateInput.toggle()\">\r\n <i class=\"fa fa-calendar\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Date Type -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'dateType'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Date Type</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select placeholder=\"- Please select -\" formControlName=\"dateType\" [clearable]=\"false\"\r\n required>\r\n <ng-option [value]=\"1\">\r\n Value Date\r\n </ng-option>\r\n <ng-option [value]=\"2\">\r\n Posting Date\r\n </ng-option>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Date -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'date'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Date</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group date-group\">\r\n <input class=\"form-control dpicker\" placeholder=\"dd/mm/yyyy\" ngbDatepicker\r\n #toDateInput=\"ngbDatepicker\" formControlName=\"date\" autocomplete=\"off\" />\r\n <button class=\"input-group-button cal\" (click)=\"toDateInput.toggle()\" type=\"button\">\r\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-custom-1-5\">\r\n <!-- View Report Button (Always at Top-Right) -->\r\n <div class=\"form-field view-report-btn\">\r\n <button type=\"submit\" class=\"btn btn-report\">View</button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</section>\r\n<hr>\r\n<!-- Error Messages -->\r\n<div class=\"alert alert-danger mt-3\" *ngIf=\"formValidationError && hasSearched\">\r\n Please fill all required fields before submitting the form.\r\n</div>\r\n\r\n<div class=\"alert alert-danger mt-3\" *ngIf=\"errorMessage && loadingState === ComponentLoadingState.Error\">\r\n {{ errorMessage }}\r\n <button type=\"button\" class=\"btn-close\" (click)=\"errorMessage = ''\"></button>\r\n</div>", styles: ["@charset \"UTF-8\";.filter-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;grid-column:span 3}.form-field{display:flex;flex-direction:column;padding:0 4px 0 0!important;min-width:0}.col-custom-10-5{flex:0 0 87.5%!important;max-width:87.5%!important}.col-custom-1-5{flex:0 0 12.5%!important;max-width:12.5%!important}::ng-deep .ng-select .ng-select-container .ng-value-container{overflow:visible;flex-wrap:nowrap}::ng-deep .ng-select .ng-select-container .ng-value-container .ng-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}::ng-deep .ng-select .ng-select-container{height:32px!important;min-height:32px!important;font-size:12px!important;align-items:center}.form-label{margin-bottom:0!important}.date-group{height:32px!important}::ng-deep .transaction-status-select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{padding:4px 0!important}::ng-deep .ng-select .ng-select-container .ng-value-container{padding-top:0}::ng-deep .ng-dropdown-panel .ng-option{font-size:12px}.btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px;padding:4px 15px!important;margin-left:10px!important}::ng-deep .ng-select .ng-select-container:focus-within{box-shadow:0 0 5px 3px #1877f2!important}::ng-deep .ng-select .ng-select-container:focus{box-shadow:0 0 5px 3px #1877f2!important}.fa-calendar{--fa: \"\\f073\" !important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2;margin-left:0!important}.cal:focus{box-shadow:none!important}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}@media (max-width: 768px){.filter-grid{grid-template-columns:1fr;gap:12px}}\n"] }]
|
394
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i2.FormBuilder }, { type: i3.ConfigService }]; }, propDecorators: { ReportName: [{
|
395
|
+
type: Input
|
396
|
+
}], searchClicked: [{
|
397
|
+
type: Output
|
398
|
+
}] } });
|
399
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9zZWFyY2gtZmlsdGVyL3NlYXJjaC1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvc2VhcmNoLWZpbHRlci9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFnQixLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQW1CLFNBQVMsRUFBZSxTQUFTLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0csT0FBTyxFQUEyQyxxQkFBcUIsRUFBOEQsTUFBTSxtRUFBbUUsQ0FBQztBQUMvTSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVczQyxNQUFNLE9BQU8scUJBQXFCO0lBbURoQyxZQUNVLGFBQTRCLEVBQzVCLEVBQWUsRUFDZixNQUFxQjtRQUZyQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXBEckIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBR2xELHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUM3QixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV2QyxpQkFBWSxHQUEwQixxQkFBcUIsQ0FBQyxRQUFRLENBQUM7UUFDckUsMEJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDOUMsZ0JBQVcsR0FB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T0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUdELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLHFCQUFxQixDQUFDLE9BQU8sQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLHFCQUFxQixDQUFDLEtBQUssQ0FBQztJQUMzRCxDQUFDOztrSEFwYlUscUJBQXFCO3NHQUFyQixxQkFBcUIsNElDZmxDLDB0WUFvUE07MkZEck9PLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFDRSxtQkFBbUI7MEpBTXBCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE9uRGVzdHJveSwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVXNlclJlcG9ydERlZmF1bHRzLCBDb21wYW55UmVwb3J0Q29uZmlnLCBDb21wb25lbnRMb2FkaW5nU3RhdGUsIENsaWVudCwgQnJhbmNoLCBDdXJyZW5jeSwgUHJvZHVjdCwgVHJhbnNhY3Rpb25TdGF0dXMsIFVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvdHJhbnNhY3Rpb24tZW5xdWlyeS1yZXBvcnQvdHJhbnNhY3Rpb24tZW5xdWlyeS5tb2RlbCc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXNlYXJjaC1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTZWFyY2hGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgUmVwb3J0TmFtZSE6IHN0cmluZztcclxuICBAT3V0cHV0KCkgc2VhcmNoQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBzZWFyY2hGb3JtITogRm9ybUdyb3VwO1xyXG4gIGZvcm1WYWxpZGF0aW9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgQ29tcG9uZW50TG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlO1xyXG4gIGhhc1NlYXJjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgY3VycmVudFVzZXI6IHN0cmluZyA9ICcnO1xyXG4gIHVzZXJuYW1lTWlzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyk7XHJcbiAgYXBwbGljYXRpb25UeXBlID0gJ2V6cmVtaXQnO1xyXG4gIGNvbXBhbnlDb2RlID0gJ0JIJztcclxuICBzZXJ2aWNlVXJsOiBzdHJpbmc7XHJcbiAgdXNlclJlcG9ydERlZmF1bHRzOiBVc2VyUmVwb3J0RGVmYXVsdHMgfCBudWxsID0gbnVsbDtcclxuICBjb21wYW55UmVwb3J0Q29uZmlnOiBDb21wYW55UmVwb3J0Q29uZmlnIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNsaWVudHMxOiBDbGllbnRbXSA9IFtdO1xyXG4gIGJyYW5jaGVzOiBCcmFuY2hbXSA9IFtdO1xyXG4gIHVzZXJzOiBVc2VyW10gPSBbXTtcclxuICBjdXJyZW5jaWVzOiBDdXJyZW5jeVtdID0gW107XHJcbiAgcHJvZHVjdHM6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIHRyYW5zYWN0aW9uU3RhdHVzZXM6IFRyYW5zYWN0aW9uU3RhdHVzW10gPSBbXTtcclxuICBzZWxlY3RlZFN0YXR1c2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHNob3dTdGF0dXNEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZpc2libGVGaWVsZEtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgZGF0ZVR5cGU6IGFueSA9IDE7XHJcbiAgZGF0ZTogYW55O1xyXG5cclxuICAvLyBGaWVsZCB2aXNpYmlsaXR5IG1hcCwgJ2Zyb21EYXRlJywgJ3RvRGF0ZScsJ3Byb2R1Y3QnLCd1c2VySWQnLCdjdXJyZW5jeScsJ3RyYW5zYWN0aW9uU3RhdHVzJywndHJhbnNhY3Rpb25ObydcclxuICB2aXNpYmxlRmllbGRzTWFwOiB7IFtyZXBvcnQ6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XHJcbiAgICAnVHJhbnNhY3Rpb24gRW5xdWlyeSc6IFsnY2xpZW50JywgJ2Zyb21EYXRlJywgJ3RvRGF0ZScsICdicmFuY2gnLCAncHJvZHVjdCcsICdjdXJyZW5jeScsICd1c2VySWQnLCAndHJhbnNhY3Rpb25TdGF0dXMnLCAndHJhbnNhY3Rpb25ObyddLFxyXG4gICAgJ0ZDIExlZGdlcic6IFsnY2xpZW50JywgJ2Zyb21EYXRlJywgJ3RvRGF0ZScsICdjdXJyZW5jeScsICdwcm9kdWN0J10sXHJcbiAgICAnQnJhbmNoIEFjdGl2aXR5JzogWydicmFuY2gnLCAndXNlcklkJywgJ2Zyb21EYXRlJywgJ3RvRGF0ZSddLFxyXG4gICAgJ0FDQyBHTCBEZXRhaWxzIEVucXVpcnknOiBbJ2RhdGVUeXBlJywgJ2RhdGUnXSxcclxuICAgIC8vIEFkZCBtb3JlIHJlcG9ydCB0eXBlcyBoZXJlXHJcbiAgfTtcclxuXHJcbiAgZ2V0IHZpc2libGVGaWVsZHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUZpZWxkc01hcFt0aGlzLlJlcG9ydE5hbWVdIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgaXNGaWVsZFZpc2libGUoZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUZpZWxkcy5pbmNsdWRlcyhmaWVsZCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVwb3J0U2VydmljZTogUmVwb3J0U2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuc2VydmljZVVybCA9IHRoaXMuY29uZmlnLmdldC5zZXJ2aWNlVXJsO1xyXG4gICAgbGV0IGZvc3NpbFVzZXIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpO1xyXG4gICAgbGV0IGV6cmVtaXRVc2VyID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZXpyZW1pdHVzZXJuYW1lJyk7XHJcblxyXG4gICAgaWYgKGZvc3NpbFVzZXIpIHRoaXMuY3VycmVudFVzZXIgPSBmb3NzaWxVc2VyO1xyXG4gICAgZWxzZSBpZiAoZXpyZW1pdFVzZXIpIHRoaXMuY3VycmVudFVzZXIgPSBlenJlbWl0VXNlcjtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRVc2VyID0gJ3ZpcHVsLmthdGFsZUB4cHJlc3Ntb25leS50ZWNoJztcclxuICAgICAgdGhpcy51c2VybmFtZU1pc3NpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrUmVwb3J0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1JlcG9ydCgpIHtcclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmFuc2FjdGlvbiBFbnF1aXJ5XCIpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHRoaXMuY3VycmVudFVzZXIucmVwbGFjZSgvXCIvZywgJycpO1xyXG5cclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQUNDIEdMIERldGFpbHMgRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRJbml0aWFsRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gJ1RyYW5zYWN0aW9uIEVucXVpcnknKSB7XHJcbiAgICAgIHRoaXMubG9hZEluaXRpYWxEYXRhZm9ydHhuRW5xdWlyeSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlRyYW5zYWN0aW9uIEVucXVpcnlcIikge1xyXG5cclxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gdGhpcy5mYi5ncm91cChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjbGllbnQ6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBicmFuY2g6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB1c2VySWQ6IFsnLTEnXSxcclxuICAgICAgICAgIGN1cnJlbmN5OiBbJ0FsbCddLFxyXG4gICAgICAgICAgcHJvZHVjdDogWydBbGwnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHRyYW5zYWN0aW9uU3RhdHVzOiBbWydBbGwnXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvbk5vOiBbJyddLFxyXG4gICAgICAgICAgY2FyZE5vOiBbJyddLFxyXG4gICAgICAgICAgaWRUeXBlOiBbJyddLFxyXG4gICAgICAgICAgaWRObzogWycnXSxcclxuICAgICAgICAgIHNlbmRlck5hbWU6IFsnJ10sXHJcbiAgICAgICAgICBiZW5lZmljaWFyeU5hbWU6IFsnJ10sXHJcbiAgICAgICAgICB0ZWxObzogWycnXSxcclxuICAgICAgICAgIHJlY2VpdmVBbW91bnQ6IFsnJ10sXHJcbiAgICAgICAgICBicmFuY2hOYW1lOiBbJyddLFxyXG4gICAgICAgICAgY291bnRyeTogWycnXSxcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZFN0YXR1c2VzID0gWydBbGwnXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQUNDIEdMIERldGFpbHMgRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgZGF0ZVR5cGU6IFsxLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW5pdGlhbERhdGFmb3J0eG5FbnF1aXJ5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXBvcnRTZXJ2aWNlXHJcbiAgICAgICAgLmdldFBhZ2VMb2FkRGF0YSh0aGlzLmN1cnJlbnRVc2VyKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50czEgPSBkYXRhLmNsaWVudHMgfHwgW107XHJcbiAgICAgICAgdGhpcy5jdXJyZW5jaWVzID0gZGF0YS5jdXJyZW5jaWVzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNlcyA9IChkYXRhLnRyYW5zYWN0aW9uU3RhdHVzZXMgfHwgW10pLmZpbHRlcihcclxuICAgICAgICAgIHRzID0+IHRzLnRyYW5zYWN0aW9uU3RhdHVzICE9PSAnJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXMuc29tZShcclxuICAgICAgICAgICAgcyA9PiBzLnRyYW5zYWN0aW9uU3RhdHVzID09PSAnQWxsJ1xyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvblN0YXR1c2VzLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvblN0YXR1czogJ0FsbCcsXHJcbiAgICAgICAgICB9IGFzIFRyYW5zYWN0aW9uU3RhdHVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdEZvcm1WYWx1ZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpZW50czEubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnRzMVswXS5idXNpbmVzc1BhcnRuZXJDb2RlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9uQ2xpZW50Q2hhbmdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIGluaXRpYWwgZGF0YSc7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EYXRlQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZnJvbURhdGVTdHIgPT4ge1xyXG4gICAgICBjb25zdCB0b0RhdGVDb250cm9sID0gdGhpcy5zZWFyY2hGb3JtLmdldCgndG9EYXRlJyk7XHJcbiAgICAgIGNvbnN0IHRvRGF0ZVN0ciA9IHRvRGF0ZUNvbnRyb2w/LnZhbHVlO1xyXG4gICAgICBpZiAoIWZyb21EYXRlU3RyIHx8ICF0b0RhdGVTdHIpIHJldHVybjtcclxuICAgICAgY29uc3QgZnJvbURhdGUgPSBuZXcgRGF0ZShmcm9tRGF0ZVN0cik7XHJcbiAgICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKHRvRGF0ZVN0cik7XHJcblxyXG4gICAgICBjb25zdCBtYXhUb0RhdGUgPSBuZXcgRGF0ZShmcm9tRGF0ZSk7XHJcbiAgICAgIG1heFRvRGF0ZT8uc2V0RGF0ZShmcm9tRGF0ZS5nZXREYXRlKCkgKyAzMSk7XHJcbiAgICAgIGlmICh0b0RhdGUgPiBtYXhUb0RhdGUpIHtcclxuICAgICAgICB0b0RhdGVDb250cm9sPy5wYXRjaFZhbHVlKG1heFRvRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF0ZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHRvRGF0ZVN0ciA9PiB7XHJcbiAgICAgIGNvbnN0IGZyb21EYXRlQ29udHJvbCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk7XHJcbiAgICAgIGNvbnN0IGZyb21EYXRlU3RyID0gZnJvbURhdGVDb250cm9sPy52YWx1ZTtcclxuICAgICAgaWYgKCF0b0RhdGVTdHIgfHwgIWZyb21EYXRlU3RyKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKHRvRGF0ZVN0cik7XHJcbiAgICAgIGNvbnN0IGZyb21EYXRlID0gbmV3IERhdGUoZnJvbURhdGVTdHIpO1xyXG5cclxuICAgICAgY29uc3QgbWluRnJvbURhdGUgPSBuZXcgRGF0ZSh0b0RhdGUpO1xyXG4gICAgICBtaW5Gcm9tRGF0ZT8uc2V0RGF0ZSh0b0RhdGUuZ2V0RGF0ZSgpIC0gMzEpO1xyXG4gICAgICBpZiAoZnJvbURhdGUgPCBtaW5Gcm9tRGF0ZSkge1xyXG4gICAgICAgIGZyb21EYXRlQ29udHJvbD8ucGF0Y2hWYWx1ZShtaW5Gcm9tRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc2V0RGVmYXVsdEZvcm1WYWx1ZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51c2VyUmVwb3J0RGVmYXVsdHMpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLnVzZXJSZXBvcnREZWZhdWx0cy5Mb2NhbEN1cnJlbmN5IHx8ICdBbGwnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyBvbkNsaWVudENoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gRW5xdWlyeVwiKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkQ2xpZW50KSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogJycsIHVzZXJJZDogJycgfSk7XHJcbiAgICAgIHRoaXMuYnJhbmNoZXMgPSBbXTtcclxuICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICB0aGlzLnVzZXJzID0gW107XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgIHRoaXMubG9hZEJyYW5jaGVzQnlBZ2VudChzZWxlY3RlZENsaWVudCksXHJcbiAgICAgICAgICB0aGlzLmxvYWRQcm9kdWN0c0J5QWdlbnQoc2VsZWN0ZWRDbGllbnQpLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICdGYWlsZWQgdG8gbG9hZCBicmFuY2gvcHJvZHVjdCc7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEJyYW5jaGVzQnlBZ2VudChhZ2VudENvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYnJhbmNoZXMgPSBhd2FpdCB0aGlzLnJlcG9ydFNlcnZpY2VcclxuICAgICAgLmdldEJyYW5jaGVzQnlBZ2VudChhZ2VudENvZGUsIHRoaXMuY3VycmVudFVzZXIpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgdGhpcy5icmFuY2hlcyA9IGJyYW5jaGVzIHx8IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLmJyYW5jaGVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRVc2Vyc0J5QnJhbmNoKGFnZW50Q29kZSwgdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5icmFuY2hlcy5zb21lKGIgPT4gYi5icmFuY2hDb2RlID09PSAnQWxsJykpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBicmFuY2g6ICdBbGwnIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRVc2Vyc0J5QnJhbmNoKGFnZW50Q29kZSwgJ0FsbCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBicmFuY2g6ICcnIH0pO1xyXG4gICAgICB0aGlzLnVzZXJzID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRQcm9kdWN0c0J5QWdlbnQoYWdlbnRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHByb2R1Y3RzID0gYXdhaXQgdGhpcy5yZXBvcnRTZXJ2aWNlXHJcbiAgICAgIC5nZXRQcm9kdWN0c0J5QWdlbnQoYWdlbnRDb2RlKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIHRoaXMucHJvZHVjdHMgPSBwcm9kdWN0cyB8fCBbXTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQnJhbmNoQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmFuc2FjdGlvbiBFbnF1aXJ5XCIpIHtcclxuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBicmFuY2ggPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdicmFuY2gnKT8udmFsdWU7XHJcbiAgICAgIGlmIChjbGllbnQgJiYgYnJhbmNoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkVXNlcnNCeUJyYW5jaChjbGllbnQsIGJyYW5jaCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51c2VycyA9IFtdO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRVc2Vyc0J5QnJhbmNoKGFnZW50Q29kZTogc3RyaW5nLCBicmFuY2hDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMucmVwb3J0U2VydmljZVxyXG4gICAgICAgIC5nZXRVc2Vyc0J5QnJhbmNoKGFnZW50Q29kZSwgYnJhbmNoQ29kZSlcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAodXNlcnMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51c2VycyA9IHVzZXJzIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSB1c2VyIGluZGljYXRpbmcgXCJBbGxcIlxyXG4gICAgICAgICAgICBjb25zdCBhbGxVc2VyID0gdGhpcy51c2Vycy5maW5kKFxyXG4gICAgICAgICAgICAgIHUgPT4gdS51c2VyTmFtZSA9PT0gJ0FsbCcgfHwgdS51c2VySWQgPT09IC0xXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWxsVXNlcikge1xyXG4gICAgICAgICAgICAgIC8vIElmIFwiQWxsXCIgaXMgcHJlc2VudCwgc2VsZWN0IGl0XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyB1c2VySWQ6IGFsbFVzZXIudXNlcklkIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNlcnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgdXNlciwgc2VsZWN0IHRoYXQgdXNlclxyXG4gICAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgdXNlcklkOiB0aGlzLnVzZXJzWzBdLnVzZXJJZCB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNsZWFyIHVzZXIgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyB1c2VySWQ6ICcnIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHJlamVjdChlcnIpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmFuc2FjdGlvbiBFbnF1aXJ5XCIpIHtcclxuICAgICAgdGhpcy5oYXNTZWFyY2hlZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm0uaW52YWxpZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkYXRpb25FcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tYXJrRm9ybUdyb3VwVG91Y2hlZCh0aGlzLnNlYXJjaEZvcm0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWFyY2hDbGlja2VkLmVtaXQodGhpcy5idWlsZFNlYXJjaENyaXRlcmlhKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJBQ0MgR0wgRGV0YWlscyBFbnF1aXJ5XCIpIHtcclxuICAgICAgY29uc3QgbW9kYWwgPSB7XHJcbiAgICAgICAgc2VsZWN0ZWREYXRlVHlwZTogdGhpcy5zZWFyY2hGb3JtLmNvbnRyb2xzW1wiZGF0ZVR5cGVcIl0/LnZhbHVlLFxyXG4gICAgICAgIHNlbGVjdGVkRGF0ZTogdGhpcy5zZWFyY2hGb3JtLmNvbnRyb2xzW1wiZGF0ZVwiXT8udmFsdWVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlYXJjaENsaWNrZWQuZW1pdChtb2RhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcmtGb3JtR3JvdXBUb3VjaGVkKGZvcm1Hcm91cDogRm9ybUdyb3VwIHwgRm9ybUFycmF5KTogdm9pZCB7XHJcbiAgICBPYmplY3QudmFsdWVzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChjb250cm9sID0+IHtcclxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgIHRoaXMubWFya0Zvcm1Hcm91cFRvdWNoZWQoY29udHJvbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFNlYXJjaENyaXRlcmlhKCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gRW5xdWlyeVwiKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS52YWx1ZTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBiYW5rOiBmb3JtVmFsdWUuY2xpZW50LFxyXG4gICAgICAgIGZyb21EYXRlOiB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSksXHJcbiAgICAgICAgdG9EYXRlOiB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpLFxyXG4gICAgICAgIGJyYW5jaDogZm9ybVZhbHVlLmJyYW5jaCxcclxuICAgICAgICB1c2VyOiBmb3JtVmFsdWUudXNlcklkIHx8ICctMScsXHJcbiAgICAgICAgY3VycmVuY3k6IGZvcm1WYWx1ZS5jdXJyZW5jeSxcclxuICAgICAgICBwcm9kdWN0OiBmb3JtVmFsdWUucHJvZHVjdCxcclxuICAgICAgICBzdGF0dXM6IHRoaXMuc2VsZWN0ZWRTdGF0dXNlcy5pbmNsdWRlcygnQWxsJykgPyBbJyddIDogdGhpcy5zZWxlY3RlZFN0YXR1c2VzLFxyXG4gICAgICAgIHRyYW5zYWN0aW9uTm86IChmb3JtVmFsdWUudHJhbnNhY3Rpb25ObyB8fCAnJykudHJpbSgpLFxyXG4gICAgICAgIGNhcmRObzogZm9ybVZhbHVlLmNhcmRObyB8fCAnJyxcclxuICAgICAgICBpZFR5cGU6IGZvcm1WYWx1ZS5pZFR5cGUgfHwgJycsXHJcbiAgICAgICAgaWRObzogZm9ybVZhbHVlLmlkTm8gfHwgJycsXHJcbiAgICAgICAgc2VuZGVyTmFtZTogZm9ybVZhbHVlLnNlbmRlck5hbWUgfHwgJycsXHJcbiAgICAgICAgYmVuZWZpY2lhcnlOYW1lOiBmb3JtVmFsdWUuYmVuZWZpY2lhcnlOYW1lIHx8ICcnLFxyXG4gICAgICAgIHRlbE5vOiBmb3JtVmFsdWUudGVsTm8gfHwgJycsXHJcbiAgICAgICAgcGF5b3V0QW1vdW50OiBmb3JtVmFsdWUucmVjZWl2ZUFtb3VudCB8fCAnJyxcclxuICAgICAgICBicmFuY2hOYW1lOiBmb3JtVmFsdWUuYnJhbmNoTmFtZSB8fCAnJyxcclxuICAgICAgICBjb21wYW55OiB0aGlzLmNvbXBhbnlDb2RlIHx8ICcnLFxyXG4gICAgICAgIGNvdW50cnk6IGZvcm1WYWx1ZS5jb3VudHJ5IHx8ICcnLFxyXG4gICAgICAgIHN5c1VzZXJJRDogdGhpcy5jdXJyZW50VXNlcixcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvSXNvRm9ybWF0KGRhdGVJbnB1dDogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghZGF0ZUlucHV0KSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIEhhbmRsZSB7IHllYXIsIG1vbnRoLCBkYXkgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0eXBlb2YgZGF0ZUlucHV0ID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICBkYXRlSW5wdXQueWVhciAmJlxyXG4gICAgICBkYXRlSW5wdXQubW9udGggJiZcclxuICAgICAgZGF0ZUlucHV0LmRheVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlSW5wdXQueWVhcjtcclxuICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZUlucHV0Lm1vbnRoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZUlucHV0LmRheSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIEpTIERhdGUgb2JqZWN0XHJcbiAgICBpZiAoZGF0ZUlucHV0IGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICBpZiAoaXNOYU4oZGF0ZUlucHV0LmdldFRpbWUoKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlSW5wdXQuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZUlucHV0LmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZUlucHV0LmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIGRkL01NL3l5eXkgc3RyaW5nXHJcbiAgICBpZiAodHlwZW9mIGRhdGVJbnB1dCA9PT0gJ3N0cmluZycgJiYgZGF0ZUlucHV0LmluY2x1ZGVzKCcvJykpIHtcclxuICAgICAgY29uc3QgcGFydHMgPSBkYXRlSW5wdXQuc3BsaXQoJy8nKTtcclxuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xyXG4gICAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHBhcnRzO1xyXG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRoLnBhZFN0YXJ0KDIsICcwJyl9LSR7ZGF5LnBhZFN0YXJ0KDIsICcwJyl9YDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBJU08gc3RyaW5nICh5eXl5LU1NLWRkIG9yIHl5eXktTU0tZGRUSEg6bW06c3Muc3NzWilcclxuICAgIGlmICh0eXBlb2YgZGF0ZUlucHV0ID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KGRhdGVJbnB1dCkpIHtcclxuICAgICAgLy8gVXNlIG9ubHkgZGF0ZSBwYXJ0IGlmIGZ1bGwgSVNPIHN0cmluZ1xyXG4gICAgICByZXR1cm4gZGF0ZUlucHV0LnN1YnN0cmluZygwLCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG5cclxuICBnZXQgZXJyb3JNZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGVycm9yTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRXJyb3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5FcnJvcjtcclxuICB9XHJcbn1cclxuIiwiPGg2IGNsYXNzPVwiQnJlYWRjcnVtYlwiPlxyXG4gIDxhIGNsYXNzPVwiQnJlYWRDcnVtYkxpbmtcIiBbcm91dGVyTGlua109XCJbJy9yZXBvcnRzJ11cIj5cclxuICAgIDxoMT5SZXBvcnRzPC9oMT5cclxuICA8L2E+XHJcbiAgPGEgaHJlZj1cIkJyZWFkQ3J1bWJMaW5rXCI+PC9hPlxyXG4gIDxzcGFuIGNsYXNzPVwiQnJlYWRDcnVtYkFycm93XCI+PC9zcGFuPlxyXG4gIDxhIGNsYXNzPVwiQnJlYWRDcnVtYkxpbmtcIj5cclxuICAgIDxoMj57eyBSZXBvcnROYW1lIH19PC9oMj5cclxuICA8L2E+XHJcbjwvaDY+XHJcblxyXG48YXBwLWxvYWRlciAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmdcIj48L2FwcC1sb2FkZXI+XHJcblxyXG48c2VjdGlvbiBjbGFzcz1cImZpbHRlci1zZWN0aW9uXCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJzZWFyY2hGb3JtXCIgKG5nU3VibWl0KT1cIm9uU2VhcmNoKClcIiBjbGFzcz1cInJlcG9ydC1maWx0ZXItZm9ybVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWN1c3RvbS0xMC01XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRHluYW1pY2FsbHkgcmVuZGVyIGZpbHRlcnMgaW4gb3JkZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHZpc2libGVGaWVsZHNcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmaWVsZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2NsaWVudCdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPkNsaWVudDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwiY2xpZW50czFcIiBiaW5kTGFiZWw9XCJidXNpbmVzc1BhcnRuZXJOYW1lXCIgYmluZFZhbHVlPVwiYnVzaW5lc3NQYXJ0bmVyQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IENsaWVudFwiIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJjbGllbnRcIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2xpZW50Q2hhbmdlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQnJhbmNoIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2JyYW5jaCdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPkJyYW5jaDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwiYnJhbmNoZXNcIiBiaW5kTGFiZWw9XCJidXNpbmVzc1BhcnRuZXJCcmFuY2hcIiBiaW5kVmFsdWU9XCJicmFuY2hDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQnJhbmNoXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cImJyYW5jaFwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25CcmFuY2hDaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBGcm9tIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCInZnJvbURhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5Gcm9tIERhdGU8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBkYXRlLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBkcGlja2VyXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNmcm9tRGF0ZUlucHV0PVwibmdiRGF0ZXBpY2tlclwiIGZvcm1Db250cm9sTmFtZT1cImZyb21EYXRlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiAoY2xpY2spPVwiZnJvbURhdGVJbnB1dC50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVG8gRGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIid0b0RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5UbyBEYXRlPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgZGF0ZS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHBpY2tlclwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIG5nYkRhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAjdG9EYXRlSW5wdXQ9XCJuZ2JEYXRlcGlja2VyXCIgZm9ybUNvbnRyb2xOYW1lPVwidG9EYXRlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiAoY2xpY2spPVwidG9EYXRlSW5wdXQudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFByb2R1Y3QgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCIncHJvZHVjdCdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlByb2R1Y3Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cInByb2R1Y3RzXCIgYmluZExhYmVsPVwicHJvZHVjdE5hbWVcIiBiaW5kVmFsdWU9XCJwcm9kdWN0Q29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFByb2R1Y3RcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBVc2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3VzZXJJZCdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlVzZXI8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cInVzZXJzXCIgYmluZExhYmVsPVwidXNlck5hbWVcIiBiaW5kVmFsdWU9XCJ1c2VySWRcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBVc2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsZWFyYWJsZV09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cInVzZXJJZFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW5jeSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPkN1cnJlbmN5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJjdXJyZW5jaWVzXCIgYmluZExhYmVsPVwiY3VycmVuY3lDb2RlXCIgYmluZFZhbHVlPVwiY3VycmVuY3lDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ3VycmVuY3lcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHJhbnNhY3Rpb24gU3RhdHVzIChNdWx0aS1zZWxlY3QpIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3RyYW5zYWN0aW9uU3RhdHVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+VHJhbnMuIFN0YXR1czxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBjbGFzcz1cInRyYW5zYWN0aW9uLXN0YXR1cy1zZWxlY3RcIiBbaXRlbXNdPVwidHJhbnNhY3Rpb25TdGF0dXNlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cInRyYW5zYWN0aW9uU3RhdHVzXCIgYmluZFZhbHVlPVwidHJhbnNhY3Rpb25TdGF0dXNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFRyYW5zYWN0aW9uIFN0YXR1c1wiIGZvcm1Db250cm9sTmFtZT1cInRyYW5zYWN0aW9uU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwiZmFsc2VcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgW3NlYXJjaGFibGVdPVwiZmFsc2VcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWl0ZW0kPVwiaXRlbSRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXRlbSQuc2VsZWN0ZWRcIiAvPiB7eyBpdGVtLnRyYW5zYWN0aW9uU3RhdHVzIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRyYW5zYWN0aW9uIE5vIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3RyYW5zYWN0aW9uTm8nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5UcmFucy4gTnVtYmVyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHBpY2tlclwiIGZvcm1Db250cm9sTmFtZT1cInRyYW5zYWN0aW9uTm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHRyYW5zYWN0aW9uIG51bWJlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBWYWx1ZSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3ZhbHVlRGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlZhbHVlIERhdGU8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBkcGlja2VyXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICN0b0RhdGVJbnB1dD1cIm5nYkRhdGVwaWNrZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJ0b0RhdGVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidG9EYXRlSW5wdXQudG9nZ2xlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSBUeXBlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVUeXBlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+RGF0ZSBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IHBsYWNlaG9sZGVyPVwiLSBQbGVhc2Ugc2VsZWN0IC1cIiBmb3JtQ29udHJvbE5hbWU9XCJkYXRlVHlwZVwiIFtjbGVhcmFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLW9wdGlvbiBbdmFsdWVdPVwiMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIERhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1vcHRpb24gW3ZhbHVlXT1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBQb3N0aW5nIERhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPkRhdGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBkYXRlLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBkcGlja2VyXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICN0b0RhdGVJbnB1dD1cIm5nYkRhdGVwaWNrZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJkYXRlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiAoY2xpY2spPVwidG9EYXRlSW5wdXQudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1jdXN0b20tMS01XCI+XHJcbiAgICAgICAgPCEtLSBWaWV3IFJlcG9ydCBCdXR0b24gKEFsd2F5cyBhdCBUb3AtUmlnaHQpIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkIHZpZXctcmVwb3J0LWJ0blwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXJlcG9ydFwiPlZpZXc8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbjwvc2VjdGlvbj5cclxuPGhyPlxyXG48IS0tIEVycm9yIE1lc3NhZ2VzIC0tPlxyXG48ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIG10LTNcIiAqbmdJZj1cImZvcm1WYWxpZGF0aW9uRXJyb3IgJiYgaGFzU2VhcmNoZWRcIj5cclxuICBQbGVhc2UgZmlsbCBhbGwgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBmb3JtLlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgbXQtM1wiICpuZ0lmPVwiZXJyb3JNZXNzYWdlICYmIGxvYWRpbmdTdGF0ZSA9PT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yXCI+XHJcbiAge3sgZXJyb3JNZXNzYWdlIH19XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwiZXJyb3JNZXNzYWdlID0gJydcIj48L2J1dHRvbj5cclxuPC9kaXY+Il19
|