@sachin9822/reports-lib 0.0.213 → 0.0.215
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 +240 -0
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +614 -0
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +263 -0
- package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +718 -0
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +275 -0
- package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
- package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +282 -0
- package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +332 -0
- package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +631 -0
- package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
- package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
- package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
- package/esm2020/lib/models/app-config.model.mjs +2 -0
- package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -0
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
- package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
- package/esm2020/lib/models/component-loading-states.mjs +7 -0
- package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
- package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
- package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
- package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
- package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
- package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
- package/esm2020/lib/reports-lib.component.mjs +22 -0
- package/esm2020/lib/reports-lib.module.mjs +172 -0
- package/esm2020/lib/reports-lib.service.mjs +14 -0
- package/esm2020/lib/services/config.service.mjs +39 -0
- package/esm2020/lib/services/report.service.mjs +374 -0
- package/esm2020/lib/shared/export-generic.service.mjs +443 -0
- package/esm2020/lib/shared/export.service.mjs +379 -0
- package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
- package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2147 -0
- package/esm2020/lib/shared/shared.module.mjs +21 -0
- package/esm2020/public-api.mjs +41 -0
- package/esm2020/sachin9822-reports-lib.mjs +5 -0
- package/fesm2015/sachin9822-reports-lib.mjs +8649 -0
- package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
- package/fesm2020/sachin9822-reports-lib.mjs +8510 -0
- package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
- package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
- package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
- package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
- package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +108 -0
- package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
- package/lib/components/funding-report/funding-report.component.d.ts +55 -0
- package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
- package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
- package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +69 -0
- package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +71 -0
- package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
- package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
- package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
- package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
- package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
- package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
- package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
- package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -0
- package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
- package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +24 -0
- package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
- package/lib/models/component-loading-states.d.ts +5 -0
- package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
- package/{src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts → lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts} +1 -1
- package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
- package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
- package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +38 -0
- package/lib/reports-lib-routing.module.d.ts +7 -0
- package/lib/reports-lib.component.d.ts +8 -0
- package/lib/reports-lib.module.d.ts +33 -0
- package/lib/reports-lib.service.d.ts +6 -0
- package/lib/services/config.service.d.ts +20 -0
- package/lib/services/report.service.d.ts +80 -0
- package/lib/shared/export-generic.service.d.ts +50 -0
- package/lib/shared/export.service.d.ts +32 -0
- package/lib/shared/loader/loader.component.d.ts +5 -0
- package/lib/shared/metadata/metadata.component.d.ts +24 -0
- package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
- package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
- package/lib/shared/shared.module.d.ts +11 -0
- package/package.json +31 -16
- package/{src/public-api.ts → public-api.d.ts} +7 -17
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -17
- package/src/assets/images/BreadcrumbArrow.png +0 -0
- package/src/assets/images/XMCoral.png +0 -0
- package/src/lib/assets/images/Search.svg +0 -10
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
- package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
- package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
- package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
- package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
- package/src/lib/components/funding-report/funding-report.component.html +0 -49
- package/src/lib/components/funding-report/funding-report.component.scss +0 -1
- package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
- package/src/lib/components/funding-report/funding-report.component.ts +0 -221
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
- package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
- package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
- package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
- package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
- package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
- package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
- package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
- package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
- package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
- package/src/lib/models/component-loading-states.ts +0 -5
- package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
- package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
- package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
- package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
- package/src/lib/reports-lib-routing.module.ts +0 -20
- package/src/lib/reports-lib.component.spec.ts +0 -23
- package/src/lib/reports-lib.component.ts +0 -20
- package/src/lib/reports-lib.module.ts +0 -102
- package/src/lib/reports-lib.service.spec.ts +0 -16
- package/src/lib/reports-lib.service.ts +0 -9
- package/src/lib/services/config.service.ts +0 -43
- package/src/lib/services/report.service.spec.ts +0 -16
- package/src/lib/services/report.service.ts +0 -463
- package/src/lib/shared/export-generic.service.ts +0 -557
- package/src/lib/shared/export.service.spec.ts +0 -16
- package/src/lib/shared/export.service.ts +0 -457
- package/src/lib/shared/loader/loader.component.html +0 -8
- package/src/lib/shared/loader/loader.component.scss +0 -52
- package/src/lib/shared/loader/loader.component.ts +0 -10
- package/src/lib/shared/metadata/metadata.component.html +0 -42
- package/src/lib/shared/metadata/metadata.component.scss +0 -95
- package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
- package/src/lib/shared/metadata/metadata.component.ts +0 -38
- package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
- package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
- package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
- package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
- package/src/lib/shared/search-filter/search-filter.component.html +0 -601
- package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
- package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
- package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
- package/src/lib/shared/shared.module.ts +0 -13
- package/src/styles/ag-grid-report-style.scss +0 -71
- package/src/styles/common-ag-grid-style.scss +0 -146
- package/src/styles/common-report-style.scss +0 -395
- package/src/styles/common-style.scss +0 -615
- package/src/test.ts +0 -27
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
- /package/{src/lib → lib}/assets/config/app-config.json +0 -0
- /package/{src → lib}/assets/images/Search.svg +0 -0
- /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
- /package/{src/lib → lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
|
@@ -0,0 +1,2147 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { ComponentLoadingState } from '../../models/transaction-enquiry-report/transaction-enquiry.model';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { forkJoin, of } from 'rxjs';
|
|
6
|
+
import { catchError, finalize, map, switchMap } from 'rxjs/operators';
|
|
7
|
+
import { takeUntil } from 'rxjs/operators';
|
|
8
|
+
import * as angularCommon from '@angular/common';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../../services/report.service";
|
|
11
|
+
import * as i2 from "@angular/forms";
|
|
12
|
+
import * as i3 from "../../services/config.service";
|
|
13
|
+
import * as i4 from "@angular/router";
|
|
14
|
+
import * as i5 from "@angular/common";
|
|
15
|
+
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
|
16
|
+
import * as i7 from "@ng-select/ng-select";
|
|
17
|
+
import * as i8 from "../loader/loader.component";
|
|
18
|
+
export class SearchFilterComponent {
|
|
19
|
+
constructor(reportService, fb, config, cd) {
|
|
20
|
+
this.reportService = reportService;
|
|
21
|
+
this.fb = fb;
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.cd = cd;
|
|
24
|
+
this.searchClicked = new EventEmitter();
|
|
25
|
+
this.formValid = new EventEmitter();
|
|
26
|
+
this.formValidationError = false;
|
|
27
|
+
this.destroy$ = new Subject();
|
|
28
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
29
|
+
this.ComponentLoadingState = ComponentLoadingState;
|
|
30
|
+
this.hasSearched = false;
|
|
31
|
+
this._errorMessage = '';
|
|
32
|
+
this.currentUser = '';
|
|
33
|
+
this.usernameMissing = false;
|
|
34
|
+
this.token = sessionStorage.getItem('access_token');
|
|
35
|
+
this.applicationType = 'ezremit';
|
|
36
|
+
this.companyCode = 'BH';
|
|
37
|
+
this.isOpen = false;
|
|
38
|
+
this.clients1 = [];
|
|
39
|
+
this.branches = [];
|
|
40
|
+
this.users = [];
|
|
41
|
+
this.currencies = [];
|
|
42
|
+
this.products = [];
|
|
43
|
+
this.transactionStatuses = [];
|
|
44
|
+
this.summaryReportTypes = [];
|
|
45
|
+
this.selectedStatuses = [];
|
|
46
|
+
this.showStatusDropdown = false;
|
|
47
|
+
this.visibleFieldKeys = [];
|
|
48
|
+
this.countries = [];
|
|
49
|
+
this.transactionProducts = [];
|
|
50
|
+
this.dateType = 1;
|
|
51
|
+
this.sendBusinessPartnerAgents = [];
|
|
52
|
+
this.recvBusinessPartnerAgents = [];
|
|
53
|
+
this.isSelectAllChecked = true;
|
|
54
|
+
this.erroMessage = 'Error in Loading Data';
|
|
55
|
+
// for Trial Balance - Accounts Report
|
|
56
|
+
this.businessLines = [];
|
|
57
|
+
this.accountStatuses = [];
|
|
58
|
+
this.currency = [];
|
|
59
|
+
this.financialYears = [];
|
|
60
|
+
this.fromMonths = [];
|
|
61
|
+
this.toMonths = [];
|
|
62
|
+
this.dateTypes = [];
|
|
63
|
+
this.fromDays = [];
|
|
64
|
+
this.toDays = [];
|
|
65
|
+
this.paramDateDefault = [];
|
|
66
|
+
// Field visibility map, 'fromDate', 'toDate','product','userId','currency','transactionStatus','transactionNo'
|
|
67
|
+
this.visibleFieldsMap = {
|
|
68
|
+
'Transaction Enquiry': ['client', 'fromDate', 'toDate', 'branch', 'product', 'currency', 'transactionStatus', 'transactionNo'],
|
|
69
|
+
'FC Ledger': ['client', 'fromDate', 'toDate', 'currency', 'product'],
|
|
70
|
+
'Branch Activity Send': ['client', 'fromDate', 'toDate', 'branch', 'transactionProduct', 'receiveCurrency', 'transactionStatus', 'sendCountry', 'receiveCountry'],
|
|
71
|
+
'ACC GL Details Enquiry': ['dateType', 'date'],
|
|
72
|
+
'Branch Activity Receive': ['client', 'fromDate', 'toDate', 'branch', 'transactionProduct', 'receiveCurrency', 'transactionStatus', 'sendCountry', 'receiveCountry'],
|
|
73
|
+
'Cancellation Transaction': ['client', 'fromDate', 'toDate', 'branch', 'sendCountry', 'receiveCountry', 'product', 'receiveCurrency'],
|
|
74
|
+
'Revenue Per Transaction': ['sendBusinessPartner', 'fromDate', 'toDate', 'recvBusinessPartner', 'sendCountry', 'receiveCountry', 'transactionStatus'],
|
|
75
|
+
'Statement of Accounts': ['client', 'fromDate', 'toDate'],
|
|
76
|
+
'Accounting': ['client', 'fromDate', 'toDate', 'branch', 'transactionProduct', 'sendCurrency', 'transactionStatus', 'sendCountry', 'receiveCountry'],
|
|
77
|
+
'Credit Limit Status Enquiry': ['client', 'fromDate', 'toDate', 'transactionStatusSingleSelect'],
|
|
78
|
+
'Funding': ['fromDate', 'toDate'],
|
|
79
|
+
'Trial Balance - Accounts': ['businessLine', 'accountStatus', 'currency', 'financialYear', 'fromMonth', 'toMonth', 'dateTypeForTrialBalanceAccounts', 'fromDay', 'toDay'],
|
|
80
|
+
'Branch Activity Send Summary': ['client', 'fromDate', 'toDate', 'branch', 'transactionProduct', 'receiveCurrency', 'transactionStatus', 'sendCountry', 'receiveCountry', 'summaryReport'],
|
|
81
|
+
'Transaction Monitoring': ['client', 'fromDate', 'toDate', 'branch', 'transactionProduct', 'receiveCurrency', 'transactionStatus', 'sendCountry', 'receiveCountry'],
|
|
82
|
+
// Add more report types here
|
|
83
|
+
};
|
|
84
|
+
this.currencySearch = (term, item) => {
|
|
85
|
+
term = term.toLowerCase();
|
|
86
|
+
return (item.currencyCode.toLowerCase().includes(term));
|
|
87
|
+
};
|
|
88
|
+
// ----------------- Improved search criteria helpers (handles product) -----------------
|
|
89
|
+
this.fieldLabelMap = {
|
|
90
|
+
client: 'Client:',
|
|
91
|
+
branch: 'Branch:',
|
|
92
|
+
fromDate: 'From Date:',
|
|
93
|
+
toDate: 'To Date:',
|
|
94
|
+
product: 'Product:',
|
|
95
|
+
transactionProduct: 'Product:',
|
|
96
|
+
userId: 'User:',
|
|
97
|
+
currency: 'Currency:',
|
|
98
|
+
sendCurrency: 'Send Currency:',
|
|
99
|
+
receiveCurrency: 'Receive Currency:',
|
|
100
|
+
transactionStatus: 'Txn. Status:',
|
|
101
|
+
transactionStatusSingleSelect: 'Txn. Status:',
|
|
102
|
+
transactionNo: 'Txn. Number:',
|
|
103
|
+
date: 'Date:',
|
|
104
|
+
dateType: 'Date Type:',
|
|
105
|
+
valueDate: 'Value Date:',
|
|
106
|
+
sendCountry: 'Send Country:',
|
|
107
|
+
receiveCountry: 'Receive Country:',
|
|
108
|
+
sendBusinessPartner: 'Sender Partner:',
|
|
109
|
+
recvBusinessPartner: 'Receiver Partner:',
|
|
110
|
+
businessLine: 'Business Line:',
|
|
111
|
+
financialYear: 'Financial Year:',
|
|
112
|
+
fromMonth: 'From Month:',
|
|
113
|
+
toMonth: 'To Month:',
|
|
114
|
+
fromDay: 'From Day:',
|
|
115
|
+
toDay: 'To Day:',
|
|
116
|
+
accountStatus: 'Account Status:',
|
|
117
|
+
// add more mappings as needed
|
|
118
|
+
};
|
|
119
|
+
// map visible field name -> actual form control name (when they differ)
|
|
120
|
+
this.fieldToControlMap = {
|
|
121
|
+
transactionStatusSingleSelect: 'transactionStatus',
|
|
122
|
+
transactionProduct: 'product', // important: transactionProduct UI uses form control named 'product'
|
|
123
|
+
// add other mappings if visibleField name differs from the form control name
|
|
124
|
+
};
|
|
125
|
+
// maps to use bindLabel / bindValue for lookups
|
|
126
|
+
this.fieldBindLabelMap = {
|
|
127
|
+
client: 'businessPartnerName',
|
|
128
|
+
branch: 'businessPartnerBranch',
|
|
129
|
+
product: 'productCode',
|
|
130
|
+
transactionProduct: 'productCode',
|
|
131
|
+
transactionStatus: 'transactionStatus',
|
|
132
|
+
transactionStatusSingleSelect: 'transactionStatus',
|
|
133
|
+
userId: 'userName',
|
|
134
|
+
currency: 'currency',
|
|
135
|
+
sendCurrency: 'currency',
|
|
136
|
+
receiveCurrency: 'currency',
|
|
137
|
+
sendBusinessPartner: 'name',
|
|
138
|
+
recvBusinessPartner: 'name',
|
|
139
|
+
businessLine: 'businessLine',
|
|
140
|
+
financialYear: 'financialYear',
|
|
141
|
+
fromMonth: 'period',
|
|
142
|
+
toMonth: 'pMonthName',
|
|
143
|
+
fromDay: 'individualDay',
|
|
144
|
+
toDay: 'pDate',
|
|
145
|
+
accountStatus: 'statusName'
|
|
146
|
+
};
|
|
147
|
+
this.fieldBindValueMap = {
|
|
148
|
+
client: 'businessPartnerCode',
|
|
149
|
+
branch: 'branchCode',
|
|
150
|
+
product: 'productCode',
|
|
151
|
+
transactionProduct: 'productCode',
|
|
152
|
+
transactionStatus: 'transactionStatus',
|
|
153
|
+
transactionStatusSingleSelect: 'transactionStatus',
|
|
154
|
+
userId: 'userId',
|
|
155
|
+
currency: 'currencyCode',
|
|
156
|
+
sendCurrency: 'currencyCode',
|
|
157
|
+
receiveCurrency: 'currencyCode',
|
|
158
|
+
sendBusinessPartner: 'id',
|
|
159
|
+
recvBusinessPartner: 'id',
|
|
160
|
+
businessLine: 'businessLine',
|
|
161
|
+
financialYear: 'financialYear',
|
|
162
|
+
fromMonth: 'pOrder',
|
|
163
|
+
toMonth: 'pMonth',
|
|
164
|
+
fromDay: 'individualDate',
|
|
165
|
+
toDay: 'individualDate',
|
|
166
|
+
accountStatus: 'statusCode'
|
|
167
|
+
};
|
|
168
|
+
this.serviceUrl = this.config.get.serviceUrl;
|
|
169
|
+
let fossilUser = sessionStorage.getItem('fossilusername');
|
|
170
|
+
let ezremitUser = sessionStorage.getItem('ezremitusername');
|
|
171
|
+
if (fossilUser)
|
|
172
|
+
this.currentUser = fossilUser;
|
|
173
|
+
else if (ezremitUser)
|
|
174
|
+
this.currentUser = ezremitUser;
|
|
175
|
+
else {
|
|
176
|
+
this.usernameMissing = true;
|
|
177
|
+
}
|
|
178
|
+
this.currentUser = this.currentUser.replace(/^["'](.*)["']$/, '$1');
|
|
179
|
+
}
|
|
180
|
+
get visibleFields() {
|
|
181
|
+
return this.visibleFieldsMap[this.ReportName] || [];
|
|
182
|
+
}
|
|
183
|
+
isFieldVisible(field) {
|
|
184
|
+
return this.visibleFields.includes(field);
|
|
185
|
+
}
|
|
186
|
+
ngOnInit() {
|
|
187
|
+
const today = new Date();
|
|
188
|
+
this.disabledDate = {
|
|
189
|
+
year: today.getFullYear(),
|
|
190
|
+
month: today.getMonth() + 1,
|
|
191
|
+
day: today.getDate()
|
|
192
|
+
};
|
|
193
|
+
this.checkReport();
|
|
194
|
+
}
|
|
195
|
+
ngOnDestroy() {
|
|
196
|
+
this.destroy$.next();
|
|
197
|
+
this.destroy$.complete();
|
|
198
|
+
}
|
|
199
|
+
checkReport() {
|
|
200
|
+
if (this.ReportName == "Transaction Enquiry") {
|
|
201
|
+
this.initializeForm();
|
|
202
|
+
this.subscribeToDateChanges();
|
|
203
|
+
this.loadInitialData();
|
|
204
|
+
this.transactionStatusSubscribe();
|
|
205
|
+
}
|
|
206
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
207
|
+
this.initializeForm();
|
|
208
|
+
this.loadInitialData();
|
|
209
|
+
this.subscribeToDateChanges();
|
|
210
|
+
this.transactionStatusSubscribe();
|
|
211
|
+
}
|
|
212
|
+
if (this.ReportName == "ACC GL Details Enquiry") {
|
|
213
|
+
this.initializeForm();
|
|
214
|
+
}
|
|
215
|
+
if (this.ReportName == "Cancellation Transaction") {
|
|
216
|
+
this.initializeForm();
|
|
217
|
+
this.loadInitialData();
|
|
218
|
+
this.subscribeToDateChanges();
|
|
219
|
+
}
|
|
220
|
+
if (this.ReportName === "Branch Activity Receive") {
|
|
221
|
+
this.initializeForm();
|
|
222
|
+
this.loadInitialData();
|
|
223
|
+
this.subscribeToDateChanges();
|
|
224
|
+
this.transactionStatusSubscribe();
|
|
225
|
+
}
|
|
226
|
+
if (this.ReportName === "Revenue Per Transaction") {
|
|
227
|
+
this.initializeForm();
|
|
228
|
+
this.loadInitialData();
|
|
229
|
+
this.subscribeToDateChanges();
|
|
230
|
+
this.transactionStatusSubscribe();
|
|
231
|
+
}
|
|
232
|
+
if (this.ReportName == "Statement of Accounts") {
|
|
233
|
+
this.initializeForm();
|
|
234
|
+
this.loadInitialData();
|
|
235
|
+
this.subscribeToDateChanges();
|
|
236
|
+
}
|
|
237
|
+
if (this.ReportName == "Accounting") {
|
|
238
|
+
this.initializeForm();
|
|
239
|
+
this.loadInitialData();
|
|
240
|
+
this.subscribeToDateChanges();
|
|
241
|
+
this.transactionStatusSubscribe();
|
|
242
|
+
}
|
|
243
|
+
if (this.ReportName === "Credit Limit Status Enquiry") {
|
|
244
|
+
this.initializeForm();
|
|
245
|
+
this.loadInitialData();
|
|
246
|
+
this.subscribeToDateChanges();
|
|
247
|
+
}
|
|
248
|
+
if (this.ReportName == "Funding") {
|
|
249
|
+
this.initializeForm();
|
|
250
|
+
this.subscribeToDateChanges();
|
|
251
|
+
}
|
|
252
|
+
if (this.ReportName == "Trial Balance - Accounts") {
|
|
253
|
+
this.initializeForm();
|
|
254
|
+
this.loadInitialData();
|
|
255
|
+
}
|
|
256
|
+
if (this.ReportName == "Branch Activity Send Summary") {
|
|
257
|
+
this.initializeForm();
|
|
258
|
+
this.loadInitialData();
|
|
259
|
+
this.subscribeToDateChanges();
|
|
260
|
+
this.transactionStatusSubscribe();
|
|
261
|
+
}
|
|
262
|
+
if (this.ReportName == "Transaction Monitoring") {
|
|
263
|
+
this.initializeForm();
|
|
264
|
+
this.loadInitialData();
|
|
265
|
+
this.subscribeToDateChanges();
|
|
266
|
+
this.transactionStatusSubscribe();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
loadInitialData() {
|
|
270
|
+
if (this.ReportName == 'Transaction Enquiry') {
|
|
271
|
+
this.loadInitialDatafortxnEnquiry();
|
|
272
|
+
}
|
|
273
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
274
|
+
this.loadInitialDataforBranchActivitySend();
|
|
275
|
+
}
|
|
276
|
+
if (this.ReportName === "Branch Activity Receive") {
|
|
277
|
+
this.loadInitialDataforBranchActivityReceive();
|
|
278
|
+
}
|
|
279
|
+
if (this.ReportName == "Cancellation Transaction") {
|
|
280
|
+
this.loadInitialDataForCancellationReport();
|
|
281
|
+
}
|
|
282
|
+
if (this.ReportName === "Revenue Per Transaction") {
|
|
283
|
+
this.loadDataForRevenuePerTransactionReport();
|
|
284
|
+
}
|
|
285
|
+
if (this.ReportName == "Statement of Accounts") {
|
|
286
|
+
this.loadInitialDataForStatementOfAccounts();
|
|
287
|
+
}
|
|
288
|
+
if (this.ReportName == "Accounting") {
|
|
289
|
+
this.loadInitialDataforAccounting();
|
|
290
|
+
}
|
|
291
|
+
if (this.ReportName == "Trial Balance - Accounts") {
|
|
292
|
+
this.loadInitialDataForTrialBalanceAccounts();
|
|
293
|
+
}
|
|
294
|
+
if (this.ReportName === "Credit Limit Status Enquiry") {
|
|
295
|
+
this.loadInitialDataForCreditLimitStatusEnquiry();
|
|
296
|
+
}
|
|
297
|
+
if (this.ReportName == "Branch Activity Send Summary") {
|
|
298
|
+
this.loadInitialDataforBranchActivitySendSummary();
|
|
299
|
+
}
|
|
300
|
+
if (this.ReportName == "Transaction Monitoring") {
|
|
301
|
+
this.loadInitialDataforTransactionMonitoring();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
loadInitialDataforBranchActivitySendSummary() {
|
|
305
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
306
|
+
forkJoin({
|
|
307
|
+
params: this.reportService.getParamsForSendSummaryReport().pipe(catchError(err => {
|
|
308
|
+
console.error('Error loading params', err);
|
|
309
|
+
return of(null);
|
|
310
|
+
})),
|
|
311
|
+
clients: this.reportService.getPayInAgentforSendSummaryReport().pipe(map((clients) => clients.map((client, index) => ({
|
|
312
|
+
businessPartnerName: client.agent,
|
|
313
|
+
businessPartnerCode: client.code,
|
|
314
|
+
displayOrder: index,
|
|
315
|
+
clientType: ""
|
|
316
|
+
}))), catchError(err => {
|
|
317
|
+
console.error('Error loading clients', err);
|
|
318
|
+
return of([]);
|
|
319
|
+
}))
|
|
320
|
+
}).subscribe({
|
|
321
|
+
next: ({ params, clients }) => {
|
|
322
|
+
this.params = params;
|
|
323
|
+
this.clients1 = clients;
|
|
324
|
+
this.countries = [...params?.countries];
|
|
325
|
+
this.currencies = [...params?.currencies];
|
|
326
|
+
this.transactionStatuses = [...params?.transactionStatusTypes];
|
|
327
|
+
this.transactionProducts = [...params?.transactionProductTypes];
|
|
328
|
+
this.summaryReportTypes = [
|
|
329
|
+
{ label: 'Date-Wise Summary', value: 'Date-Wise Summary' },
|
|
330
|
+
{ label: 'Total Summary', value: 'Total Summary' }
|
|
331
|
+
];
|
|
332
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
333
|
+
this.onClientChange();
|
|
334
|
+
},
|
|
335
|
+
error: err => {
|
|
336
|
+
console.error('Unexpected forkJoin error', err);
|
|
337
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
338
|
+
},
|
|
339
|
+
complete: () => {
|
|
340
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
loadInitialDataforTransactionMonitoring() {
|
|
345
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
346
|
+
forkJoin({
|
|
347
|
+
params: this.reportService.getParamsForTransactionMonitoringReport().pipe(catchError(err => {
|
|
348
|
+
console.error('Error loading params', err);
|
|
349
|
+
return of(null);
|
|
350
|
+
})),
|
|
351
|
+
clients: this.reportService.getPayInAgentforTransactionMonitoringReport().pipe(map((clients) => clients.map((client, index) => ({
|
|
352
|
+
businessPartnerName: client.agent,
|
|
353
|
+
businessPartnerCode: client.code,
|
|
354
|
+
displayOrder: index,
|
|
355
|
+
clientType: ""
|
|
356
|
+
}))), catchError(err => {
|
|
357
|
+
console.error('Error loading clients', err);
|
|
358
|
+
return of([]);
|
|
359
|
+
}))
|
|
360
|
+
}).subscribe({
|
|
361
|
+
next: ({ params, clients }) => {
|
|
362
|
+
this.params = params;
|
|
363
|
+
this.clients1 = clients;
|
|
364
|
+
this.countries = [...params?.countries];
|
|
365
|
+
this.currencies = [...params?.currencies];
|
|
366
|
+
this.transactionStatuses = [...params?.transactionStatusTypes];
|
|
367
|
+
this.transactionProducts = [...params?.transactionProductTypes];
|
|
368
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
369
|
+
if (this.initialFilters) {
|
|
370
|
+
//patch data
|
|
371
|
+
this.applyInitialFilters();
|
|
372
|
+
}
|
|
373
|
+
this.onClientChange();
|
|
374
|
+
// AUTO LOAD ONLY for routed case
|
|
375
|
+
if (this.initialFilters) {
|
|
376
|
+
this.onSearch();
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
error: err => {
|
|
380
|
+
console.error('Unexpected forkJoin error', err);
|
|
381
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
382
|
+
},
|
|
383
|
+
complete: () => {
|
|
384
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
applyInitialFilters() {
|
|
389
|
+
if (!this.initialFilters)
|
|
390
|
+
return;
|
|
391
|
+
const patch = {};
|
|
392
|
+
// Transaction Status (STRING → ARRAY)
|
|
393
|
+
if (this.initialFilters.transactionStatus) {
|
|
394
|
+
patch.transactionStatus = [this.initialFilters.transactionStatus];
|
|
395
|
+
}
|
|
396
|
+
// Receive Country
|
|
397
|
+
if (this.initialFilters.receiveCountry) {
|
|
398
|
+
patch.receiveCountry = this.initialFilters.receiveCountry;
|
|
399
|
+
}
|
|
400
|
+
// Realtime handling
|
|
401
|
+
if (this.initialFilters.isRealtime) {
|
|
402
|
+
patch.fromDate = '';
|
|
403
|
+
patch.toDate = '';
|
|
404
|
+
//clear
|
|
405
|
+
this.searchForm.get('fromDate')?.clearValidators();
|
|
406
|
+
this.searchForm.get('toDate')?.clearValidators();
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
// Only override if values exist (VERY IMPORTANT)
|
|
410
|
+
if (this.initialFilters.toDate) {
|
|
411
|
+
patch.toDate = this.initialFilters.toDate;
|
|
412
|
+
}
|
|
413
|
+
if (this.initialFilters.fromDate) {
|
|
414
|
+
patch.fromDate = this.initialFilters.fromDate;
|
|
415
|
+
}
|
|
416
|
+
this.searchForm.get('fromDate')?.setValidators(Validators.required);
|
|
417
|
+
this.searchForm.get('toDate')?.setValidators(Validators.required);
|
|
418
|
+
}
|
|
419
|
+
// Single patch call (avoids multiple triggers)
|
|
420
|
+
this.searchForm.patchValue(patch, { emitEvent: false });
|
|
421
|
+
this.searchForm.get('fromDate')?.updateValueAndValidity({ emitEvent: false });
|
|
422
|
+
this.searchForm.get('toDate')?.updateValueAndValidity({ emitEvent: false });
|
|
423
|
+
}
|
|
424
|
+
initializeForm() {
|
|
425
|
+
if (this.ReportName == "Transaction Enquiry") {
|
|
426
|
+
this.searchForm = this.fb.group({
|
|
427
|
+
client: [null, Validators.required],
|
|
428
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
429
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
430
|
+
branch: [null, Validators.required],
|
|
431
|
+
product: [null, Validators.required],
|
|
432
|
+
currency: ['All'],
|
|
433
|
+
transactionStatus: [['All'], Validators.required],
|
|
434
|
+
transactionNo: ['']
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
if (this.ReportName == "ACC GL Details Enquiry") {
|
|
438
|
+
this.searchForm = this.fb.group({
|
|
439
|
+
date: [new Date().toISOString().split("T")[0], Validators.required],
|
|
440
|
+
dateType: [1, Validators.required]
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
444
|
+
this.searchForm = this.fb.group({
|
|
445
|
+
client: [null, Validators.required],
|
|
446
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
447
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
448
|
+
branch: [null, Validators.required],
|
|
449
|
+
receiveCurrency: ['All'],
|
|
450
|
+
product: ['All', Validators.required],
|
|
451
|
+
transactionStatus: [['All'], Validators.required],
|
|
452
|
+
sendCountry: ['All'],
|
|
453
|
+
receiveCountry: ['All']
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
if (this.ReportName == "Branch Activity Receive") {
|
|
457
|
+
this.searchForm = this.fb.group({
|
|
458
|
+
client: [null, Validators.required],
|
|
459
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
460
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
461
|
+
branch: [null, Validators.required],
|
|
462
|
+
receiveCurrency: ['All'],
|
|
463
|
+
product: ['All', Validators.required],
|
|
464
|
+
transactionStatus: [['All'], Validators.required],
|
|
465
|
+
sendCountry: ['All'],
|
|
466
|
+
receiveCountry: ['All']
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
if (this.ReportName == "Cancellation Transaction") {
|
|
470
|
+
this.searchForm = this.fb.group({
|
|
471
|
+
client: [null, Validators.required],
|
|
472
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
473
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
474
|
+
branch: [null, Validators.required],
|
|
475
|
+
sendCountry: [null],
|
|
476
|
+
receiveCountry: [null],
|
|
477
|
+
product: [null, Validators.required],
|
|
478
|
+
receiveCurrency: [null, Validators.required],
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
if (this.ReportName === "Revenue Per Transaction") {
|
|
482
|
+
this.searchForm = this.fb.group({
|
|
483
|
+
sendBusinessPartner: [null, Validators.required],
|
|
484
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
485
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
486
|
+
recvBusinessPartner: [null, Validators.required],
|
|
487
|
+
transactionStatus: [['All'], Validators.required],
|
|
488
|
+
sendCountry: ['All'],
|
|
489
|
+
receiveCountry: ['All']
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
if (this.ReportName == "Statement of Accounts") {
|
|
493
|
+
this.searchForm = this.fb.group({
|
|
494
|
+
client: [null, Validators.required],
|
|
495
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
496
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required]
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
if (this.ReportName == "Accounting") {
|
|
500
|
+
this.searchForm = this.fb.group({
|
|
501
|
+
client: [null, Validators.required],
|
|
502
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
503
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
504
|
+
branch: [null, Validators.required],
|
|
505
|
+
currency: ['All'],
|
|
506
|
+
product: ['All', Validators.required],
|
|
507
|
+
transactionStatus: [['All'], Validators.required],
|
|
508
|
+
sendCountry: ['All'],
|
|
509
|
+
receiveCountry: ['All']
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
if (this.ReportName === "Credit Limit Status Enquiry") {
|
|
513
|
+
this.searchForm = this.fb.group({
|
|
514
|
+
client: [null, Validators.required],
|
|
515
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
516
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
517
|
+
transactionStatus: ['All', Validators.required],
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
if (this.ReportName == "Funding") {
|
|
521
|
+
this.searchForm = this.fb.group({
|
|
522
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
523
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required]
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
if (this.ReportName == "Trial Balance - Accounts") {
|
|
527
|
+
this.searchForm = this.fb.group({
|
|
528
|
+
// Added fields
|
|
529
|
+
businessLine: ['All'],
|
|
530
|
+
accountStatus: [['Active']],
|
|
531
|
+
financialYear: [new Date().getFullYear().toString()],
|
|
532
|
+
fromMonth: [''],
|
|
533
|
+
toMonth: [''],
|
|
534
|
+
dateType: ['VD'],
|
|
535
|
+
fromDay: [null, Validators.required],
|
|
536
|
+
toDay: [{ value: null, disabled: true }, Validators.required],
|
|
537
|
+
currency: ['All'],
|
|
538
|
+
});
|
|
539
|
+
this.reportService.GetParamDateDefaultForTrialBalanceAccountsReport().subscribe({
|
|
540
|
+
next: (response) => {
|
|
541
|
+
let financialMonth = response[0].financialMonth;
|
|
542
|
+
console.log(`financialMonth in init form of Trial Balance - Accounts: ${financialMonth}`);
|
|
543
|
+
this.searchForm.patchValue({
|
|
544
|
+
fromMonth: financialMonth,
|
|
545
|
+
toMonth: financialMonth
|
|
546
|
+
});
|
|
547
|
+
}, error: (err) => { console.error('Error fetching data:', err); }
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
if (this.ReportName == "Branch Activity Send Summary") {
|
|
551
|
+
this.searchForm = this.fb.group({
|
|
552
|
+
client: [null, Validators.required],
|
|
553
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
554
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
555
|
+
branch: [null, Validators.required],
|
|
556
|
+
receiveCurrency: ['All'],
|
|
557
|
+
product: ['All', Validators.required],
|
|
558
|
+
transactionStatus: [['All'], Validators.required],
|
|
559
|
+
sendCountry: ['All'],
|
|
560
|
+
receiveCountry: ['All'],
|
|
561
|
+
summaryReport: ['Date-Wise Summary']
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
if (this.ReportName == "Transaction Monitoring") {
|
|
565
|
+
this.searchForm = this.fb.group({
|
|
566
|
+
client: [null, Validators.required],
|
|
567
|
+
fromDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
568
|
+
toDate: [new Date().toISOString().split("T")[0], Validators.required],
|
|
569
|
+
branch: [null, Validators.required],
|
|
570
|
+
receiveCurrency: ['All'],
|
|
571
|
+
product: ['All', Validators.required],
|
|
572
|
+
transactionStatus: [['All'], Validators.required],
|
|
573
|
+
sendCountry: ['All'],
|
|
574
|
+
receiveCountry: ['All']
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
loadInitialDataforBranchActivitySend() {
|
|
579
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
580
|
+
forkJoin({
|
|
581
|
+
params: this.reportService.getParams().pipe(catchError(err => {
|
|
582
|
+
console.error('Error loading params', err);
|
|
583
|
+
return of(null);
|
|
584
|
+
})),
|
|
585
|
+
clients: this.reportService.getPayInAgents().pipe(map((clients) => clients.map((client, index) => ({
|
|
586
|
+
businessPartnerName: client.agent,
|
|
587
|
+
businessPartnerCode: client.code,
|
|
588
|
+
displayOrder: index,
|
|
589
|
+
clientType: ""
|
|
590
|
+
}))), catchError(err => {
|
|
591
|
+
console.error('Error loading clients', err);
|
|
592
|
+
return of([]);
|
|
593
|
+
}))
|
|
594
|
+
}).subscribe({
|
|
595
|
+
next: ({ params, clients }) => {
|
|
596
|
+
this.params = params;
|
|
597
|
+
this.clients1 = clients;
|
|
598
|
+
this.countries = [...params?.countries];
|
|
599
|
+
this.currencies = [...params?.currencies];
|
|
600
|
+
this.transactionStatuses = [...params?.transactionStatusTypes];
|
|
601
|
+
this.transactionProducts = [...params?.transactionProductTypes];
|
|
602
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
603
|
+
this.onClientChange();
|
|
604
|
+
},
|
|
605
|
+
error: err => {
|
|
606
|
+
console.error('Unexpected forkJoin error', err);
|
|
607
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
608
|
+
},
|
|
609
|
+
complete: () => {
|
|
610
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
async loadInitialDatafortxnEnquiry() {
|
|
615
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
616
|
+
this.errorMessage = '';
|
|
617
|
+
try {
|
|
618
|
+
const data = await this.reportService
|
|
619
|
+
.getPageLoadData()
|
|
620
|
+
.pipe(takeUntil(this.destroy$))
|
|
621
|
+
.toPromise();
|
|
622
|
+
if (data) {
|
|
623
|
+
this.clients1 = data.clients || [];
|
|
624
|
+
this.currencies = data.currencies || [];
|
|
625
|
+
this.products = data.products || [];
|
|
626
|
+
this.transactionStatuses = (data.transactionStatuses || []).filter(ts => ts.transactionStatus !== '');
|
|
627
|
+
if (!this.transactionStatuses.some(s => s.transactionStatus === 'All')) {
|
|
628
|
+
this.transactionStatuses.unshift({
|
|
629
|
+
transactionStatus: 'All',
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
this.searchForm.patchValue({ product: 'All' });
|
|
633
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
634
|
+
await this.onClientChange();
|
|
635
|
+
}
|
|
636
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
637
|
+
}
|
|
638
|
+
catch (error) {
|
|
639
|
+
this.errorMessage = 'Failed to load initial data';
|
|
640
|
+
this.loadingState = ComponentLoadingState.Error;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
loadInitialDataforBranchActivityReceive() {
|
|
644
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
645
|
+
forkJoin({
|
|
646
|
+
params: this.reportService.getBranchActivityReceiveParams()
|
|
647
|
+
.pipe(catchError(err => {
|
|
648
|
+
console.error('Error loading params', err);
|
|
649
|
+
return of(null);
|
|
650
|
+
})),
|
|
651
|
+
payoutAgents: this.reportService.getAllPayOutAgents()
|
|
652
|
+
.pipe(map((clients) => clients.map((client, index) => ({
|
|
653
|
+
businessPartnerName: client.agent,
|
|
654
|
+
businessPartnerCode: client.code,
|
|
655
|
+
displayOrder: client.number,
|
|
656
|
+
clientType: ""
|
|
657
|
+
}))), catchError(err => {
|
|
658
|
+
return of([]);
|
|
659
|
+
}))
|
|
660
|
+
}).subscribe({
|
|
661
|
+
next: ({ params, payoutAgents }) => {
|
|
662
|
+
this.params = params;
|
|
663
|
+
this.clients1 = payoutAgents;
|
|
664
|
+
this.countries = [...params?.countries];
|
|
665
|
+
this.currencies = [...params?.currencies];
|
|
666
|
+
this.transactionStatuses = [...params?.transactionStatusTypes];
|
|
667
|
+
this.transactionProducts = [...params?.transactionProductTypes];
|
|
668
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
669
|
+
this.onClientChange();
|
|
670
|
+
},
|
|
671
|
+
error: err => {
|
|
672
|
+
console.error('Unexpected forkJoin error', err);
|
|
673
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
674
|
+
},
|
|
675
|
+
complete: () => {
|
|
676
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
677
|
+
}
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
async loadInitialDataForCancellationReport() {
|
|
681
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
682
|
+
this.errorMessage = '';
|
|
683
|
+
try {
|
|
684
|
+
const data = await this.reportService
|
|
685
|
+
.loadDataforCancallation()
|
|
686
|
+
.pipe(takeUntil(this.destroy$))
|
|
687
|
+
.toPromise();
|
|
688
|
+
if (data) {
|
|
689
|
+
this.countries = data.countries ?? [];
|
|
690
|
+
this.clients1 = (data.payInAgents ?? []).map((agent) => ({
|
|
691
|
+
businessPartnerName: agent.agent,
|
|
692
|
+
businessPartnerCode: agent.code
|
|
693
|
+
}));
|
|
694
|
+
this.products = (data.productTypes ?? []).map((pt) => ({
|
|
695
|
+
productCode: pt.productCode,
|
|
696
|
+
productName: pt.name
|
|
697
|
+
}));
|
|
698
|
+
this.currencies = data.currencies ?? [];
|
|
699
|
+
this.searchForm.patchValue({
|
|
700
|
+
product: this.products[0]?.productCode,
|
|
701
|
+
receiveCountry: this.countries[0]?.country,
|
|
702
|
+
sendCountry: this.countries[0]?.country,
|
|
703
|
+
receiveCurrency: this.currencies[0]?.currencyCode
|
|
704
|
+
});
|
|
705
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
706
|
+
await this.onClientChange();
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
// No data case
|
|
710
|
+
this.countries = [];
|
|
711
|
+
this.clients1 = [];
|
|
712
|
+
this.products = [];
|
|
713
|
+
this.currencies = [];
|
|
714
|
+
}
|
|
715
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
716
|
+
}
|
|
717
|
+
catch (error) {
|
|
718
|
+
console.error('Error loading cancellation report data', error);
|
|
719
|
+
this.errorMessage = 'Failed to load cancellation report data';
|
|
720
|
+
this.loadingState = ComponentLoadingState.Error;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
loadDataForRevenuePerTransactionReport() {
|
|
724
|
+
const $agents = this.reportService.getAgentsForRevenuePerTransaction();
|
|
725
|
+
const $params = this.reportService.getRevenuePerTransactionReportParams();
|
|
726
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
727
|
+
forkJoin([$agents, $params]).subscribe({
|
|
728
|
+
next: ([agents, params]) => {
|
|
729
|
+
this.sendBusinessPartnerAgents = agents.filter(agent => agent.transactionLeg === "PayIn");
|
|
730
|
+
this.recvBusinessPartnerAgents = agents.filter(agent => agent.transactionLeg === "PayOut");
|
|
731
|
+
this.transactionStatuses = params.transactionStatusTypes;
|
|
732
|
+
this.countries = params.countries;
|
|
733
|
+
this.searchForm.patchValue({
|
|
734
|
+
sendBusinessPartner: this.sendBusinessPartnerAgents[0].id,
|
|
735
|
+
recvBusinessPartner: this.recvBusinessPartnerAgents[0].id
|
|
736
|
+
});
|
|
737
|
+
},
|
|
738
|
+
error: (err) => {
|
|
739
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
740
|
+
},
|
|
741
|
+
complete: () => {
|
|
742
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
743
|
+
}
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
loadInitialDataforAccounting() {
|
|
747
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
748
|
+
forkJoin({
|
|
749
|
+
clients: this.reportService.getClientsForAccountingReport(this.currentUser).pipe(map((clients) => clients.map((client, index) => ({
|
|
750
|
+
businessPartnerName: client.agent,
|
|
751
|
+
businessPartnerCode: client.correlationId,
|
|
752
|
+
displayOrder: index,
|
|
753
|
+
clientType: ""
|
|
754
|
+
}))), catchError(err => {
|
|
755
|
+
console.error('Error loading clients', err);
|
|
756
|
+
return of([]);
|
|
757
|
+
})),
|
|
758
|
+
products: this.reportService.getTransactionTypesForAccountingReport().pipe(catchError(err => {
|
|
759
|
+
console.error('Error loading transaction types', err);
|
|
760
|
+
return of([]);
|
|
761
|
+
})),
|
|
762
|
+
currencies: this.reportService.getAllCurrenciesForAccountingReport().pipe(catchError(err => {
|
|
763
|
+
console.error('Error loading currencies', err);
|
|
764
|
+
return of([]);
|
|
765
|
+
})),
|
|
766
|
+
statuses: this.reportService.getAllTransactionStatusForAccountingReport().pipe(catchError(err => {
|
|
767
|
+
console.error('Error loading statuses', err);
|
|
768
|
+
return of([]);
|
|
769
|
+
})),
|
|
770
|
+
countries: this.reportService.getAllCountriesForAccountingReport().pipe(catchError(err => {
|
|
771
|
+
console.error('Error loading countries', err);
|
|
772
|
+
return of([]);
|
|
773
|
+
}))
|
|
774
|
+
}).subscribe({
|
|
775
|
+
next: ({ clients, products, currencies, statuses, countries }) => {
|
|
776
|
+
this.clients1 = clients;
|
|
777
|
+
this.transactionProducts = products;
|
|
778
|
+
this.currencies = currencies;
|
|
779
|
+
this.transactionStatuses = statuses;
|
|
780
|
+
this.countries = countries;
|
|
781
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
782
|
+
this.onClientChange();
|
|
783
|
+
},
|
|
784
|
+
error: err => {
|
|
785
|
+
console.error('Unexpected forkJoin error in Accounting init', err);
|
|
786
|
+
this.loadingState = ComponentLoadingState.Error;
|
|
787
|
+
},
|
|
788
|
+
complete: () => {
|
|
789
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
790
|
+
}
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
loadInitialDataForCreditLimitStatusEnquiry() {
|
|
794
|
+
const $agents = this.reportService.getClientsForCreditLimitStatusEnquiryReport();
|
|
795
|
+
const $status = this.reportService.getTransactionTypesForCreditLimitStatusEnquiryReport();
|
|
796
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
797
|
+
forkJoin({
|
|
798
|
+
agents: $agents.pipe(map((clients) => clients.map((client, index) => ({
|
|
799
|
+
businessPartnerName: client.name,
|
|
800
|
+
businessPartnerCode: client.code,
|
|
801
|
+
displayOrder: index,
|
|
802
|
+
clientType: ""
|
|
803
|
+
})))),
|
|
804
|
+
status: $status
|
|
805
|
+
}).subscribe({
|
|
806
|
+
next: ({ agents, status }) => {
|
|
807
|
+
this.clients1 = agents;
|
|
808
|
+
this.searchForm.patchValue({ client: this.clients1[0].businessPartnerCode });
|
|
809
|
+
this.transactionStatuses = status;
|
|
810
|
+
},
|
|
811
|
+
error: (err) => {
|
|
812
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
813
|
+
console.error('Unexpected forkJoin error', err);
|
|
814
|
+
},
|
|
815
|
+
complete: () => {
|
|
816
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
817
|
+
}
|
|
818
|
+
});
|
|
819
|
+
}
|
|
820
|
+
loadInitialDataForTrialBalanceAccounts() {
|
|
821
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
822
|
+
forkJoin({
|
|
823
|
+
businessLines: this.reportService.GetBusinessLineForTrialBalanceAccountsReport()
|
|
824
|
+
.pipe(catchError(err => of([]))),
|
|
825
|
+
accountStatuses: this.reportService.GetAccountStatusForTrialBalanceAccountsReport()
|
|
826
|
+
.pipe(catchError(err => of([]))),
|
|
827
|
+
dateTypes: this.reportService.GetDateTypeForTrialBalanceAccountsReport()
|
|
828
|
+
.pipe(catchError(err => of([]))),
|
|
829
|
+
financialYears: this.reportService.GetYearForTrialBalanceAccountsReport()
|
|
830
|
+
.pipe(catchError(err => of([]))),
|
|
831
|
+
fromMonths: this.reportService.GetFromMonthsForTrialBalanceAccountsReport()
|
|
832
|
+
.pipe(catchError(err => of([]))),
|
|
833
|
+
currency: this.reportService.GetCurrenciesForTrialBalanceAccountsReport()
|
|
834
|
+
.pipe(catchError(err => of([]))),
|
|
835
|
+
paramDateDefault: this.reportService.GetParamDateDefaultForTrialBalanceAccountsReport()
|
|
836
|
+
.pipe(catchError(err => of([])))
|
|
837
|
+
})
|
|
838
|
+
.pipe(switchMap(results => {
|
|
839
|
+
// assign base results
|
|
840
|
+
this.businessLines = results.businessLines.filter(b => b.businessLine?.trim() !== '');
|
|
841
|
+
this.accountStatuses = results.accountStatuses;
|
|
842
|
+
this.dateTypes = results.dateTypes;
|
|
843
|
+
this.financialYears = results.financialYears
|
|
844
|
+
.sort((a, b) => Number(a.financialYear) - Number(b.financialYear));
|
|
845
|
+
this.fromMonths = results.fromMonths;
|
|
846
|
+
this.currencies = results.currency;
|
|
847
|
+
this.paramDateDefault = results.paramDateDefault;
|
|
848
|
+
// resolve year/month for fromDays & toMonths
|
|
849
|
+
const year = +(new Date().getFullYear());
|
|
850
|
+
const month = this.paramDateDefault[0].financialMonth;
|
|
851
|
+
const selectedPMonth = this.searchForm.get('fromMonth')?.value;
|
|
852
|
+
const fromMonthObj = this.fromMonths.find(m => m.pOrder === selectedPMonth);
|
|
853
|
+
const fromMonthLabel = fromMonthObj?.period;
|
|
854
|
+
// first call fromDays with year/month
|
|
855
|
+
return this.reportService.GetFromDatesForTrialBalanceAccountsReport(year, fromMonthLabel).pipe(catchError(err => of([])), switchMap(fromDays => {
|
|
856
|
+
this.fromDays = fromDays;
|
|
857
|
+
this.searchForm.patchValue({
|
|
858
|
+
fromDay: this.paramDateDefault[0]?.tDate,
|
|
859
|
+
});
|
|
860
|
+
const financialYear = this.searchForm.get('financialYear')?.value;
|
|
861
|
+
const fromMonth = this.searchForm.get('fromMonth')?.value;
|
|
862
|
+
const toMonth = this.searchForm.get('toMonth')?.value;
|
|
863
|
+
const fromDay = this.searchForm.get('fromDay')?.value;
|
|
864
|
+
const requestPayload = {
|
|
865
|
+
Year: financialYear,
|
|
866
|
+
FromMonth: fromMonth,
|
|
867
|
+
ToMonth: toMonth,
|
|
868
|
+
FromDate: fromDay // assuming fromDay is already a Date or ISO string
|
|
869
|
+
};
|
|
870
|
+
// now chain to: toDays + toMonths
|
|
871
|
+
return forkJoin({
|
|
872
|
+
toDays: this.reportService.GetToDatesForTrialBalanceAccountsReport(requestPayload)
|
|
873
|
+
.pipe(catchError(err => of([]))),
|
|
874
|
+
toMonths: this.reportService.GetToMonthsForTrialBalanceAccountsReport(year, month)
|
|
875
|
+
.pipe(catchError(err => of([])))
|
|
876
|
+
}).pipe(map(extra => ({ ...results, fromDays, ...extra })));
|
|
877
|
+
}));
|
|
878
|
+
}))
|
|
879
|
+
.subscribe({
|
|
880
|
+
next: (allResults) => {
|
|
881
|
+
this.toDays = allResults.toDays;
|
|
882
|
+
this.toMonths = allResults.toMonths;
|
|
883
|
+
// patch form defaults
|
|
884
|
+
this.searchForm.patchValue({
|
|
885
|
+
businessLine: this.businessLines[0]?.businessLine ?? null,
|
|
886
|
+
accountStatus: this.accountStatuses.length ? [this.accountStatuses[0].statusCode] : [],
|
|
887
|
+
financialYear: this.paramDateDefault[0]?.financialYear ?? new Date().getFullYear().toString(),
|
|
888
|
+
fromMonth: this.paramDateDefault[0]?.financialMonth,
|
|
889
|
+
toMonth: this.paramDateDefault[0]?.financialMonth,
|
|
890
|
+
dateType: this.dateTypes[0]?.dateTypeCode ?? 'VD',
|
|
891
|
+
fromDay: this.fromDays[0]?.tDate,
|
|
892
|
+
toDay: this.toDays.find(d => d.isToday)?.value ?? new Date().getDate(),
|
|
893
|
+
currency: this.currency[0]?.currencyCode ?? 'All'
|
|
894
|
+
});
|
|
895
|
+
},
|
|
896
|
+
error: (err) => {
|
|
897
|
+
console.error('Failed to load Trial Balance dropdown data', err);
|
|
898
|
+
this.loadingState = ComponentLoadingState.Error;
|
|
899
|
+
},
|
|
900
|
+
complete: () => {
|
|
901
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
902
|
+
}
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
subscribeToDateChanges() {
|
|
906
|
+
this.searchForm.get('fromDate')?.valueChanges.subscribe(fromDateStr => {
|
|
907
|
+
const toDateControl = this.searchForm.get('toDate');
|
|
908
|
+
const toDateStr = toDateControl?.value;
|
|
909
|
+
if (!fromDateStr)
|
|
910
|
+
return;
|
|
911
|
+
const fromDate = new Date(fromDateStr);
|
|
912
|
+
// If ToDate is empty → set default
|
|
913
|
+
if (!toDateControl?.value) {
|
|
914
|
+
const maxToDate = new Date(fromDate);
|
|
915
|
+
maxToDate.setDate(fromDate.getDate() + 30);
|
|
916
|
+
toDateControl.patchValue(maxToDate.toISOString().split("T")[0]);
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
const toDate = new Date(toDateStr);
|
|
920
|
+
const maxToDate = new Date(fromDate);
|
|
921
|
+
maxToDate?.setDate(fromDate.getDate() + 30);
|
|
922
|
+
if (toDate.setHours(0, 0, 0, 0) > maxToDate.setHours(0, 0, 0, 0) || toDate.setHours(0, 0, 0, 0) < fromDate.setHours(0, 0, 0, 0)) {
|
|
923
|
+
maxToDate.setHours(12, 0, 0, 0);
|
|
924
|
+
toDateControl?.patchValue(maxToDate.toISOString().split("T")[0]);
|
|
925
|
+
// setTimeout(() => toDateControl?.patchValue(maxToDate.toISOString().split("T")[0]));
|
|
926
|
+
this.cd.detectChanges();
|
|
927
|
+
}
|
|
928
|
+
this.disabledDate = this.toNgbDateStruct(fromDate);
|
|
929
|
+
// setTimeout(() => this.disabledDate = this.toNgbDateStruct(fromDate));
|
|
930
|
+
});
|
|
931
|
+
this.searchForm.get('toDate')?.valueChanges.subscribe(toDateStr => {
|
|
932
|
+
const fromDateControl = this.searchForm.get('fromDate');
|
|
933
|
+
const fromDateStr = fromDateControl?.value;
|
|
934
|
+
if (!toDateStr)
|
|
935
|
+
return;
|
|
936
|
+
const toDate = new Date(toDateStr);
|
|
937
|
+
// If FromDate is empty → set default
|
|
938
|
+
if (!fromDateControl?.value) {
|
|
939
|
+
const minFromDate = new Date(toDate);
|
|
940
|
+
minFromDate.setDate(toDate.getDate() - 30);
|
|
941
|
+
fromDateControl.patchValue(minFromDate.toISOString().split("T")[0]);
|
|
942
|
+
return;
|
|
943
|
+
}
|
|
944
|
+
const fromDate = new Date(fromDateStr);
|
|
945
|
+
this.disabledDate = this.toNgbDateStruct(fromDate);
|
|
946
|
+
const minFromDate = new Date(toDate);
|
|
947
|
+
minFromDate?.setDate(toDate.getDate() - 30);
|
|
948
|
+
if (fromDate.setHours(0, 0, 0, 0) < minFromDate.setHours(0, 0, 0, 0)) {
|
|
949
|
+
minFromDate.setHours(12, 0, 0, 0);
|
|
950
|
+
fromDateControl?.patchValue(minFromDate.toISOString().split("T")[0]);
|
|
951
|
+
this.cd.detectChanges();
|
|
952
|
+
}
|
|
953
|
+
if (fromDate.setHours(0, 0, 0, 0) > toDate.setHours(0, 0, 0, 0)) {
|
|
954
|
+
fromDateControl?.patchValue(minFromDate.toISOString().split("T")[0]);
|
|
955
|
+
this.cd.detectChanges();
|
|
956
|
+
}
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
async loadInitialDataForStatementOfAccounts() {
|
|
960
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
961
|
+
this.errorMessage = '';
|
|
962
|
+
try {
|
|
963
|
+
const clients = await this.reportService
|
|
964
|
+
.loadClientsForStatementOfAccounts()
|
|
965
|
+
.pipe(takeUntil(this.destroy$))
|
|
966
|
+
.toPromise();
|
|
967
|
+
if (clients && clients.length > 0) {
|
|
968
|
+
this.clients1 = clients.map((c, index) => ({
|
|
969
|
+
businessPartnerCode: c.agentID,
|
|
970
|
+
businessPartnerName: c.agentName,
|
|
971
|
+
displayOrder: index,
|
|
972
|
+
clientType: c.clientType
|
|
973
|
+
}));
|
|
974
|
+
}
|
|
975
|
+
else {
|
|
976
|
+
this.clients1 = [];
|
|
977
|
+
}
|
|
978
|
+
if (this.clients1.length === 1) {
|
|
979
|
+
this.searchForm.patchValue({
|
|
980
|
+
client: this.clients1[0].businessPartnerCode
|
|
981
|
+
});
|
|
982
|
+
await this.onClientChange();
|
|
983
|
+
}
|
|
984
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
985
|
+
}
|
|
986
|
+
catch (error) {
|
|
987
|
+
console.error('Error loading Statement of Accounts clients', error);
|
|
988
|
+
this.errorMessage = 'Failed to load clients for Statement of Accounts';
|
|
989
|
+
this.loadingState = ComponentLoadingState.Error;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
async onClientChange() {
|
|
993
|
+
if (this.ReportName == "Transaction Enquiry") {
|
|
994
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
995
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
996
|
+
if (!selectedClient)
|
|
997
|
+
return;
|
|
998
|
+
this.branches = [];
|
|
999
|
+
if (selectedClient === 'All') {
|
|
1000
|
+
this.branches = [{
|
|
1001
|
+
businessPartnerBranch: 'All',
|
|
1002
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1003
|
+
branchCode: 'All',
|
|
1004
|
+
bank: 'All',
|
|
1005
|
+
number: 1
|
|
1006
|
+
}];
|
|
1007
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1008
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
else {
|
|
1012
|
+
try {
|
|
1013
|
+
await Promise.all([
|
|
1014
|
+
this.loadBranchesByAgent(selectedClient)
|
|
1015
|
+
]);
|
|
1016
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1017
|
+
}
|
|
1018
|
+
catch (err) {
|
|
1019
|
+
this.errorMessage = 'Failed to load branch';
|
|
1020
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
1025
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1026
|
+
if (!selectedClient)
|
|
1027
|
+
return;
|
|
1028
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1029
|
+
this.branches = [];
|
|
1030
|
+
if (selectedClient === 'All') {
|
|
1031
|
+
this.branches = [{
|
|
1032
|
+
businessPartnerBranch: 'All',
|
|
1033
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1034
|
+
branchCode: 'All',
|
|
1035
|
+
bank: 'All',
|
|
1036
|
+
number: 1
|
|
1037
|
+
}];
|
|
1038
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1039
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
else {
|
|
1043
|
+
this.reportService.getBranchByAgent(selectedClient).subscribe({
|
|
1044
|
+
next: (data) => {
|
|
1045
|
+
this.branches = data;
|
|
1046
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1047
|
+
},
|
|
1048
|
+
error: (err) => {
|
|
1049
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1050
|
+
},
|
|
1051
|
+
complete: () => {
|
|
1052
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
if (this.ReportName === "Branch Activity Receive") {
|
|
1058
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1059
|
+
if (!selectedClient)
|
|
1060
|
+
return;
|
|
1061
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1062
|
+
this.branches = [];
|
|
1063
|
+
if (selectedClient === 'All') {
|
|
1064
|
+
this.branches = [{
|
|
1065
|
+
businessPartnerBranch: 'All',
|
|
1066
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1067
|
+
branchCode: 'All',
|
|
1068
|
+
bank: 'All',
|
|
1069
|
+
number: 1
|
|
1070
|
+
}];
|
|
1071
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1072
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1073
|
+
return;
|
|
1074
|
+
}
|
|
1075
|
+
else {
|
|
1076
|
+
this.reportService.getBranchActivityReceivePayoutAgentBranch(selectedClient).subscribe({
|
|
1077
|
+
next: (data) => {
|
|
1078
|
+
this.branches = data;
|
|
1079
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1080
|
+
},
|
|
1081
|
+
error: (err) => {
|
|
1082
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1083
|
+
},
|
|
1084
|
+
complete: () => {
|
|
1085
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1086
|
+
}
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
if (this.ReportName == "Cancellation Transaction") {
|
|
1091
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1092
|
+
this.errorMessage = '';
|
|
1093
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1094
|
+
this.branches = [];
|
|
1095
|
+
if (selectedClient === 'All') {
|
|
1096
|
+
this.branches = [{
|
|
1097
|
+
businessPartnerBranch: 'All',
|
|
1098
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1099
|
+
branchCode: 'All',
|
|
1100
|
+
bank: 'All',
|
|
1101
|
+
number: 1
|
|
1102
|
+
}];
|
|
1103
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1104
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1105
|
+
return;
|
|
1106
|
+
}
|
|
1107
|
+
else {
|
|
1108
|
+
try {
|
|
1109
|
+
const data = await this.reportService
|
|
1110
|
+
.getBranches(selectedClient)
|
|
1111
|
+
.pipe(takeUntil(this.destroy$))
|
|
1112
|
+
.toPromise();
|
|
1113
|
+
if (data) {
|
|
1114
|
+
this.branches = data;
|
|
1115
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1116
|
+
}
|
|
1117
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1118
|
+
}
|
|
1119
|
+
catch (error) {
|
|
1120
|
+
console.error('Failed to load branches', error);
|
|
1121
|
+
this.errorMessage = 'Failed to load branch data';
|
|
1122
|
+
this.loadingState = ComponentLoadingState.Error;
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
if (this.ReportName == "Statement of Accounts") {
|
|
1127
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1128
|
+
this.errorMessage = '';
|
|
1129
|
+
const ClientId = this.searchForm.get('client')?.value;
|
|
1130
|
+
const selectedClient = this.clients1.find(c => c.businessPartnerCode === ClientId);
|
|
1131
|
+
this.clientName = selectedClient?.businessPartnerName || '';
|
|
1132
|
+
this.clientType = selectedClient?.clientType || '';
|
|
1133
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1134
|
+
}
|
|
1135
|
+
// accounting report
|
|
1136
|
+
if (this.ReportName == "Accounting") {
|
|
1137
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1138
|
+
if (!selectedClient)
|
|
1139
|
+
return;
|
|
1140
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1141
|
+
this.branches = [];
|
|
1142
|
+
if (selectedClient === 'All') {
|
|
1143
|
+
this.branches = [{
|
|
1144
|
+
businessPartnerBranch: 'All',
|
|
1145
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1146
|
+
branchCode: 'All',
|
|
1147
|
+
bank: 'All',
|
|
1148
|
+
number: 1
|
|
1149
|
+
}];
|
|
1150
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1151
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1152
|
+
return;
|
|
1153
|
+
}
|
|
1154
|
+
else {
|
|
1155
|
+
this.reportService.getBranchByAgentForAccountingReport(this.currentUser, selectedClient).subscribe({
|
|
1156
|
+
next: (data) => {
|
|
1157
|
+
this.branches = data;
|
|
1158
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1159
|
+
},
|
|
1160
|
+
error: (err) => {
|
|
1161
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1162
|
+
},
|
|
1163
|
+
complete: () => {
|
|
1164
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1165
|
+
}
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
1170
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1171
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1172
|
+
this.branches = [];
|
|
1173
|
+
if (selectedClient === 'All') {
|
|
1174
|
+
this.branches = [{
|
|
1175
|
+
businessPartnerBranch: 'All',
|
|
1176
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1177
|
+
branchCode: 'All',
|
|
1178
|
+
bank: 'All',
|
|
1179
|
+
number: 1
|
|
1180
|
+
}];
|
|
1181
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1182
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1183
|
+
return;
|
|
1184
|
+
}
|
|
1185
|
+
else {
|
|
1186
|
+
this.reportService.getBranchByAgent(selectedClient).subscribe({
|
|
1187
|
+
next: (data) => {
|
|
1188
|
+
this.branches = data;
|
|
1189
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1190
|
+
},
|
|
1191
|
+
error: (err) => {
|
|
1192
|
+
throw err;
|
|
1193
|
+
},
|
|
1194
|
+
complete: () => {
|
|
1195
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1196
|
+
}
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
if (this.ReportName == "Transaction Monitoring") {
|
|
1201
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1202
|
+
if (!selectedClient)
|
|
1203
|
+
return;
|
|
1204
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1205
|
+
this.branches = [];
|
|
1206
|
+
if (selectedClient === 'All') {
|
|
1207
|
+
this.branches = [{
|
|
1208
|
+
businessPartnerBranch: 'All',
|
|
1209
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1210
|
+
branchCode: 'All',
|
|
1211
|
+
bank: 'All',
|
|
1212
|
+
number: 1
|
|
1213
|
+
}];
|
|
1214
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1215
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1216
|
+
return;
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
this.reportService.getBranchByAgentForTransactionMonitoringReport(selectedClient).subscribe({
|
|
1220
|
+
next: (data) => {
|
|
1221
|
+
this.branches = data;
|
|
1222
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1223
|
+
},
|
|
1224
|
+
error: (err) => {
|
|
1225
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1226
|
+
},
|
|
1227
|
+
complete: () => {
|
|
1228
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1229
|
+
}
|
|
1230
|
+
});
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
if (this.ReportName == "Branch Activity Send Summary") {
|
|
1234
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1235
|
+
const selectedClient = this.searchForm.get('client')?.value;
|
|
1236
|
+
this.branches = [];
|
|
1237
|
+
if (selectedClient === 'All') {
|
|
1238
|
+
this.branches = [{
|
|
1239
|
+
businessPartnerBranch: 'All',
|
|
1240
|
+
businessPartnerBranch_CorrelationId: 'All',
|
|
1241
|
+
branchCode: 'All',
|
|
1242
|
+
bank: 'All',
|
|
1243
|
+
number: 1
|
|
1244
|
+
}];
|
|
1245
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1246
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1247
|
+
return;
|
|
1248
|
+
}
|
|
1249
|
+
else {
|
|
1250
|
+
this.reportService.getBranchByAgentForSendSummaryReport(selectedClient).subscribe({
|
|
1251
|
+
next: (data) => {
|
|
1252
|
+
this.branches = data;
|
|
1253
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1254
|
+
},
|
|
1255
|
+
error: (err) => {
|
|
1256
|
+
throw err;
|
|
1257
|
+
},
|
|
1258
|
+
complete: () => {
|
|
1259
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1260
|
+
}
|
|
1261
|
+
});
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
async loadBranchesByAgent(agentCode) {
|
|
1266
|
+
const branches = await this.reportService
|
|
1267
|
+
.getBranchesByAgent(agentCode)
|
|
1268
|
+
.pipe(takeUntil(this.destroy$))
|
|
1269
|
+
.toPromise();
|
|
1270
|
+
this.branches = branches || [];
|
|
1271
|
+
if (this.branches.length === 1) {
|
|
1272
|
+
this.searchForm.patchValue({ branch: this.branches[0].branchCode });
|
|
1273
|
+
// await this.loadUsersByBranch(agentCode, this.branches[0].branchCode);
|
|
1274
|
+
}
|
|
1275
|
+
else if (this.branches.some(b => b.branchCode === 'All')) {
|
|
1276
|
+
this.searchForm.patchValue({ branch: 'All' });
|
|
1277
|
+
// await this.loadUsersByBranch(agentCode, 'All');
|
|
1278
|
+
}
|
|
1279
|
+
else {
|
|
1280
|
+
this.searchForm.patchValue({ branch: '' });
|
|
1281
|
+
this.users = [];
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
async onBranchChange() {
|
|
1285
|
+
}
|
|
1286
|
+
onSearch() {
|
|
1287
|
+
if (this.ReportName == "Transaction Enquiry") {
|
|
1288
|
+
this.hasSearched = true;
|
|
1289
|
+
if (this.searchForm.invalid) {
|
|
1290
|
+
this.formValidationError = true;
|
|
1291
|
+
this.formValid.emit(false);
|
|
1292
|
+
return;
|
|
1293
|
+
}
|
|
1294
|
+
this.formValidationError = false;
|
|
1295
|
+
this.formValid.emit(true);
|
|
1296
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1297
|
+
}
|
|
1298
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
1299
|
+
this.hasSearched = true;
|
|
1300
|
+
if (this.searchForm.invalid) {
|
|
1301
|
+
this.formValidationError = true;
|
|
1302
|
+
this.formValid.emit(false);
|
|
1303
|
+
return;
|
|
1304
|
+
}
|
|
1305
|
+
this.formValidationError = false;
|
|
1306
|
+
this.formValid.emit(true);
|
|
1307
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1308
|
+
}
|
|
1309
|
+
if (this.ReportName == "ACC GL Details Enquiry") {
|
|
1310
|
+
this.hasSearched = true;
|
|
1311
|
+
if (this.searchForm.invalid) {
|
|
1312
|
+
this.formValidationError = true;
|
|
1313
|
+
this.formValid.emit(false);
|
|
1314
|
+
return;
|
|
1315
|
+
}
|
|
1316
|
+
this.formValidationError = false;
|
|
1317
|
+
const modal = {
|
|
1318
|
+
selectedDateType: this.searchForm.controls["dateType"]?.value,
|
|
1319
|
+
selectedDate: this.searchForm.controls["date"]?.value
|
|
1320
|
+
};
|
|
1321
|
+
this.formValid.emit(true);
|
|
1322
|
+
this.searchClicked.emit(modal);
|
|
1323
|
+
}
|
|
1324
|
+
if (this.ReportName === "Branch Activity Receive") {
|
|
1325
|
+
this.hasSearched = true;
|
|
1326
|
+
if (this.searchForm.invalid) {
|
|
1327
|
+
this.formValidationError = true;
|
|
1328
|
+
this.formValid.emit(false);
|
|
1329
|
+
return;
|
|
1330
|
+
}
|
|
1331
|
+
this.formValidationError = false;
|
|
1332
|
+
this.formValid.emit(true);
|
|
1333
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1334
|
+
}
|
|
1335
|
+
if (this.ReportName == "Cancellation Transaction") {
|
|
1336
|
+
this.hasSearched = true;
|
|
1337
|
+
if (this.searchForm.invalid) {
|
|
1338
|
+
this.formValidationError = true;
|
|
1339
|
+
this.formValid.emit(false);
|
|
1340
|
+
return;
|
|
1341
|
+
}
|
|
1342
|
+
this.formValidationError = false;
|
|
1343
|
+
this.formValid.emit(true);
|
|
1344
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1345
|
+
}
|
|
1346
|
+
if (this.ReportName === "Revenue Per Transaction") {
|
|
1347
|
+
this.hasSearched = true;
|
|
1348
|
+
if (this.searchForm.invalid) {
|
|
1349
|
+
this.formValidationError = true;
|
|
1350
|
+
this.formValid.emit(false);
|
|
1351
|
+
return;
|
|
1352
|
+
}
|
|
1353
|
+
this.formValidationError = false;
|
|
1354
|
+
this.formValid.emit(true);
|
|
1355
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1356
|
+
}
|
|
1357
|
+
if (this.ReportName == "Statement of Accounts") {
|
|
1358
|
+
this.hasSearched = true;
|
|
1359
|
+
if (this.searchForm.invalid) {
|
|
1360
|
+
this.formValidationError = true;
|
|
1361
|
+
this.formValid.emit(false);
|
|
1362
|
+
return;
|
|
1363
|
+
}
|
|
1364
|
+
this.formValidationError = false;
|
|
1365
|
+
this.formValid.emit(true);
|
|
1366
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1367
|
+
}
|
|
1368
|
+
if (this.ReportName == "Accounting") {
|
|
1369
|
+
this.hasSearched = true;
|
|
1370
|
+
if (this.searchForm.invalid) {
|
|
1371
|
+
this.formValidationError = true;
|
|
1372
|
+
// this.markFormGroupTouched(this.searchForm);
|
|
1373
|
+
this.formValid.emit(false);
|
|
1374
|
+
return;
|
|
1375
|
+
}
|
|
1376
|
+
this.formValidationError = false;
|
|
1377
|
+
this.formValid.emit(true);
|
|
1378
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1379
|
+
}
|
|
1380
|
+
if (this.ReportName === "Credit Limit Status Enquiry") {
|
|
1381
|
+
this.hasSearched = true;
|
|
1382
|
+
if (this.searchForm.invalid) {
|
|
1383
|
+
this.formValidationError = true;
|
|
1384
|
+
this.formValid.emit(false);
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
this.formValidationError = false;
|
|
1388
|
+
this.formValid.emit(true);
|
|
1389
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1390
|
+
}
|
|
1391
|
+
if (this.ReportName == "Funding") {
|
|
1392
|
+
this.hasSearched = true;
|
|
1393
|
+
if (this.searchForm.invalid) {
|
|
1394
|
+
this.formValidationError = true;
|
|
1395
|
+
this.formValid.emit(false);
|
|
1396
|
+
return;
|
|
1397
|
+
}
|
|
1398
|
+
this.formValidationError = false;
|
|
1399
|
+
this.formValid.emit(true);
|
|
1400
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1401
|
+
}
|
|
1402
|
+
if (this.ReportName == "Trial Balance - Accounts") {
|
|
1403
|
+
this.hasSearched = true;
|
|
1404
|
+
if (this.searchForm.invalid) {
|
|
1405
|
+
this.formValidationError = true;
|
|
1406
|
+
this.formValid.emit(false);
|
|
1407
|
+
return;
|
|
1408
|
+
}
|
|
1409
|
+
this.formValidationError = false;
|
|
1410
|
+
this.formValid.emit(true);
|
|
1411
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1412
|
+
}
|
|
1413
|
+
if (this.ReportName == "Branch Activity Send Summary") {
|
|
1414
|
+
this.hasSearched = true;
|
|
1415
|
+
if (this.searchForm.invalid) {
|
|
1416
|
+
this.formValidationError = true;
|
|
1417
|
+
this.formValid.emit(false);
|
|
1418
|
+
return;
|
|
1419
|
+
}
|
|
1420
|
+
this.formValidationError = false;
|
|
1421
|
+
this.formValid.emit(true);
|
|
1422
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1423
|
+
}
|
|
1424
|
+
if (this.ReportName == "Transaction Monitoring") {
|
|
1425
|
+
this.hasSearched = true;
|
|
1426
|
+
if (this.searchForm.invalid) {
|
|
1427
|
+
this.formValidationError = true;
|
|
1428
|
+
this.formValid.emit(false);
|
|
1429
|
+
return;
|
|
1430
|
+
}
|
|
1431
|
+
this.formValidationError = false;
|
|
1432
|
+
this.formValid.emit(true);
|
|
1433
|
+
this.searchClicked.emit(this.buildSearchCriteria());
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
buildSearchCriteria() {
|
|
1437
|
+
const formValue = this.searchForm.value;
|
|
1438
|
+
const fromDate = new Date(formValue.fromDate);
|
|
1439
|
+
const toDate = new Date(formValue.toDate);
|
|
1440
|
+
const formatDate = (d) => {
|
|
1441
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
1442
|
+
const month = String(d.getMonth() + 1).padStart(2, "0");
|
|
1443
|
+
const year = d.getFullYear();
|
|
1444
|
+
return `${day}/${month}/${year}`;
|
|
1445
|
+
};
|
|
1446
|
+
const searchCriteria = this.getSearchCriteriaArray();
|
|
1447
|
+
if (this.ReportName == "Transaction Enquiry") {
|
|
1448
|
+
const formValue = this.searchForm.value;
|
|
1449
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1450
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1451
|
+
return {
|
|
1452
|
+
modal: formValue,
|
|
1453
|
+
sysUserID: this.currentUser,
|
|
1454
|
+
reportPeriod: `${formatDate(fromDate)} - ${formatDate(toDate)}`,
|
|
1455
|
+
searchCriteria: searchCriteria
|
|
1456
|
+
};
|
|
1457
|
+
}
|
|
1458
|
+
if (this.ReportName == "Branch Activity Send") {
|
|
1459
|
+
const formValue = this.searchForm.value;
|
|
1460
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1461
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1462
|
+
const searchCriteria = [
|
|
1463
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === formValue.client)?.businessPartnerName || ''],
|
|
1464
|
+
['Transaction Status:', formValue.transactionStatus.join(",")],
|
|
1465
|
+
['Branch:', this.branches.find(b => b.branchCode === formValue.branch)?.businessPartnerBranch || ''],
|
|
1466
|
+
['Product:', formValue.product],
|
|
1467
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1468
|
+
['Receive Currency:', this.currencies.find(c => c.currencyCode === formValue.receiveCurrency)?.currency || ''],
|
|
1469
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1470
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1471
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1472
|
+
];
|
|
1473
|
+
return {
|
|
1474
|
+
modal: formValue,
|
|
1475
|
+
sysUserID: this.currentUser,
|
|
1476
|
+
searchCriteria: searchCriteria
|
|
1477
|
+
};
|
|
1478
|
+
}
|
|
1479
|
+
if (this.ReportName == "Branch Activity Receive") {
|
|
1480
|
+
const formValue = this.searchForm.value;
|
|
1481
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1482
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1483
|
+
const searchCriteria = [
|
|
1484
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === formValue.client)?.businessPartnerName || ''],
|
|
1485
|
+
['Transaction Status:', formValue.transactionStatus.join(",")],
|
|
1486
|
+
['Branch:', this.branches.find(b => b.branchCode === formValue.branch)?.businessPartnerBranch || ''],
|
|
1487
|
+
['Product:', formValue.product],
|
|
1488
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1489
|
+
['Receive Currency:', this.currencies.find(c => c.currencyCode === formValue.receiveCurrency)?.currency || ''],
|
|
1490
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1491
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1492
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1493
|
+
];
|
|
1494
|
+
return {
|
|
1495
|
+
modal: formValue,
|
|
1496
|
+
sysUserID: this.currentUser,
|
|
1497
|
+
searchCriteria: searchCriteria
|
|
1498
|
+
};
|
|
1499
|
+
}
|
|
1500
|
+
if (this.ReportName == "Cancellation Transaction") {
|
|
1501
|
+
const formValue = this.searchForm.value;
|
|
1502
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1503
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1504
|
+
const searchCriteria = [
|
|
1505
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === formValue.client)?.businessPartnerName || ''],
|
|
1506
|
+
['Branch:', this.branches.find(b => b.branchCode === formValue.branch)?.businessPartnerBranch || ''],
|
|
1507
|
+
['Product:', formValue.product],
|
|
1508
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1509
|
+
['Receive Currency:', this.currencies.find(c => c.currencyCode === formValue.receiveCurrency)?.currency || ''],
|
|
1510
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1511
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1512
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1513
|
+
];
|
|
1514
|
+
return {
|
|
1515
|
+
modal: formValue,
|
|
1516
|
+
sysUserID: this.currentUser,
|
|
1517
|
+
reportPeriod: `${formatDate(fromDate)} - ${formatDate(toDate)}`,
|
|
1518
|
+
searchCriteria: searchCriteria
|
|
1519
|
+
};
|
|
1520
|
+
}
|
|
1521
|
+
if (this.ReportName === "Revenue Per Transaction") {
|
|
1522
|
+
const formValue = this.searchForm.value;
|
|
1523
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1524
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1525
|
+
const searchCriteria = [
|
|
1526
|
+
['Sender Partner:', this.sendBusinessPartnerAgents.find(c => c.id === formValue.sendBusinessPartner)?.name || ''],
|
|
1527
|
+
['Receive Partner:', this.recvBusinessPartnerAgents.find(c => c.id === formValue.recvBusinessPartner)?.name || ''],
|
|
1528
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1529
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1530
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1531
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1532
|
+
['Transaction Status:', formValue.transactionStatus.join(",")],
|
|
1533
|
+
];
|
|
1534
|
+
return {
|
|
1535
|
+
modal: formValue,
|
|
1536
|
+
sysUserId: this.currentUser,
|
|
1537
|
+
searchCriteria: searchCriteria
|
|
1538
|
+
};
|
|
1539
|
+
}
|
|
1540
|
+
if (this.ReportName == "Statement of Accounts") {
|
|
1541
|
+
const formValue = this.searchForm.value;
|
|
1542
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1543
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1544
|
+
return {
|
|
1545
|
+
modal: formValue,
|
|
1546
|
+
clientType: this.clientType,
|
|
1547
|
+
sysUserID: this.currentUser,
|
|
1548
|
+
clientName: this.clientName,
|
|
1549
|
+
reportPeriod: `${formatDate(fromDate)} - ${formatDate(toDate)}`,
|
|
1550
|
+
searchCriteria: searchCriteria
|
|
1551
|
+
};
|
|
1552
|
+
}
|
|
1553
|
+
if (this.ReportName == "Accounting") {
|
|
1554
|
+
const formValue = this.searchForm.value;
|
|
1555
|
+
const searchCriteria = [
|
|
1556
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === formValue.client)?.businessPartnerName || ''],
|
|
1557
|
+
['Transaction Status:', formValue.transactionStatus.join(",")],
|
|
1558
|
+
['Branch:', this.branches.find(b => b.branchCode === formValue.branch)?.businessPartnerBranch || ''],
|
|
1559
|
+
['Product:', this.transactionProducts.find(t => t.productCode === formValue.product)?.name || ''],
|
|
1560
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1561
|
+
['Send Currency:', this.currencies.find(c => c.currencyCode === formValue.currency)?.currency || ''],
|
|
1562
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1563
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1564
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1565
|
+
];
|
|
1566
|
+
return {
|
|
1567
|
+
modal: {
|
|
1568
|
+
...formValue,
|
|
1569
|
+
fromDate: this.toIsoFormat(formValue.fromDate),
|
|
1570
|
+
toDate: this.toIsoFormat(formValue.toDate),
|
|
1571
|
+
},
|
|
1572
|
+
sysUserID: this.currentUser,
|
|
1573
|
+
searchCriteria: searchCriteria
|
|
1574
|
+
};
|
|
1575
|
+
}
|
|
1576
|
+
if (this.ReportName === "Credit Limit Status Enquiry") {
|
|
1577
|
+
const clientCode = this.searchForm.controls['client'].value;
|
|
1578
|
+
const formValue = this.searchForm.value;
|
|
1579
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1580
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1581
|
+
formValue.client = this.clients1.find(c => c.businessPartnerCode === clientCode)?.businessPartnerName || '';
|
|
1582
|
+
const searchCriteria = [
|
|
1583
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === clientCode)?.businessPartnerName || ''],
|
|
1584
|
+
['Transaction status:', formValue.transactionStatus],
|
|
1585
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1586
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1587
|
+
];
|
|
1588
|
+
return {
|
|
1589
|
+
modal: formValue,
|
|
1590
|
+
sysUserID: this.currentUser,
|
|
1591
|
+
searchCriteria: searchCriteria
|
|
1592
|
+
};
|
|
1593
|
+
}
|
|
1594
|
+
if (this.ReportName == "Funding") {
|
|
1595
|
+
return {
|
|
1596
|
+
modal: formValue,
|
|
1597
|
+
sysUserID: this.currentUser,
|
|
1598
|
+
reportPeriod: `${formatDate(fromDate)} - ${formatDate(toDate)}`,
|
|
1599
|
+
searchCriteria: searchCriteria
|
|
1600
|
+
};
|
|
1601
|
+
}
|
|
1602
|
+
if (this.ReportName == "Trial Balance - Accounts") {
|
|
1603
|
+
const formValue = this.searchForm.value;
|
|
1604
|
+
const dateRange = this.prepareFromDateAndToDateForTrialBalanceAccountReport();
|
|
1605
|
+
return {
|
|
1606
|
+
modal: {
|
|
1607
|
+
...formValue,
|
|
1608
|
+
fromDate: dateRange.fromDate,
|
|
1609
|
+
toDate: dateRange.toDate,
|
|
1610
|
+
},
|
|
1611
|
+
sysUserID: this.currentUser
|
|
1612
|
+
};
|
|
1613
|
+
}
|
|
1614
|
+
if (this.ReportName == "Branch Activity Send Summary") {
|
|
1615
|
+
const formValue = this.searchForm.value;
|
|
1616
|
+
formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1617
|
+
formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1618
|
+
const searchCriteria = [
|
|
1619
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === formValue.client)?.businessPartnerName || ''],
|
|
1620
|
+
['Transaction Status:', formValue.transactionStatus.join(",")],
|
|
1621
|
+
['Branch:', this.branches.find(b => b.branchCode === formValue.branch)?.businessPartnerBranch || ''],
|
|
1622
|
+
['Product:', formValue.product],
|
|
1623
|
+
['From Date:', angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1624
|
+
['Receive Currency:', this.currencies.find(c => c.currencyCode === formValue.receiveCurrency)?.currency || ''],
|
|
1625
|
+
['To Date:', angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1626
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1627
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1628
|
+
['Summary Report:', formValue.summaryReport],
|
|
1629
|
+
];
|
|
1630
|
+
return {
|
|
1631
|
+
modal: formValue,
|
|
1632
|
+
sysUserID: this.currentUser,
|
|
1633
|
+
searchCriteria: searchCriteria
|
|
1634
|
+
};
|
|
1635
|
+
}
|
|
1636
|
+
if (this.ReportName == "Transaction Monitoring") {
|
|
1637
|
+
const formValue = this.searchForm.value;
|
|
1638
|
+
// formValue.fromDate = this.toIsoFormat(formValue.fromDate);
|
|
1639
|
+
// formValue.toDate = this.toIsoFormat(formValue.toDate);
|
|
1640
|
+
if (this.initialFilters?.isRealtime && (!formValue.fromDate && !formValue.toDate)) {
|
|
1641
|
+
formValue.fromDate = null;
|
|
1642
|
+
formValue.toDate = null;
|
|
1643
|
+
}
|
|
1644
|
+
else {
|
|
1645
|
+
formValue.fromDate = this.toIsoFormat(fromDate);
|
|
1646
|
+
formValue.toDate = this.toIsoFormat(toDate);
|
|
1647
|
+
if (this.initialFilters?.isRealtime) {
|
|
1648
|
+
this.initialFilters.isRealtime = false;
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1651
|
+
const searchCriteria = [
|
|
1652
|
+
['Client:', this.clients1.find(c => c.businessPartnerCode === formValue.client)?.businessPartnerName || ''],
|
|
1653
|
+
['Transaction Status:', formValue.transactionStatus.join(",")],
|
|
1654
|
+
['Branch:', this.branches.find(b => b.branchCode === formValue.branch)?.businessPartnerBranch || ''],
|
|
1655
|
+
['Product:', formValue.product],
|
|
1656
|
+
['From Date:', this.initialFilters?.isRealtime ? '' : angularCommon.formatDate(this.toIsoFormat(formValue.fromDate), 'dd/MM/yyyy', 'en-US')],
|
|
1657
|
+
['Receive Currency:', this.currencies.find(c => c.currencyCode === formValue.receiveCurrency)?.currency || ''],
|
|
1658
|
+
['To Date:', this.initialFilters?.isRealtime ? '' : angularCommon.formatDate(this.toIsoFormat(formValue.toDate), 'dd/MM/yyyy', 'en-US')],
|
|
1659
|
+
['Send Country:', this.countries.find(c => c.countryCode === formValue.sendCountry)?.country || ''],
|
|
1660
|
+
['Receive Country:', this.countries.find(c => c.countryCode === formValue.receiveCountry)?.country || ''],
|
|
1661
|
+
];
|
|
1662
|
+
return {
|
|
1663
|
+
modal: formValue,
|
|
1664
|
+
sysUserID: this.currentUser,
|
|
1665
|
+
searchCriteria: searchCriteria
|
|
1666
|
+
};
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
toIsoFormat(dateInput) {
|
|
1670
|
+
if (!dateInput)
|
|
1671
|
+
return undefined;
|
|
1672
|
+
// Handle { year, month, day }
|
|
1673
|
+
if (typeof dateInput === 'object' &&
|
|
1674
|
+
dateInput.year &&
|
|
1675
|
+
dateInput.month &&
|
|
1676
|
+
dateInput.day) {
|
|
1677
|
+
const year = dateInput.year;
|
|
1678
|
+
const month = String(dateInput.month).padStart(2, '0');
|
|
1679
|
+
const day = String(dateInput.day).padStart(2, '0');
|
|
1680
|
+
return `${year}-${month}-${day}`;
|
|
1681
|
+
}
|
|
1682
|
+
// Handle JS Date object
|
|
1683
|
+
if (dateInput instanceof Date) {
|
|
1684
|
+
if (isNaN(dateInput.getTime()))
|
|
1685
|
+
return undefined;
|
|
1686
|
+
const year = dateInput.getFullYear();
|
|
1687
|
+
const month = String(dateInput.getMonth() + 1).padStart(2, '0');
|
|
1688
|
+
const day = String(dateInput.getDate()).padStart(2, '0');
|
|
1689
|
+
return `${year}-${month}-${day}`;
|
|
1690
|
+
}
|
|
1691
|
+
// Handle dd/MM/yyyy string
|
|
1692
|
+
if (typeof dateInput === 'string' && dateInput.includes('/')) {
|
|
1693
|
+
const parts = dateInput.split('/');
|
|
1694
|
+
if (parts.length === 3) {
|
|
1695
|
+
const [day, month, year] = parts;
|
|
1696
|
+
return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
// Handle ISO string (yyyy-MM-dd or yyyy-MM-ddTHH:mm:ss.sssZ)
|
|
1700
|
+
if (typeof dateInput === 'string' && /^\d{4}-\d{2}-\d{2}/.test(dateInput)) {
|
|
1701
|
+
// Use only date part if full ISO string
|
|
1702
|
+
return dateInput.substring(0, 10);
|
|
1703
|
+
}
|
|
1704
|
+
return undefined;
|
|
1705
|
+
}
|
|
1706
|
+
onOpen() {
|
|
1707
|
+
this.isOpen = true;
|
|
1708
|
+
}
|
|
1709
|
+
onClose() {
|
|
1710
|
+
this.isOpen = false;
|
|
1711
|
+
}
|
|
1712
|
+
get errorMessage() {
|
|
1713
|
+
return this._errorMessage;
|
|
1714
|
+
}
|
|
1715
|
+
set errorMessage(value) {
|
|
1716
|
+
this._errorMessage = value;
|
|
1717
|
+
}
|
|
1718
|
+
get isLoading() {
|
|
1719
|
+
return this.loadingState === ComponentLoadingState.Loading;
|
|
1720
|
+
}
|
|
1721
|
+
get isError() {
|
|
1722
|
+
return this.loadingState === ComponentLoadingState.Error;
|
|
1723
|
+
}
|
|
1724
|
+
toNgbDateStruct(fromDate) {
|
|
1725
|
+
return {
|
|
1726
|
+
year: fromDate.getFullYear(),
|
|
1727
|
+
month: fromDate.getMonth() + 1,
|
|
1728
|
+
day: fromDate.getDate()
|
|
1729
|
+
};
|
|
1730
|
+
}
|
|
1731
|
+
transactionStatusSubscribe() {
|
|
1732
|
+
this.searchForm.get('transactionStatus').valueChanges.subscribe((val) => {
|
|
1733
|
+
const allStatus = this.transactionStatuses
|
|
1734
|
+
.map((status) => status.transactionStatus);
|
|
1735
|
+
if (val.includes('All')) {
|
|
1736
|
+
if (this.isSelectAllChecked) {
|
|
1737
|
+
const filteredStatus = val.filter(s => s !== 'All');
|
|
1738
|
+
this.searchForm.get('transactionStatus')
|
|
1739
|
+
.setValue(filteredStatus, { emitEvent: false });
|
|
1740
|
+
this.isSelectAllChecked = false;
|
|
1741
|
+
}
|
|
1742
|
+
else {
|
|
1743
|
+
this.searchForm.get('transactionStatus')
|
|
1744
|
+
.setValue(['All'], { emitEvent: false });
|
|
1745
|
+
this.isSelectAllChecked = true;
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
});
|
|
1749
|
+
}
|
|
1750
|
+
handleDateChange() {
|
|
1751
|
+
this.searchForm.get('fromDate')?.valueChanges.subscribe(fromDateStr => {
|
|
1752
|
+
const toDateControl = this.searchForm.get('toDate');
|
|
1753
|
+
const toDateStr = toDateControl?.value;
|
|
1754
|
+
if (!fromDateStr || !toDateStr)
|
|
1755
|
+
return;
|
|
1756
|
+
const fromDate = new Date(fromDateStr);
|
|
1757
|
+
this.disabledDate = this.toNgbDateStruct(fromDate);
|
|
1758
|
+
});
|
|
1759
|
+
}
|
|
1760
|
+
// ** for trial balance accounting report -
|
|
1761
|
+
onSelectFromMonth() {
|
|
1762
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1763
|
+
const year = +this.searchForm.get('financialYear')?.value;
|
|
1764
|
+
const fromMonth = +this.searchForm.get('fromMonth')?.value;
|
|
1765
|
+
if (!year || !fromMonth) {
|
|
1766
|
+
return;
|
|
1767
|
+
}
|
|
1768
|
+
this.reportService.GetToMonthsForTrialBalanceAccountsReport(year, fromMonth)
|
|
1769
|
+
.pipe(catchError(err => of([])))
|
|
1770
|
+
.subscribe((toMonths) => {
|
|
1771
|
+
this.toMonths = toMonths;
|
|
1772
|
+
// update "toMonth" form control with default (first option)
|
|
1773
|
+
this.searchForm.patchValue({
|
|
1774
|
+
toMonth: this.toMonths[0]?.pMonth ?? ""
|
|
1775
|
+
});
|
|
1776
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1777
|
+
});
|
|
1778
|
+
// on select fromMonth goes call to fromDay
|
|
1779
|
+
const financialYear = +this.searchForm.get('financialYear')?.value;
|
|
1780
|
+
const selectedPMonth = this.searchForm.get('fromMonth')?.value;
|
|
1781
|
+
const fromMonthObj = this.fromMonths.find(m => m.pOrder === selectedPMonth);
|
|
1782
|
+
const fromMonthLabel = fromMonthObj?.period;
|
|
1783
|
+
this.reportService.GetFromDatesForTrialBalanceAccountsReport(financialYear, fromMonthLabel)
|
|
1784
|
+
.subscribe((fromDays) => {
|
|
1785
|
+
this.fromDays = fromDays;
|
|
1786
|
+
this.searchForm.patchValue({ fromDay: undefined });
|
|
1787
|
+
this.searchForm.patchValue({ toDay: "" });
|
|
1788
|
+
this.searchForm.get('toDay')?.disable();
|
|
1789
|
+
}, (error) => {
|
|
1790
|
+
console.error('Error while fetching To Days:', error);
|
|
1791
|
+
});
|
|
1792
|
+
}
|
|
1793
|
+
onSelectFromDay() {
|
|
1794
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1795
|
+
const currentToDayValue = this.searchForm.get('toDay')?.value;
|
|
1796
|
+
const currentToDayObject = this.toDays.find(d => d.individualDate === currentToDayValue);
|
|
1797
|
+
const financialYear = this.searchForm.get('financialYear')?.value;
|
|
1798
|
+
const fromMonth = this.searchForm.get('fromMonth')?.value;
|
|
1799
|
+
const toMonth = this.searchForm.get('toMonth')?.value;
|
|
1800
|
+
const fromDay = this.searchForm.get('fromDay')?.value;
|
|
1801
|
+
const requestPayload = {
|
|
1802
|
+
Year: financialYear,
|
|
1803
|
+
FromMonth: fromMonth,
|
|
1804
|
+
ToMonth: toMonth,
|
|
1805
|
+
FromDate: fromDay
|
|
1806
|
+
};
|
|
1807
|
+
this.reportService.GetToDatesForTrialBalanceAccountsReport(requestPayload)
|
|
1808
|
+
.pipe(finalize(() => {
|
|
1809
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1810
|
+
}))
|
|
1811
|
+
.subscribe((toDays) => {
|
|
1812
|
+
this.toDays = toDays;
|
|
1813
|
+
if (this.searchForm.get('fromMonth')?.value != this.searchForm.get('toMonth')?.value && this.searchForm.get('toDay')?.value) {
|
|
1814
|
+
const matchedToDayObject = this.toDays.find(d => d.pDate === currentToDayObject.pDate);
|
|
1815
|
+
this.searchForm.patchValue({
|
|
1816
|
+
toDay: matchedToDayObject.individualDate ?? ""
|
|
1817
|
+
});
|
|
1818
|
+
}
|
|
1819
|
+
else {
|
|
1820
|
+
this.searchForm.patchValue({
|
|
1821
|
+
toDay: this.toDays[0]?.individualDate ?? ""
|
|
1822
|
+
});
|
|
1823
|
+
}
|
|
1824
|
+
this.searchForm.get('toDay')?.enable();
|
|
1825
|
+
}, (error) => {
|
|
1826
|
+
console.error('Error fetching To Days:', error);
|
|
1827
|
+
window.alert('Error fetching To Days');
|
|
1828
|
+
this.toDays = [];
|
|
1829
|
+
this.searchForm.get('toDay')?.patchValue("");
|
|
1830
|
+
}, () => {
|
|
1831
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1832
|
+
});
|
|
1833
|
+
}
|
|
1834
|
+
onSelectToMonth() {
|
|
1835
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1836
|
+
const currentToDayValue = this.searchForm.get('toDay')?.value;
|
|
1837
|
+
const financialYear = this.searchForm.get('financialYear')?.value;
|
|
1838
|
+
const fromMonth = this.searchForm.get('fromMonth')?.value;
|
|
1839
|
+
const toMonth = this.searchForm.get('toMonth')?.value;
|
|
1840
|
+
const fromDay = this.searchForm.get('fromDay')?.value;
|
|
1841
|
+
if (!financialYear || !fromMonth || !toMonth || !fromDay) {
|
|
1842
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1843
|
+
return;
|
|
1844
|
+
}
|
|
1845
|
+
const requestPayload = {
|
|
1846
|
+
Year: financialYear,
|
|
1847
|
+
FromMonth: fromMonth,
|
|
1848
|
+
ToMonth: toMonth,
|
|
1849
|
+
FromDate: fromDay
|
|
1850
|
+
};
|
|
1851
|
+
this.reportService.GetToDatesForTrialBalanceAccountsReport(requestPayload)
|
|
1852
|
+
.subscribe((toDays) => {
|
|
1853
|
+
this.toDays = toDays;
|
|
1854
|
+
if (this.searchForm.get('fromMonth')?.value === this.searchForm.get('toMonth')?.value) {
|
|
1855
|
+
const fromDay = this.searchForm.get('fromDay')?.value;
|
|
1856
|
+
const fromDayObject = this.fromDays.find(d => d.individualDate === fromDay);
|
|
1857
|
+
const toDayObject = this.toDays.find(d => d.pDate === fromDayObject?.individualDay);
|
|
1858
|
+
this.searchForm.patchValue({
|
|
1859
|
+
toDay: toDayObject?.individualDate ?? ""
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1862
|
+
else {
|
|
1863
|
+
this.searchForm.patchValue({
|
|
1864
|
+
toDay: this.toDays[0].individualDate
|
|
1865
|
+
});
|
|
1866
|
+
}
|
|
1867
|
+
}, (error) => {
|
|
1868
|
+
console.error('Error fetching To Days:', error);
|
|
1869
|
+
window.alert('Error fetching To Days:');
|
|
1870
|
+
this.toDays = [];
|
|
1871
|
+
this.searchForm.get('toDay')?.patchValue("");
|
|
1872
|
+
}, () => {
|
|
1873
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1874
|
+
});
|
|
1875
|
+
}
|
|
1876
|
+
onSelectFinancialYear() {
|
|
1877
|
+
// on financialYear change fromday and today should change to default values acocrding to year and frommonth,tomonth -
|
|
1878
|
+
this.loadingState = ComponentLoadingState.Loading;
|
|
1879
|
+
// call fromDays
|
|
1880
|
+
const financialYear = +this.searchForm.get('financialYear')?.value;
|
|
1881
|
+
const selectedPMonth = this.searchForm.get('fromMonth')?.value;
|
|
1882
|
+
const fromMonthObj = this.fromMonths.find(m => m.pOrder === selectedPMonth);
|
|
1883
|
+
const fromMonthLabel = fromMonthObj?.period;
|
|
1884
|
+
this.reportService.GetFromDatesForTrialBalanceAccountsReport(financialYear, fromMonthLabel)
|
|
1885
|
+
.subscribe((fromDays) => {
|
|
1886
|
+
this.fromDays = fromDays;
|
|
1887
|
+
this.searchForm.patchValue({ fromDay: undefined });
|
|
1888
|
+
this.searchForm.patchValue({ toDay: "" });
|
|
1889
|
+
this.searchForm.get('toDay')?.disable();
|
|
1890
|
+
}, (error) => {
|
|
1891
|
+
console.error('Error while fetching To Days:', error);
|
|
1892
|
+
});
|
|
1893
|
+
const fromMonth = this.searchForm.get('fromMonth')?.value;
|
|
1894
|
+
const toMonth = this.searchForm.get('toMonth')?.value;
|
|
1895
|
+
const fromDay = this.searchForm.get('fromDay')?.value;
|
|
1896
|
+
const requestPayload = {
|
|
1897
|
+
Year: financialYear,
|
|
1898
|
+
FromMonth: fromMonth,
|
|
1899
|
+
ToMonth: toMonth,
|
|
1900
|
+
FromDate: fromDay
|
|
1901
|
+
};
|
|
1902
|
+
this.reportService.GetToDatesForTrialBalanceAccountsReport(requestPayload)
|
|
1903
|
+
.subscribe((toDays) => {
|
|
1904
|
+
this.toDays = toDays;
|
|
1905
|
+
if (this.searchForm.get('fromMonth')?.value === this.searchForm.get('toMonth')?.value) {
|
|
1906
|
+
const fromDay = this.searchForm.get('fromDay')?.value;
|
|
1907
|
+
const fromDayObject = this.fromDays.find(d => d.individualDate === fromDay);
|
|
1908
|
+
const toDayObject = this.toDays.find(d => d.pDate === fromDayObject?.individualDay);
|
|
1909
|
+
this.searchForm.patchValue({
|
|
1910
|
+
toDay: toDayObject?.individualDate ?? ""
|
|
1911
|
+
});
|
|
1912
|
+
}
|
|
1913
|
+
else {
|
|
1914
|
+
this.searchForm.patchValue({
|
|
1915
|
+
toDay: ""
|
|
1916
|
+
});
|
|
1917
|
+
this.searchForm.get('toDay')?.disable();
|
|
1918
|
+
}
|
|
1919
|
+
}, (error) => {
|
|
1920
|
+
console.error('Error fetching To Days:', error);
|
|
1921
|
+
window.alert('Error fetching To Days:');
|
|
1922
|
+
this.toDays = [];
|
|
1923
|
+
this.searchForm.get('toDay')?.patchValue("");
|
|
1924
|
+
}, () => {
|
|
1925
|
+
this.loadingState = ComponentLoadingState.Complete;
|
|
1926
|
+
});
|
|
1927
|
+
}
|
|
1928
|
+
prepareFromDateAndToDateForTrialBalanceAccountReport() {
|
|
1929
|
+
const financialYear = +this.searchForm.get('financialYear')?.value;
|
|
1930
|
+
const fromMonth = this.searchForm.get('fromMonth')?.value;
|
|
1931
|
+
const toMonth = this.searchForm.get('toMonth')?.value;
|
|
1932
|
+
const selectedFromDay = this.searchForm.get('fromDay')?.value;
|
|
1933
|
+
const fromDayObj = this.fromDays.find(m => m.individualDate === selectedFromDay);
|
|
1934
|
+
const fromDay = fromDayObj?.individualDay;
|
|
1935
|
+
const selectedToDay = this.searchForm.get('toDay')?.value;
|
|
1936
|
+
const toDayObj = this.toDays.find(m => m.individualDate === selectedToDay);
|
|
1937
|
+
const toDay = toDayObj?.pDate;
|
|
1938
|
+
const fromDate = new Date(financialYear, +fromMonth - 1, +fromDay); // JS month is 0-based
|
|
1939
|
+
const toDate = new Date(financialYear, +toMonth - 1, +toDay);
|
|
1940
|
+
return {
|
|
1941
|
+
fromDate: fromDate,
|
|
1942
|
+
toDate: toDate
|
|
1943
|
+
};
|
|
1944
|
+
}
|
|
1945
|
+
formatDateToDDMMYYYY(d) {
|
|
1946
|
+
if (!d)
|
|
1947
|
+
return '';
|
|
1948
|
+
const date = (typeof d === 'string' && d.length) ? new Date(d) : (d instanceof Date ? d : new Date(d));
|
|
1949
|
+
if (isNaN(date.getTime()))
|
|
1950
|
+
return '';
|
|
1951
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
1952
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
1953
|
+
const year = date.getFullYear();
|
|
1954
|
+
return `${day}/${month}/${year}`;
|
|
1955
|
+
}
|
|
1956
|
+
/** helper to find item in the known lists by bindValue and return its bindLabel
|
|
1957
|
+
* improved: tries multiple fallback value keys so product lookup is robust */
|
|
1958
|
+
lookupFromListByField(field, scalarValue) {
|
|
1959
|
+
const bindLabel = this.fieldBindLabelMap[field];
|
|
1960
|
+
const bindValue = this.fieldBindValueMap[field];
|
|
1961
|
+
// choose candidate list based on field
|
|
1962
|
+
let list;
|
|
1963
|
+
switch (field) {
|
|
1964
|
+
case 'client':
|
|
1965
|
+
list = this.clients1;
|
|
1966
|
+
break;
|
|
1967
|
+
case 'branch':
|
|
1968
|
+
list = this.branches;
|
|
1969
|
+
break;
|
|
1970
|
+
case 'product':
|
|
1971
|
+
list = this.products;
|
|
1972
|
+
break;
|
|
1973
|
+
case 'transactionProduct':
|
|
1974
|
+
list = this.transactionProducts;
|
|
1975
|
+
break;
|
|
1976
|
+
case 'transactionStatus':
|
|
1977
|
+
case 'transactionStatusSingleSelect':
|
|
1978
|
+
list = this.transactionStatuses;
|
|
1979
|
+
break;
|
|
1980
|
+
case 'userId':
|
|
1981
|
+
list = this.users;
|
|
1982
|
+
break;
|
|
1983
|
+
case 'sendBusinessPartner':
|
|
1984
|
+
list = this.sendBusinessPartnerAgents;
|
|
1985
|
+
break;
|
|
1986
|
+
case 'recvBusinessPartner':
|
|
1987
|
+
list = this.recvBusinessPartnerAgents;
|
|
1988
|
+
break;
|
|
1989
|
+
case 'businessLine':
|
|
1990
|
+
list = this.businessLines;
|
|
1991
|
+
break;
|
|
1992
|
+
case 'financialYear':
|
|
1993
|
+
list = this.financialYears;
|
|
1994
|
+
break;
|
|
1995
|
+
case 'fromMonth':
|
|
1996
|
+
list = this.fromMonths;
|
|
1997
|
+
break;
|
|
1998
|
+
case 'toMonth':
|
|
1999
|
+
list = this.toMonths;
|
|
2000
|
+
break;
|
|
2001
|
+
case 'fromDay':
|
|
2002
|
+
list = this.fromDays;
|
|
2003
|
+
break;
|
|
2004
|
+
case 'toDay':
|
|
2005
|
+
list = this.toDays;
|
|
2006
|
+
break;
|
|
2007
|
+
case 'accountStatus':
|
|
2008
|
+
list = this.accountStatuses;
|
|
2009
|
+
break;
|
|
2010
|
+
case 'sendCountry':
|
|
2011
|
+
case 'receiveCountry':
|
|
2012
|
+
list = this.countries;
|
|
2013
|
+
break;
|
|
2014
|
+
case 'currency':
|
|
2015
|
+
case 'sendCurrency':
|
|
2016
|
+
case 'receiveCurrency':
|
|
2017
|
+
list = this.currencies;
|
|
2018
|
+
break;
|
|
2019
|
+
default: list = undefined;
|
|
2020
|
+
}
|
|
2021
|
+
// handle common 'All' sentinel
|
|
2022
|
+
if (scalarValue === 'All' || scalarValue === '' || scalarValue === null || scalarValue === undefined)
|
|
2023
|
+
return String(scalarValue || '');
|
|
2024
|
+
if (list && list.length) {
|
|
2025
|
+
// try the configured bindValue key first
|
|
2026
|
+
if (bindValue) {
|
|
2027
|
+
const found = list.find((x) => String(x[bindValue]) === String(scalarValue));
|
|
2028
|
+
if (found) {
|
|
2029
|
+
if (bindLabel && found[bindLabel])
|
|
2030
|
+
return found[bindLabel];
|
|
2031
|
+
return found.transactionStatusLabel || found.transactionStatus || found.name || found.productName || found.businessPartnerName || String(scalarValue);
|
|
2032
|
+
}
|
|
2033
|
+
}
|
|
2034
|
+
// fallback: try matching on common keys in case shapes differ
|
|
2035
|
+
const commonKeys = ['productCode', 'code', 'id', 'value', 'currencyCode', 'statusCode'];
|
|
2036
|
+
for (const key of commonKeys) {
|
|
2037
|
+
const found2 = list.find((x) => x && x[key] !== undefined && String(x[key]) === String(scalarValue));
|
|
2038
|
+
if (found2) {
|
|
2039
|
+
const labelCandidate = bindLabel && found2[bindLabel] ? found2[bindLabel] : (found2.productName || found2.name || found2.transactionStatusLabel || found2.businessPartnerName);
|
|
2040
|
+
return labelCandidate || String(scalarValue);
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
// last attempt: if scalarValue equals a label in the list, return it
|
|
2044
|
+
if (bindLabel) {
|
|
2045
|
+
const found3 = list.find((x) => String(x[bindLabel]) === String(scalarValue));
|
|
2046
|
+
if (found3)
|
|
2047
|
+
return String(found3[bindLabel]);
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
// not found — return scalar as string
|
|
2051
|
+
return String(scalarValue);
|
|
2052
|
+
}
|
|
2053
|
+
// --- lookup that prefers bindLabel when possible ---
|
|
2054
|
+
getLookupDisplayValue(field, value) {
|
|
2055
|
+
if (value === null || value === undefined || value === '')
|
|
2056
|
+
return '';
|
|
2057
|
+
// Date handling
|
|
2058
|
+
if (field === 'fromDate' || field === 'toDate' || field === 'date' || field === 'valueDate') {
|
|
2059
|
+
return this.formatDateToDDMMYYYY(value);
|
|
2060
|
+
}
|
|
2061
|
+
// Currencies: show "CODE - Name"
|
|
2062
|
+
if (['currency', 'sendCurrency', 'receiveCurrency'].includes(field)) {
|
|
2063
|
+
if (value === 'All')
|
|
2064
|
+
return 'All';
|
|
2065
|
+
if (typeof value === 'object') {
|
|
2066
|
+
const code = value.currencyCode || value.currency || '';
|
|
2067
|
+
const name = value.currency || '';
|
|
2068
|
+
return code ? `${code} - ${name}` : String(value);
|
|
2069
|
+
}
|
|
2070
|
+
const cur = this.currencies?.find((x) => x.currencyCode === value);
|
|
2071
|
+
return cur ? `${cur.currencyCode} - ${cur.currency}` : String(value);
|
|
2072
|
+
}
|
|
2073
|
+
// If it's an array (multi-select), map each item
|
|
2074
|
+
if (Array.isArray(value)) {
|
|
2075
|
+
const mapped = value.map(v => {
|
|
2076
|
+
if (typeof v === 'object') {
|
|
2077
|
+
const bindLabel = this.fieldBindLabelMap[field];
|
|
2078
|
+
return bindLabel && v[bindLabel] ? v[bindLabel] : (v.transactionStatusLabel || v.statusName || v.productName || v.name || JSON.stringify(v));
|
|
2079
|
+
}
|
|
2080
|
+
return this.lookupFromListByField(field, v);
|
|
2081
|
+
});
|
|
2082
|
+
if (mapped.length === 1 && (mapped[0] === 'All' || mapped[0] === ''))
|
|
2083
|
+
return 'All';
|
|
2084
|
+
return mapped.join(', ');
|
|
2085
|
+
}
|
|
2086
|
+
// If value is an object (single select returned object)
|
|
2087
|
+
if (typeof value === 'object') {
|
|
2088
|
+
// product special-case: product object might have productName/productCode
|
|
2089
|
+
if (field === 'product' || field === 'transactionProduct') {
|
|
2090
|
+
const pn = value.productName || value.name || value.label || value.display || value.product || value.transactionProduct;
|
|
2091
|
+
if (pn)
|
|
2092
|
+
return pn;
|
|
2093
|
+
// try common keys
|
|
2094
|
+
return value.productCode || value.code || value.id ? String(value.productCode || value.code || value.id) : JSON.stringify(value);
|
|
2095
|
+
}
|
|
2096
|
+
const bindLabel = this.fieldBindLabelMap[field];
|
|
2097
|
+
if (bindLabel && value[bindLabel])
|
|
2098
|
+
return value[bindLabel];
|
|
2099
|
+
return value.transactionStatus || value.name || value.businessPartnerName || JSON.stringify(value);
|
|
2100
|
+
}
|
|
2101
|
+
// Scalar -> lookup in lists using bindValue -> return bindLabel
|
|
2102
|
+
// product special-case: if value === 'All' then return 'All'
|
|
2103
|
+
if ((field === 'product' || field === 'transactionProduct') && String(value) === 'All')
|
|
2104
|
+
return 'All';
|
|
2105
|
+
return this.lookupFromListByField(field, value);
|
|
2106
|
+
}
|
|
2107
|
+
/**
|
|
2108
|
+
* Returns search criteria array for the currently visible fields.
|
|
2109
|
+
* Output: [ ['Label:', 'Value'], ... ]
|
|
2110
|
+
*/
|
|
2111
|
+
getSearchCriteriaArray() {
|
|
2112
|
+
if (!this.searchForm)
|
|
2113
|
+
return [];
|
|
2114
|
+
const criteria = [];
|
|
2115
|
+
const formValue = this.searchForm.value;
|
|
2116
|
+
const fields = this.visibleFields; // uses your getter
|
|
2117
|
+
fields.forEach(field => {
|
|
2118
|
+
const label = this.fieldLabelMap[field] || (field + ':');
|
|
2119
|
+
const controlName = this.fieldToControlMap[field] || field;
|
|
2120
|
+
const value = formValue[controlName];
|
|
2121
|
+
// dates
|
|
2122
|
+
if (controlName === 'fromDate' || controlName === 'toDate' || controlName === 'date' || controlName === 'valueDate') {
|
|
2123
|
+
criteria.push([label, this.formatDateToDDMMYYYY(value) || '']);
|
|
2124
|
+
return;
|
|
2125
|
+
}
|
|
2126
|
+
// Use getLookupDisplayValue to produce the human-friendly string (handles arrays/objects/scalars)
|
|
2127
|
+
const display = this.getLookupDisplayValue(field, value);
|
|
2128
|
+
criteria.push([label, display || '']);
|
|
2129
|
+
});
|
|
2130
|
+
return criteria;
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
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 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2134
|
+
SearchFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SearchFilterComponent, selector: "lib-search-filter", inputs: { ReportName: "ReportName", initialFilters: "initialFilters" }, outputs: { searchClicked: "searchClicked", formValid: "formValid" }, 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<section>\r\n <form [formGroup]=\"searchForm\" (ngSubmit)=\"onSearch()\">\r\n <div class=\"row\">\r\n <div class=\"col-custom-10-5\">\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 [ngClass]=\"{'invalid-select': searchForm.get('client')?.invalid && (searchForm.get('client')?.touched || formValidationError)}\"\r\n (change)=\"onClientChange()\" (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.businessPartnerName\">{{ item.businessPartnerName }}</span>\r\n </ng-template>\r\n\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 [ngClass]=\"{'invalid-select': searchForm.get('branch')?.invalid && (searchForm.get('branch')?.touched || formValidationError)}\"\r\n (change)=\"onBranchChange()\" (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.businessPartnerBranch\">{{ item.businessPartnerBranch }}</span>\r\n </ng-template>\r\n\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 [ngClass]=\"{'invalid-date':searchForm.get('fromDate')?.invalid && (searchForm.get('fromDate')?.touched || formValidationError)}\" />\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\" [minDate]=\"disabledDate\"\r\n autocomplete=\"off\"\r\n [ngClass]=\"{'invalid-date':searchForm.get('toDate')?.invalid && (searchForm.get('toDate')?.touched || formValidationError)}\" />\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\" (open)=\"onOpen()\"\r\n (close)=\"onClose()\" [searchable]=\"isOpen\">\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 (open)=\"onOpen()\" (close)=\"onClose()\"\r\n [searchable]=\"isOpen\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('userId')?.invalid && (searchForm.get('userId')?.touched || formValidationError)}\">\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\" bindValue=\"currencyCode\" placeholder=\"Select Currency\"\r\n [clearable]=\"false\" formControlName=\"currency\" [searchable]=\"true\" [searchFn]=\"currencySearch\"\r\n (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n\r\n <!-- Template for dropdown options -->\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Template for selected value -->\r\n <ng-template ng-label-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Send Currency -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'sendCurrency'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Send Currency</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"currencies\" bindValue=\"currencyCode\" placeholder=\"Select Currency\"\r\n [clearable]=\"false\" formControlName=\"currency\" [searchable]=\"true\" [searchFn]=\"currencySearch\"\r\n (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n\r\n <!-- Template for dropdown options -->\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Template for selected value -->\r\n <ng-template ng-label-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\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\">Txn. 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 [ngClass]=\"{'invalid-select': searchForm.get('transactionStatus')?.invalid && (searchForm.get('transactionStatus')?.touched || formValidationError)}\">\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\">Txn. 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 [ngClass]=\"{'invalid-date':searchForm.get('date')?.invalid && (searchForm.get('date')?.touched || formValidationError)}\" />\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 <!-- Send Country -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'sendCountry'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Send Country</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n placeholder=\"Select Product\" [clearable]=\"false\" formControlName=\"sendCountry\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.country\">{{ item.country }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Receive Country -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'receiveCountry'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Receive Country</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n placeholder=\"Select Product\" [clearable]=\"false\" formControlName=\"receiveCountry\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.country\">{{ item.country }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Transaction Product -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionProduct'\">\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]=\"transactionProducts\" bindLabel=\"name\" 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 <!-- 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\" 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 #dateInput=\"ngbDatepicker\" formControlName=\"date\" autocomplete=\"off\"\r\n [ngClass]=\"{'invalid-date': searchForm.get('date')?.invalid && (searchForm.get('date')?.touched || formValidationError)}\" />\r\n <button class=\"input-group-button cal\" type=\"button\" (click)=\"dateInput.toggle()\">\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 <!-- receiveCurrency -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'receiveCurrency'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Receive Currency</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"currencies\" bindValue=\"currencyCode\" placeholder=\"Select Receive Currency\"\r\n [clearable]=\"false\" formControlName=\"receiveCurrency\" required (change)=\"onBranchChange()\"\r\n [searchable]=\"true\" [searchFn]=\"currencySearch\" (open)=\"onOpen()\" (close)=\"onClose()\"\r\n [searchable]=\"isOpen\">\r\n\r\n <!-- Dropdown options -->\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Selected value -->\r\n <ng-template ng-label-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Send BusinessPartner -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'sendBusinessPartner'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Send Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"sendBusinessPartnerAgents\" bindLabel=\"name\" bindValue=\"id\"\r\n placeholder=\"Select Send Partner\" [clearable]=\"false\" formControlName=\"sendBusinessPartner\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('sendBusinessPartner')?.invalid && (searchForm.get('sendBusinessPartner')?.touched || formValidationError)}\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.name\">{{ item.name }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Recv BusinessPartner -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'recvBusinessPartner'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Recv Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"recvBusinessPartnerAgents\" bindLabel=\"name\" bindValue=\"id\"\r\n placeholder=\"Select Recv Partner\" [clearable]=\"false\" formControlName=\"recvBusinessPartner\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('recvBusinessPartner')?.invalid && (searchForm.get('recvBusinessPartner')?.touched || formValidationError)}\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.name\">{{ item.name }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Transaction Status (Single-select) -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionStatusSingleSelect'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Txn. Status<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"transactionStatuses\" bindLabel=\"transactionStatus\" bindValue=\"transactionStatus\"\r\n placeholder=\"Select Status\" [clearable]=\"false\" formControlName=\"transactionStatus\" required\r\n [ngClass]=\"{'invalid-select': searchForm.get('transactionStatus')?.invalid && (searchForm.get('transactionStatus')?.touched || formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- For Trial Balance - Accounts Report -->\r\n\r\n <!-- Business Line -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'businessLine'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Business Line</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"businessLines\" bindLabel=\"businessLine\" bindValue=\"businessLine\"\r\n placeholder=\"Select Business Line\" [clearable]=\"false\" formControlName=\"businessLine\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('businessLine')?.invalid && (searchForm.get('businessLine')?.touched || formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Year -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'financialYear'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Financial Year</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"financialYears\" bindLabel=\"financialYear\" bindValue=\"financialYear\"\r\n placeholder=\"Select Year\" [clearable]=\"false\" formControlName=\"financialYear\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('financialYear')?.invalid && (searchForm.get('financialYear')?.touched || formValidationError)}\"\r\n (change)=\"onSelectFinancialYear()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- From Month -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'fromMonth'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">From Month</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"fromMonths\" bindLabel=\"period\" bindValue=\"pOrder\"\r\n placeholder=\"Select From Month\" [clearable]=\"false\" formControlName=\"fromMonth\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('fromMonth')?.invalid && (searchForm.get('fromMonth')?.touched|| formValidationError)}\"\r\n (change)=\"onSelectFromMonth()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- To Month -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'toMonth'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">To Month</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"toMonths\" bindLabel=\"pMonthName\" bindValue=\"pMonth\"\r\n placeholder=\"Select To Month\" [clearable]=\"false\" formControlName=\"toMonth\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('toMonth')?.invalid && (searchForm.get('toMonth')?.touched|| formValidationError)}\"\r\n (change)=\"onSelectToMonth()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- From Day -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'fromDay'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">From Day <span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"fromDays\" bindLabel=\"individualDay\" bindValue=\"individualDate\"\r\n placeholder=\"Select From Day\" [clearable]=\"false\" formControlName=\"fromDay\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('fromDay')?.invalid && (searchForm.get('fromDay')?.touched|| formValidationError)}\"\r\n (change)=\"onSelectFromDay()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- To Day -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'toDay'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">To Day<span style=\"margin-left: 1px;\"\r\n class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"toDays\" bindLabel=\"pDate\" bindValue=\"individualDate\" placeholder=\"Select To Day\"\r\n [clearable]=\"false\" formControlName=\"toDay\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('toDay')?.invalid && (searchForm.get('toDay')?.touched|| formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Date Type -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'dateTypeForTrialBalanceAccounts'\">\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 [items]=\"dateTypes\" bindLabel=\"dateTypeLabel\" bindValue=\"dateTypeCode\"\r\n placeholder=\"Select Date Type\" formControlName=\"dateType\" [clearable]=\"false\" required\r\n [ngClass]=\"{'invalid-select': searchForm.get('dateType')?.invalid && (searchForm.get('dateType')?.touched|| formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Account Status -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'accountStatus'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Account Status</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select class=\"transaction-status-select\" [items]=\"accountStatuses\" bindLabel=\"statusName\"\r\n bindValue=\"statusCode\" [multiple]=\"true\" placeholder=\"Select Account Status\"\r\n formControlName=\"accountStatus\" [closeOnSelect]=\"false\" [clearable]=\"false\" [searchable]=\"false\"\r\n required\r\n [ngClass]=\"{'invalid-select': searchForm.get('accountStatus')?.invalid && (searchForm.get('accountStatus')?.touched|| formValidationError)}\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input type=\"checkbox\" [checked]=\"item$.selected\" /> {{ item.statusName }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Summary Report-->\r\n <div class=\"form-field\" *ngSwitchCase=\"'summaryReport'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Summary Report</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"summaryReportTypes\" bindLabel=\"label\" bindValue=\"value\"\r\n [clearable]=\"false\" formControlName=\"summaryReport\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.label\">{{ item.label }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n\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 mandatory fields\r\n</div>\r\n\r\n<div class=\"alert alert-danger mt-3\" *ngIf=\"errorMessage && loadingState === ComponentLoadingState.Error\">\r\n {{ errorMessage }}\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;padding:0!important}::ng-deep .ng-select .ng-select-container .ng-value-container{overflow:hidden;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:15px!important;width:auto!important;margin-right:7px!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-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}}.input-group-button{background:none!important;border:1px solid #1877F2!important;background-color:#1877f2!important;border-radius:0 3px 3px 0!important;min-width:35px;margin-left:1px;height:32px!important;cursor:pointer}.input-group-button .fa{color:#fff}.input-group-button:focus{box-shadow:0 0 5px 3px #009ee054}.input-group-button:focus{outline:none!important;box-shadow:none!important}.Breadcrumb h1,.Breadcrumb h2{font-weight:700}.row{display:flex;flex-wrap:wrap;margin-right:0;margin-left:0}.col-2{padding-left:0}.col-10{padding-right:0}.col-custom-10-5{padding-right:0!important;padding-left:0}::ng-deep .invalid-select.ng-select>.ng-select-container{background-color:#d521211a;border:2px solid red!important}.invalid-date{background-color:#d521211a;border:2px solid red!important}\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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: 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.ɵ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: 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: "directive", type: i7.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "component", type: i8.LoaderComponent, selector: "app-loader" }] });
|
|
2135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SearchFilterComponent, decorators: [{
|
|
2136
|
+
type: Component,
|
|
2137
|
+
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<section>\r\n <form [formGroup]=\"searchForm\" (ngSubmit)=\"onSearch()\">\r\n <div class=\"row\">\r\n <div class=\"col-custom-10-5\">\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 [ngClass]=\"{'invalid-select': searchForm.get('client')?.invalid && (searchForm.get('client')?.touched || formValidationError)}\"\r\n (change)=\"onClientChange()\" (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.businessPartnerName\">{{ item.businessPartnerName }}</span>\r\n </ng-template>\r\n\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 [ngClass]=\"{'invalid-select': searchForm.get('branch')?.invalid && (searchForm.get('branch')?.touched || formValidationError)}\"\r\n (change)=\"onBranchChange()\" (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.businessPartnerBranch\">{{ item.businessPartnerBranch }}</span>\r\n </ng-template>\r\n\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 [ngClass]=\"{'invalid-date':searchForm.get('fromDate')?.invalid && (searchForm.get('fromDate')?.touched || formValidationError)}\" />\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\" [minDate]=\"disabledDate\"\r\n autocomplete=\"off\"\r\n [ngClass]=\"{'invalid-date':searchForm.get('toDate')?.invalid && (searchForm.get('toDate')?.touched || formValidationError)}\" />\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\" (open)=\"onOpen()\"\r\n (close)=\"onClose()\" [searchable]=\"isOpen\">\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 (open)=\"onOpen()\" (close)=\"onClose()\"\r\n [searchable]=\"isOpen\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('userId')?.invalid && (searchForm.get('userId')?.touched || formValidationError)}\">\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\" bindValue=\"currencyCode\" placeholder=\"Select Currency\"\r\n [clearable]=\"false\" formControlName=\"currency\" [searchable]=\"true\" [searchFn]=\"currencySearch\"\r\n (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n\r\n <!-- Template for dropdown options -->\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Template for selected value -->\r\n <ng-template ng-label-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Send Currency -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'sendCurrency'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Send Currency</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"currencies\" bindValue=\"currencyCode\" placeholder=\"Select Currency\"\r\n [clearable]=\"false\" formControlName=\"currency\" [searchable]=\"true\" [searchFn]=\"currencySearch\"\r\n (open)=\"onOpen()\" (close)=\"onClose()\" [searchable]=\"isOpen\">\r\n\r\n <!-- Template for dropdown options -->\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Template for selected value -->\r\n <ng-template ng-label-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\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\">Txn. 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 [ngClass]=\"{'invalid-select': searchForm.get('transactionStatus')?.invalid && (searchForm.get('transactionStatus')?.touched || formValidationError)}\">\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\">Txn. 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 [ngClass]=\"{'invalid-date':searchForm.get('date')?.invalid && (searchForm.get('date')?.touched || formValidationError)}\" />\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 <!-- Send Country -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'sendCountry'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Send Country</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n placeholder=\"Select Product\" [clearable]=\"false\" formControlName=\"sendCountry\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.country\">{{ item.country }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Receive Country -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'receiveCountry'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Receive Country</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"countries\" bindLabel=\"country\" bindValue=\"countryCode\"\r\n placeholder=\"Select Product\" [clearable]=\"false\" formControlName=\"receiveCountry\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.country\">{{ item.country }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Transaction Product -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionProduct'\">\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]=\"transactionProducts\" bindLabel=\"name\" 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 <!-- 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\" 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 #dateInput=\"ngbDatepicker\" formControlName=\"date\" autocomplete=\"off\"\r\n [ngClass]=\"{'invalid-date': searchForm.get('date')?.invalid && (searchForm.get('date')?.touched || formValidationError)}\" />\r\n <button class=\"input-group-button cal\" type=\"button\" (click)=\"dateInput.toggle()\">\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 <!-- receiveCurrency -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'receiveCurrency'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Receive Currency</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"currencies\" bindValue=\"currencyCode\" placeholder=\"Select Receive Currency\"\r\n [clearable]=\"false\" formControlName=\"receiveCurrency\" required (change)=\"onBranchChange()\"\r\n [searchable]=\"true\" [searchFn]=\"currencySearch\" (open)=\"onOpen()\" (close)=\"onClose()\"\r\n [searchable]=\"isOpen\">\r\n\r\n <!-- Dropdown options -->\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Selected value -->\r\n <ng-template ng-label-tmp let-item=\"item\">\r\n <div\r\n [title]=\"item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency)\">\r\n {{ item.currencyCode === 'All' ? 'All' : (item.currencyCode + ' - ' + item.currency) }}\r\n </div>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Send BusinessPartner -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'sendBusinessPartner'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Send Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"sendBusinessPartnerAgents\" bindLabel=\"name\" bindValue=\"id\"\r\n placeholder=\"Select Send Partner\" [clearable]=\"false\" formControlName=\"sendBusinessPartner\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('sendBusinessPartner')?.invalid && (searchForm.get('sendBusinessPartner')?.touched || formValidationError)}\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.name\">{{ item.name }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Recv BusinessPartner -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'recvBusinessPartner'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Recv Client<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"recvBusinessPartnerAgents\" bindLabel=\"name\" bindValue=\"id\"\r\n placeholder=\"Select Recv Partner\" [clearable]=\"false\" formControlName=\"recvBusinessPartner\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('recvBusinessPartner')?.invalid && (searchForm.get('recvBusinessPartner')?.touched || formValidationError)}\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.name\">{{ item.name }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Transaction Status (Single-select) -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'transactionStatusSingleSelect'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Txn. Status<span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"transactionStatuses\" bindLabel=\"transactionStatus\" bindValue=\"transactionStatus\"\r\n placeholder=\"Select Status\" [clearable]=\"false\" formControlName=\"transactionStatus\" required\r\n [ngClass]=\"{'invalid-select': searchForm.get('transactionStatus')?.invalid && (searchForm.get('transactionStatus')?.touched || formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- For Trial Balance - Accounts Report -->\r\n\r\n <!-- Business Line -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'businessLine'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Business Line</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"businessLines\" bindLabel=\"businessLine\" bindValue=\"businessLine\"\r\n placeholder=\"Select Business Line\" [clearable]=\"false\" formControlName=\"businessLine\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('businessLine')?.invalid && (searchForm.get('businessLine')?.touched || formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Year -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'financialYear'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Financial Year</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"financialYears\" bindLabel=\"financialYear\" bindValue=\"financialYear\"\r\n placeholder=\"Select Year\" [clearable]=\"false\" formControlName=\"financialYear\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('financialYear')?.invalid && (searchForm.get('financialYear')?.touched || formValidationError)}\"\r\n (change)=\"onSelectFinancialYear()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- From Month -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'fromMonth'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">From Month</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"fromMonths\" bindLabel=\"period\" bindValue=\"pOrder\"\r\n placeholder=\"Select From Month\" [clearable]=\"false\" formControlName=\"fromMonth\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('fromMonth')?.invalid && (searchForm.get('fromMonth')?.touched|| formValidationError)}\"\r\n (change)=\"onSelectFromMonth()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- To Month -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'toMonth'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">To Month</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"toMonths\" bindLabel=\"pMonthName\" bindValue=\"pMonth\"\r\n placeholder=\"Select To Month\" [clearable]=\"false\" formControlName=\"toMonth\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('toMonth')?.invalid && (searchForm.get('toMonth')?.touched|| formValidationError)}\"\r\n (change)=\"onSelectToMonth()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- From Day -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'fromDay'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">From Day <span class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"fromDays\" bindLabel=\"individualDay\" bindValue=\"individualDate\"\r\n placeholder=\"Select From Day\" [clearable]=\"false\" formControlName=\"fromDay\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('fromDay')?.invalid && (searchForm.get('fromDay')?.touched|| formValidationError)}\"\r\n (change)=\"onSelectFromDay()\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- To Day -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'toDay'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">To Day<span style=\"margin-left: 1px;\"\r\n class=\"text-danger\">*</span></label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"toDays\" bindLabel=\"pDate\" bindValue=\"individualDate\" placeholder=\"Select To Day\"\r\n [clearable]=\"false\" formControlName=\"toDay\"\r\n [ngClass]=\"{'invalid-select': searchForm.get('toDay')?.invalid && (searchForm.get('toDay')?.touched|| formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Date Type -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'dateTypeForTrialBalanceAccounts'\">\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 [items]=\"dateTypes\" bindLabel=\"dateTypeLabel\" bindValue=\"dateTypeCode\"\r\n placeholder=\"Select Date Type\" formControlName=\"dateType\" [clearable]=\"false\" required\r\n [ngClass]=\"{'invalid-select': searchForm.get('dateType')?.invalid && (searchForm.get('dateType')?.touched|| formValidationError)}\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Account Status -->\r\n <div class=\"form-field\" *ngSwitchCase=\"'accountStatus'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Account Status</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select class=\"transaction-status-select\" [items]=\"accountStatuses\" bindLabel=\"statusName\"\r\n bindValue=\"statusCode\" [multiple]=\"true\" placeholder=\"Select Account Status\"\r\n formControlName=\"accountStatus\" [closeOnSelect]=\"false\" [clearable]=\"false\" [searchable]=\"false\"\r\n required\r\n [ngClass]=\"{'invalid-select': searchForm.get('accountStatus')?.invalid && (searchForm.get('accountStatus')?.touched|| formValidationError)}\">\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\">\r\n <input type=\"checkbox\" [checked]=\"item$.selected\" /> {{ item.statusName }}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Summary Report-->\r\n <div class=\"form-field\" *ngSwitchCase=\"'summaryReport'\">\r\n <div class=\"row align-items-center\">\r\n <div class=\"col-2\">\r\n <label class=\"form-label label-data\">Summary Report</label>\r\n </div>\r\n <div class=\"col-10\">\r\n <ng-select [items]=\"summaryReportTypes\" bindLabel=\"label\" bindValue=\"value\"\r\n [clearable]=\"false\" formControlName=\"summaryReport\">\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n <span [title]=\"item.label\">{{ item.label }}</span>\r\n </ng-template>\r\n\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n\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 mandatory fields\r\n</div>\r\n\r\n<div class=\"alert alert-danger mt-3\" *ngIf=\"errorMessage && loadingState === ComponentLoadingState.Error\">\r\n {{ errorMessage }}\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;padding:0!important}::ng-deep .ng-select .ng-select-container .ng-value-container{overflow:hidden;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:15px!important;width:auto!important;margin-right:7px!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-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}}.input-group-button{background:none!important;border:1px solid #1877F2!important;background-color:#1877f2!important;border-radius:0 3px 3px 0!important;min-width:35px;margin-left:1px;height:32px!important;cursor:pointer}.input-group-button .fa{color:#fff}.input-group-button:focus{box-shadow:0 0 5px 3px #009ee054}.input-group-button:focus{outline:none!important;box-shadow:none!important}.Breadcrumb h1,.Breadcrumb h2{font-weight:700}.row{display:flex;flex-wrap:wrap;margin-right:0;margin-left:0}.col-2{padding-left:0}.col-10{padding-right:0}.col-custom-10-5{padding-right:0!important;padding-left:0}::ng-deep .invalid-select.ng-select>.ng-select-container{background-color:#d521211a;border:2px solid red!important}.invalid-date{background-color:#d521211a;border:2px solid red!important}\n"] }]
|
|
2138
|
+
}], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i2.FormBuilder }, { type: i3.ConfigService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { ReportName: [{
|
|
2139
|
+
type: Input
|
|
2140
|
+
}], searchClicked: [{
|
|
2141
|
+
type: Output
|
|
2142
|
+
}], formValid: [{
|
|
2143
|
+
type: Output
|
|
2144
|
+
}], initialFilters: [{
|
|
2145
|
+
type: Input
|
|
2146
|
+
}] } });
|
|
2147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9zZWFyY2gtZmlsdGVyL3NlYXJjaC1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvc2VhcmNoLWZpbHRlci9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBOEQsTUFBTSxtRUFBbUUsQ0FBQztBQUN0SyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJM0MsT0FBTyxLQUFLLGFBQWEsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7OztBQVFqRCxNQUFNLE9BQU8scUJBQXFCO0lBcUZoQyxZQUNVLGFBQTRCLEVBQzVCLEVBQWUsRUFDZixNQUFxQixFQUNyQixFQUFxQjtRQUhyQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXZGckIs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LElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUMzRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFckMsUUFBUTtZQUNSLElBQUksV0FBVyxLQUFLLFVBQVUsSUFBSSxXQUFXLEtBQUssUUFBUSxJQUFJLFdBQVcsS0FBSyxNQUFNLElBQUksV0FBVyxLQUFLLFdBQVcsRUFBRTtnQkFDbkgsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsT0FBTzthQUNSO1lBRUQsa0dBQWtHO1lBQ2xHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFekQsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7O2tIQTcwRVUscUJBQXFCO3NHQUFyQixxQkFBcUIsc01DbEJsQyxnNWdDQXdsQk07MkZEdGtCTyxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsbUJBQW1COzBMQU1wQixVQUFVO3NCQUFsQixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFRSxjQUFjO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE9uRGVzdHJveSwgT3V0cHV0LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGUsIENsaWVudCwgQnJhbmNoLCBDdXJyZW5jeSwgUHJvZHVjdCwgVHJhbnNhY3Rpb25TdGF0dXMsIFVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbHMvdHJhbnNhY3Rpb24tZW5xdWlyeS1yZXBvcnQvdHJhbnNhY3Rpb24tZW5xdWlyeS5tb2RlbCc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZm9ya0pvaW4sIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBSZXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ2JEYXRlU3RydWN0IH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgKiBhcyBhbmd1bGFyQ29tbW9uIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zZWFyY2gtZmlsdGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWZpbHRlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU2VhcmNoRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIFJlcG9ydE5hbWUhOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHNlYXJjaENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZm9ybVZhbGlkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIHNlYXJjaEZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgaW5pdGlhbEZpbHRlcnM6IGFueTtcclxuICBmb3JtVmFsaWRhdGlvbkVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGxvYWRpbmdTdGF0ZTogQ29tcG9uZW50TG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gIENvbXBvbmVudExvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZTtcclxuICBoYXNTZWFyY2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIGN1cnJlbnRVc2VyOiBzdHJpbmcgPSAnJztcclxuICB1c2VybmFtZU1pc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0b2tlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2FjY2Vzc190b2tlbicpO1xyXG4gIGFwcGxpY2F0aW9uVHlwZSA9ICdlenJlbWl0JztcclxuICBjb21wYW55Q29kZSA9ICdCSCc7XHJcbiAgc2VydmljZVVybDogc3RyaW5nO1xyXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcclxuXHJcbiAgY2xpZW50czE6IENsaWVudFtdID0gW107XHJcbiAgYnJhbmNoZXM6IEJyYW5jaFtdID0gW107XHJcbiAgdXNlcnM6IFVzZXJbXSA9IFtdO1xyXG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5W10gPSBbXTtcclxuICBwcm9kdWN0czogUHJvZHVjdFtdID0gW107XHJcbiAgdHJhbnNhY3Rpb25TdGF0dXNlczogVHJhbnNhY3Rpb25TdGF0dXNbXSA9IFtdO1xyXG4gIHN1bW1hcnlSZXBvcnRUeXBlczogYW55W10gPSBbXTtcclxuICBzZWxlY3RlZFN0YXR1c2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHNob3dTdGF0dXNEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZpc2libGVGaWVsZEtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgcGFyYW1zOiBhbnk7XHJcbiAgY291bnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIHRyYW5zYWN0aW9uUHJvZHVjdHM6IGFueVtdID0gW107XHJcbiAgZGF0ZVR5cGU6IGFueSA9IDE7XHJcbiAgZGF0ZTogYW55O1xyXG4gIHNlbmRCdXNpbmVzc1BhcnRuZXJBZ2VudHM6IGFueVtdID0gW107XHJcbiAgcmVjdkJ1c2luZXNzUGFydG5lckFnZW50czogYW55W10gPSBbXTtcclxuICBjbGllbnROYW1lOiBzdHJpbmc7XHJcbiAgY2xpZW50VHlwZTogc3RyaW5nO1xyXG4gIGRpc2FibGVkRGF0ZTogTmdiRGF0ZVN0cnVjdDtcclxuICBpc1NlbGVjdEFsbENoZWNrZWQgPSB0cnVlO1xyXG4gIGVycm9NZXNzYWdlOiBzdHJpbmcgPSAnRXJyb3IgaW4gTG9hZGluZyBEYXRhJztcclxuXHJcbiAgLy8gZm9yIFRyaWFsIEJhbGFuY2UgLSBBY2NvdW50cyBSZXBvcnRcclxuICBidXNpbmVzc0xpbmVzOiBhbnlbXSA9IFtdO1xyXG4gIGFjY291bnRTdGF0dXNlczogYW55W10gPSBbXTtcclxuICBjdXJyZW5jeTogYW55W10gPSBbXTtcclxuICBmaW5hbmNpYWxZZWFyczogYW55W10gPSBbXTtcclxuICBmcm9tTW9udGhzOiBhbnlbXSA9IFtdO1xyXG4gIHRvTW9udGhzOiBhbnlbXSA9IFtdO1xyXG4gIGRhdGVUeXBlczogYW55W10gPSBbXTtcclxuICBmcm9tRGF5czogYW55W10gPSBbXTtcclxuICB0b0RheXM6IGFueVtdID0gW107XHJcbiAgcGFyYW1EYXRlRGVmYXVsdDogYW55W10gPSBbXTtcclxuXHJcbiAgLy8gRmllbGQgdmlzaWJpbGl0eSBtYXAsICdmcm9tRGF0ZScsICd0b0RhdGUnLCdwcm9kdWN0JywndXNlcklkJywnY3VycmVuY3knLCd0cmFuc2FjdGlvblN0YXR1cycsJ3RyYW5zYWN0aW9uTm8nXHJcbiAgdmlzaWJsZUZpZWxkc01hcDogeyBbcmVwb3J0OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge1xyXG4gICAgJ1RyYW5zYWN0aW9uIEVucXVpcnknOiBbJ2NsaWVudCcsICdmcm9tRGF0ZScsICd0b0RhdGUnLCAnYnJhbmNoJywgJ3Byb2R1Y3QnLCAnY3VycmVuY3knLCAndHJhbnNhY3Rpb25TdGF0dXMnLCAndHJhbnNhY3Rpb25ObyddLFxyXG4gICAgJ0ZDIExlZGdlcic6IFsnY2xpZW50JywgJ2Zyb21EYXRlJywgJ3RvRGF0ZScsICdjdXJyZW5jeScsICdwcm9kdWN0J10sXHJcbiAgICAnQnJhbmNoIEFjdGl2aXR5IFNlbmQnOiBbJ2NsaWVudCcsICdmcm9tRGF0ZScsICd0b0RhdGUnLCAnYnJhbmNoJywgJ3RyYW5zYWN0aW9uUHJvZHVjdCcsICdyZWNlaXZlQ3VycmVuY3knLCAndHJhbnNhY3Rpb25TdGF0dXMnLCAnc2VuZENvdW50cnknLCAncmVjZWl2ZUNvdW50cnknXSxcclxuICAgICdBQ0MgR0wgRGV0YWlscyBFbnF1aXJ5JzogWydkYXRlVHlwZScsICdkYXRlJ10sXHJcbiAgICAnQnJhbmNoIEFjdGl2aXR5IFJlY2VpdmUnOiBbJ2NsaWVudCcsICdmcm9tRGF0ZScsICd0b0RhdGUnLCAnYnJhbmNoJywgJ3RyYW5zYWN0aW9uUHJvZHVjdCcsICdyZWNlaXZlQ3VycmVuY3knLCAndHJhbnNhY3Rpb25TdGF0dXMnLCAnc2VuZENvdW50cnknLCAncmVjZWl2ZUNvdW50cnknXSxcclxuICAgICdDYW5jZWxsYXRpb24gVHJhbnNhY3Rpb24nOiBbJ2NsaWVudCcsICdmcm9tRGF0ZScsICd0b0RhdGUnLCAnYnJhbmNoJywgJ3NlbmRDb3VudHJ5JywgJ3JlY2VpdmVDb3VudHJ5JywgJ3Byb2R1Y3QnLCAncmVjZWl2ZUN1cnJlbmN5J10sXHJcbiAgICAnUmV2ZW51ZSBQZXIgVHJhbnNhY3Rpb24nOiBbJ3NlbmRCdXNpbmVzc1BhcnRuZXInLCAnZnJvbURhdGUnLCAndG9EYXRlJywgJ3JlY3ZCdXNpbmVzc1BhcnRuZXInLCAnc2VuZENvdW50cnknLCAncmVjZWl2ZUNvdW50cnknLCAndHJhbnNhY3Rpb25TdGF0dXMnXSxcclxuICAgICdTdGF0ZW1lbnQgb2YgQWNjb3VudHMnOiBbJ2NsaWVudCcsICdmcm9tRGF0ZScsICd0b0RhdGUnXSxcclxuICAgICdBY2NvdW50aW5nJzogWydjbGllbnQnLCAnZnJvbURhdGUnLCAndG9EYXRlJywgJ2JyYW5jaCcsICd0cmFuc2FjdGlvblByb2R1Y3QnLCAnc2VuZEN1cnJlbmN5JywgJ3RyYW5zYWN0aW9uU3RhdHVzJywgJ3NlbmRDb3VudHJ5JywgJ3JlY2VpdmVDb3VudHJ5J10sXHJcbiAgICAnQ3JlZGl0IExpbWl0IFN0YXR1cyBFbnF1aXJ5JzogWydjbGllbnQnLCAnZnJvbURhdGUnLCAndG9EYXRlJywgJ3RyYW5zYWN0aW9uU3RhdHVzU2luZ2xlU2VsZWN0J10sXHJcbiAgICAnRnVuZGluZyc6IFsnZnJvbURhdGUnLCAndG9EYXRlJ10sXHJcbiAgICAnVHJpYWwgQmFsYW5jZSAtIEFjY291bnRzJzogWydidXNpbmVzc0xpbmUnLCAnYWNjb3VudFN0YXR1cycsICdjdXJyZW5jeScsICdmaW5hbmNpYWxZZWFyJywgJ2Zyb21Nb250aCcsICd0b01vbnRoJywgJ2RhdGVUeXBlRm9yVHJpYWxCYWxhbmNlQWNjb3VudHMnLCAnZnJvbURheScsICd0b0RheSddLFxyXG4gICAgJ0JyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnknOiBbJ2NsaWVudCcsICdmcm9tRGF0ZScsICd0b0RhdGUnLCAnYnJhbmNoJywgJ3RyYW5zYWN0aW9uUHJvZHVjdCcsICdyZWNlaXZlQ3VycmVuY3knLCAndHJhbnNhY3Rpb25TdGF0dXMnLCAnc2VuZENvdW50cnknLCAncmVjZWl2ZUNvdW50cnknLCAnc3VtbWFyeVJlcG9ydCddLFxyXG5cclxuICAgICdUcmFuc2FjdGlvbiBNb25pdG9yaW5nJzogWydjbGllbnQnLCAnZnJvbURhdGUnLCAndG9EYXRlJywgJ2JyYW5jaCcsICd0cmFuc2FjdGlvblByb2R1Y3QnLCAncmVjZWl2ZUN1cnJlbmN5JywgJ3RyYW5zYWN0aW9uU3RhdHVzJywgJ3NlbmRDb3VudHJ5JywgJ3JlY2VpdmVDb3VudHJ5J10sXHJcbiAgICAvLyBBZGQgbW9yZSByZXBvcnQgdHlwZXMgaGVyZVxyXG4gIH07XHJcblxyXG4gIGdldCB2aXNpYmxlRmllbGRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLnZpc2libGVGaWVsZHNNYXBbdGhpcy5SZXBvcnROYW1lXSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGlzRmllbGRWaXNpYmxlKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZpc2libGVGaWVsZHMuaW5jbHVkZXMoZmllbGQpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlcG9ydFNlcnZpY2U6IFJlcG9ydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHRoaXMuc2VydmljZVVybCA9IHRoaXMuY29uZmlnLmdldC5zZXJ2aWNlVXJsO1xyXG4gICAgbGV0IGZvc3NpbFVzZXIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3NzaWx1c2VybmFtZScpO1xyXG4gICAgbGV0IGV6cmVtaXRVc2VyID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZXpyZW1pdHVzZXJuYW1lJyk7XHJcblxyXG4gICAgaWYgKGZvc3NpbFVzZXIpIHRoaXMuY3VycmVudFVzZXIgPSBmb3NzaWxVc2VyO1xyXG4gICAgZWxzZSBpZiAoZXpyZW1pdFVzZXIpIHRoaXMuY3VycmVudFVzZXIgPSBlenJlbWl0VXNlcjtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJuYW1lTWlzc2luZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlci5yZXBsYWNlKC9eW1wiJ10oLiopW1wiJ10kLywgJyQxJyk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuZGlzYWJsZWREYXRlID0ge1xyXG4gICAgICB5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgIGRheTogdG9kYXkuZ2V0RGF0ZSgpXHJcbiAgICB9O1xyXG4gICAgdGhpcy5jaGVja1JlcG9ydCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tSZXBvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGVDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMubG9hZEluaXRpYWxEYXRhKCk7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNTdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJCcmFuY2ggQWN0aXZpdHkgU2VuZFwiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGEoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGVDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNTdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJBQ0MgR0wgRGV0YWlscyBFbnF1aXJ5XCIpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkNhbmNlbGxhdGlvbiBUcmFuc2FjdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGEoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGVDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09PSBcIkJyYW5jaCBBY3Rpdml0eSBSZWNlaXZlXCIpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvblN0YXR1c1N1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PT0gXCJSZXZlbnVlIFBlciBUcmFuc2FjdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKVxyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvblN0YXR1c1N1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlN0YXRlbWVudCBvZiBBY2NvdW50c1wiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGEoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGVDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQWNjb3VudGluZ1wiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGEoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGVDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNTdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT09IFwiQ3JlZGl0IExpbWl0IFN0YXR1cyBFbnF1aXJ5XCIpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJGdW5kaW5nXCIpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmlhbCBCYWxhbmNlIC0gQWNjb3VudHNcIikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgICAgIHRoaXMubG9hZEluaXRpYWxEYXRhKCk7XHJcbiAgICB9XHJcbiAgICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJCcmFuY2ggQWN0aXZpdHkgU2VuZCBTdW1tYXJ5XCIpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvblN0YXR1c1N1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmFuc2FjdGlvbiBNb25pdG9yaW5nXCIpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YSgpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUNoYW5nZXMoKTtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvblN0YXR1c1N1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZEluaXRpYWxEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSAnVHJhbnNhY3Rpb24gRW5xdWlyeScpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFmb3J0eG5FbnF1aXJ5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kXCIpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFmb3JCcmFuY2hBY3Rpdml0eVNlbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09PSBcIkJyYW5jaCBBY3Rpdml0eSBSZWNlaXZlXCIpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFmb3JCcmFuY2hBY3Rpdml0eVJlY2VpdmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJDYW5jZWxsYXRpb24gVHJhbnNhY3Rpb25cIikge1xyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YUZvckNhbmNlbGxhdGlvblJlcG9ydCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PT0gXCJSZXZlbnVlIFBlciBUcmFuc2FjdGlvblwiKSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGFGb3JSZXZlbnVlUGVyVHJhbnNhY3Rpb25SZXBvcnQoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJTdGF0ZW1lbnQgb2YgQWNjb3VudHNcIikge1xyXG4gICAgICB0aGlzLmxvYWRJbml0aWFsRGF0YUZvclN0YXRlbWVudE9mQWNjb3VudHMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJBY2NvdW50aW5nXCIpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFmb3JBY2NvdW50aW5nKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJpYWwgQmFsYW5jZSAtIEFjY291bnRzXCIpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFGb3JUcmlhbEJhbGFuY2VBY2NvdW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT09IFwiQ3JlZGl0IExpbWl0IFN0YXR1cyBFbnF1aXJ5XCIpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFGb3JDcmVkaXRMaW1pdFN0YXR1c0VucXVpcnkoKTtcclxuICAgIH1cclxuICAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeVwiKSB7XHJcbiAgICAgIHRoaXMubG9hZEluaXRpYWxEYXRhZm9yQnJhbmNoQWN0aXZpdHlTZW5kU3VtbWFyeSgpO1xyXG4gICAgfVxyXG4gIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmFuc2FjdGlvbiBNb25pdG9yaW5nXCIpIHtcclxuICAgICAgdGhpcy5sb2FkSW5pdGlhbERhdGFmb3JUcmFuc2FjdGlvbk1vbml0b3JpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gbG9hZEluaXRpYWxEYXRhZm9yQnJhbmNoQWN0aXZpdHlTZW5kU3VtbWFyeSgpIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIHBhcmFtczogdGhpcy5yZXBvcnRTZXJ2aWNlLmdldFBhcmFtc0ZvclNlbmRTdW1tYXJ5UmVwb3J0KCkucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHBhcmFtcycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgICAgY2xpZW50czogdGhpcy5yZXBvcnRTZXJ2aWNlLmdldFBheUluQWdlbnRmb3JTZW5kU3VtbWFyeVJlcG9ydCgpLnBpcGUoXHJcbiAgICAgICAgbWFwKChjbGllbnRzOiBhbnlbXSk6IENsaWVudFtdID0+XHJcbiAgICAgICAgICBjbGllbnRzLm1hcCgoY2xpZW50LCBpbmRleCkgPT4gKHtcclxuICAgICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyTmFtZTogY2xpZW50LmFnZW50LFxyXG4gICAgICAgICAgICBidXNpbmVzc1BhcnRuZXJDb2RlOiBjbGllbnQuY29kZSxcclxuICAgICAgICAgICAgZGlzcGxheU9yZGVyOiBpbmRleCxcclxuICAgICAgICAgICAgY2xpZW50VHlwZTogXCJcIlxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNsaWVudHMnLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KS5zdWJzY3JpYmUoXHJcbiAgICAgIHtcclxuICAgICAgICBuZXh0OiAoeyBwYXJhbXMsIGNsaWVudHMgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudHMxID0gY2xpZW50cztcclxuICAgICAgICAgIHRoaXMuY291bnRyaWVzID0gWy4uLnBhcmFtcz8uY291bnRyaWVzXVxyXG4gICAgICAgICAgdGhpcy5jdXJyZW5jaWVzID0gWy4uLnBhcmFtcz8uY3VycmVuY2llc107XHJcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXMgPSBbLi4ucGFyYW1zPy50cmFuc2FjdGlvblN0YXR1c1R5cGVzXTtcclxuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Qcm9kdWN0cyA9IFsuLi5wYXJhbXM/LnRyYW5zYWN0aW9uUHJvZHVjdFR5cGVzXTtcclxuICAgICAgICAgIHRoaXMuc3VtbWFyeVJlcG9ydFR5cGVzID0gW1xyXG4gICAgICAgICAgICB7IGxhYmVsOiAnRGF0ZS1XaXNlIFN1bW1hcnknLCB2YWx1ZTogJ0RhdGUtV2lzZSBTdW1tYXJ5JyB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiAnVG90YWwgU3VtbWFyeScsIHZhbHVlOiAnVG90YWwgU3VtbWFyeScgfVxyXG4gICAgICAgICAgXTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGNsaWVudDogdGhpcy5jbGllbnRzMVswXS5idXNpbmVzc1BhcnRuZXJDb2RlIH0pO1xyXG4gICAgICAgICAgdGhpcy5vbkNsaWVudENoYW5nZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIGZvcmtKb2luIGVycm9yJywgZXJyKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgICBcclxuICBsb2FkSW5pdGlhbERhdGFmb3JUcmFuc2FjdGlvbk1vbml0b3JpbmcoKSB7XHJcbiAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIHBhcmFtczogdGhpcy5yZXBvcnRTZXJ2aWNlLmdldFBhcmFtc0ZvclRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcG9ydCgpLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBwYXJhbXMnLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIGNsaWVudHM6IHRoaXMucmVwb3J0U2VydmljZS5nZXRQYXlJbkFnZW50Zm9yVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVwb3J0KCkucGlwZShcclxuICAgICAgICBtYXAoKGNsaWVudHM6IGFueVtdKTogQ2xpZW50W10gPT5cclxuICAgICAgICAgIGNsaWVudHMubWFwKChjbGllbnQsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICBidXNpbmVzc1BhcnRuZXJOYW1lOiBjbGllbnQuYWdlbnQsXHJcbiAgICAgICAgICAgIGJ1c2luZXNzUGFydG5lckNvZGU6IGNsaWVudC5jb2RlLFxyXG4gICAgICAgICAgICBkaXNwbGF5T3JkZXI6IGluZGV4LFxyXG4gICAgICAgICAgICBjbGllbnRUeXBlOiBcIlwiXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICApLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgY2xpZW50cycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgIH0pLnN1YnNjcmliZShcclxuICAgICAge1xyXG4gICAgICAgIG5leHQ6ICh7IHBhcmFtcywgY2xpZW50cyB9KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgICAgIHRoaXMuY2xpZW50czEgPSBjbGllbnRzO1xyXG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMgPSBbLi4ucGFyYW1zPy5jb3VudHJpZXNdXHJcbiAgICAgICAgICB0aGlzLmN1cnJlbmNpZXMgPSBbLi4ucGFyYW1zPy5jdXJyZW5jaWVzXTtcclxuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNlcyA9IFsuLi5wYXJhbXM/LnRyYW5zYWN0aW9uU3RhdHVzVHlwZXNdO1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvblByb2R1Y3RzID0gWy4uLnBhcmFtcz8udHJhbnNhY3Rpb25Qcm9kdWN0VHlwZXNdO1xyXG5cclxuICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBjbGllbnQ6IHRoaXMuY2xpZW50czFbMF0uYnVzaW5lc3NQYXJ0bmVyQ29kZSB9KTtcclxuICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIC8vcGF0Y2ggZGF0YVxyXG4gICAgICAgICAgICB0aGlzLmFwcGx5SW5pdGlhbEZpbHRlcnMoKTtcclxuICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgdGhpcy5vbkNsaWVudENoYW5nZSgpO1xyXG4gICAgICAgICAgLy8gIEFVVE8gTE9BRCBPTkxZIGZvciByb3V0ZWQgY2FzZVxyXG4gICAgICAgICAgaWYgKHRoaXMuaW5pdGlhbEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIGZvcmtKb2luIGVycm9yJywgZXJyKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsRmlsdGVycygpIHtcclxuICAgIGlmICghdGhpcy5pbml0aWFsRmlsdGVycykgcmV0dXJuO1xyXG4gICAgY29uc3QgcGF0Y2g6IGFueSA9IHt9O1xyXG4gICAgLy8gVHJhbnNhY3Rpb24gU3RhdHVzIChTVFJJTkcg4oaSIEFSUkFZKVxyXG4gICAgaWYgKHRoaXMuaW5pdGlhbEZpbHRlcnMudHJhbnNhY3Rpb25TdGF0dXMpIHtcclxuICAgICAgcGF0Y2gudHJhbnNhY3Rpb25TdGF0dXMgPSBbdGhpcy5pbml0aWFsRmlsdGVycy50cmFuc2FjdGlvblN0YXR1c107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVjZWl2ZSBDb3VudHJ5XHJcbiAgICBpZiAodGhpcy5pbml0aWFsRmlsdGVycy5yZWNlaXZlQ291bnRyeSkge1xyXG4gICAgICBwYXRjaC5yZWNlaXZlQ291bnRyeSA9IHRoaXMuaW5pdGlhbEZpbHRlcnMucmVjZWl2ZUNvdW50cnk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVhbHRpbWUgaGFuZGxpbmdcclxuICAgIGlmICh0aGlzLmluaXRpYWxGaWx0ZXJzLmlzUmVhbHRpbWUpIHtcclxuXHJcbiAgICAgIHBhdGNoLmZyb21EYXRlID0gJyc7XHJcbiAgICAgIHBhdGNoLnRvRGF0ZSA9ICcnO1xyXG4gICAgICAvL2NsZWFyXHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b0RhdGUnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgaWYgdmFsdWVzIGV4aXN0IChWRVJZIElNUE9SVEFOVClcclxuICAgICAgaWYgKHRoaXMuaW5pdGlhbEZpbHRlcnMudG9EYXRlKSB7XHJcbiAgICAgICAgcGF0Y2gudG9EYXRlID0gdGhpcy5pbml0aWFsRmlsdGVycy50b0RhdGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaW5pdGlhbEZpbHRlcnMuZnJvbURhdGUpIHtcclxuICAgICAgICBwYXRjaC5mcm9tRGF0ZSA9IHRoaXMuaW5pdGlhbEZpbHRlcnMuZnJvbURhdGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF0ZScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyBTaW5nbGUgcGF0Y2ggY2FsbCAoYXZvaWRzIG11bHRpcGxlIHRyaWdnZXJzKVxyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUocGF0Y2gsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgndG9EYXRlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2xpZW50OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBicmFuY2g6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHByb2R1Y3Q6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIGN1cnJlbmN5OiBbJ0FsbCddLFxyXG4gICAgICAgICAgdHJhbnNhY3Rpb25TdGF0dXM6IFtbJ0FsbCddLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHRyYW5zYWN0aW9uTm86IFsnJ11cclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJBQ0MgR0wgRGV0YWlscyBFbnF1aXJ5XCIpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gdGhpcy5mYi5ncm91cChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBkYXRlVHlwZTogWzEsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kXCIpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gdGhpcy5mYi5ncm91cChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjbGllbnQ6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIGZyb21EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0b0RhdGU6IFtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIGJyYW5jaDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgcmVjZWl2ZUN1cnJlbmN5OiBbJ0FsbCddLFxyXG4gICAgICAgICAgcHJvZHVjdDogWydBbGwnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHRyYW5zYWN0aW9uU3RhdHVzOiBbWydBbGwnXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBzZW5kQ291bnRyeTogWydBbGwnXSxcclxuICAgICAgICAgIHJlY2VpdmVDb3VudHJ5OiBbJ0FsbCddXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJCcmFuY2ggQWN0aXZpdHkgUmVjZWl2ZVwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2xpZW50OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBicmFuY2g6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHJlY2VpdmVDdXJyZW5jeTogWydBbGwnXSxcclxuICAgICAgICAgIHByb2R1Y3Q6IFsnQWxsJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvblN0YXR1czogW1snQWxsJ10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgc2VuZENvdW50cnk6IFsnQWxsJ10sXHJcbiAgICAgICAgICByZWNlaXZlQ291bnRyeTogWydBbGwnXVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQ2FuY2VsbGF0aW9uIFRyYW5zYWN0aW9uXCIpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gdGhpcy5mYi5ncm91cChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjbGllbnQ6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIGZyb21EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0b0RhdGU6IFtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIGJyYW5jaDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgc2VuZENvdW50cnk6IFtudWxsXSxcclxuICAgICAgICAgIHJlY2VpdmVDb3VudHJ5OiBbbnVsbF0sXHJcbiAgICAgICAgICBwcm9kdWN0OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICByZWNlaXZlQ3VycmVuY3k6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PT0gXCJSZXZlbnVlIFBlciBUcmFuc2FjdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHNlbmRCdXNpbmVzc1BhcnRuZXI6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIHRvRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIHJlY3ZCdXNpbmVzc1BhcnRuZXI6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICB0cmFuc2FjdGlvblN0YXR1czogW1snQWxsJ10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIHNlbmRDb3VudHJ5OiBbJ0FsbCddLFxyXG4gICAgICAgIHJlY2VpdmVDb3VudHJ5OiBbJ0FsbCddXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlN0YXRlbWVudCBvZiBBY2NvdW50c1wiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2xpZW50OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkFjY291bnRpbmdcIikge1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0gPSB0aGlzLmZiLmdyb3VwKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNsaWVudDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgZnJvbURhdGU6IFtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHRvRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgYnJhbmNoOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBjdXJyZW5jeTogWydBbGwnXSxcclxuICAgICAgICAgIHByb2R1Y3Q6IFsnQWxsJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvblN0YXR1czogW1snQWxsJ10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgc2VuZENvdW50cnk6IFsnQWxsJ10sXHJcbiAgICAgICAgICByZWNlaXZlQ291bnRyeTogWydBbGwnXVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09PSBcIkNyZWRpdCBMaW1pdCBTdGF0dXMgRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2xpZW50OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvblN0YXR1czogWydBbGwnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiRnVuZGluZ1wiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZnJvbURhdGU6IFtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHRvRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlRyaWFsIEJhbGFuY2UgLSBBY2NvdW50c1wiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gQWRkZWQgZmllbGRzXHJcbiAgICAgICAgICBidXNpbmVzc0xpbmU6IFsnQWxsJ10sXHJcbiAgICAgICAgICBhY2NvdW50U3RhdHVzOiBbWydBY3RpdmUnXV0sXHJcbiAgICAgICAgICBmaW5hbmNpYWxZZWFyOiBbbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCldLCAgIC8vIGRlZmF1bHQgdG8gY3VycmVudCB5ZWFyXHJcbiAgICAgICAgICBmcm9tTW9udGg6IFsnJ10sXHJcbiAgICAgICAgICB0b01vbnRoOiBbJyddLFxyXG4gICAgICAgICAgZGF0ZVR5cGU6IFsnVkQnXSwgICAgICAgICAgICAgIC8vIGV4YW1wbGUgZGVmYXVsdFxyXG4gICAgICAgICAgZnJvbURheTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXk6IFt7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIGN1cnJlbmN5OiBbJ0FsbCddLFxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLnJlcG9ydFNlcnZpY2UuR2V0UGFyYW1EYXRlRGVmYXVsdEZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGxldCBmaW5hbmNpYWxNb250aDogc3RyaW5nID0gcmVzcG9uc2VbMF0uZmluYW5jaWFsTW9udGg7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhgZmluYW5jaWFsTW9udGggaW4gaW5pdCBmb3JtIG9mIFRyaWFsIEJhbGFuY2UgLSBBY2NvdW50czogJHtmaW5hbmNpYWxNb250aH1gKTtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgZnJvbU1vbnRoOiBmaW5hbmNpYWxNb250aCxcclxuICAgICAgICAgICAgdG9Nb250aDogZmluYW5jaWFsTW9udGhcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7IGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGRhdGE6JywgZXJyKTsgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIikge1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0gPSB0aGlzLmZiLmdyb3VwKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNsaWVudDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgZnJvbURhdGU6IFtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHRvRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgYnJhbmNoOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICByZWNlaXZlQ3VycmVuY3k6IFsnQWxsJ10sXHJcbiAgICAgICAgICBwcm9kdWN0OiBbJ0FsbCcsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdHJhbnNhY3Rpb25TdGF0dXM6IFtbJ0FsbCddLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHNlbmRDb3VudHJ5OiBbJ0FsbCddLFxyXG4gICAgICAgICAgcmVjZWl2ZUNvdW50cnk6IFsnQWxsJ10sXHJcbiAgICAgICAgICBzdW1tYXJ5UmVwb3J0OiBbJ0RhdGUtV2lzZSBTdW1tYXJ5J11cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gTW9uaXRvcmluZ1wiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2xpZW50OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBmcm9tRGF0ZTogW25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgdG9EYXRlOiBbbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBicmFuY2g6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHJlY2VpdmVDdXJyZW5jeTogWydBbGwnXSxcclxuICAgICAgICAgIHByb2R1Y3Q6IFsnQWxsJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvblN0YXR1czogW1snQWxsJ10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgc2VuZENvdW50cnk6IFsnQWxsJ10sXHJcbiAgICAgICAgICByZWNlaXZlQ291bnRyeTogWydBbGwnXVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRJbml0aWFsRGF0YWZvckJyYW5jaEFjdGl2aXR5U2VuZCgpIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIHBhcmFtczogdGhpcy5yZXBvcnRTZXJ2aWNlLmdldFBhcmFtcygpLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBwYXJhbXMnLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIGNsaWVudHM6IHRoaXMucmVwb3J0U2VydmljZS5nZXRQYXlJbkFnZW50cygpLnBpcGUoXHJcbiAgICAgICAgbWFwKChjbGllbnRzOiBhbnlbXSk6IENsaWVudFtdID0+XHJcbiAgICAgICAgICBjbGllbnRzLm1hcCgoY2xpZW50LCBpbmRleCkgPT4gKHtcclxuICAgICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyTmFtZTogY2xpZW50LmFnZW50LFxyXG4gICAgICAgICAgICBidXNpbmVzc1BhcnRuZXJDb2RlOiBjbGllbnQuY29kZSxcclxuICAgICAgICAgICAgZGlzcGxheU9yZGVyOiBpbmRleCxcclxuICAgICAgICAgICAgY2xpZW50VHlwZTogXCJcIlxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNsaWVudHMnLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KS5zdWJzY3JpYmUoXHJcbiAgICAgIHtcclxuICAgICAgICBuZXh0OiAoeyBwYXJhbXMsIGNsaWVudHMgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudHMxID0gY2xpZW50cztcclxuICAgICAgICAgIHRoaXMuY291bnRyaWVzID0gWy4uLnBhcmFtcz8uY291bnRyaWVzXVxyXG4gICAgICAgICAgdGhpcy5jdXJyZW5jaWVzID0gWy4uLnBhcmFtcz8uY3VycmVuY2llc107XHJcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXMgPSBbLi4ucGFyYW1zPy50cmFuc2FjdGlvblN0YXR1c1R5cGVzXTtcclxuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Qcm9kdWN0cyA9IFsuLi5wYXJhbXM/LnRyYW5zYWN0aW9uUHJvZHVjdFR5cGVzXTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGNsaWVudDogdGhpcy5jbGllbnRzMVswXS5idXNpbmVzc1BhcnRuZXJDb2RlfSk7XHJcbiAgICAgICAgICB0aGlzLm9uQ2xpZW50Q2hhbmdlKCk7XHJcblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIGZvcmtKb2luIGVycm9yJywgZXJyKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEluaXRpYWxEYXRhZm9ydHhuRW5xdWlyeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucmVwb3J0U2VydmljZVxyXG4gICAgICAgIC5nZXRQYWdlTG9hZERhdGEoKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50czEgPSBkYXRhLmNsaWVudHMgfHwgW107XHJcbiAgICAgICAgdGhpcy5jdXJyZW5jaWVzID0gZGF0YS5jdXJyZW5jaWVzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMucHJvZHVjdHMgPSBkYXRhLnByb2R1Y3RzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNlcyA9IChkYXRhLnRyYW5zYWN0aW9uU3RhdHVzZXMgfHwgW10pLmZpbHRlcihcclxuICAgICAgICAgIHRzID0+IHRzLnRyYW5zYWN0aW9uU3RhdHVzICE9PSAnJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgIXRoaXMudHJhbnNhY3Rpb25TdGF0dXNlcy5zb21lKFxyXG4gICAgICAgICAgICBzID0+IHMudHJhbnNhY3Rpb25TdGF0dXMgPT09ICdBbGwnXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXMudW5zaGlmdCh7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhdHVzOiAnQWxsJyxcclxuICAgICAgICAgIH0gYXMgVHJhbnNhY3Rpb25TdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IHByb2R1Y3Q6ICdBbGwnIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGNsaWVudDogdGhpcy5jbGllbnRzMVswXS5idXNpbmVzc1BhcnRuZXJDb2RlfSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbkNsaWVudENoYW5nZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIGluaXRpYWwgZGF0YSc7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZEluaXRpYWxEYXRhZm9yQnJhbmNoQWN0aXZpdHlSZWNlaXZlKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgcGFyYW1zOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQWN0aXZpdHlSZWNlaXZlUGFyYW1zKClcclxuICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHBhcmFtcycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICApLFxyXG4gICAgICBwYXlvdXRBZ2VudHM6IHRoaXMucmVwb3J0U2VydmljZS5nZXRBbGxQYXlPdXRBZ2VudHMoKVxyXG4gICAgICAgIC5waXBlKG1hcCgoY2xpZW50czogYW55W10pOiBDbGllbnRbXSA9PlxyXG4gICAgICAgICAgY2xpZW50cy5tYXAoKGNsaWVudCwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgICAgIGJ1c2luZXNzUGFydG5lck5hbWU6IGNsaWVudC5hZ2VudCxcclxuICAgICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQ29kZTogY2xpZW50LmNvZGUsXHJcbiAgICAgICAgICAgIGRpc3BsYXlPcmRlcjogY2xpZW50Lm51bWJlcixcclxuICAgICAgICAgICAgY2xpZW50VHlwZTogXCJcIlxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgKSwgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KSlcclxuICAgIH0pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6ICh7IHBhcmFtcywgcGF5b3V0QWdlbnRzIH0pID0+IHtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgICB0aGlzLmNsaWVudHMxID0gcGF5b3V0QWdlbnRzO1xyXG4gICAgICAgIHRoaXMuY291bnRyaWVzID0gWy4uLnBhcmFtcz8uY291bnRyaWVzXVxyXG4gICAgICAgIHRoaXMuY3VycmVuY2llcyA9IFsuLi5wYXJhbXM/LmN1cnJlbmNpZXNdO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNlcyA9IFsuLi5wYXJhbXM/LnRyYW5zYWN0aW9uU3RhdHVzVHlwZXNdO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Qcm9kdWN0cyA9IFsuLi5wYXJhbXM/LnRyYW5zYWN0aW9uUHJvZHVjdFR5cGVzXTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBjbGllbnQ6IHRoaXMuY2xpZW50czFbMF0uYnVzaW5lc3NQYXJ0bmVyQ29kZX0pO1xyXG4gICAgICAgIHRoaXMub25DbGllbnRDaGFuZ2UoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBmb3JrSm9pbiBlcnJvcicsIGVycik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZEluaXRpYWxEYXRhRm9yQ2FuY2VsbGF0aW9uUmVwb3J0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucmVwb3J0U2VydmljZVxyXG4gICAgICAgIC5sb2FkRGF0YWZvckNhbmNhbGxhdGlvbigpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMgPSBkYXRhLmNvdW50cmllcyA/PyBbXTtcclxuICAgICAgICB0aGlzLmNsaWVudHMxID0gKGRhdGEucGF5SW5BZ2VudHMgPz8gW10pLm1hcCgoYWdlbnQpID0+ICh7XHJcbiAgICAgICAgICBidXNpbmVzc1BhcnRuZXJOYW1lOiBhZ2VudC5hZ2VudCxcclxuICAgICAgICAgIGJ1c2luZXNzUGFydG5lckNvZGU6IGFnZW50LmNvZGVcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0cyA9IChkYXRhLnByb2R1Y3RUeXBlcyA/PyBbXSkubWFwKChwdCkgPT4gKHtcclxuICAgICAgICAgIHByb2R1Y3RDb2RlOiBwdC5wcm9kdWN0Q29kZSxcclxuICAgICAgICAgIHByb2R1Y3ROYW1lOiBwdC5uYW1lXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuY3VycmVuY2llcyA9IGRhdGEuY3VycmVuY2llcyA/PyBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgcHJvZHVjdDogdGhpcy5wcm9kdWN0c1swXT8ucHJvZHVjdENvZGUsXHJcbiAgICAgICAgICByZWNlaXZlQ291bnRyeTogdGhpcy5jb3VudHJpZXNbMF0/LmNvdW50cnksXHJcbiAgICAgICAgICBzZW5kQ291bnRyeTogdGhpcy5jb3VudHJpZXNbMF0/LmNvdW50cnksXHJcbiAgICAgICAgICByZWNlaXZlQ3VycmVuY3k6IHRoaXMuY3VycmVuY2llc1swXT8uY3VycmVuY3lDb2RlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgY2xpZW50OiB0aGlzLmNsaWVudHMxWzBdLmJ1c2luZXNzUGFydG5lckNvZGV9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLm9uQ2xpZW50Q2hhbmdlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTm8gZGF0YSBjYXNlXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmNsaWVudHMxID0gW107XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVuY2llcyA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNhbmNlbGxhdGlvbiByZXBvcnQgZGF0YScsIGVycm9yKTtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIGxvYWQgY2FuY2VsbGF0aW9uIHJlcG9ydCBkYXRhJztcclxuICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkRGF0YUZvclJldmVudWVQZXJUcmFuc2FjdGlvblJlcG9ydCgpIHtcclxuICAgIGNvbnN0ICRhZ2VudHMgPSB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QWdlbnRzRm9yUmV2ZW51ZVBlclRyYW5zYWN0aW9uKCk7XHJcbiAgICBjb25zdCAkcGFyYW1zID0gdGhpcy5yZXBvcnRTZXJ2aWNlLmdldFJldmVudWVQZXJUcmFuc2FjdGlvblJlcG9ydFBhcmFtcygpO1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIGZvcmtKb2luKFskYWdlbnRzLCAkcGFyYW1zXSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKFthZ2VudHMsIHBhcmFtc10pID0+IHtcclxuICAgICAgICB0aGlzLnNlbmRCdXNpbmVzc1BhcnRuZXJBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnZW50ID0+IGFnZW50LnRyYW5zYWN0aW9uTGVnID09PSBcIlBheUluXCIpO1xyXG4gICAgICAgIHRoaXMucmVjdkJ1c2luZXNzUGFydG5lckFnZW50cyA9IGFnZW50cy5maWx0ZXIoYWdlbnQgPT4gYWdlbnQudHJhbnNhY3Rpb25MZWcgPT09IFwiUGF5T3V0XCIpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdGF0dXNlcyA9IHBhcmFtcy50cmFuc2FjdGlvblN0YXR1c1R5cGVzXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMgPSBwYXJhbXMuY291bnRyaWVzO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgc2VuZEJ1c2luZXNzUGFydG5lcjogdGhpcy5zZW5kQnVzaW5lc3NQYXJ0bmVyQWdlbnRzWzBdLmlkLFxyXG4gICAgICAgIHJlY3ZCdXNpbmVzc1BhcnRuZXI6IHRoaXMucmVjdkJ1c2luZXNzUGFydG5lckFnZW50c1swXS5pZFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgbG9hZEluaXRpYWxEYXRhZm9yQWNjb3VudGluZygpIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcblxyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBjbGllbnRzOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0Q2xpZW50c0ZvckFjY291bnRpbmdSZXBvcnQodGhpcy5jdXJyZW50VXNlcikucGlwZShcclxuICAgICAgICBtYXAoKGNsaWVudHM6IGFueVtdKTogQ2xpZW50W10gPT5cclxuICAgICAgICAgIGNsaWVudHMubWFwKChjbGllbnQsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICBidXNpbmVzc1BhcnRuZXJOYW1lOiBjbGllbnQuYWdlbnQsXHJcbiAgICAgICAgICAgIGJ1c2luZXNzUGFydG5lckNvZGU6IGNsaWVudC5jb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICBkaXNwbGF5T3JkZXI6IGluZGV4LFxyXG4gICAgICAgICAgICBjbGllbnRUeXBlOiBcIlwiXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICApLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgY2xpZW50cycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHByb2R1Y3RzOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0VHJhbnNhY3Rpb25UeXBlc0ZvckFjY291bnRpbmdSZXBvcnQoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgdHJhbnNhY3Rpb24gdHlwZXMnLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLFxyXG4gICAgICBjdXJyZW5jaWVzOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QWxsQ3VycmVuY2llc0ZvckFjY291bnRpbmdSZXBvcnQoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgY3VycmVuY2llcycsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHN0YXR1c2VzOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QWxsVHJhbnNhY3Rpb25TdGF0dXNGb3JBY2NvdW50aW5nUmVwb3J0KCkucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1c2VzJywgZXJyKTtcclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgICAgY291bnRyaWVzOiB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzRm9yQWNjb3VudGluZ1JlcG9ydCgpLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBjb3VudHJpZXMnLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoeyBjbGllbnRzLCBwcm9kdWN0cywgY3VycmVuY2llcywgc3RhdHVzZXMsIGNvdW50cmllcyB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRzMSA9IGNsaWVudHM7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvblByb2R1Y3RzID0gcHJvZHVjdHM7XHJcbiAgICAgICAgdGhpcy5jdXJyZW5jaWVzID0gY3VycmVuY2llcztcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXMgPSBzdGF0dXNlcztcclxuICAgICAgICB0aGlzLmNvdW50cmllcyA9IGNvdW50cmllcztcclxuXHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBjbGllbnQ6IHRoaXMuY2xpZW50czFbMF0uYnVzaW5lc3NQYXJ0bmVyQ29kZX0pO1xyXG4gICAgICAgIHRoaXMub25DbGllbnRDaGFuZ2UoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBmb3JrSm9pbiBlcnJvciBpbiBBY2NvdW50aW5nIGluaXQnLCBlcnIpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBsb2FkSW5pdGlhbERhdGFGb3JDcmVkaXRMaW1pdFN0YXR1c0VucXVpcnkoKSB7XHJcbiAgICBjb25zdCAkYWdlbnRzID0gdGhpcy5yZXBvcnRTZXJ2aWNlLmdldENsaWVudHNGb3JDcmVkaXRMaW1pdFN0YXR1c0VucXVpcnlSZXBvcnQoKTtcclxuICAgIGNvbnN0ICRzdGF0dXMgPSB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0VHJhbnNhY3Rpb25UeXBlc0ZvckNyZWRpdExpbWl0U3RhdHVzRW5xdWlyeVJlcG9ydCgpO1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgYWdlbnRzOiAkYWdlbnRzLnBpcGUoXHJcbiAgICAgICAgbWFwKChjbGllbnRzOiBhbnlbXSk6IENsaWVudFtdID0+XHJcbiAgICAgICAgICBjbGllbnRzLm1hcCgoY2xpZW50LCBpbmRleCkgPT4gKHtcclxuICAgICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyTmFtZTogY2xpZW50Lm5hbWUsXHJcbiAgICAgICAgICAgIGJ1c2luZXNzUGFydG5lckNvZGU6IGNsaWVudC5jb2RlLFxyXG4gICAgICAgICAgICBkaXNwbGF5T3JkZXI6IGluZGV4LFxyXG4gICAgICAgICAgICBjbGllbnRUeXBlOiBcIlwiXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICApXHJcbiAgICAgICksXHJcbiAgICAgIHN0YXR1czogJHN0YXR1c1xyXG4gICAgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHsgYWdlbnRzLCBzdGF0dXMgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xpZW50czEgPSBhZ2VudHM7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBjbGllbnQ6IHRoaXMuY2xpZW50czFbMF0uYnVzaW5lc3NQYXJ0bmVyQ29kZSB9KTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXMgPSBzdGF0dXM7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBmb3JrSm9pbiBlcnJvcicsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KVxyXG4gIH1cclxuICBsb2FkSW5pdGlhbERhdGFGb3JUcmlhbEJhbGFuY2VBY2NvdW50cygpIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcblxyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBidXNpbmVzc0xpbmVzOiB0aGlzLnJlcG9ydFNlcnZpY2UuR2V0QnVzaW5lc3NMaW5lRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoKVxyXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IG9mKFtdKSkpLFxyXG4gICAgICBhY2NvdW50U3RhdHVzZXM6IHRoaXMucmVwb3J0U2VydmljZS5HZXRBY2NvdW50U3RhdHVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoKVxyXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IG9mKFtdKSkpLFxyXG4gICAgICBkYXRlVHlwZXM6IHRoaXMucmVwb3J0U2VydmljZS5HZXREYXRlVHlwZUZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KClcclxuICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiBvZihbXSkpKSxcclxuICAgICAgZmluYW5jaWFsWWVhcnM6IHRoaXMucmVwb3J0U2VydmljZS5HZXRZZWFyRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoKVxyXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IG9mKFtdKSkpLFxyXG4gICAgICBmcm9tTW9udGhzOiB0aGlzLnJlcG9ydFNlcnZpY2UuR2V0RnJvbU1vbnRoc0ZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KClcclxuICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiBvZihbXSkpKSxcclxuICAgICAgY3VycmVuY3k6IHRoaXMucmVwb3J0U2VydmljZS5HZXRDdXJyZW5jaWVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoKVxyXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IG9mKFtdKSkpLFxyXG4gICAgICBwYXJhbURhdGVEZWZhdWx0OiB0aGlzLnJlcG9ydFNlcnZpY2UuR2V0UGFyYW1EYXRlRGVmYXVsdEZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KClcclxuICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiBvZihbXSkpKVxyXG4gICAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKHJlc3VsdHMgPT4ge1xyXG4gICAgICAgICAgLy8gYXNzaWduIGJhc2UgcmVzdWx0c1xyXG4gICAgICAgICAgdGhpcy5idXNpbmVzc0xpbmVzID0gcmVzdWx0cy5idXNpbmVzc0xpbmVzLmZpbHRlcihiID0+IGIuYnVzaW5lc3NMaW5lPy50cmltKCkgIT09ICcnKTtcclxuICAgICAgICAgIHRoaXMuYWNjb3VudFN0YXR1c2VzID0gcmVzdWx0cy5hY2NvdW50U3RhdHVzZXM7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUeXBlcyA9IHJlc3VsdHMuZGF0ZVR5cGVzO1xyXG4gICAgICAgICAgdGhpcy5maW5hbmNpYWxZZWFycyA9IHJlc3VsdHMuZmluYW5jaWFsWWVhcnNcclxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IE51bWJlcihhLmZpbmFuY2lhbFllYXIpIC0gTnVtYmVyKGIuZmluYW5jaWFsWWVhcikpO1xyXG4gICAgICAgICAgdGhpcy5mcm9tTW9udGhzID0gcmVzdWx0cy5mcm9tTW9udGhzO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW5jaWVzID0gcmVzdWx0cy5jdXJyZW5jeTtcclxuICAgICAgICAgIHRoaXMucGFyYW1EYXRlRGVmYXVsdCA9IHJlc3VsdHMucGFyYW1EYXRlRGVmYXVsdDtcclxuXHJcbiAgICAgICAgICAvLyByZXNvbHZlIHllYXIvbW9udGggZm9yIGZyb21EYXlzICYgdG9Nb250aHNcclxuICAgICAgICAgIGNvbnN0IHllYXIgPSArKG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgICAgICBjb25zdCBtb250aCA9IHRoaXMucGFyYW1EYXRlRGVmYXVsdFswXS5maW5hbmNpYWxNb250aDtcclxuXHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFBNb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21Nb250aCcpPy52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IGZyb21Nb250aE9iaiA9IHRoaXMuZnJvbU1vbnRocy5maW5kKG0gPT4gbS5wT3JkZXIgPT09IHNlbGVjdGVkUE1vbnRoKTtcclxuICAgICAgICAgIGNvbnN0IGZyb21Nb250aExhYmVsID0gZnJvbU1vbnRoT2JqPy5wZXJpb2Q7XHJcblxyXG4gICAgICAgICAgLy8gZmlyc3QgY2FsbCBmcm9tRGF5cyB3aXRoIHllYXIvbW9udGhcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNlcnZpY2UuR2V0RnJvbURhdGVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoXHJcbiAgICAgICAgICAgIHllYXIsIGZyb21Nb250aExhYmVsXHJcbiAgICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IG9mKFtdKSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChmcm9tRGF5cyA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5mcm9tRGF5cyA9IGZyb21EYXlzO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgICAgIGZyb21EYXk6IHRoaXMucGFyYW1EYXRlRGVmYXVsdFswXT8udERhdGUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbmFuY2lhbFllYXIgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnZhbHVlO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZyb21Nb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21Nb250aCcpPy52YWx1ZTtcclxuICAgICAgICAgICAgICBjb25zdCB0b01vbnRoID0gdGhpcy5zZWFyY2hGb3JtLmdldCgndG9Nb250aCcpPy52YWx1ZTtcclxuICAgICAgICAgICAgICBjb25zdCBmcm9tRGF5ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbURheScpPy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7XHJcbiAgICAgICAgICAgICAgICBZZWFyOiBmaW5hbmNpYWxZZWFyLFxyXG4gICAgICAgICAgICAgICAgRnJvbU1vbnRoOiBmcm9tTW9udGgsXHJcbiAgICAgICAgICAgICAgICBUb01vbnRoOiB0b01vbnRoLFxyXG4gICAgICAgICAgICAgICAgRnJvbURhdGU6IGZyb21EYXkgLy8gYXNzdW1pbmcgZnJvbURheSBpcyBhbHJlYWR5IGEgRGF0ZSBvciBJU08gc3RyaW5nXHJcbiAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gbm93IGNoYWluIHRvOiB0b0RheXMgKyB0b01vbnRoc1xyXG4gICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbih7XHJcbiAgICAgICAgICAgICAgICB0b0RheXM6IHRoaXMucmVwb3J0U2VydmljZS5HZXRUb0RhdGVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQocmVxdWVzdFBheWxvYWQpXHJcbiAgICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IG9mKFtdKSkpLFxyXG4gICAgICAgICAgICAgICAgdG9Nb250aHM6IHRoaXMucmVwb3J0U2VydmljZS5HZXRUb01vbnRoc0ZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KHllYXIsIG1vbnRoKVxyXG4gICAgICAgICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiBvZihbXSkpKVxyXG4gICAgICAgICAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoZXh0cmEgPT4gKHsgLi4ucmVzdWx0cywgZnJvbURheXMsIC4uLmV4dHJhIH0pKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGFsbFJlc3VsdHMpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9EYXlzID0gYWxsUmVzdWx0cy50b0RheXM7XHJcbiAgICAgICAgICB0aGlzLnRvTW9udGhzID0gYWxsUmVzdWx0cy50b01vbnRocztcclxuXHJcbiAgICAgICAgICAvLyBwYXRjaCBmb3JtIGRlZmF1bHRzXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgIGJ1c2luZXNzTGluZTogdGhpcy5idXNpbmVzc0xpbmVzWzBdPy5idXNpbmVzc0xpbmUgPz8gbnVsbCxcclxuICAgICAgICAgICAgYWNjb3VudFN0YXR1czogdGhpcy5hY2NvdW50U3RhdHVzZXMubGVuZ3RoID8gW3RoaXMuYWNjb3VudFN0YXR1c2VzWzBdLnN0YXR1c0NvZGVdIDogW10sXHJcbiAgICAgICAgICAgIGZpbmFuY2lhbFllYXI6IHRoaXMucGFyYW1EYXRlRGVmYXVsdFswXT8uZmluYW5jaWFsWWVhciA/PyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgZnJvbU1vbnRoOiB0aGlzLnBhcmFtRGF0ZURlZmF1bHRbMF0/LmZpbmFuY2lhbE1vbnRoLFxyXG4gICAgICAgICAgICB0b01vbnRoOiB0aGlzLnBhcmFtRGF0ZURlZmF1bHRbMF0/LmZpbmFuY2lhbE1vbnRoLFxyXG4gICAgICAgICAgICBkYXRlVHlwZTogdGhpcy5kYXRlVHlwZXNbMF0/LmRhdGVUeXBlQ29kZSA/PyAnVkQnLFxyXG4gICAgICAgICAgICBmcm9tRGF5OiB0aGlzLmZyb21EYXlzWzBdPy50RGF0ZSxcclxuICAgICAgICAgICAgdG9EYXk6IHRoaXMudG9EYXlzLmZpbmQoZCA9PiBkLmlzVG9kYXkpPy52YWx1ZSA/PyBuZXcgRGF0ZSgpLmdldERhdGUoKSxcclxuICAgICAgICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3lbMF0/LmN1cnJlbmN5Q29kZSA/PyAnQWxsJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgVHJpYWwgQmFsYW5jZSBkcm9wZG93biBkYXRhJywgZXJyKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuIHByaXZhdGUgc3Vic2NyaWJlVG9EYXRlQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZnJvbURhdGVTdHIgPT4ge1xyXG4gICAgICBjb25zdCB0b0RhdGVDb250cm9sID0gdGhpcy5zZWFyY2hGb3JtLmdldCgndG9EYXRlJyk7XHJcbiAgICAgIGNvbnN0IHRvRGF0ZVN0ciA9IHRvRGF0ZUNvbnRyb2w/LnZhbHVlO1xyXG4gICAgICBpZiAoIWZyb21EYXRlU3RyKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IGZyb21EYXRlID0gbmV3IERhdGUoZnJvbURhdGVTdHIpO1xyXG4gICAgICBcclxuICAgICAgLy8gSWYgVG9EYXRlIGlzIGVtcHR5IOKGkiBzZXQgZGVmYXVsdFxyXG4gICAgICBpZiAoIXRvRGF0ZUNvbnRyb2w/LnZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgbWF4VG9EYXRlID0gbmV3IERhdGUoZnJvbURhdGUpO1xyXG4gICAgICAgIG1heFRvRGF0ZS5zZXREYXRlKGZyb21EYXRlLmdldERhdGUoKSArIDMwKTtcclxuICAgICAgICB0b0RhdGVDb250cm9sLnBhdGNoVmFsdWUobWF4VG9EYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKHRvRGF0ZVN0cik7XHJcbiAgICAgIGNvbnN0IG1heFRvRGF0ZSA9IG5ldyBEYXRlKGZyb21EYXRlKTtcclxuICAgICAgbWF4VG9EYXRlPy5zZXREYXRlKGZyb21EYXRlLmdldERhdGUoKSArIDMwKTtcclxuICAgICAgaWYgKHRvRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSA+IG1heFRvRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSB8fCB0b0RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCkgPCBmcm9tRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSkge1xyXG4gICAgICAgIG1heFRvRGF0ZS5zZXRIb3VycygxMiwgMCwgMCwgMCk7XHJcbiAgICAgICAgdG9EYXRlQ29udHJvbD8ucGF0Y2hWYWx1ZShtYXhUb0RhdGUudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0pO1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4gdG9EYXRlQ29udHJvbD8ucGF0Y2hWYWx1ZShtYXhUb0RhdGUudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0pKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRpc2FibGVkRGF0ZSA9IHRoaXMudG9OZ2JEYXRlU3RydWN0KGZyb21EYXRlKTtcclxuICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpc2FibGVkRGF0ZSA9IHRoaXMudG9OZ2JEYXRlU3RydWN0KGZyb21EYXRlKSk7XHJcblxyXG4gICAgfSk7XHJcbiAgIFxyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgndG9EYXRlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodG9EYXRlU3RyID0+IHtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGZyb21EYXRlQ29udHJvbCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXRlJyk7XHJcbiAgICAgIGNvbnN0IGZyb21EYXRlU3RyID0gZnJvbURhdGVDb250cm9sPy52YWx1ZTtcclxuICAgICAgaWYgKCF0b0RhdGVTdHIpIHJldHVybjtcclxuICAgICAgY29uc3QgdG9EYXRlID0gbmV3IERhdGUodG9EYXRlU3RyKTtcclxuXHJcbiAgICAgIC8vIElmIEZyb21EYXRlIGlzIGVtcHR5IOKGkiBzZXQgZGVmYXVsdFxyXG4gICAgICBpZiAoIWZyb21EYXRlQ29udHJvbD8udmFsdWUpIHtcclxuICAgICAgICBjb25zdCBtaW5Gcm9tRGF0ZSA9IG5ldyBEYXRlKHRvRGF0ZSk7XHJcbiAgICAgICAgbWluRnJvbURhdGUuc2V0RGF0ZSh0b0RhdGUuZ2V0RGF0ZSgpIC0gMzApO1xyXG4gICAgICAgIGZyb21EYXRlQ29udHJvbC5wYXRjaFZhbHVlKG1pbkZyb21EYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZnJvbURhdGUgPSBuZXcgRGF0ZShmcm9tRGF0ZVN0cik7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWREYXRlID0gdGhpcy50b05nYkRhdGVTdHJ1Y3QoZnJvbURhdGUpO1xyXG4gICAgICBjb25zdCBtaW5Gcm9tRGF0ZSA9IG5ldyBEYXRlKHRvRGF0ZSk7XHJcbiAgICAgIG1pbkZyb21EYXRlPy5zZXREYXRlKHRvRGF0ZS5nZXREYXRlKCkgLSAzMCk7XHJcbiAgICAgIGlmIChmcm9tRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSA8IG1pbkZyb21EYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApKSB7XHJcbiAgICAgICAgbWluRnJvbURhdGUuc2V0SG91cnMoMTIsIDAsIDAsIDApO1xyXG4gICAgICAgIGZyb21EYXRlQ29udHJvbD8ucGF0Y2hWYWx1ZShtaW5Gcm9tRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmcm9tRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSA+IHRvRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSkge1xyXG4gICAgICAgIGZyb21EYXRlQ29udHJvbD8ucGF0Y2hWYWx1ZShtaW5Gcm9tRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW5pdGlhbERhdGFGb3JTdGF0ZW1lbnRPZkFjY291bnRzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY2xpZW50cyA9IGF3YWl0IHRoaXMucmVwb3J0U2VydmljZVxyXG4gICAgICAgIC5sb2FkQ2xpZW50c0ZvclN0YXRlbWVudE9mQWNjb3VudHMoKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICBpZiAoY2xpZW50cyAmJiBjbGllbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmNsaWVudHMxID0gY2xpZW50cy5tYXAoKGMsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQ29kZTogYy5hZ2VudElELFxyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyTmFtZTogYy5hZ2VudE5hbWUsXHJcbiAgICAgICAgICBkaXNwbGF5T3JkZXI6IGluZGV4LFxyXG4gICAgICAgICAgY2xpZW50VHlwZTogYy5jbGllbnRUeXBlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2xpZW50czEgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jbGllbnRzMS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50czFbMF0uYnVzaW5lc3NQYXJ0bmVyQ29kZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub25DbGllbnRDaGFuZ2UoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBTdGF0ZW1lbnQgb2YgQWNjb3VudHMgY2xpZW50cycsIGVycm9yKTtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIGxvYWQgY2xpZW50cyBmb3IgU3RhdGVtZW50IG9mIEFjY291bnRzJztcclxuICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNsaWVudENoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkQ2xpZW50KSByZXR1cm47XHJcbiAgICAgIHRoaXMuYnJhbmNoZXMgPSBbXTtcclxuICAgICAgaWYgKHNlbGVjdGVkQ2xpZW50ID09PSAnQWxsJykge1xyXG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSBbe1xyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQnJhbmNoOiAnQWxsJyxcclxuICAgICAgICAgIGJ1c2luZXNzUGFydG5lckJyYW5jaF9Db3JyZWxhdGlvbklkOiAnQWxsJyxcclxuICAgICAgICAgIGJyYW5jaENvZGU6ICdBbGwnLFxyXG4gICAgICAgICAgYmFuazogJ0FsbCcsXHJcbiAgICAgICAgICBudW1iZXI6IDFcclxuICAgICAgICB9XTtcclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRCcmFuY2hlc0J5QWdlbnQoc2VsZWN0ZWRDbGllbnQpXHJcbiAgICAgICAgICBdKTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIGxvYWQgYnJhbmNoJztcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJCcmFuY2ggQWN0aXZpdHkgU2VuZFwiKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkQ2xpZW50KSByZXR1cm47XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICAgIHRoaXMuYnJhbmNoZXMgPSBbXTtcclxuICAgICAgaWYgKHNlbGVjdGVkQ2xpZW50ID09PSAnQWxsJykge1xyXG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSBbe1xyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQnJhbmNoOiAnQWxsJyxcclxuICAgICAgICAgIGJ1c2luZXNzUGFydG5lckJyYW5jaF9Db3JyZWxhdGlvbklkOiAnQWxsJyxcclxuICAgICAgICAgIGJyYW5jaENvZGU6ICdBbGwnLFxyXG4gICAgICAgICAgYmFuazogJ0FsbCcsXHJcbiAgICAgICAgICBudW1iZXI6IDFcclxuICAgICAgICB9XTtcclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQnlBZ2VudChzZWxlY3RlZENsaWVudCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYnJhbmNoZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PT0gXCJCcmFuY2ggQWN0aXZpdHkgUmVjZWl2ZVwiKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkQ2xpZW50KSByZXR1cm47XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICAgIHRoaXMuYnJhbmNoZXMgPSBbXTtcclxuICAgICAgaWYgKHNlbGVjdGVkQ2xpZW50ID09PSAnQWxsJykge1xyXG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSBbe1xyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQnJhbmNoOiAnQWxsJyxcclxuICAgICAgICAgIGJ1c2luZXNzUGFydG5lckJyYW5jaF9Db3JyZWxhdGlvbklkOiAnQWxsJyxcclxuICAgICAgICAgIGJyYW5jaENvZGU6ICdBbGwnLFxyXG4gICAgICAgICAgYmFuazogJ0FsbCcsXHJcbiAgICAgICAgICBudW1iZXI6IDFcclxuICAgICAgICB9XTtcclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQWN0aXZpdHlSZWNlaXZlUGF5b3V0QWdlbnRCcmFuY2goc2VsZWN0ZWRDbGllbnQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmJyYW5jaGVzID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBicmFuY2g6IHRoaXMuYnJhbmNoZXNbMF0uYnJhbmNoQ29kZSB9KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJDYW5jZWxsYXRpb24gVHJhbnNhY3Rpb25cIikge1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nO1xyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZENsaWVudCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2NsaWVudCcpPy52YWx1ZTtcclxuICAgICAgdGhpcy5icmFuY2hlcyA9IFtdO1xyXG4gICAgICBpZiAoc2VsZWN0ZWRDbGllbnQgPT09ICdBbGwnKSB7XHJcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IFt7XHJcbiAgICAgICAgICBidXNpbmVzc1BhcnRuZXJCcmFuY2g6ICdBbGwnLFxyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQnJhbmNoX0NvcnJlbGF0aW9uSWQ6ICdBbGwnLFxyXG4gICAgICAgICAgYnJhbmNoQ29kZTogJ0FsbCcsXHJcbiAgICAgICAgICBiYW5rOiAnQWxsJyxcclxuICAgICAgICAgIG51bWJlcjogMVxyXG4gICAgICAgIH1dO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgYnJhbmNoOiB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUgfSk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZXBvcnRTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5nZXRCcmFuY2hlcyhzZWxlY3RlZENsaWVudClcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5icmFuY2hlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgYnJhbmNoOiB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGJyYW5jaGVzJywgZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIGxvYWQgYnJhbmNoIGRhdGEnO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuRXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlN0YXRlbWVudCBvZiBBY2NvdW50c1wiKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICAgIGNvbnN0IENsaWVudElkID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZENsaWVudCA9IHRoaXMuY2xpZW50czEuZmluZChjID0+IGMuYnVzaW5lc3NQYXJ0bmVyQ29kZSA9PT0gQ2xpZW50SWQpO1xyXG4gICAgICB0aGlzLmNsaWVudE5hbWUgPSBzZWxlY3RlZENsaWVudD8uYnVzaW5lc3NQYXJ0bmVyTmFtZSB8fCAnJztcclxuICAgICAgdGhpcy5jbGllbnRUeXBlID0gc2VsZWN0ZWRDbGllbnQ/LmNsaWVudFR5cGUgfHwgJyc7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFjY291bnRpbmcgcmVwb3J0XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQWNjb3VudGluZ1wiKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkQ2xpZW50KSByZXR1cm47XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcblxyXG4gICAgICB0aGlzLmJyYW5jaGVzID0gW107XHJcbiAgICAgIGlmIChzZWxlY3RlZENsaWVudCA9PT0gJ0FsbCcpIHtcclxuICAgICAgICB0aGlzLmJyYW5jaGVzID0gW3tcclxuICAgICAgICAgIGJ1c2luZXNzUGFydG5lckJyYW5jaDogJ0FsbCcsXHJcbiAgICAgICAgICBidXNpbmVzc1BhcnRuZXJCcmFuY2hfQ29ycmVsYXRpb25JZDogJ0FsbCcsXHJcbiAgICAgICAgICBicmFuY2hDb2RlOiAnQWxsJyxcclxuICAgICAgICAgIGJhbms6ICdBbGwnLFxyXG4gICAgICAgICAgbnVtYmVyOiAxXHJcbiAgICAgICAgfV07XHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBicmFuY2g6IHRoaXMuYnJhbmNoZXNbMF0uYnJhbmNoQ29kZSB9KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRTZXJ2aWNlLmdldEJyYW5jaEJ5QWdlbnRGb3JBY2NvdW50aW5nUmVwb3J0KHRoaXMuY3VycmVudFVzZXIsIHNlbGVjdGVkQ2xpZW50KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5icmFuY2hlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgYnJhbmNoOiB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUgfSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmRcIikge1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZENsaWVudCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2NsaWVudCcpPy52YWx1ZTtcclxuICAgICAgdGhpcy5icmFuY2hlcyA9IFtdO1xyXG4gICAgICBpZiAoc2VsZWN0ZWRDbGllbnQgPT09ICdBbGwnKSB7XHJcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IFt7XHJcbiAgICAgICAgICBidXNpbmVzc1BhcnRuZXJCcmFuY2g6ICdBbGwnLFxyXG4gICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQnJhbmNoX0NvcnJlbGF0aW9uSWQ6ICdBbGwnLFxyXG4gICAgICAgICAgYnJhbmNoQ29kZTogJ0FsbCcsXHJcbiAgICAgICAgICBiYW5rOiAnQWxsJyxcclxuICAgICAgICAgIG51bWJlcjogMVxyXG4gICAgICAgIH1dO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgYnJhbmNoOiB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUgfSk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVwb3J0U2VydmljZS5nZXRCcmFuY2hCeUFnZW50KHNlbGVjdGVkQ2xpZW50KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5icmFuY2hlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgYnJhbmNoOiB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUgfSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gTW9uaXRvcmluZ1wiKSB7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZENsaWVudCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2NsaWVudCcpPy52YWx1ZTtcclxuICAgICAgICAgIGlmICghc2VsZWN0ZWRDbGllbnQpIHJldHVybjtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICAgICAgICB0aGlzLmJyYW5jaGVzID0gW107XHJcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRDbGllbnQgPT09ICdBbGwnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnJhbmNoZXMgPSBbe1xyXG4gICAgICAgICAgICAgIGJ1c2luZXNzUGFydG5lckJyYW5jaDogJ0FsbCcsXHJcbiAgICAgICAgICAgICAgYnVzaW5lc3NQYXJ0bmVyQnJhbmNoX0NvcnJlbGF0aW9uSWQ6ICdBbGwnLFxyXG4gICAgICAgICAgICAgIGJyYW5jaENvZGU6ICdBbGwnLFxyXG4gICAgICAgICAgICAgIGJhbms6ICdBbGwnLFxyXG4gICAgICAgICAgICAgIG51bWJlcjogMVxyXG4gICAgICAgICAgICB9XTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBicmFuY2g6IHRoaXMuYnJhbmNoZXNbMF0uYnJhbmNoQ29kZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQnlBZ2VudEZvclRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcG9ydChzZWxlY3RlZENsaWVudCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmFuY2hlcyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeVwiKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xpZW50ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnZhbHVlO1xyXG4gICAgICB0aGlzLmJyYW5jaGVzID0gW107XHJcbiAgICAgIGlmIChzZWxlY3RlZENsaWVudCA9PT0gJ0FsbCcpIHtcclxuICAgICAgICB0aGlzLmJyYW5jaGVzID0gW3tcclxuICAgICAgICAgIGJ1c2luZXNzUGFydG5lckJyYW5jaDogJ0FsbCcsXHJcbiAgICAgICAgICBidXNpbmVzc1BhcnRuZXJCcmFuY2hfQ29ycmVsYXRpb25JZDogJ0FsbCcsXHJcbiAgICAgICAgICBicmFuY2hDb2RlOiAnQWxsJyxcclxuICAgICAgICAgIGJhbms6ICdBbGwnLFxyXG4gICAgICAgICAgbnVtYmVyOiAxXHJcbiAgICAgICAgfV07XHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBicmFuY2g6IHRoaXMuYnJhbmNoZXNbMF0uYnJhbmNoQ29kZSB9KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRTZXJ2aWNlLmdldEJyYW5jaEJ5QWdlbnRGb3JTZW5kU3VtbWFyeVJlcG9ydChzZWxlY3RlZENsaWVudCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYnJhbmNoZXMgPSBkYXRhO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogdGhpcy5icmFuY2hlc1swXS5icmFuY2hDb2RlIH0pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkQnJhbmNoZXNCeUFnZW50KGFnZW50Q29kZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IHRoaXMucmVwb3J0U2VydmljZVxyXG4gICAgICAuZ2V0QnJhbmNoZXNCeUFnZW50KGFnZW50Q29kZSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB0aGlzLmJyYW5jaGVzID0gYnJhbmNoZXMgfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMuYnJhbmNoZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgYnJhbmNoOiB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUgfSk7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMubG9hZFVzZXJzQnlCcmFuY2goYWdlbnRDb2RlLCB0aGlzLmJyYW5jaGVzWzBdLmJyYW5jaENvZGUpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmJyYW5jaGVzLnNvbWUoYiA9PiBiLmJyYW5jaENvZGUgPT09ICdBbGwnKSkge1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogJ0FsbCcgfSk7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMubG9hZFVzZXJzQnlCcmFuY2goYWdlbnRDb2RlLCAnQWxsJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7IGJyYW5jaDogJycgfSk7XHJcbiAgICAgIHRoaXMudXNlcnMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQnJhbmNoQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlRyYW5zYWN0aW9uIEVucXVpcnlcIikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmRcIikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQUNDIEdMIERldGFpbHMgRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmludmFsaWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICAgICAgY29uc3QgbW9kYWwgPSB7XHJcbiAgICAgICAgc2VsZWN0ZWREYXRlVHlwZTogdGhpcy5zZWFyY2hGb3JtLmNvbnRyb2xzW1wiZGF0ZVR5cGVcIl0/LnZhbHVlLFxyXG4gICAgICAgIHNlbGVjdGVkRGF0ZTogdGhpcy5zZWFyY2hGb3JtLmNvbnRyb2xzW1wiZGF0ZVwiXT8udmFsdWVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KHRydWUpO1xyXG4gICAgICB0aGlzLnNlYXJjaENsaWNrZWQuZW1pdChtb2RhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PT0gXCJCcmFuY2ggQWN0aXZpdHkgUmVjZWl2ZVwiKSB7XHJcbiAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmludmFsaWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy5mb3JtVmFsaWQuZW1pdCh0cnVlKTtcclxuICAgICAgdGhpcy5zZWFyY2hDbGlja2VkLmVtaXQodGhpcy5idWlsZFNlYXJjaENyaXRlcmlhKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJDYW5jZWxsYXRpb24gVHJhbnNhY3Rpb25cIikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09PSBcIlJldmVudWUgUGVyIFRyYW5zYWN0aW9uXCIpIHtcclxuICAgICAgdGhpcy5oYXNTZWFyY2hlZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm0uaW52YWxpZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkYXRpb25FcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWQuZW1pdChmYWxzZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KHRydWUpO1xyXG4gICAgICB0aGlzLnNlYXJjaENsaWNrZWQuZW1pdCh0aGlzLmJ1aWxkU2VhcmNoQ3JpdGVyaWEoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlN0YXRlbWVudCBvZiBBY2NvdW50c1wiKSB7XHJcbiAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmludmFsaWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy5mb3JtVmFsaWQuZW1pdCh0cnVlKTtcclxuICAgICAgdGhpcy5zZWFyY2hDbGlja2VkLmVtaXQodGhpcy5idWlsZFNlYXJjaENyaXRlcmlhKCkpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQWNjb3VudGluZ1wiKSB7XHJcbiAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmludmFsaWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIC8vIHRoaXMubWFya0Zvcm1Hcm91cFRvdWNoZWQodGhpcy5zZWFyY2hGb3JtKTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09PSBcIkNyZWRpdCBMaW1pdCBTdGF0dXMgRW5xdWlyeVwiKSB7XHJcbiAgICAgIHRoaXMuaGFzU2VhcmNoZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmludmFsaWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uRXJyb3IgPSBmYWxzZTtcclxuICAgICAgdGhpcy5mb3JtVmFsaWQuZW1pdCh0cnVlKTtcclxuICAgICAgdGhpcy5zZWFyY2hDbGlja2VkLmVtaXQodGhpcy5idWlsZFNlYXJjaENyaXRlcmlhKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkZ1bmRpbmdcIikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmlhbCBCYWxhbmNlIC0gQWNjb3VudHNcIikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIilcclxuIHtcclxuICAgICAgdGhpcy5oYXNTZWFyY2hlZCA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm0uaW52YWxpZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkYXRpb25FcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWQuZW1pdChmYWxzZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KHRydWUpO1xyXG4gICAgICB0aGlzLnNlYXJjaENsaWNrZWQuZW1pdCh0aGlzLmJ1aWxkU2VhcmNoQ3JpdGVyaWEoKSk7XHJcbiAgICB9XHJcbiAgICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIlRyYW5zYWN0aW9uIE1vbml0b3JpbmdcIikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2VhcmNoQ2xpY2tlZC5lbWl0KHRoaXMuYnVpbGRTZWFyY2hDcml0ZXJpYSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRTZWFyY2hDcml0ZXJpYSgpOiBhbnkge1xyXG5cclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS52YWx1ZTtcclxuICAgIGNvbnN0IGZyb21EYXRlID0gbmV3IERhdGUoZm9ybVZhbHVlLmZyb21EYXRlKTtcclxuICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKGZvcm1WYWx1ZS50b0RhdGUpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZDogRGF0ZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcclxuICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICBjb25zdCB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWEgPSB0aGlzLmdldFNlYXJjaENyaXRlcmlhQXJyYXkoKTtcclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJhbnNhY3Rpb24gRW5xdWlyeVwiKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS52YWx1ZTtcclxuICAgICAgZm9ybVZhbHVlLmZyb21EYXRlID0gdGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUuZnJvbURhdGUpO1xyXG4gICAgICBmb3JtVmFsdWUudG9EYXRlID0gdGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUudG9EYXRlKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RhbDogZm9ybVZhbHVlLFxyXG4gICAgICAgIHN5c1VzZXJJRDogdGhpcy5jdXJyZW50VXNlcixcclxuICAgICAgICByZXBvcnRQZXJpb2Q6IGAke2Zvcm1hdERhdGUoZnJvbURhdGUpfSAtICR7Zm9ybWF0RGF0ZSh0b0RhdGUpfWAsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kXCIpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICBmb3JtVmFsdWUuZnJvbURhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICAgIGZvcm1WYWx1ZS50b0RhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpO1xyXG4gICAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICAgIFsnQ2xpZW50OicsIHRoaXMuY2xpZW50czEuZmluZChjID0+IGMuYnVzaW5lc3NQYXJ0bmVyQ29kZSA9PT0gZm9ybVZhbHVlLmNsaWVudCk/LmJ1c2luZXNzUGFydG5lck5hbWUgfHwgJyddLFxyXG4gICAgICAgIFsnVHJhbnNhY3Rpb24gU3RhdHVzOicsIGZvcm1WYWx1ZS50cmFuc2FjdGlvblN0YXR1cy5qb2luKFwiLFwiKV0sXHJcbiAgICAgICAgWydCcmFuY2g6JywgdGhpcy5icmFuY2hlcy5maW5kKGIgPT4gYi5icmFuY2hDb2RlID09PSBmb3JtVmFsdWUuYnJhbmNoKT8uYnVzaW5lc3NQYXJ0bmVyQnJhbmNoIHx8ICcnXSxcclxuICAgICAgICBbJ1Byb2R1Y3Q6JywgZm9ybVZhbHVlLnByb2R1Y3RdLFxyXG4gICAgICAgIFsnRnJvbSBEYXRlOicsIGFuZ3VsYXJDb21tb24uZm9ybWF0RGF0ZSh0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnUmVjZWl2ZSBDdXJyZW5jeTonLCB0aGlzLmN1cnJlbmNpZXMuZmluZChjID0+IGMuY3VycmVuY3lDb2RlID09PSBmb3JtVmFsdWUucmVjZWl2ZUN1cnJlbmN5KT8uY3VycmVuY3kgfHwgJyddLFxyXG4gICAgICAgIFsnVG8gRGF0ZTonLCBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUudG9EYXRlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKV0sXHJcbiAgICAgICAgWydTZW5kIENvdW50cnk6JywgdGhpcy5jb3VudHJpZXMuZmluZChjID0+IGMuY291bnRyeUNvZGUgPT09IGZvcm1WYWx1ZS5zZW5kQ291bnRyeSk/LmNvdW50cnkgfHwgJyddLFxyXG4gICAgICAgIFsnUmVjZWl2ZSBDb3VudHJ5OicsIHRoaXMuY291bnRyaWVzLmZpbmQoYyA9PiBjLmNvdW50cnlDb2RlID09PSBmb3JtVmFsdWUucmVjZWl2ZUNvdW50cnkpPy5jb3VudHJ5IHx8ICcnXSxcclxuICAgICAgXTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RhbDogZm9ybVZhbHVlLFxyXG4gICAgICAgIHN5c1VzZXJJRDogdGhpcy5jdXJyZW50VXNlcixcclxuICAgICAgICBzZWFyY2hDcml0ZXJpYTogc2VhcmNoQ3JpdGVyaWFcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJCcmFuY2ggQWN0aXZpdHkgUmVjZWl2ZVwiKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS52YWx1ZTtcclxuICAgICAgZm9ybVZhbHVlLmZyb21EYXRlID0gdGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUuZnJvbURhdGUpO1xyXG4gICAgICBmb3JtVmFsdWUudG9EYXRlID0gdGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUudG9EYXRlKTtcclxuICAgICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtcclxuICAgICAgICBbJ0NsaWVudDonLCB0aGlzLmNsaWVudHMxLmZpbmQoYyA9PiBjLmJ1c2luZXNzUGFydG5lckNvZGUgPT09IGZvcm1WYWx1ZS5jbGllbnQpPy5idXNpbmVzc1BhcnRuZXJOYW1lIHx8ICcnXSxcclxuICAgICAgICBbJ1RyYW5zYWN0aW9uIFN0YXR1czonLCBmb3JtVmFsdWUudHJhbnNhY3Rpb25TdGF0dXMuam9pbihcIixcIildLFxyXG4gICAgICAgIFsnQnJhbmNoOicsIHRoaXMuYnJhbmNoZXMuZmluZChiID0+IGIuYnJhbmNoQ29kZSA9PT0gZm9ybVZhbHVlLmJyYW5jaCk/LmJ1c2luZXNzUGFydG5lckJyYW5jaCB8fCAnJ10sXHJcbiAgICAgICAgWydQcm9kdWN0OicsIGZvcm1WYWx1ZS5wcm9kdWN0XSxcclxuICAgICAgICBbJ0Zyb20gRGF0ZTonLCBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUuZnJvbURhdGUpLCAnZGQvTU0veXl5eScsICdlbi1VUycpXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ3VycmVuY3k6JywgdGhpcy5jdXJyZW5jaWVzLmZpbmQoYyA9PiBjLmN1cnJlbmN5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDdXJyZW5jeSk/LmN1cnJlbmN5IHx8ICcnXSxcclxuICAgICAgICBbJ1RvIERhdGU6JywgYW5ndWxhckNvbW1vbi5mb3JtYXREYXRlKHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLnRvRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnU2VuZCBDb3VudHJ5OicsIHRoaXMuY291bnRyaWVzLmZpbmQoYyA9PiBjLmNvdW50cnlDb2RlID09PSBmb3JtVmFsdWUuc2VuZENvdW50cnkpPy5jb3VudHJ5IHx8ICcnXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ291bnRyeTonLCB0aGlzLmNvdW50cmllcy5maW5kKGMgPT4gYy5jb3VudHJ5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDb3VudHJ5KT8uY291bnRyeSB8fCAnJ10sXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbW9kYWw6IGZvcm1WYWx1ZSxcclxuICAgICAgICBzeXNVc2VySUQ6IHRoaXMuY3VycmVudFVzZXIsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQ2FuY2VsbGF0aW9uIFRyYW5zYWN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICBmb3JtVmFsdWUuZnJvbURhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICAgIGZvcm1WYWx1ZS50b0RhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpO1xyXG4gICAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICAgIFsnQ2xpZW50OicsIHRoaXMuY2xpZW50czEuZmluZChjID0+IGMuYnVzaW5lc3NQYXJ0bmVyQ29kZSA9PT0gZm9ybVZhbHVlLmNsaWVudCk/LmJ1c2luZXNzUGFydG5lck5hbWUgfHwgJyddLFxyXG4gICAgICAgIFsnQnJhbmNoOicsIHRoaXMuYnJhbmNoZXMuZmluZChiID0+IGIuYnJhbmNoQ29kZSA9PT0gZm9ybVZhbHVlLmJyYW5jaCk/LmJ1c2luZXNzUGFydG5lckJyYW5jaCB8fCAnJ10sXHJcbiAgICAgICAgWydQcm9kdWN0OicsIGZvcm1WYWx1ZS5wcm9kdWN0XSxcclxuICAgICAgICBbJ0Zyb20gRGF0ZTonLCBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUuZnJvbURhdGUpLCAnZGQvTU0veXl5eScsICdlbi1VUycpXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ3VycmVuY3k6JywgdGhpcy5jdXJyZW5jaWVzLmZpbmQoYyA9PiBjLmN1cnJlbmN5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDdXJyZW5jeSk/LmN1cnJlbmN5IHx8ICcnXSxcclxuICAgICAgICBbJ1RvIERhdGU6JywgYW5ndWxhckNvbW1vbi5mb3JtYXREYXRlKHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLnRvRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnU2VuZCBDb3VudHJ5OicsIHRoaXMuY291bnRyaWVzLmZpbmQoYyA9PiBjLmNvdW50cnlDb2RlID09PSBmb3JtVmFsdWUuc2VuZENvdW50cnkpPy5jb3VudHJ5IHx8ICcnXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ291bnRyeTonLCB0aGlzLmNvdW50cmllcy5maW5kKGMgPT4gYy5jb3VudHJ5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDb3VudHJ5KT8uY291bnRyeSB8fCAnJ10sXHJcblxyXG4gICAgICBdO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1vZGFsOiBmb3JtVmFsdWUsXHJcbiAgICAgICAgc3lzVXNlcklEOiB0aGlzLmN1cnJlbnRVc2VyLFxyXG4gICAgICAgIHJlcG9ydFBlcmlvZDogYCR7Zm9ybWF0RGF0ZShmcm9tRGF0ZSl9IC0gJHtmb3JtYXREYXRlKHRvRGF0ZSl9YCxcclxuICAgICAgICBzZWFyY2hDcml0ZXJpYTogc2VhcmNoQ3JpdGVyaWFcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09PSBcIlJldmVudWUgUGVyIFRyYW5zYWN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICBmb3JtVmFsdWUuZnJvbURhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICAgIGZvcm1WYWx1ZS50b0RhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpO1xyXG4gICAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICAgIFsnU2VuZGVyIFBhcnRuZXI6JywgdGhpcy5zZW5kQnVzaW5lc3NQYXJ0bmVyQWdlbnRzLmZpbmQoYyA9PiBjLmlkID09PSBmb3JtVmFsdWUuc2VuZEJ1c2luZXNzUGFydG5lcik/Lm5hbWUgfHwgJyddLFxyXG4gICAgICAgIFsnUmVjZWl2ZSBQYXJ0bmVyOicsIHRoaXMucmVjdkJ1c2luZXNzUGFydG5lckFnZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZm9ybVZhbHVlLnJlY3ZCdXNpbmVzc1BhcnRuZXIpPy5uYW1lIHx8ICcnXSxcclxuICAgICAgICBbJ1NlbmQgQ291bnRyeTonLCB0aGlzLmNvdW50cmllcy5maW5kKGMgPT4gYy5jb3VudHJ5Q29kZSA9PT0gZm9ybVZhbHVlLnNlbmRDb3VudHJ5KT8uY291bnRyeSB8fCAnJ10sXHJcbiAgICAgICAgWydSZWNlaXZlIENvdW50cnk6JywgdGhpcy5jb3VudHJpZXMuZmluZChjID0+IGMuY291bnRyeUNvZGUgPT09IGZvcm1WYWx1ZS5yZWNlaXZlQ291bnRyeSk/LmNvdW50cnkgfHwgJyddLFxyXG4gICAgICAgIFsnRnJvbSBEYXRlOicsIGFuZ3VsYXJDb21tb24uZm9ybWF0RGF0ZSh0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnVG8gRGF0ZTonLCBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUudG9EYXRlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKV0sXHJcbiAgICAgICAgWydUcmFuc2FjdGlvbiBTdGF0dXM6JywgZm9ybVZhbHVlLnRyYW5zYWN0aW9uU3RhdHVzLmpvaW4oXCIsXCIpXSxcclxuICAgICAgXTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RhbDogZm9ybVZhbHVlLFxyXG4gICAgICAgIHN5c1VzZXJJZDogdGhpcy5jdXJyZW50VXNlcixcclxuICAgICAgICBzZWFyY2hDcml0ZXJpYTogc2VhcmNoQ3JpdGVyaWFcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJTdGF0ZW1lbnQgb2YgQWNjb3VudHNcIikge1xyXG4gICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnNlYXJjaEZvcm0udmFsdWU7XHJcbiAgICAgIGZvcm1WYWx1ZS5mcm9tRGF0ZSA9IHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLmZyb21EYXRlKTtcclxuICAgICAgZm9ybVZhbHVlLnRvRGF0ZSA9IHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbW9kYWw6IGZvcm1WYWx1ZSxcclxuICAgICAgICBjbGllbnRUeXBlOiB0aGlzLmNsaWVudFR5cGUsXHJcbiAgICAgICAgc3lzVXNlcklEOiB0aGlzLmN1cnJlbnRVc2VyLFxyXG4gICAgICAgIGNsaWVudE5hbWU6IHRoaXMuY2xpZW50TmFtZSxcclxuICAgICAgICByZXBvcnRQZXJpb2Q6IGAke2Zvcm1hdERhdGUoZnJvbURhdGUpfSAtICR7Zm9ybWF0RGF0ZSh0b0RhdGUpfWAsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiQWNjb3VudGluZ1wiKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS52YWx1ZTtcclxuICAgICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWEgPSBbXHJcbiAgICAgICAgWydDbGllbnQ6JywgdGhpcy5jbGllbnRzMS5maW5kKGMgPT4gYy5idXNpbmVzc1BhcnRuZXJDb2RlID09PSBmb3JtVmFsdWUuY2xpZW50KT8uYnVzaW5lc3NQYXJ0bmVyTmFtZSB8fCAnJ10sXHJcbiAgICAgICAgWydUcmFuc2FjdGlvbiBTdGF0dXM6JywgZm9ybVZhbHVlLnRyYW5zYWN0aW9uU3RhdHVzLmpvaW4oXCIsXCIpXSxcclxuICAgICAgICBbJ0JyYW5jaDonLCB0aGlzLmJyYW5jaGVzLmZpbmQoYiA9PiBiLmJyYW5jaENvZGUgPT09IGZvcm1WYWx1ZS5icmFuY2gpPy5idXNpbmVzc1BhcnRuZXJCcmFuY2ggfHwgJyddLFxyXG4gICAgICAgIFsnUHJvZHVjdDonLCB0aGlzLnRyYW5zYWN0aW9uUHJvZHVjdHMuZmluZCh0ID0+IHQucHJvZHVjdENvZGUgPT09IGZvcm1WYWx1ZS5wcm9kdWN0KT8ubmFtZSB8fCAnJ10sXHJcbiAgICAgICAgWydGcm9tIERhdGU6JywgYW5ndWxhckNvbW1vbi5mb3JtYXREYXRlKHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLmZyb21EYXRlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKV0sXHJcbiAgICAgICAgWydTZW5kIEN1cnJlbmN5OicsIHRoaXMuY3VycmVuY2llcy5maW5kKGMgPT4gYy5jdXJyZW5jeUNvZGUgPT09IGZvcm1WYWx1ZS5jdXJyZW5jeSk/LmN1cnJlbmN5IHx8ICcnXSxcclxuICAgICAgICBbJ1RvIERhdGU6JywgYW5ndWxhckNvbW1vbi5mb3JtYXREYXRlKHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLnRvRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnU2VuZCBDb3VudHJ5OicsIHRoaXMuY291bnRyaWVzLmZpbmQoYyA9PiBjLmNvdW50cnlDb2RlID09PSBmb3JtVmFsdWUuc2VuZENvdW50cnkpPy5jb3VudHJ5IHx8ICcnXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ291bnRyeTonLCB0aGlzLmNvdW50cmllcy5maW5kKGMgPT4gYy5jb3VudHJ5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDb3VudHJ5KT8uY291bnRyeSB8fCAnJ10sXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbW9kYWw6IHtcclxuICAgICAgICAgIC4uLmZvcm1WYWx1ZSxcclxuICAgICAgICAgIGZyb21EYXRlOiB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSksXHJcbiAgICAgICAgICB0b0RhdGU6IHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLnRvRGF0ZSksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzeXNVc2VySUQ6IHRoaXMuY3VycmVudFVzZXIsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PT0gXCJDcmVkaXQgTGltaXQgU3RhdHVzIEVucXVpcnlcIikge1xyXG4gICAgICBjb25zdCBjbGllbnRDb2RlID0gdGhpcy5zZWFyY2hGb3JtLmNvbnRyb2xzWydjbGllbnQnXS52YWx1ZTtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICBmb3JtVmFsdWUuZnJvbURhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICAgIGZvcm1WYWx1ZS50b0RhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpO1xyXG4gICAgICBmb3JtVmFsdWUuY2xpZW50ID0gdGhpcy5jbGllbnRzMS5maW5kKGMgPT4gYy5idXNpbmVzc1BhcnRuZXJDb2RlID09PSBjbGllbnRDb2RlKT8uYnVzaW5lc3NQYXJ0bmVyTmFtZSB8fCAnJztcclxuICAgICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtcclxuICAgICAgICBbJ0NsaWVudDonLCB0aGlzLmNsaWVudHMxLmZpbmQoYyA9PiBjLmJ1c2luZXNzUGFydG5lckNvZGUgPT09IGNsaWVudENvZGUpPy5idXNpbmVzc1BhcnRuZXJOYW1lIHx8ICcnXSxcclxuICAgICAgICBbJ1RyYW5zYWN0aW9uIHN0YXR1czonLCBmb3JtVmFsdWUudHJhbnNhY3Rpb25TdGF0dXNdLFxyXG4gICAgICAgIFsnRnJvbSBEYXRlOicsIGFuZ3VsYXJDb21tb24uZm9ybWF0RGF0ZSh0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnVG8gRGF0ZTonLCBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUudG9EYXRlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKV0sXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbW9kYWw6IGZvcm1WYWx1ZSxcclxuICAgICAgICBzeXNVc2VySUQ6IHRoaXMuY3VycmVudFVzZXIsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJGdW5kaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RhbDogZm9ybVZhbHVlLFxyXG4gICAgICAgIHN5c1VzZXJJRDogdGhpcy5jdXJyZW50VXNlcixcclxuICAgICAgICByZXBvcnRQZXJpb2Q6IGAke2Zvcm1hdERhdGUoZnJvbURhdGUpfSAtICR7Zm9ybWF0RGF0ZSh0b0RhdGUpfWAsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5SZXBvcnROYW1lID09IFwiVHJpYWwgQmFsYW5jZSAtIEFjY291bnRzXCIpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICBjb25zdCBkYXRlUmFuZ2UgPSB0aGlzLnByZXBhcmVGcm9tRGF0ZUFuZFRvRGF0ZUZvclRyaWFsQmFsYW5jZUFjY291bnRSZXBvcnQoKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBtb2RhbDoge1xyXG4gICAgICAgICAgLi4uZm9ybVZhbHVlLFxyXG4gICAgICAgICAgZnJvbURhdGU6IGRhdGVSYW5nZS5mcm9tRGF0ZSxcclxuICAgICAgICAgIHRvRGF0ZTogZGF0ZVJhbmdlLnRvRGF0ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN5c1VzZXJJRDogdGhpcy5jdXJyZW50VXNlclxyXG4gICAgICB9O1xyXG5cclxuICAgIH1cclxuICAgICAgaWYgKHRoaXMuUmVwb3J0TmFtZSA9PSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIilcclxuIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICBmb3JtVmFsdWUuZnJvbURhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICAgIGZvcm1WYWx1ZS50b0RhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpO1xyXG4gICAgICBjb25zdCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgICAgIFsnQ2xpZW50OicsIHRoaXMuY2xpZW50czEuZmluZChjID0+IGMuYnVzaW5lc3NQYXJ0bmVyQ29kZSA9PT0gZm9ybVZhbHVlLmNsaWVudCk/LmJ1c2luZXNzUGFydG5lck5hbWUgfHwgJyddLFxyXG4gICAgICAgIFsnVHJhbnNhY3Rpb24gU3RhdHVzOicsIGZvcm1WYWx1ZS50cmFuc2FjdGlvblN0YXR1cy5qb2luKFwiLFwiKV0sXHJcbiAgICAgICAgWydCcmFuY2g6JywgdGhpcy5icmFuY2hlcy5maW5kKGIgPT4gYi5icmFuY2hDb2RlID09PSBmb3JtVmFsdWUuYnJhbmNoKT8uYnVzaW5lc3NQYXJ0bmVyQnJhbmNoIHx8ICcnXSxcclxuICAgICAgICBbJ1Byb2R1Y3Q6JywgZm9ybVZhbHVlLnByb2R1Y3RdLFxyXG4gICAgICAgIFsnRnJvbSBEYXRlOicsIGFuZ3VsYXJDb21tb24uZm9ybWF0RGF0ZSh0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnUmVjZWl2ZSBDdXJyZW5jeTonLCB0aGlzLmN1cnJlbmNpZXMuZmluZChjID0+IGMuY3VycmVuY3lDb2RlID09PSBmb3JtVmFsdWUucmVjZWl2ZUN1cnJlbmN5KT8uY3VycmVuY3kgfHwgJyddLFxyXG4gICAgICAgIFsnVG8gRGF0ZTonLCBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUudG9EYXRlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKV0sXHJcbiAgICAgICAgWydTZW5kIENvdW50cnk6JywgdGhpcy5jb3VudHJpZXMuZmluZChjID0+IGMuY291bnRyeUNvZGUgPT09IGZvcm1WYWx1ZS5zZW5kQ291bnRyeSk/LmNvdW50cnkgfHwgJyddLFxyXG4gICAgICAgIFsnUmVjZWl2ZSBDb3VudHJ5OicsIHRoaXMuY291bnRyaWVzLmZpbmQoYyA9PiBjLmNvdW50cnlDb2RlID09PSBmb3JtVmFsdWUucmVjZWl2ZUNvdW50cnkpPy5jb3VudHJ5IHx8ICcnXSxcclxuICAgICAgICBbJ1N1bW1hcnkgUmVwb3J0OicsIGZvcm1WYWx1ZS5zdW1tYXJ5UmVwb3J0XSwgXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbW9kYWw6IGZvcm1WYWx1ZSxcclxuICAgICAgICBzeXNVc2VySUQ6IHRoaXMuY3VycmVudFVzZXIsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLlJlcG9ydE5hbWUgPT0gXCJUcmFuc2FjdGlvbiBNb25pdG9yaW5nXCIpIHtcclxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgICAvLyBmb3JtVmFsdWUuZnJvbURhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS5mcm9tRGF0ZSk7XHJcbiAgICAgIC8vIGZvcm1WYWx1ZS50b0RhdGUgPSB0aGlzLnRvSXNvRm9ybWF0KGZvcm1WYWx1ZS50b0RhdGUpO1xyXG4gICAgICBpZiAodGhpcy5pbml0aWFsRmlsdGVycz8uaXNSZWFsdGltZSAmJighZm9ybVZhbHVlLmZyb21EYXRlICYmICFmb3JtVmFsdWUudG9EYXRlKSkge1xyXG4gICAgICAgIGZvcm1WYWx1ZS5mcm9tRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgZm9ybVZhbHVlLnRvRGF0ZSA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9ybVZhbHVlLmZyb21EYXRlID0gdGhpcy50b0lzb0Zvcm1hdChmcm9tRGF0ZSk7XHJcbiAgICAgICAgZm9ybVZhbHVlLnRvRGF0ZSA9IHRoaXMudG9Jc29Gb3JtYXQodG9EYXRlKTtcclxuICAgICAgICBpZiAodGhpcy5pbml0aWFsRmlsdGVycz8uaXNSZWFsdGltZSkge1xyXG4gICAgICAgICAgdGhpcy5pbml0aWFsRmlsdGVycy5pc1JlYWx0aW1lID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtcclxuICAgICAgICBbJ0NsaWVudDonLCB0aGlzLmNsaWVudHMxLmZpbmQoYyA9PiBjLmJ1c2luZXNzUGFydG5lckNvZGUgPT09IGZvcm1WYWx1ZS5jbGllbnQpPy5idXNpbmVzc1BhcnRuZXJOYW1lIHx8ICcnXSxcclxuICAgICAgICBbJ1RyYW5zYWN0aW9uIFN0YXR1czonLCBmb3JtVmFsdWUudHJhbnNhY3Rpb25TdGF0dXMuam9pbihcIixcIildLFxyXG4gICAgICAgIFsnQnJhbmNoOicsIHRoaXMuYnJhbmNoZXMuZmluZChiID0+IGIuYnJhbmNoQ29kZSA9PT0gZm9ybVZhbHVlLmJyYW5jaCk/LmJ1c2luZXNzUGFydG5lckJyYW5jaCB8fCAnJ10sXHJcbiAgICAgICAgWydQcm9kdWN0OicsIGZvcm1WYWx1ZS5wcm9kdWN0XSxcclxuICAgICAgICBbJ0Zyb20gRGF0ZTonLCB0aGlzLmluaXRpYWxGaWx0ZXJzPy5pc1JlYWx0aW1lID8gJycgOiBhbmd1bGFyQ29tbW9uLmZvcm1hdERhdGUodGhpcy50b0lzb0Zvcm1hdChmb3JtVmFsdWUuZnJvbURhdGUpLCAnZGQvTU0veXl5eScsICdlbi1VUycpXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ3VycmVuY3k6JywgdGhpcy5jdXJyZW5jaWVzLmZpbmQoYyA9PiBjLmN1cnJlbmN5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDdXJyZW5jeSk/LmN1cnJlbmN5IHx8ICcnXSxcclxuICAgICAgICBbJ1RvIERhdGU6JywgdGhpcy5pbml0aWFsRmlsdGVycz8uaXNSZWFsdGltZSA/ICcnIDogYW5ndWxhckNvbW1vbi5mb3JtYXREYXRlKHRoaXMudG9Jc29Gb3JtYXQoZm9ybVZhbHVlLnRvRGF0ZSksICdkZC9NTS95eXl5JywgJ2VuLVVTJyldLFxyXG4gICAgICAgIFsnU2VuZCBDb3VudHJ5OicsIHRoaXMuY291bnRyaWVzLmZpbmQoYyA9PiBjLmNvdW50cnlDb2RlID09PSBmb3JtVmFsdWUuc2VuZENvdW50cnkpPy5jb3VudHJ5IHx8ICcnXSxcclxuICAgICAgICBbJ1JlY2VpdmUgQ291bnRyeTonLCB0aGlzLmNvdW50cmllcy5maW5kKGMgPT4gYy5jb3VudHJ5Q29kZSA9PT0gZm9ybVZhbHVlLnJlY2VpdmVDb3VudHJ5KT8uY291bnRyeSB8fCAnJ10sXHJcbiAgICAgIF07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbW9kYWw6IGZvcm1WYWx1ZSxcclxuICAgICAgICBzeXNVc2VySUQ6IHRoaXMuY3VycmVudFVzZXIsXHJcbiAgICAgICAgc2VhcmNoQ3JpdGVyaWE6IHNlYXJjaENyaXRlcmlhXHJcbiAgICAgIH1cclxuICAgfVxyXG4gIH1cclxuXHJcbiAgdG9Jc29Gb3JtYXQoZGF0ZUlucHV0OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkYXRlSW5wdXQpIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gSGFuZGxlIHsgeWVhciwgbW9udGgsIGRheSB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHR5cGVvZiBkYXRlSW5wdXQgPT09ICdvYmplY3QnICYmXHJcbiAgICAgIGRhdGVJbnB1dC55ZWFyICYmXHJcbiAgICAgIGRhdGVJbnB1dC5tb250aCAmJlxyXG4gICAgICBkYXRlSW5wdXQuZGF5XHJcbiAgICApIHtcclxuICAgICAgY29uc3QgeWVhciA9IGRhdGVJbnB1dC55ZWFyO1xyXG4gICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlSW5wdXQubW9udGgpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlSW5wdXQuZGF5KS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgSlMgRGF0ZSBvYmplY3RcclxuICAgIGlmIChkYXRlSW5wdXQgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIGlmIChpc05hTihkYXRlSW5wdXQuZ2V0VGltZSgpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgY29uc3QgeWVhciA9IGRhdGVJbnB1dC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlSW5wdXQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlSW5wdXQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgZGQvTU0veXl5eSBzdHJpbmdcclxuICAgIGlmICh0eXBlb2YgZGF0ZUlucHV0ID09PSAnc3RyaW5nJyAmJiBkYXRlSW5wdXQuaW5jbHVkZXMoJy8nKSkge1xyXG4gICAgICBjb25zdCBwYXJ0cyA9IGRhdGVJbnB1dC5zcGxpdCgnLycpO1xyXG4gICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XHJcbiAgICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gcGFydHM7XHJcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGgucGFkU3RhcnQoMiwgJzAnKX0tJHtkYXkucGFkU3RhcnQoMiwgJzAnKX1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIElTTyBzdHJpbmcgKHl5eXktTU0tZGQgb3IgeXl5eS1NTS1kZFRISDptbTpzcy5zc3NaKVxyXG4gICAgaWYgKHR5cGVvZiBkYXRlSW5wdXQgPT09ICdzdHJpbmcnICYmIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0vLnRlc3QoZGF0ZUlucHV0KSkge1xyXG4gICAgICAvLyBVc2Ugb25seSBkYXRlIHBhcnQgaWYgZnVsbCBJU08gc3RyaW5nXHJcbiAgICAgIHJldHVybiBkYXRlSW5wdXQuc3Vic3RyaW5nKDAsIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gIH1cclxuICBvbkNsb3NlKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBnZXQgZXJyb3JNZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGVycm9yTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRXJyb3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5FcnJvcjtcclxuICB9XHJcblxyXG4gIGN1cnJlbmN5U2VhcmNoID0gKHRlcm06IHN0cmluZywgaXRlbTogYW55KSA9PiB7XHJcbiAgICB0ZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgaXRlbS5jdXJyZW5jeUNvZGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICB0b05nYkRhdGVTdHJ1Y3QoZnJvbURhdGU6IERhdGUpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHllYXI6IGZyb21EYXRlLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgIG1vbnRoOiBmcm9tRGF0ZS5nZXRNb250aCgpICsgMSxcclxuICAgICAgZGF5OiBmcm9tRGF0ZS5nZXREYXRlKClcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvblN0YXR1c1N1YnNjcmliZSgpIHtcclxuICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RyYW5zYWN0aW9uU3RhdHVzJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsbFN0YXR1cyA9IHRoaXMudHJhbnNhY3Rpb25TdGF0dXNlc1xyXG4gICAgICAgIC5tYXAoKHN0YXR1cykgPT4gc3RhdHVzLnRyYW5zYWN0aW9uU3RhdHVzKTtcclxuXHJcbiAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ0FsbCcpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RBbGxDaGVja2VkKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZFN0YXR1cyA9IHZhbC5maWx0ZXIocyA9PiBzICE9PSAnQWxsJyk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0cmFuc2FjdGlvblN0YXR1cycpXHJcbiAgICAgICAgICAgIC5zZXRWYWx1ZShmaWx0ZXJlZFN0YXR1cywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc1NlbGVjdEFsbENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLmdldCgndHJhbnNhY3Rpb25TdGF0dXMnKVxyXG4gICAgICAgICAgICAuc2V0VmFsdWUoWydBbGwnXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgdGhpcy5pc1NlbGVjdEFsbENoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbURhdGUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShmcm9tRGF0ZVN0ciA9PiB7XHJcbiAgICAgIGNvbnN0IHRvRGF0ZUNvbnRyb2wgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b0RhdGUnKTtcclxuICAgICAgY29uc3QgdG9EYXRlU3RyID0gdG9EYXRlQ29udHJvbD8udmFsdWU7XHJcbiAgICAgIGlmICghZnJvbURhdGVTdHIgfHwgIXRvRGF0ZVN0cikgcmV0dXJuO1xyXG4gICAgICBjb25zdCBmcm9tRGF0ZSA9IG5ldyBEYXRlKGZyb21EYXRlU3RyKTtcclxuICAgICAgdGhpcy5kaXNhYmxlZERhdGUgPSB0aGlzLnRvTmdiRGF0ZVN0cnVjdChmcm9tRGF0ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvLyAqKiAgZm9yIHRyaWFsIGJhbGFuY2UgYWNjb3VudGluZyByZXBvcnQgLSBcclxuXHJcbiAgb25TZWxlY3RGcm9tTW9udGgoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nO1xyXG4gICAgY29uc3QgeWVhciA9ICt0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgZnJvbU1vbnRoID0gK3RoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21Nb250aCcpPy52YWx1ZTtcclxuXHJcbiAgICBpZiAoIXllYXIgfHwgIWZyb21Nb250aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLkdldFRvTW9udGhzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoeWVhciwgZnJvbU1vbnRoKVxyXG4gICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiBvZihbXSkpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh0b01vbnRocykgPT4ge1xyXG4gICAgICAgIHRoaXMudG9Nb250aHMgPSB0b01vbnRocztcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIFwidG9Nb250aFwiIGZvcm0gY29udHJvbCB3aXRoIGRlZmF1bHQgKGZpcnN0IG9wdGlvbilcclxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICB0b01vbnRoOiB0aGlzLnRvTW9udGhzWzBdPy5wTW9udGggPz8gXCJcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyBvbiBzZWxlY3QgZnJvbU1vbnRoIGdvZXMgY2FsbCB0byBmcm9tRGF5XHJcblxyXG4gICAgY29uc3QgZmluYW5jaWFsWWVhciA9ICt0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnZhbHVlO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRQTW9udGggPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmcm9tTW9udGgnKT8udmFsdWU7XHJcbiAgICBjb25zdCBmcm9tTW9udGhPYmogPSB0aGlzLmZyb21Nb250aHMuZmluZChtID0+IG0ucE9yZGVyID09PSBzZWxlY3RlZFBNb250aCk7XHJcbiAgICBjb25zdCBmcm9tTW9udGhMYWJlbCA9IGZyb21Nb250aE9iaj8ucGVyaW9kO1xyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLkdldEZyb21EYXRlc0ZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KGZpbmFuY2lhbFllYXIsIGZyb21Nb250aExhYmVsKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChmcm9tRGF5cykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mcm9tRGF5cyA9IGZyb21EYXlzO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBmcm9tRGF5OiB1bmRlZmluZWQgfSlcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgdG9EYXk6IFwiXCIgfSlcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZmV0Y2hpbmcgVG8gRGF5czonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0RnJvbURheSgpIHtcclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcbiAgICBjb25zdCBjdXJyZW50VG9EYXlWYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LnZhbHVlO1xyXG4gICAgY29uc3QgY3VycmVudFRvRGF5T2JqZWN0ID0gdGhpcy50b0RheXMuZmluZChkID0+IGQuaW5kaXZpZHVhbERhdGUgPT09IGN1cnJlbnRUb0RheVZhbHVlKVxyXG5cclxuICAgIGNvbnN0IGZpbmFuY2lhbFllYXIgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgZnJvbU1vbnRoID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbU1vbnRoJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdG9Nb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8udmFsdWU7XHJcbiAgICBjb25zdCBmcm9tRGF5ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbURheScpPy52YWx1ZTtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHtcclxuICAgICAgWWVhcjogZmluYW5jaWFsWWVhcixcclxuICAgICAgRnJvbU1vbnRoOiBmcm9tTW9udGgsXHJcbiAgICAgIFRvTW9udGg6IHRvTW9udGgsXHJcbiAgICAgIEZyb21EYXRlOiBmcm9tRGF5XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVwb3J0U2VydmljZS5HZXRUb0RhdGVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQocmVxdWVzdFBheWxvYWQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkNvbXBsZXRlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAodG9EYXlzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvRGF5cyA9IHRvRGF5cztcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbU1vbnRoJyk/LnZhbHVlICE9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8udmFsdWUgJiYgdGhpcy5zZWFyY2hGb3JtLmdldCgndG9EYXknKT8udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFRvRGF5T2JqZWN0ID0gdGhpcy50b0RheXMuZmluZChkID0+IGQucERhdGUgPT09IGN1cnJlbnRUb0RheU9iamVjdC5wRGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgICB0b0RheTogbWF0Y2hlZFRvRGF5T2JqZWN0LmluZGl2aWR1YWxEYXRlID8/IFwiXCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgICAgdG9EYXk6IHRoaXMudG9EYXlzWzBdPy5pbmRpdmlkdWFsRGF0ZSA/PyBcIlwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLmdldCgndG9EYXknKT8uZW5hYmxlKCk7XHJcblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBUbyBEYXlzOicsIGVycm9yKTtcclxuICAgICAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3IgZmV0Y2hpbmcgVG8gRGF5cycpO1xyXG4gICAgICAgICAgdGhpcy50b0RheXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LnBhdGNoVmFsdWUoXCJcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25TZWxlY3RUb01vbnRoKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZztcclxuXHJcbiAgICBjb25zdCBjdXJyZW50VG9EYXlWYWx1ZSA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LnZhbHVlO1xyXG5cclxuICAgIGNvbnN0IGZpbmFuY2lhbFllYXIgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgZnJvbU1vbnRoID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbU1vbnRoJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdG9Nb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8udmFsdWU7XHJcbiAgICBjb25zdCBmcm9tRGF5ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbURheScpPy52YWx1ZTtcclxuXHJcbiAgICBpZiAoIWZpbmFuY2lhbFllYXIgfHwgIWZyb21Nb250aCB8fCAhdG9Nb250aCB8fCAhZnJvbURheSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdGF0ZSA9IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Db21wbGV0ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0ge1xyXG4gICAgICBZZWFyOiBmaW5hbmNpYWxZZWFyLFxyXG4gICAgICBGcm9tTW9udGg6IGZyb21Nb250aCxcclxuICAgICAgVG9Nb250aDogdG9Nb250aCxcclxuICAgICAgRnJvbURhdGU6IGZyb21EYXlcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLkdldFRvRGF0ZXNGb3JUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydChyZXF1ZXN0UGF5bG9hZClcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAodG9EYXlzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvRGF5cyA9IHRvRGF5cztcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbU1vbnRoJyk/LnZhbHVlID09PSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b01vbnRoJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21EYXkgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmcm9tRGF5Jyk/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBmcm9tRGF5T2JqZWN0ID0gdGhpcy5mcm9tRGF5cy5maW5kKGQgPT4gZC5pbmRpdmlkdWFsRGF0ZSA9PT0gZnJvbURheSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvRGF5T2JqZWN0ID0gdGhpcy50b0RheXMuZmluZChkID0+IGQucERhdGUgPT09IGZyb21EYXlPYmplY3Q/LmluZGl2aWR1YWxEYXkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICAgIHRvRGF5OiB0b0RheU9iamVjdD8uaW5kaXZpZHVhbERhdGUgPz8gXCJcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgICAgICB0b0RheTogdGhpcy50b0RheXNbMF0uaW5kaXZpZHVhbERhdGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBUbyBEYXlzOicsIGVycm9yKTtcclxuICAgICAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3IgZmV0Y2hpbmcgVG8gRGF5czonKTtcclxuICAgICAgICAgIHRoaXMudG9EYXlzID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b0RheScpPy5wYXRjaFZhbHVlKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RGaW5hbmNpYWxZZWFyKCkge1xyXG4gICAgLy8gb24gZmluYW5jaWFsWWVhciBjaGFuZ2UgZnJvbWRheSBhbmQgdG9kYXkgc2hvdWxkIGNoYW5nZSB0byBkZWZhdWx0IHZhbHVlcyBhY29jcmRpbmcgdG8geWVhciBhbmQgZnJvbW1vbnRoLHRvbW9udGggLVxyXG5cclxuICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmc7XHJcblxyXG4gICAgLy8gY2FsbCBmcm9tRGF5c1xyXG5cclxuICAgIGNvbnN0IGZpbmFuY2lhbFllYXIgPSArdGhpcy5zZWFyY2hGb3JtLmdldCgnZmluYW5jaWFsWWVhcicpPy52YWx1ZTtcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZFBNb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21Nb250aCcpPy52YWx1ZTtcclxuICAgIGNvbnN0IGZyb21Nb250aE9iaiA9IHRoaXMuZnJvbU1vbnRocy5maW5kKG0gPT4gbS5wT3JkZXIgPT09IHNlbGVjdGVkUE1vbnRoKTtcclxuICAgIGNvbnN0IGZyb21Nb250aExhYmVsID0gZnJvbU1vbnRoT2JqPy5wZXJpb2Q7XHJcblxyXG4gICAgdGhpcy5yZXBvcnRTZXJ2aWNlLkdldEZyb21EYXRlc0ZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KGZpbmFuY2lhbFllYXIsIGZyb21Nb250aExhYmVsKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChmcm9tRGF5cykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mcm9tRGF5cyA9IGZyb21EYXlzO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoeyBmcm9tRGF5OiB1bmRlZmluZWQgfSlcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5wYXRjaFZhbHVlKHsgdG9EYXk6IFwiXCIgfSlcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZmV0Y2hpbmcgVG8gRGF5czonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgIGNvbnN0IGZyb21Nb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21Nb250aCcpPy52YWx1ZTtcclxuICAgIGNvbnN0IHRvTW9udGggPSB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b01vbnRoJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgZnJvbURheSA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXknKT8udmFsdWU7XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSB7XHJcbiAgICAgIFllYXI6IGZpbmFuY2lhbFllYXIsXHJcbiAgICAgIEZyb21Nb250aDogZnJvbU1vbnRoLFxyXG4gICAgICBUb01vbnRoOiB0b01vbnRoLFxyXG4gICAgICBGcm9tRGF0ZTogZnJvbURheVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuR2V0VG9EYXRlc0ZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KHJlcXVlc3RQYXlsb2FkKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICh0b0RheXMpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9EYXlzID0gdG9EYXlzO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmcm9tTW9udGgnKT8udmFsdWUgPT09IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgZnJvbURheSA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ2Zyb21EYXknKT8udmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21EYXlPYmplY3QgPSB0aGlzLmZyb21EYXlzLmZpbmQoZCA9PiBkLmluZGl2aWR1YWxEYXRlID09PSBmcm9tRGF5KTtcclxuICAgICAgICAgICAgY29uc3QgdG9EYXlPYmplY3QgPSB0aGlzLnRvRGF5cy5maW5kKGQgPT4gZC5wRGF0ZSA9PT0gZnJvbURheU9iamVjdD8uaW5kaXZpZHVhbERheSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgICAgdG9EYXk6IHRvRGF5T2JqZWN0Py5pbmRpdmlkdWFsRGF0ZSA/PyBcIlwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgICAgIHRvRGF5OiBcIlwiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b0RheScpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBUbyBEYXlzOicsIGVycm9yKTtcclxuICAgICAgICAgIHdpbmRvdy5hbGVydCgnRXJyb3IgZmV0Y2hpbmcgVG8gRGF5czonKTtcclxuICAgICAgICAgIHRoaXMudG9EYXlzID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0uZ2V0KCd0b0RheScpPy5wYXRjaFZhbHVlKFwiXCIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGUuQ29tcGxldGU7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcmVwYXJlRnJvbURhdGVBbmRUb0RhdGVGb3JUcmlhbEJhbGFuY2VBY2NvdW50UmVwb3J0KCkge1xyXG4gICAgY29uc3QgZmluYW5jaWFsWWVhciA9ICt0aGlzLnNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgZnJvbU1vbnRoID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbU1vbnRoJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdG9Nb250aCA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8udmFsdWU7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRGcm9tRGF5ID0gdGhpcy5zZWFyY2hGb3JtLmdldCgnZnJvbURheScpPy52YWx1ZTtcclxuICAgIGNvbnN0IGZyb21EYXlPYmogPSB0aGlzLmZyb21EYXlzLmZpbmQobSA9PiBtLmluZGl2aWR1YWxEYXRlID09PSBzZWxlY3RlZEZyb21EYXkpO1xyXG4gICAgY29uc3QgZnJvbURheSA9IGZyb21EYXlPYmo/LmluZGl2aWR1YWxEYXk7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRUb0RheSA9IHRoaXMuc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdG9EYXlPYmogPSB0aGlzLnRvRGF5cy5maW5kKG0gPT4gbS5pbmRpdmlkdWFsRGF0ZSA9PT0gc2VsZWN0ZWRUb0RheSk7XHJcbiAgICBjb25zdCB0b0RheSA9IHRvRGF5T2JqPy5wRGF0ZTtcclxuXHJcbiAgICBjb25zdCBmcm9tRGF0ZSA9IG5ldyBEYXRlKGZpbmFuY2lhbFllYXIsICtmcm9tTW9udGggLSAxLCArZnJvbURheSk7IC8vIEpTIG1vbnRoIGlzIDAtYmFzZWRcclxuICAgIGNvbnN0IHRvRGF0ZSA9IG5ldyBEYXRlKGZpbmFuY2lhbFllYXIsICt0b01vbnRoIC0gMSwgK3RvRGF5KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmcm9tRGF0ZTogZnJvbURhdGUsXHJcbiAgICAgIHRvRGF0ZTogdG9EYXRlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0gSW1wcm92ZWQgc2VhcmNoIGNyaXRlcmlhIGhlbHBlcnMgKGhhbmRsZXMgcHJvZHVjdCkgLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcHJpdmF0ZSBmaWVsZExhYmVsTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgY2xpZW50OiAnQ2xpZW50OicsXHJcbiAgICBicmFuY2g6ICdCcmFuY2g6JyxcclxuICAgIGZyb21EYXRlOiAnRnJvbSBEYXRlOicsXHJcbiAgICB0b0RhdGU6ICdUbyBEYXRlOicsXHJcbiAgICBwcm9kdWN0OiAnUHJvZHVjdDonLFxyXG4gICAgdHJhbnNhY3Rpb25Qcm9kdWN0OiAnUHJvZHVjdDonLFxyXG4gICAgdXNlcklkOiAnVXNlcjonLFxyXG4gICAgY3VycmVuY3k6ICdDdXJyZW5jeTonLFxyXG4gICAgc2VuZEN1cnJlbmN5OiAnU2VuZCBDdXJyZW5jeTonLFxyXG4gICAgcmVjZWl2ZUN1cnJlbmN5OiAnUmVjZWl2ZSBDdXJyZW5jeTonLFxyXG4gICAgdHJhbnNhY3Rpb25TdGF0dXM6ICdUeG4uIFN0YXR1czonLFxyXG4gICAgdHJhbnNhY3Rpb25TdGF0dXNTaW5nbGVTZWxlY3Q6ICdUeG4uIFN0YXR1czonLFxyXG4gICAgdHJhbnNhY3Rpb25ObzogJ1R4bi4gTnVtYmVyOicsXHJcbiAgICBkYXRlOiAnRGF0ZTonLFxyXG4gICAgZGF0ZVR5cGU6ICdEYXRlIFR5cGU6JyxcclxuICAgIHZhbHVlRGF0ZTogJ1ZhbHVlIERhdGU6JyxcclxuICAgIHNlbmRDb3VudHJ5OiAnU2VuZCBDb3VudHJ5OicsXHJcbiAgICByZWNlaXZlQ291bnRyeTogJ1JlY2VpdmUgQ291bnRyeTonLFxyXG4gICAgc2VuZEJ1c2luZXNzUGFydG5lcjogJ1NlbmRlciBQYXJ0bmVyOicsXHJcbiAgICByZWN2QnVzaW5lc3NQYXJ0bmVyOiAnUmVjZWl2ZXIgUGFydG5lcjonLFxyXG4gICAgYnVzaW5lc3NMaW5lOiAnQnVzaW5lc3MgTGluZTonLFxyXG4gICAgZmluYW5jaWFsWWVhcjogJ0ZpbmFuY2lhbCBZZWFyOicsXHJcbiAgICBmcm9tTW9udGg6ICdGcm9tIE1vbnRoOicsXHJcbiAgICB0b01vbnRoOiAnVG8gTW9udGg6JyxcclxuICAgIGZyb21EYXk6ICdGcm9tIERheTonLFxyXG4gICAgdG9EYXk6ICdUbyBEYXk6JyxcclxuICAgIGFjY291bnRTdGF0dXM6ICdBY2NvdW50IFN0YXR1czonLFxyXG4gICAgLy8gYWRkIG1vcmUgbWFwcGluZ3MgYXMgbmVlZGVkXHJcbiAgfTtcclxuXHJcbiAgLy8gbWFwIHZpc2libGUgZmllbGQgbmFtZSAtPiBhY3R1YWwgZm9ybSBjb250cm9sIG5hbWUgKHdoZW4gdGhleSBkaWZmZXIpXHJcbiAgcHJpdmF0ZSBmaWVsZFRvQ29udHJvbE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgIHRyYW5zYWN0aW9uU3RhdHVzU2luZ2xlU2VsZWN0OiAndHJhbnNhY3Rpb25TdGF0dXMnLFxyXG4gICAgdHJhbnNhY3Rpb25Qcm9kdWN0OiAncHJvZHVjdCcsIC8vIGltcG9ydGFudDogdHJhbnNhY3Rpb25Qcm9kdWN0IFVJIHVzZXMgZm9ybSBjb250cm9sIG5hbWVkICdwcm9kdWN0J1xyXG4gICAgLy8gYWRkIG90aGVyIG1hcHBpbmdzIGlmIHZpc2libGVGaWVsZCBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgZm9ybSBjb250cm9sIG5hbWVcclxuICB9O1xyXG5cclxuICAvLyBtYXBzIHRvIHVzZSBiaW5kTGFiZWwgLyBiaW5kVmFsdWUgZm9yIGxvb2t1cHNcclxuICBwcml2YXRlIGZpZWxkQmluZExhYmVsTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgY2xpZW50OiAnYnVzaW5lc3NQYXJ0bmVyTmFtZScsXHJcbiAgICBicmFuY2g6ICdidXNpbmVzc1BhcnRuZXJCcmFuY2gnLFxyXG4gICAgcHJvZHVjdDogJ3Byb2R1Y3RDb2RlJyxcclxuICAgIHRyYW5zYWN0aW9uUHJvZHVjdDogJ3Byb2R1Y3RDb2RlJyxcclxuICAgIHRyYW5zYWN0aW9uU3RhdHVzOiAndHJhbnNhY3Rpb25TdGF0dXMnLFxyXG4gICAgdHJhbnNhY3Rpb25TdGF0dXNTaW5nbGVTZWxlY3Q6ICd0cmFuc2FjdGlvblN0YXR1cycsXHJcbiAgICB1c2VySWQ6ICd1c2VyTmFtZScsXHJcbiAgICBjdXJyZW5jeTogJ2N1cnJlbmN5JyxcclxuICAgIHNlbmRDdXJyZW5jeTogJ2N1cnJlbmN5JyxcclxuICAgIHJlY2VpdmVDdXJyZW5jeTogJ2N1cnJlbmN5JyxcclxuICAgIHNlbmRCdXNpbmVzc1BhcnRuZXI6ICduYW1lJyxcclxuICAgIHJlY3ZCdXNpbmVzc1BhcnRuZXI6ICduYW1lJyxcclxuICAgIGJ1c2luZXNzTGluZTogJ2J1c2luZXNzTGluZScsXHJcbiAgICBmaW5hbmNpYWxZZWFyOiAnZmluYW5jaWFsWWVhcicsXHJcbiAgICBmcm9tTW9udGg6ICdwZXJpb2QnLFxyXG4gICAgdG9Nb250aDogJ3BNb250aE5hbWUnLFxyXG4gICAgZnJvbURheTogJ2luZGl2aWR1YWxEYXknLFxyXG4gICAgdG9EYXk6ICdwRGF0ZScsXHJcbiAgICBhY2NvdW50U3RhdHVzOiAnc3RhdHVzTmFtZSdcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGZpZWxkQmluZFZhbHVlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgY2xpZW50OiAnYnVzaW5lc3NQYXJ0bmVyQ29kZScsXHJcbiAgICBicmFuY2g6ICdicmFuY2hDb2RlJyxcclxuICAgIHByb2R1Y3Q6ICdwcm9kdWN0Q29kZScsXHJcbiAgICB0cmFuc2FjdGlvblByb2R1Y3Q6ICdwcm9kdWN0Q29kZScsXHJcbiAgICB0cmFuc2FjdGlvblN0YXR1czogJ3RyYW5zYWN0aW9uU3RhdHVzJyxcclxuICAgIHRyYW5zYWN0aW9uU3RhdHVzU2luZ2xlU2VsZWN0OiAndHJhbnNhY3Rpb25TdGF0dXMnLFxyXG4gICAgdXNlcklkOiAndXNlcklkJyxcclxuICAgIGN1cnJlbmN5OiAnY3VycmVuY3lDb2RlJyxcclxuICAgIHNlbmRDdXJyZW5jeTogJ2N1cnJlbmN5Q29kZScsXHJcbiAgICByZWNlaXZlQ3VycmVuY3k6ICdjdXJyZW5jeUNvZGUnLFxyXG4gICAgc2VuZEJ1c2luZXNzUGFydG5lcjogJ2lkJyxcclxuICAgIHJlY3ZCdXNpbmVzc1BhcnRuZXI6ICdpZCcsXHJcbiAgICBidXNpbmVzc0xpbmU6ICdidXNpbmVzc0xpbmUnLFxyXG4gICAgZmluYW5jaWFsWWVhcjogJ2ZpbmFuY2lhbFllYXInLFxyXG4gICAgZnJvbU1vbnRoOiAncE9yZGVyJyxcclxuICAgIHRvTW9udGg6ICdwTW9udGgnLFxyXG4gICAgZnJvbURheTogJ2luZGl2aWR1YWxEYXRlJyxcclxuICAgIHRvRGF5OiAnaW5kaXZpZHVhbERhdGUnLFxyXG4gICAgYWNjb3VudFN0YXR1czogJ3N0YXR1c0NvZGUnXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlVG9ERE1NWVlZWShkOiBzdHJpbmcgfCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWQpIHJldHVybiAnJztcclxuICAgIGNvbnN0IGRhdGUgPSAodHlwZW9mIGQgPT09ICdzdHJpbmcnICYmIGQubGVuZ3RoKSA/IG5ldyBEYXRlKGQpIDogKGQgaW5zdGFuY2VvZiBEYXRlID8gZCA6IG5ldyBEYXRlKGQpKTtcclxuICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiAnJztcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XHJcbiAgfVxyXG5cclxuICAvKiogaGVscGVyIHRvIGZpbmQgaXRlbSBpbiB0aGUga25vd24gbGlzdHMgYnkgYmluZFZhbHVlIGFuZCByZXR1cm4gaXRzIGJpbmRMYWJlbFxyXG4gICAqICBpbXByb3ZlZDogdHJpZXMgbXVsdGlwbGUgZmFsbGJhY2sgdmFsdWUga2V5cyBzbyBwcm9kdWN0IGxvb2t1cCBpcyByb2J1c3QgKi9cclxuICBwcml2YXRlIGxvb2t1cEZyb21MaXN0QnlGaWVsZChmaWVsZDogc3RyaW5nLCBzY2FsYXJWYWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJpbmRMYWJlbCA9IHRoaXMuZmllbGRCaW5kTGFiZWxNYXBbZmllbGRdO1xyXG4gICAgY29uc3QgYmluZFZhbHVlID0gdGhpcy5maWVsZEJpbmRWYWx1ZU1hcFtmaWVsZF07XHJcblxyXG4gICAgLy8gY2hvb3NlIGNhbmRpZGF0ZSBsaXN0IGJhc2VkIG9uIGZpZWxkXHJcbiAgICBsZXQgbGlzdDogYW55W10gfCB1bmRlZmluZWQ7XHJcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XHJcbiAgICAgIGNhc2UgJ2NsaWVudCc6IGxpc3QgPSB0aGlzLmNsaWVudHMxOyBicmVhaztcclxuICAgICAgY2FzZSAnYnJhbmNoJzogbGlzdCA9IHRoaXMuYnJhbmNoZXM7IGJyZWFrO1xyXG4gICAgICBjYXNlICdwcm9kdWN0JzogbGlzdCA9IHRoaXMucHJvZHVjdHM7IGJyZWFrO1xyXG4gICAgICBjYXNlICd0cmFuc2FjdGlvblByb2R1Y3QnOiBsaXN0ID0gdGhpcy50cmFuc2FjdGlvblByb2R1Y3RzOyBicmVhaztcclxuICAgICAgY2FzZSAndHJhbnNhY3Rpb25TdGF0dXMnOlxyXG4gICAgICBjYXNlICd0cmFuc2FjdGlvblN0YXR1c1NpbmdsZVNlbGVjdCc6IGxpc3QgPSB0aGlzLnRyYW5zYWN0aW9uU3RhdHVzZXM7IGJyZWFrO1xyXG4gICAgICBjYXNlICd1c2VySWQnOiBsaXN0ID0gdGhpcy51c2VyczsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3NlbmRCdXNpbmVzc1BhcnRuZXInOiBsaXN0ID0gdGhpcy5zZW5kQnVzaW5lc3NQYXJ0bmVyQWdlbnRzOyBicmVhaztcclxuICAgICAgY2FzZSAncmVjdkJ1c2luZXNzUGFydG5lcic6IGxpc3QgPSB0aGlzLnJlY3ZCdXNpbmVzc1BhcnRuZXJBZ2VudHM7IGJyZWFrO1xyXG4gICAgICBjYXNlICdidXNpbmVzc0xpbmUnOiBsaXN0ID0gdGhpcy5idXNpbmVzc0xpbmVzOyBicmVhaztcclxuICAgICAgY2FzZSAnZmluYW5jaWFsWWVhcic6IGxpc3QgPSB0aGlzLmZpbmFuY2lhbFllYXJzOyBicmVhaztcclxuICAgICAgY2FzZSAnZnJvbU1vbnRoJzogbGlzdCA9IHRoaXMuZnJvbU1vbnRoczsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RvTW9udGgnOiBsaXN0ID0gdGhpcy50b01vbnRoczsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Zyb21EYXknOiBsaXN0ID0gdGhpcy5mcm9tRGF5czsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RvRGF5JzogbGlzdCA9IHRoaXMudG9EYXlzOyBicmVhaztcclxuICAgICAgY2FzZSAnYWNjb3VudFN0YXR1cyc6IGxpc3QgPSB0aGlzLmFjY291bnRTdGF0dXNlczsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3NlbmRDb3VudHJ5JzpcclxuICAgICAgY2FzZSAncmVjZWl2ZUNvdW50cnknOiBsaXN0ID0gdGhpcy5jb3VudHJpZXM7IGJyZWFrO1xyXG4gICAgICBjYXNlICdjdXJyZW5jeSc6XHJcbiAgICAgIGNhc2UgJ3NlbmRDdXJyZW5jeSc6XHJcbiAgICAgIGNhc2UgJ3JlY2VpdmVDdXJyZW5jeSc6IGxpc3QgPSB0aGlzLmN1cnJlbmNpZXM7IGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OiBsaXN0ID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGhhbmRsZSBjb21tb24gJ0FsbCcgc2VudGluZWxcclxuICAgIGlmIChzY2FsYXJWYWx1ZSA9PT0gJ0FsbCcgfHwgc2NhbGFyVmFsdWUgPT09ICcnIHx8IHNjYWxhclZhbHVlID09PSBudWxsIHx8IHNjYWxhclZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBTdHJpbmcoc2NhbGFyVmFsdWUgfHwgJycpO1xyXG5cclxuICAgIGlmIChsaXN0ICYmIGxpc3QubGVuZ3RoKSB7XHJcbiAgICAgIC8vIHRyeSB0aGUgY29uZmlndXJlZCBiaW5kVmFsdWUga2V5IGZpcnN0XHJcbiAgICAgIGlmIChiaW5kVmFsdWUpIHtcclxuICAgICAgICBjb25zdCBmb3VuZCA9IGxpc3QuZmluZCgoeDogYW55KSA9PiBTdHJpbmcoeFtiaW5kVmFsdWVdKSA9PT0gU3RyaW5nKHNjYWxhclZhbHVlKSk7XHJcbiAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICBpZiAoYmluZExhYmVsICYmIGZvdW5kW2JpbmRMYWJlbF0pIHJldHVybiBmb3VuZFtiaW5kTGFiZWxdO1xyXG4gICAgICAgICAgcmV0dXJuIGZvdW5kLnRyYW5zYWN0aW9uU3RhdHVzTGFiZWwgfHwgZm91bmQudHJhbnNhY3Rpb25TdGF0dXMgfHwgZm91bmQubmFtZSB8fCBmb3VuZC5wcm9kdWN0TmFtZSB8fCBmb3VuZC5idXNpbmVzc1BhcnRuZXJOYW1lIHx8IFN0cmluZyhzY2FsYXJWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBmYWxsYmFjazogdHJ5IG1hdGNoaW5nIG9uIGNvbW1vbiBrZXlzIGluIGNhc2Ugc2hhcGVzIGRpZmZlclxyXG4gICAgICBjb25zdCBjb21tb25LZXlzID0gWydwcm9kdWN0Q29kZScsICdjb2RlJywgJ2lkJywgJ3ZhbHVlJywgJ2N1cnJlbmN5Q29kZScsICdzdGF0dXNDb2RlJ107XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbW1vbktleXMpIHtcclxuICAgICAgICBjb25zdCBmb3VuZDIgPSBsaXN0LmZpbmQoKHg6IGFueSkgPT4geCAmJiB4W2tleV0gIT09IHVuZGVmaW5lZCAmJiBTdHJpbmcoeFtrZXldKSA9PT0gU3RyaW5nKHNjYWxhclZhbHVlKSk7XHJcbiAgICAgICAgaWYgKGZvdW5kMikge1xyXG4gICAgICAgICAgY29uc3QgbGFiZWxDYW5kaWRhdGUgPSBiaW5kTGFiZWwgJiYgZm91bmQyW2JpbmRMYWJlbF0gPyBmb3VuZDJbYmluZExhYmVsXSA6IChmb3VuZDIucHJvZHVjdE5hbWUgfHwgZm91bmQyLm5hbWUgfHwgZm91bmQyLnRyYW5zYWN0aW9uU3RhdHVzTGFiZWwgfHwgZm91bmQyLmJ1c2luZXNzUGFydG5lck5hbWUpO1xyXG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ2FuZGlkYXRlIHx8IFN0cmluZyhzY2FsYXJWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBsYXN0IGF0dGVtcHQ6IGlmIHNjYWxhclZhbHVlIGVxdWFscyBhIGxhYmVsIGluIHRoZSBsaXN0LCByZXR1cm4gaXRcclxuICAgICAgaWYgKGJpbmRMYWJlbCkge1xyXG4gICAgICAgIGNvbnN0IGZvdW5kMyA9IGxpc3QuZmluZCgoeDogYW55KSA9PiBTdHJpbmcoeFtiaW5kTGFiZWxdKSA9PT0gU3RyaW5nKHNjYWxhclZhbHVlKSk7XHJcbiAgICAgICAgaWYgKGZvdW5kMykgcmV0dXJuIFN0cmluZyhmb3VuZDNbYmluZExhYmVsXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBub3QgZm91bmQg4oCUIHJldHVybiBzY2FsYXIgYXMgc3RyaW5nXHJcbiAgICByZXR1cm4gU3RyaW5nKHNjYWxhclZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBsb29rdXAgdGhhdCBwcmVmZXJzIGJpbmRMYWJlbCB3aGVuIHBvc3NpYmxlIC0tLVxyXG4gIHByaXZhdGUgZ2V0TG9va3VwRGlzcGxheVZhbHVlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJyc7XHJcblxyXG4gICAgLy8gRGF0ZSBoYW5kbGluZ1xyXG4gICAgaWYgKGZpZWxkID09PSAnZnJvbURhdGUnIHx8IGZpZWxkID09PSAndG9EYXRlJyB8fCBmaWVsZCA9PT0gJ2RhdGUnIHx8IGZpZWxkID09PSAndmFsdWVEYXRlJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlVG9ERE1NWVlZWSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3VycmVuY2llczogc2hvdyBcIkNPREUgLSBOYW1lXCJcclxuICAgIGlmIChbJ2N1cnJlbmN5JywgJ3NlbmRDdXJyZW5jeScsICdyZWNlaXZlQ3VycmVuY3knXS5pbmNsdWRlcyhmaWVsZCkpIHtcclxuICAgICAgaWYgKHZhbHVlID09PSAnQWxsJykgcmV0dXJuICdBbGwnO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSB2YWx1ZS5jdXJyZW5jeUNvZGUgfHwgdmFsdWUuY3VycmVuY3kgfHwgJyc7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHZhbHVlLmN1cnJlbmN5IHx8ICcnO1xyXG4gICAgICAgIHJldHVybiBjb2RlID8gYCR7Y29kZX0gLSAke25hbWV9YCA6IFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY3VyID0gdGhpcy5jdXJyZW5jaWVzPy5maW5kKCh4OiBhbnkpID0+IHguY3VycmVuY3lDb2RlID09PSB2YWx1ZSk7XHJcbiAgICAgIHJldHVybiBjdXIgPyBgJHtjdXIuY3VycmVuY3lDb2RlfSAtICR7Y3VyLmN1cnJlbmN5fWAgOiBTdHJpbmcodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIGl0J3MgYW4gYXJyYXkgKG11bHRpLXNlbGVjdCksIG1hcCBlYWNoIGl0ZW1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZS5tYXAodiA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgY29uc3QgYmluZExhYmVsID0gdGhpcy5maWVsZEJpbmRMYWJlbE1hcFtmaWVsZF07XHJcbiAgICAgICAgICByZXR1cm4gYmluZExhYmVsICYmIHZbYmluZExhYmVsXSA/IHZbYmluZExhYmVsXSA6ICh2LnRyYW5zYWN0aW9uU3RhdHVzTGFiZWwgfHwgdi5zdGF0dXNOYW1lIHx8IHYucHJvZHVjdE5hbWUgfHwgdi5uYW1lIHx8IEpTT04uc3RyaW5naWZ5KHYpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwRnJvbUxpc3RCeUZpZWxkKGZpZWxkLCB2KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChtYXBwZWQubGVuZ3RoID09PSAxICYmIChtYXBwZWRbMF0gPT09ICdBbGwnIHx8IG1hcHBlZFswXSA9PT0gJycpKSByZXR1cm4gJ0FsbCc7XHJcbiAgICAgIHJldHVybiBtYXBwZWQuam9pbignLCAnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB2YWx1ZSBpcyBhbiBvYmplY3QgKHNpbmdsZSBzZWxlY3QgcmV0dXJuZWQgb2JqZWN0KVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gcHJvZHVjdCBzcGVjaWFsLWNhc2U6IHByb2R1Y3Qgb2JqZWN0IG1pZ2h0IGhhdmUgcHJvZHVjdE5hbWUvcHJvZHVjdENvZGVcclxuICAgICAgaWYgKGZpZWxkID09PSAncHJvZHVjdCcgfHwgZmllbGQgPT09ICd0cmFuc2FjdGlvblByb2R1Y3QnKSB7XHJcbiAgICAgICAgY29uc3QgcG4gPSB2YWx1ZS5wcm9kdWN0TmFtZSB8fCB2YWx1ZS5uYW1lIHx8IHZhbHVlLmxhYmVsIHx8IHZhbHVlLmRpc3BsYXkgfHwgdmFsdWUucHJvZHVjdCB8fCB2YWx1ZS50cmFuc2FjdGlvblByb2R1Y3Q7XHJcbiAgICAgICAgaWYgKHBuKSByZXR1cm4gcG47XHJcbiAgICAgICAgLy8gdHJ5IGNvbW1vbiBrZXlzXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlLnByb2R1Y3RDb2RlIHx8IHZhbHVlLmNvZGUgfHwgdmFsdWUuaWQgPyBTdHJpbmcodmFsdWUucHJvZHVjdENvZGUgfHwgdmFsdWUuY29kZSB8fCB2YWx1ZS5pZCkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGJpbmRMYWJlbCA9IHRoaXMuZmllbGRCaW5kTGFiZWxNYXBbZmllbGRdO1xyXG4gICAgICBpZiAoYmluZExhYmVsICYmIHZhbHVlW2JpbmRMYWJlbF0pIHJldHVybiB2YWx1ZVtiaW5kTGFiZWxdO1xyXG4gICAgICByZXR1cm4gdmFsdWUudHJhbnNhY3Rpb25TdGF0dXMgfHwgdmFsdWUubmFtZSB8fCB2YWx1ZS5idXNpbmVzc1BhcnRuZXJOYW1lIHx8IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTY2FsYXIgLT4gbG9va3VwIGluIGxpc3RzIHVzaW5nIGJpbmRWYWx1ZSAtPiByZXR1cm4gYmluZExhYmVsXHJcbiAgICAvLyBwcm9kdWN0IHNwZWNpYWwtY2FzZTogaWYgdmFsdWUgPT09ICdBbGwnIHRoZW4gcmV0dXJuICdBbGwnXHJcbiAgICBpZiAoKGZpZWxkID09PSAncHJvZHVjdCcgfHwgZmllbGQgPT09ICd0cmFuc2FjdGlvblByb2R1Y3QnKSAmJiBTdHJpbmcodmFsdWUpID09PSAnQWxsJykgcmV0dXJuICdBbGwnO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxvb2t1cEZyb21MaXN0QnlGaWVsZChmaWVsZCwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBzZWFyY2ggY3JpdGVyaWEgYXJyYXkgZm9yIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBmaWVsZHMuXHJcbiAgICogT3V0cHV0OiBbIFsnTGFiZWw6JywgJ1ZhbHVlJ10sIC4uLiBdXHJcbiAgICovXHJcbiAgcHVibGljIGdldFNlYXJjaENyaXRlcmlhQXJyYXkoKTogW3N0cmluZywgc3RyaW5nXVtdIHtcclxuICAgIGlmICghdGhpcy5zZWFyY2hGb3JtKSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3QgY3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5zZWFyY2hGb3JtLnZhbHVlO1xyXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy52aXNpYmxlRmllbGRzOyAvLyB1c2VzIHlvdXIgZ2V0dGVyXHJcblxyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZmllbGRMYWJlbE1hcFtmaWVsZF0gfHwgKGZpZWxkICsgJzonKTtcclxuICAgICAgY29uc3QgY29udHJvbE5hbWUgPSB0aGlzLmZpZWxkVG9Db250cm9sTWFwW2ZpZWxkXSB8fCBmaWVsZDtcclxuICAgICAgY29uc3QgdmFsdWUgPSBmb3JtVmFsdWVbY29udHJvbE5hbWVdO1xyXG5cclxuICAgICAgLy8gZGF0ZXNcclxuICAgICAgaWYgKGNvbnRyb2xOYW1lID09PSAnZnJvbURhdGUnIHx8IGNvbnRyb2xOYW1lID09PSAndG9EYXRlJyB8fCBjb250cm9sTmFtZSA9PT0gJ2RhdGUnIHx8IGNvbnRyb2xOYW1lID09PSAndmFsdWVEYXRlJykge1xyXG4gICAgICAgIGNyaXRlcmlhLnB1c2goW2xhYmVsLCB0aGlzLmZvcm1hdERhdGVUb0RETU1ZWVlZKHZhbHVlKSB8fCAnJ10pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVXNlIGdldExvb2t1cERpc3BsYXlWYWx1ZSB0byBwcm9kdWNlIHRoZSBodW1hbi1mcmllbmRseSBzdHJpbmcgKGhhbmRsZXMgYXJyYXlzL29iamVjdHMvc2NhbGFycylcclxuICAgICAgY29uc3QgZGlzcGxheSA9IHRoaXMuZ2V0TG9va3VwRGlzcGxheVZhbHVlKGZpZWxkLCB2YWx1ZSk7XHJcblxyXG4gICAgICBjcml0ZXJpYS5wdXNoKFtsYWJlbCwgZGlzcGxheSB8fCAnJ10pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNyaXRlcmlhO1xyXG4gIH1cclxuXHJcblxyXG5cclxufVxyXG4iLCI8aDYgY2xhc3M9XCJCcmVhZGNydW1iXCI+XHJcbiAgPGEgY2xhc3M9XCJCcmVhZENydW1iTGlua1wiIFtyb3V0ZXJMaW5rXT1cIlsnL3JlcG9ydHMnXVwiPlxyXG4gICAgPGgxPlJlcG9ydHM8L2gxPlxyXG4gIDwvYT5cclxuICA8YSBocmVmPVwiQnJlYWRDcnVtYkxpbmtcIj48L2E+XHJcbiAgPHNwYW4gY2xhc3M9XCJCcmVhZENydW1iQXJyb3dcIj48L3NwYW4+XHJcbiAgPGEgY2xhc3M9XCJCcmVhZENydW1iTGlua1wiPlxyXG4gICAgPGgyPnt7IFJlcG9ydE5hbWUgfX08L2gyPlxyXG4gIDwvYT5cclxuPC9oNj5cclxuXHJcbjxhcHAtbG9hZGVyICpuZ0lmPVwibG9hZGluZ1N0YXRlID09PSBDb21wb25lbnRMb2FkaW5nU3RhdGUuTG9hZGluZ1wiPjwvYXBwLWxvYWRlcj5cclxuPHNlY3Rpb24+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJzZWFyY2hGb3JtXCIgKG5nU3VibWl0KT1cIm9uU2VhcmNoKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1jdXN0b20tMTAtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItZ3JpZFwiPlxyXG5cclxuICAgICAgICAgIDwhLS0gRHluYW1pY2FsbHkgcmVuZGVyIGZpbHRlcnMgaW4gb3JkZXIgLS0+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB2aXNpYmxlRmllbGRzXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZpZWxkXCI+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQ2xpZW50IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidjbGllbnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5DbGllbnQ8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImNsaWVudHMxXCIgYmluZExhYmVsPVwiYnVzaW5lc3NQYXJ0bmVyTmFtZVwiIGJpbmRWYWx1ZT1cImJ1c2luZXNzUGFydG5lckNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQ2xpZW50XCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cImNsaWVudFwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ2NsaWVudCcpPy5pbnZhbGlkICYmIChzZWFyY2hGb3JtLmdldCgnY2xpZW50Jyk/LnRvdWNoZWQgfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DbGllbnRDaGFuZ2UoKVwiIChvcGVuKT1cIm9uT3BlbigpXCIgKGNsb3NlKT1cIm9uQ2xvc2UoKVwiIFtzZWFyY2hhYmxlXT1cImlzT3BlblwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwiaXRlbS5idXNpbmVzc1BhcnRuZXJOYW1lXCI+e3sgaXRlbS5idXNpbmVzc1BhcnRuZXJOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQnJhbmNoIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidicmFuY2gnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5CcmFuY2g8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImJyYW5jaGVzXCIgYmluZExhYmVsPVwiYnVzaW5lc3NQYXJ0bmVyQnJhbmNoXCIgYmluZFZhbHVlPVwiYnJhbmNoQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBCcmFuY2hcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmNoXCIgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZC1zZWxlY3QnOiBzZWFyY2hGb3JtLmdldCgnYnJhbmNoJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCdicmFuY2gnKT8udG91Y2hlZCB8fCBmb3JtVmFsaWRhdGlvbkVycm9yKX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkJyYW5jaENoYW5nZSgpXCIgKG9wZW4pPVwib25PcGVuKClcIiAoY2xvc2UpPVwib25DbG9zZSgpXCIgW3NlYXJjaGFibGVdPVwiaXNPcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RpdGxlXT1cIml0ZW0uYnVzaW5lc3NQYXJ0bmVyQnJhbmNoXCI+e3sgaXRlbS5idXNpbmVzc1BhcnRuZXJCcmFuY2ggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGcm9tIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2Zyb21EYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+RnJvbSBEYXRlPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgZGF0ZS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGRwaWNrZXJcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNmcm9tRGF0ZUlucHV0PVwibmdiRGF0ZXBpY2tlclwiIGZvcm1Db250cm9sTmFtZT1cImZyb21EYXRlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkLWRhdGUnOnNlYXJjaEZvcm0uZ2V0KCdmcm9tRGF0ZScpPy5pbnZhbGlkICYmIChzZWFyY2hGb3JtLmdldCgnZnJvbURhdGUnKT8udG91Y2hlZCB8fCBmb3JtVmFsaWRhdGlvbkVycm9yKX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiAoY2xpY2spPVwiZnJvbURhdGVJbnB1dC50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRvIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3RvRGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlRvIERhdGU8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBkYXRlLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHBpY2tlclwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIG5nYkRhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgI3RvRGF0ZUlucHV0PVwibmdiRGF0ZXBpY2tlclwiIGZvcm1Db250cm9sTmFtZT1cInRvRGF0ZVwiIFttaW5EYXRlXT1cImRpc2FibGVkRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZC1kYXRlJzpzZWFyY2hGb3JtLmdldCgndG9EYXRlJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCd0b0RhdGUnKT8udG91Y2hlZCB8fCBmb3JtVmFsaWRhdGlvbkVycm9yKX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiAoY2xpY2spPVwidG9EYXRlSW5wdXQudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBQcm9kdWN0IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidwcm9kdWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+UHJvZHVjdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwicHJvZHVjdHNcIiBiaW5kTGFiZWw9XCJwcm9kdWN0TmFtZVwiIGJpbmRWYWx1ZT1cInByb2R1Y3RDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFByb2R1Y3RcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdFwiIChvcGVuKT1cIm9uT3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJvbkNsb3NlKClcIiBbc2VhcmNoYWJsZV09XCJpc09wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBVc2VyIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIid1c2VySWQnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5Vc2VyPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJ1c2Vyc1wiIGJpbmRMYWJlbD1cInVzZXJOYW1lXCIgYmluZFZhbHVlPVwidXNlcklkXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgVXNlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwidXNlcklkXCIgcmVxdWlyZWQgKG9wZW4pPVwib25PcGVuKClcIiAoY2xvc2UpPVwib25DbG9zZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ3VzZXJJZCcpPy5pbnZhbGlkICYmIChzZWFyY2hGb3JtLmdldCgndXNlcklkJyk/LnRvdWNoZWQgfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQ3VycmVuY3kgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+Q3VycmVuY3k8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImN1cnJlbmNpZXNcIiBiaW5kVmFsdWU9XCJjdXJyZW5jeUNvZGVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDdXJyZW5jeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbc2VhcmNoYWJsZV09XCJ0cnVlXCIgW3NlYXJjaEZuXT1cImN1cnJlbmN5U2VhcmNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cIm9uT3BlbigpXCIgKGNsb3NlKT1cIm9uQ2xvc2UoKVwiIFtzZWFyY2hhYmxlXT1cImlzT3BlblwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGRyb3Bkb3duIG9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIHNlbGVjdGVkIHZhbHVlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWxhYmVsLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLVNlbmQgQ3VycmVuY3kgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3NlbmRDdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlNlbmQgQ3VycmVuY3k8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImN1cnJlbmNpZXNcIiBiaW5kVmFsdWU9XCJjdXJyZW5jeUNvZGVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDdXJyZW5jeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbc2VhcmNoYWJsZV09XCJ0cnVlXCIgW3NlYXJjaEZuXT1cImN1cnJlbmN5U2VhcmNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChvcGVuKT1cIm9uT3BlbigpXCIgKGNsb3NlKT1cIm9uQ2xvc2UoKVwiIFtzZWFyY2hhYmxlXT1cImlzT3BlblwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGRyb3Bkb3duIG9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIHNlbGVjdGVkIHZhbHVlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWxhYmVsLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUcmFuc2FjdGlvbiBTdGF0dXMgKE11bHRpLXNlbGVjdCkgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3RyYW5zYWN0aW9uU3RhdHVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+VHhuLiBTdGF0dXM8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgY2xhc3M9XCJ0cmFuc2FjdGlvbi1zdGF0dXMtc2VsZWN0XCIgW2l0ZW1zXT1cInRyYW5zYWN0aW9uU3RhdHVzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwidHJhbnNhY3Rpb25TdGF0dXNcIiBiaW5kVmFsdWU9XCJ0cmFuc2FjdGlvblN0YXR1c1wiIFttdWx0aXBsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFRyYW5zYWN0aW9uIFN0YXR1c1wiIGZvcm1Db250cm9sTmFtZT1cInRyYW5zYWN0aW9uU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cImZhbHNlXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIFtzZWFyY2hhYmxlXT1cImZhbHNlXCIgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZC1zZWxlY3QnOiBzZWFyY2hGb3JtLmdldCgndHJhbnNhY3Rpb25TdGF0dXMnKT8uaW52YWxpZCAmJiAoc2VhcmNoRm9ybS5nZXQoJ3RyYW5zYWN0aW9uU3RhdHVzJyk/LnRvdWNoZWQgfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaXRlbSQ9XCJpdGVtJFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXRlbSQuc2VsZWN0ZWRcIiAvPiB7eyBpdGVtLnRyYW5zYWN0aW9uU3RhdHVzIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRyYW5zYWN0aW9uIE5vIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIid0cmFuc2FjdGlvbk5vJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+VHhuLiBOdW1iZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBkcGlja2VyXCIgZm9ybUNvbnRyb2xOYW1lPVwidHJhbnNhY3Rpb25Ob1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHRyYW5zYWN0aW9uIG51bWJlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVmFsdWUgRGF0ZSAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCIndmFsdWVEYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+VmFsdWUgRGF0ZTxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBkcGlja2VyXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjdG9EYXRlSW5wdXQ9XCJuZ2JEYXRlcGlja2VyXCIgZm9ybUNvbnRyb2xOYW1lPVwidG9EYXRlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkLWRhdGUnOnNlYXJjaEZvcm0uZ2V0KCdkYXRlJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCdkYXRlJyk/LnRvdWNoZWQgfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b0RhdGVJbnB1dC50b2dnbGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gU2VuZCBDb3VudHJ5IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidzZW5kQ291bnRyeSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlNlbmQgQ291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwiY291bnRyaWVzXCIgYmluZExhYmVsPVwiY291bnRyeVwiIGJpbmRWYWx1ZT1cImNvdW50cnlDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFByb2R1Y3RcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VuZENvdW50cnlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RpdGxlXT1cIml0ZW0uY291bnRyeVwiPnt7IGl0ZW0uY291bnRyeSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFJlY2VpdmUgQ291bnRyeSAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCIncmVjZWl2ZUNvdW50cnknXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5SZWNlaXZlIENvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImNvdW50cmllc1wiIGJpbmRMYWJlbD1cImNvdW50cnlcIiBiaW5kVmFsdWU9XCJjb3VudHJ5Q29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBQcm9kdWN0XCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cInJlY2VpdmVDb3VudHJ5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0aXRsZV09XCJpdGVtLmNvdW50cnlcIj57eyBpdGVtLmNvdW50cnkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLVRyYW5zYWN0aW9uIFByb2R1Y3QgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3RyYW5zYWN0aW9uUHJvZHVjdCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlByb2R1Y3Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cInRyYW5zYWN0aW9uUHJvZHVjdHNcIiBiaW5kTGFiZWw9XCJuYW1lXCIgYmluZFZhbHVlPVwicHJvZHVjdENvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgUHJvZHVjdFwiIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRGF0ZSBUeXBlIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlVHlwZSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPkRhdGUgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIi0gUGxlYXNlIHNlbGVjdCAtXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZVR5cGVcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctb3B0aW9uIFt2YWx1ZV09XCIxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIERhdGVcclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLW9wdGlvbiBbdmFsdWVdPVwiMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQb3N0aW5nIERhdGVcclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIERhdGUgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5EYXRlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgZGF0ZS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGRwaWNrZXJcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNkYXRlSW5wdXQ9XCJuZ2JEYXRlcGlja2VyXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZC1kYXRlJzogc2VhcmNoRm9ybS5nZXQoJ2RhdGUnKT8uaW52YWxpZCAmJiAoc2VhcmNoRm9ybS5nZXQoJ2RhdGUnKT8udG91Y2hlZCB8fCBmb3JtVmFsaWRhdGlvbkVycm9yKX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ1dHRvbiBjYWxcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRhdGVJbnB1dC50b2dnbGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gcmVjZWl2ZUN1cnJlbmN5IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidyZWNlaXZlQ3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5SZWNlaXZlIEN1cnJlbmN5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJjdXJyZW5jaWVzXCIgYmluZFZhbHVlPVwiY3VycmVuY3lDb2RlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgUmVjZWl2ZSBDdXJyZW5jeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVjZWl2ZUN1cnJlbmN5XCIgcmVxdWlyZWQgKGNoYW5nZSk9XCJvbkJyYW5jaENoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIiBbc2VhcmNoRm5dPVwiY3VycmVuY3lTZWFyY2hcIiAob3Blbik9XCJvbk9wZW4oKVwiIChjbG9zZSk9XCJvbkNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiaXNPcGVuXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biBvcHRpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5jdXJyZW5jeUNvZGUgPT09ICdBbGwnID8gJ0FsbCcgOiAoaXRlbS5jdXJyZW5jeUNvZGUgKyAnIC0gJyArIGl0ZW0uY3VycmVuY3kpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5jdXJyZW5jeUNvZGUgPT09ICdBbGwnID8gJ0FsbCcgOiAoaXRlbS5jdXJyZW5jeUNvZGUgKyAnIC0gJyArIGl0ZW0uY3VycmVuY3kpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGVkIHZhbHVlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWxhYmVsLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmN1cnJlbmN5Q29kZSA9PT0gJ0FsbCcgPyAnQWxsJyA6IChpdGVtLmN1cnJlbmN5Q29kZSArICcgLSAnICsgaXRlbS5jdXJyZW5jeSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBTZW5kIEJ1c2luZXNzUGFydG5lciAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCInc2VuZEJ1c2luZXNzUGFydG5lcidcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlNlbmQgQ2xpZW50PHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJzZW5kQnVzaW5lc3NQYXJ0bmVyQWdlbnRzXCIgYmluZExhYmVsPVwibmFtZVwiIGJpbmRWYWx1ZT1cImlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFNlbmQgUGFydG5lclwiIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJzZW5kQnVzaW5lc3NQYXJ0bmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZC1zZWxlY3QnOiBzZWFyY2hGb3JtLmdldCgnc2VuZEJ1c2luZXNzUGFydG5lcicpPy5pbnZhbGlkICYmIChzZWFyY2hGb3JtLmdldCgnc2VuZEJ1c2luZXNzUGFydG5lcicpPy50b3VjaGVkIHx8IGZvcm1WYWxpZGF0aW9uRXJyb3IpfVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwiaXRlbS5uYW1lXCI+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gUmVjdiBCdXNpbmVzc1BhcnRuZXIgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3JlY3ZCdXNpbmVzc1BhcnRuZXInXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5SZWN2IENsaWVudDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwicmVjdkJ1c2luZXNzUGFydG5lckFnZW50c1wiIGJpbmRMYWJlbD1cIm5hbWVcIiBiaW5kVmFsdWU9XCJpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBSZWN2IFBhcnRuZXJcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVjdkJ1c2luZXNzUGFydG5lclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ3JlY3ZCdXNpbmVzc1BhcnRuZXInKT8uaW52YWxpZCAmJiAoc2VhcmNoRm9ybS5nZXQoJ3JlY3ZCdXNpbmVzc1BhcnRuZXInKT8udG91Y2hlZCB8fCBmb3JtVmFsaWRhdGlvbkVycm9yKX1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RpdGxlXT1cIml0ZW0ubmFtZVwiPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRyYW5zYWN0aW9uIFN0YXR1cyAoU2luZ2xlLXNlbGVjdCkgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3RyYW5zYWN0aW9uU3RhdHVzU2luZ2xlU2VsZWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+VHhuLiBTdGF0dXM8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cInRyYW5zYWN0aW9uU3RhdHVzZXNcIiBiaW5kTGFiZWw9XCJ0cmFuc2FjdGlvblN0YXR1c1wiIGJpbmRWYWx1ZT1cInRyYW5zYWN0aW9uU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJ0cmFuc2FjdGlvblN0YXR1c1wiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ3RyYW5zYWN0aW9uU3RhdHVzJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCd0cmFuc2FjdGlvblN0YXR1cycpPy50b3VjaGVkIHx8IGZvcm1WYWxpZGF0aW9uRXJyb3IpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvciBUcmlhbCBCYWxhbmNlIC0gQWNjb3VudHMgUmVwb3J0IC0tPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJ1c2luZXNzIExpbmUgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2J1c2luZXNzTGluZSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPkJ1c2luZXNzIExpbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImJ1c2luZXNzTGluZXNcIiBiaW5kTGFiZWw9XCJidXNpbmVzc0xpbmVcIiBiaW5kVmFsdWU9XCJidXNpbmVzc0xpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQnVzaW5lc3MgTGluZVwiIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJidXNpbmVzc0xpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkLXNlbGVjdCc6IHNlYXJjaEZvcm0uZ2V0KCdidXNpbmVzc0xpbmUnKT8uaW52YWxpZCAmJiAoc2VhcmNoRm9ybS5nZXQoJ2J1c2luZXNzTGluZScpPy50b3VjaGVkIHx8IGZvcm1WYWxpZGF0aW9uRXJyb3IpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFllYXIgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbmFuY2lhbFllYXInXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5GaW5hbmNpYWwgWWVhcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwiZmluYW5jaWFsWWVhcnNcIiBiaW5kTGFiZWw9XCJmaW5hbmNpYWxZZWFyXCIgYmluZFZhbHVlPVwiZmluYW5jaWFsWWVhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBZZWFyXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cImZpbmFuY2lhbFllYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkLXNlbGVjdCc6IHNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCdmaW5hbmNpYWxZZWFyJyk/LnRvdWNoZWQgfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RGaW5hbmNpYWxZZWFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGcm9tIE1vbnRoIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidmcm9tTW9udGgnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5Gcm9tIE1vbnRoPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJmcm9tTW9udGhzXCIgYmluZExhYmVsPVwicGVyaW9kXCIgYmluZFZhbHVlPVwicE9yZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEZyb20gTW9udGhcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZnJvbU1vbnRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW52YWxpZC1zZWxlY3QnOiBzZWFyY2hGb3JtLmdldCgnZnJvbU1vbnRoJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCdmcm9tTW9udGgnKT8udG91Y2hlZHx8IGZvcm1WYWxpZGF0aW9uRXJyb3IpfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0RnJvbU1vbnRoKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUbyBNb250aCAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCIndG9Nb250aCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbGFiZWwtZGF0YVwiPlRvIE1vbnRoPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJ0b01vbnRoc1wiIGJpbmRMYWJlbD1cInBNb250aE5hbWVcIiBiaW5kVmFsdWU9XCJwTW9udGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgVG8gTW9udGhcIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwidG9Nb250aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8uaW52YWxpZCAmJiAoc2VhcmNoRm9ybS5nZXQoJ3RvTW9udGgnKT8udG91Y2hlZHx8IGZvcm1WYWxpZGF0aW9uRXJyb3IpfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0VG9Nb250aCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRnJvbSBEYXkgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ2Zyb21EYXknXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5Gcm9tIERheSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImZyb21EYXlzXCIgYmluZExhYmVsPVwiaW5kaXZpZHVhbERheVwiIGJpbmRWYWx1ZT1cImluZGl2aWR1YWxEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEZyb20gRGF5XCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cImZyb21EYXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpbnZhbGlkLXNlbGVjdCc6IHNlYXJjaEZvcm0uZ2V0KCdmcm9tRGF5Jyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCdmcm9tRGF5Jyk/LnRvdWNoZWR8fCBmb3JtVmFsaWRhdGlvbkVycm9yKX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEZyb21EYXkoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRvIERheSAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ1N3aXRjaENhc2U9XCIndG9EYXknXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5UbyBEYXk8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJ0b0RheXNcIiBiaW5kTGFiZWw9XCJwRGF0ZVwiIGJpbmRWYWx1ZT1cImluZGl2aWR1YWxEYXRlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgVG8gRGF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJ0b0RheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ3RvRGF5Jyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCd0b0RheScpPy50b3VjaGVkfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRGF0ZSBUeXBlIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlVHlwZUZvclRyaWFsQmFsYW5jZUFjY291bnRzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+RGF0ZSBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJkYXRlVHlwZXNcIiBiaW5kTGFiZWw9XCJkYXRlVHlwZUxhYmVsXCIgYmluZFZhbHVlPVwiZGF0ZVR5cGVDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IERhdGUgVHlwZVwiIGZvcm1Db250cm9sTmFtZT1cImRhdGVUeXBlXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ2RhdGVUeXBlJyk/LmludmFsaWQgJiYgKHNlYXJjaEZvcm0uZ2V0KCdkYXRlVHlwZScpPy50b3VjaGVkfHwgZm9ybVZhbGlkYXRpb25FcnJvcil9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEFjY291bnQgU3RhdHVzIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nU3dpdGNoQ2FzZT1cIidhY2NvdW50U3RhdHVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBsYWJlbC1kYXRhXCI+QWNjb3VudCBTdGF0dXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3QgY2xhc3M9XCJ0cmFuc2FjdGlvbi1zdGF0dXMtc2VsZWN0XCIgW2l0ZW1zXT1cImFjY291bnRTdGF0dXNlc1wiIGJpbmRMYWJlbD1cInN0YXR1c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwic3RhdHVzQ29kZVwiIFttdWx0aXBsZV09XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQWNjb3VudCBTdGF0dXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWNjb3VudFN0YXR1c1wiIFtjbG9zZU9uU2VsZWN0XT1cImZhbHNlXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQtc2VsZWN0Jzogc2VhcmNoRm9ybS5nZXQoJ2FjY291bnRTdGF0dXMnKT8uaW52YWxpZCAmJiAoc2VhcmNoRm9ybS5nZXQoJ2FjY291bnRTdGF0dXMnKT8udG91Y2hlZHx8IGZvcm1WYWxpZGF0aW9uRXJyb3IpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LWl0ZW0kPVwiaXRlbSRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIml0ZW0kLnNlbGVjdGVkXCIgLz4ge3sgaXRlbS5zdGF0dXNOYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwhLS1TdW1tYXJ5IFJlcG9ydC0tPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIiAqbmdTd2l0Y2hDYXNlPVwiJ3N1bW1hcnlSZXBvcnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGxhYmVsLWRhdGFcIj5TdW1tYXJ5IFJlcG9ydDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbaXRlbXNdPVwic3VtbWFyeVJlcG9ydFR5cGVzXCIgYmluZExhYmVsPVwibGFiZWxcIiBiaW5kVmFsdWU9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGVhcmFibGVdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJzdW1tYXJ5UmVwb3J0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0aXRsZV09XCJpdGVtLmxhYmVsXCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWN1c3RvbS0xLTVcIj5cclxuICAgICAgICA8IS0tIFZpZXcgUmVwb3J0IEJ1dHRvbiAoQWx3YXlzIGF0IFRvcC1SaWdodCkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQgdmlldy1yZXBvcnQtYnRuXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcmVwb3J0XCI+VmlldzwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9zZWN0aW9uPlxyXG48aHI+XHJcbjwhLS0gRXJyb3IgTWVzc2FnZXMgLS0+XHJcbjxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgbXQtM1wiICpuZ0lmPVwiZm9ybVZhbGlkYXRpb25FcnJvciAmJiBoYXNTZWFyY2hlZFwiPlxyXG4gIFBsZWFzZSBmaWxsIGFsbCBtYW5kYXRvcnkgZmllbGRzXHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBtdC0zXCIgKm5nSWY9XCJlcnJvck1lc3NhZ2UgJiYgbG9hZGluZ1N0YXRlID09PSBDb21wb25lbnRMb2FkaW5nU3RhdGUuRXJyb3JcIj5cclxuICB7eyBlcnJvck1lc3NhZ2UgfX1cclxuPC9kaXY+Il19
|