@sachin9822/reports-lib 0.0.210 → 0.0.212
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/karma.conf.js +44 -0
- package/ng-package.json +17 -0
- package/package.json +16 -31
- package/src/assets/images/BreadcrumbArrow.png +0 -0
- package/src/lib/assets/images/Search.svg +10 -0
- package/src/lib/assets/images/XMLogo.png +0 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +27 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +46 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +23 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +292 -0
- package/src/lib/components/accounting-report/accounting-report.component.html +64 -0
- package/src/lib/components/accounting-report/accounting-report.component.scss +24 -0
- package/src/lib/components/accounting-report/accounting-report.component.spec.ts +23 -0
- package/src/lib/components/accounting-report/accounting-report.component.ts +738 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +46 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +2 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +23 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +247 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +46 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +3 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +23 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +276 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +51 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +7 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +23 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +840 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +68 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +65 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +23 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +290 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +25 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +1 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +23 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +213 -0
- package/src/lib/components/funding-report/funding-report.component.html +49 -0
- package/src/lib/components/funding-report/funding-report.component.scss +1 -0
- package/src/lib/components/funding-report/funding-report.component.spec.ts +23 -0
- package/src/lib/components/funding-report/funding-report.component.ts +221 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +26 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +1 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +23 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +267 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +95 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +54 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +23 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +904 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +49 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +2 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +32 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +304 -0
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +46 -0
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +7 -0
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +343 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +25 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +23 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +23 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +745 -0
- package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +10 -0
- package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +20 -0
- package/src/lib/models/accounting-report/accounting-report-branch-group.ts +7 -0
- package/src/lib/models/accounting-report/accounting-report-entry-model.ts +25 -0
- package/src/lib/models/accounting-report/accounting-report-model.ts +7 -0
- package/{lib/models/accounting-report/accounting-report-sub-group.d.ts → src/lib/models/accounting-report/accounting-report-sub-group.ts} +3 -2
- package/{lib/models/app-config.model.d.ts → src/lib/models/app-config.model.ts} +8 -7
- package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +18 -0
- package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +16 -0
- package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +26 -0
- package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +65 -0
- package/src/lib/models/component-loading-states.ts +5 -0
- package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +28 -0
- package/{lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts → src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts} +1 -1
- package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +21 -0
- package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +127 -0
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +16 -0
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +29 -0
- package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +46 -0
- package/src/lib/reports-lib-routing.module.ts +20 -0
- package/src/lib/reports-lib.component.spec.ts +23 -0
- package/src/lib/reports-lib.component.ts +20 -0
- package/src/lib/reports-lib.module.ts +102 -0
- package/src/lib/reports-lib.service.spec.ts +16 -0
- package/src/lib/reports-lib.service.ts +9 -0
- package/src/lib/services/config.service.ts +43 -0
- package/src/lib/services/report.service.spec.ts +16 -0
- package/src/lib/services/report.service.ts +463 -0
- package/src/lib/shared/export-generic.service.ts +557 -0
- package/src/lib/shared/export.service.spec.ts +16 -0
- package/src/lib/shared/export.service.ts +457 -0
- package/src/lib/shared/loader/loader.component.html +8 -0
- package/src/lib/shared/loader/loader.component.scss +52 -0
- package/src/lib/shared/loader/loader.component.ts +10 -0
- package/src/lib/shared/metadata/metadata.component.html +42 -0
- package/src/lib/shared/metadata/metadata.component.scss +95 -0
- package/src/lib/shared/metadata/metadata.component.spec.ts +23 -0
- package/src/lib/shared/metadata/metadata.component.ts +38 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.html +7 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.scss +42 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +23 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.ts +38 -0
- package/src/lib/shared/search-filter/search-filter.component.html +601 -0
- package/src/lib/shared/search-filter/search-filter.component.scss +203 -0
- package/src/lib/shared/search-filter/search-filter.component.spec.ts +23 -0
- package/src/lib/shared/search-filter/search-filter.component.ts +2387 -0
- package/src/lib/shared/shared.module.ts +13 -0
- package/{public-api.d.ts → src/public-api.ts} +17 -7
- package/src/styles/ag-grid-report-style.scss +71 -0
- package/src/styles/common-ag-grid-style.scss +146 -0
- package/src/styles/common-report-style.scss +395 -0
- package/src/styles/common-style.scss +615 -0
- package/src/test.ts +27 -0
- package/tsconfig.lib.json +15 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +0 -240
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +0 -596
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +0 -218
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +0 -243
- package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +0 -700
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +0 -255
- package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +0 -192
- package/esm2020/lib/components/funding-report/funding-report.component.mjs +0 -198
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +0 -244
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +0 -776
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +0 -266
- package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +0 -311
- package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +0 -631
- package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +0 -2
- package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +0 -2
- package/esm2020/lib/models/app-config.model.mjs +0 -2
- package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +0 -2
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +0 -6
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +0 -3
- package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +0 -10
- package/esm2020/lib/models/component-loading-states.mjs +0 -7
- package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +0 -5
- package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +0 -2
- package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +0 -2
- package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +0 -8
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +0 -6
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +0 -5
- package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +0 -3
- package/esm2020/lib/reports-lib-routing.module.mjs +0 -24
- package/esm2020/lib/reports-lib.component.mjs +0 -22
- package/esm2020/lib/reports-lib.module.mjs +0 -172
- package/esm2020/lib/reports-lib.service.mjs +0 -14
- package/esm2020/lib/services/config.service.mjs +0 -39
- package/esm2020/lib/services/report.service.mjs +0 -374
- package/esm2020/lib/shared/export-generic.service.mjs +0 -443
- package/esm2020/lib/shared/export.service.mjs +0 -379
- package/esm2020/lib/shared/loader/loader.component.mjs +0 -11
- package/esm2020/lib/shared/metadata/metadata.component.mjs +0 -51
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +0 -44
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +0 -2134
- package/esm2020/lib/shared/shared.module.mjs +0 -21
- package/esm2020/public-api.mjs +0 -41
- package/esm2020/sachin9822-reports-lib.mjs +0 -5
- package/fesm2015/sachin9822-reports-lib.mjs +0 -8402
- package/fesm2015/sachin9822-reports-lib.mjs.map +0 -1
- package/fesm2020/sachin9822-reports-lib.mjs +0 -8384
- package/fesm2020/sachin9822-reports-lib.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +0 -70
- package/lib/components/accounting-report/accounting-report.component.d.ts +0 -76
- package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +0 -58
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +0 -69
- package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +0 -78
- package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +0 -95
- package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +0 -55
- package/lib/components/funding-report/funding-report.component.d.ts +0 -55
- package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +0 -57
- package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +0 -109
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +0 -76
- package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +0 -68
- package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +0 -71
- package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +0 -8
- package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +0 -18
- package/lib/models/accounting-report/accounting-report-branch-group.d.ts +0 -6
- package/lib/models/accounting-report/accounting-report-entry-model.d.ts +0 -24
- package/lib/models/accounting-report/accounting-report-model.d.ts +0 -6
- package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +0 -18
- package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +0 -13
- package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +0 -24
- package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +0 -44
- package/lib/models/component-loading-states.d.ts +0 -5
- package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +0 -26
- package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +0 -18
- package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +0 -113
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +0 -13
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +0 -23
- package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +0 -38
- package/lib/reports-lib-routing.module.d.ts +0 -7
- package/lib/reports-lib.component.d.ts +0 -8
- package/lib/reports-lib.module.d.ts +0 -33
- package/lib/reports-lib.service.d.ts +0 -6
- package/lib/services/config.service.d.ts +0 -20
- package/lib/services/report.service.d.ts +0 -80
- package/lib/shared/export-generic.service.d.ts +0 -50
- package/lib/shared/export.service.d.ts +0 -32
- package/lib/shared/loader/loader.component.d.ts +0 -5
- package/lib/shared/metadata/metadata.component.d.ts +0 -24
- package/lib/shared/page-size-selector/page-size-selector.component.d.ts +0 -15
- package/lib/shared/search-filter/search-filter.component.d.ts +0 -127
- package/lib/shared/shared.module.d.ts +0 -11
- /package/{lib → src}/assets/images/Search.svg +0 -0
- /package/{lib/assets/images/XMLogo.png → src/assets/images/XMCoral.png} +0 -0
- /package/{lib → src/lib}/assets/config/app-config.json +0 -0
- /package/{lib → src/lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { map, retry } from 'rxjs/operators';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common/http";
|
|
5
|
-
import * as i2 from "./config.service";
|
|
6
|
-
export class ReportService {
|
|
7
|
-
// private reportUrl = '/api/v1/Report';
|
|
8
|
-
// private systemReportUrl = '/api/v1/CompanyConfiguration/SystemReports';
|
|
9
|
-
constructor(http, config) {
|
|
10
|
-
this.http = http;
|
|
11
|
-
this.config = config;
|
|
12
|
-
if (!this.config.get) {
|
|
13
|
-
throw new Error('ConfigService is not initialized. Ensure APP_INITIALIZER ran before using ReportService.');
|
|
14
|
-
}
|
|
15
|
-
this.reportServiceUrl = this.config.get.reportServiceUrl;
|
|
16
|
-
}
|
|
17
|
-
getAccGLDetailsReport(formattedDate, dateType) {
|
|
18
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccGlDetailsEnquiryReport/GetAccGLDetailsEnquiryReport/${formattedDate}/${dateType}`;
|
|
19
|
-
return this.http.get(apiPath);
|
|
20
|
-
}
|
|
21
|
-
getPayInAgents() {
|
|
22
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/GetAllPayInAgents`;
|
|
23
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
24
|
-
return response;
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
getBranchByAgent(code) {
|
|
28
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/GetBranchByAgent/${code}/BH`;
|
|
29
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
30
|
-
retry(2),
|
|
31
|
-
map(response => response);
|
|
32
|
-
return response;
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
getParams() {
|
|
36
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/GetBranchActivitySendReportParams`;
|
|
37
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
38
|
-
retry(2),
|
|
39
|
-
map(response => response);
|
|
40
|
-
return response;
|
|
41
|
-
}));
|
|
42
|
-
}
|
|
43
|
-
getBranchActivityReport(data) {
|
|
44
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/GetBranchActivitySendReport`;
|
|
45
|
-
return this.http.post(apiPath, data).pipe(map(response => {
|
|
46
|
-
return response;
|
|
47
|
-
}));
|
|
48
|
-
}
|
|
49
|
-
getUserNameFromSessionStorage() {
|
|
50
|
-
let fossilUserName = sessionStorage.getItem('fossilusername');
|
|
51
|
-
let ezremitusername = sessionStorage.getItem('ezremitusername');
|
|
52
|
-
if (fossilUserName) {
|
|
53
|
-
return fossilUserName.replace(/^"(.*)"$/, '$1');
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
return ezremitusername.replace(/^"(.*)"$/, '$1');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//Trasaction Enquiry Report Apis
|
|
60
|
-
// API 1: Get initial page load data
|
|
61
|
-
getPageLoadData() {
|
|
62
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/TransactionEnquiry/pageLoadData`;
|
|
63
|
-
return this.http.get(url).pipe(map(response => response));
|
|
64
|
-
}
|
|
65
|
-
// API 2: Get branches by agent
|
|
66
|
-
getBranchesByAgent(agentCode) {
|
|
67
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/TransactionEnquiry/branches/${agentCode}`;
|
|
68
|
-
return this.http.get(url).pipe(map(response => response));
|
|
69
|
-
}
|
|
70
|
-
// API 4: Get users by branch
|
|
71
|
-
getUsersByBranch(businessPartnerCode, branchCode) {
|
|
72
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/TransactionEnquiry/users/${businessPartnerCode}/${branchCode}`;
|
|
73
|
-
return this.http.get(url).pipe(map(response => response));
|
|
74
|
-
}
|
|
75
|
-
// API 5: Search transactions
|
|
76
|
-
searchTransactions(data) {
|
|
77
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/TransactionEnquiry/viewReport`;
|
|
78
|
-
return this.http.post(url, data).pipe(map(response => response));
|
|
79
|
-
}
|
|
80
|
-
// Branch Activity Receive Report API
|
|
81
|
-
getAllPayOutAgents() {
|
|
82
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/BranchActivityReceive/GetAllPayoutAgents/`;
|
|
83
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
84
|
-
return response;
|
|
85
|
-
}));
|
|
86
|
-
}
|
|
87
|
-
getBranchActivityReceiveParams() {
|
|
88
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/BranchActivityReceive/GetBranchActivityReceiveReportParams`;
|
|
89
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
90
|
-
return response;
|
|
91
|
-
}));
|
|
92
|
-
}
|
|
93
|
-
getBranchActivityReceivePayoutAgentBranch(code) {
|
|
94
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/BranchActivityReceive/GetBranchByPayoutAgent/${code}/BH`;
|
|
95
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
96
|
-
retry(2),
|
|
97
|
-
map(response => response);
|
|
98
|
-
return response;
|
|
99
|
-
}));
|
|
100
|
-
}
|
|
101
|
-
getBranchActivityReceiveReport(data) {
|
|
102
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/BranchActivityReceive/GetBranchActivityReceiveReport`;
|
|
103
|
-
return this.http.post(apiPath, data).pipe(map(response => {
|
|
104
|
-
return response;
|
|
105
|
-
}));
|
|
106
|
-
}
|
|
107
|
-
//Cancellation Transaction Report apis
|
|
108
|
-
//Api 1
|
|
109
|
-
loadDataforCancallation() {
|
|
110
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/CancellationTransactionReport/pageLoadData`;
|
|
111
|
-
return this.http.get(apiPath);
|
|
112
|
-
}
|
|
113
|
-
/** Api 2 - Get list of branches for an agent */
|
|
114
|
-
getBranches(agentCode) {
|
|
115
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/CancellationTransactionReport/branches/${agentCode}`;
|
|
116
|
-
return this.http.get(apiPath).pipe(map(response => response || []));
|
|
117
|
-
}
|
|
118
|
-
//Api 3
|
|
119
|
-
getCancellationReport(criteria) {
|
|
120
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/CancellationTransactionReport/viewReport`;
|
|
121
|
-
return this.http.post(url, criteria).pipe(map(response => {
|
|
122
|
-
return response;
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
// Revenue Per Transaction Report API
|
|
126
|
-
getAgentsForRevenuePerTransaction() {
|
|
127
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/RevenuePerTransaction/GetAgentsForRevenuePerTransaction`;
|
|
128
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
129
|
-
return response;
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
getRevenuePerTransactionReportParams() {
|
|
133
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/RevenuePerTransaction/GetRevenuePerTransactionParams`;
|
|
134
|
-
return this.http.get(apiPath);
|
|
135
|
-
}
|
|
136
|
-
getRevenuePerTransactionReport(data) {
|
|
137
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/RevenuePerTransaction/GetRevenuePerTransactionReport`;
|
|
138
|
-
return this.http.post(apiPath, data).pipe(map(response => {
|
|
139
|
-
return response;
|
|
140
|
-
}));
|
|
141
|
-
}
|
|
142
|
-
//Statement of Accounts Report
|
|
143
|
-
loadClientsForStatementOfAccounts() {
|
|
144
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/StatementofAccounts/Clients`;
|
|
145
|
-
return this.http.get(apiPath);
|
|
146
|
-
}
|
|
147
|
-
checkClientForStatementOfAccounts(clientId) {
|
|
148
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/StatementofAccounts/checkClient/${clientId}`;
|
|
149
|
-
return this.http.get(apiPath);
|
|
150
|
-
}
|
|
151
|
-
getStatementOfAccount(criteria) {
|
|
152
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/StatementofAccounts/statementOfAccount`;
|
|
153
|
-
return this.http.post(url, criteria).pipe(map(response => response || {
|
|
154
|
-
openingBalAndFunding: [],
|
|
155
|
-
sendDetails: [],
|
|
156
|
-
receiveDetails: []
|
|
157
|
-
}));
|
|
158
|
-
}
|
|
159
|
-
// Accounting Report
|
|
160
|
-
// Api 1 - get accounting report
|
|
161
|
-
getAccountingReport(object) {
|
|
162
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/GetAccountingReport`;
|
|
163
|
-
return this.http.post(apiPath, object).pipe(map(response => response || undefined));
|
|
164
|
-
}
|
|
165
|
-
// Api 2 - get All clients
|
|
166
|
-
getClientsForAccountingReport(sysUserID) {
|
|
167
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/GetAllPayInAgents/${sysUserID}`;
|
|
168
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
169
|
-
return response;
|
|
170
|
-
}));
|
|
171
|
-
}
|
|
172
|
-
// Api 3 - get branch by agent or client
|
|
173
|
-
getBranchByAgentForAccountingReport(sysUserId, code) {
|
|
174
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/GetBranchByAgent/${code}/${sysUserId}/BH`;
|
|
175
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
176
|
-
retry(2),
|
|
177
|
-
map(response => response);
|
|
178
|
-
return response;
|
|
179
|
-
}));
|
|
180
|
-
}
|
|
181
|
-
// Api 4 - get All transaction types ( products )
|
|
182
|
-
getTransactionTypesForAccountingReport() {
|
|
183
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/getTransactionTypes`;
|
|
184
|
-
return this.http.get(url).pipe(map(response => response));
|
|
185
|
-
}
|
|
186
|
-
// Api 5 - get All currencies
|
|
187
|
-
getAllCurrenciesForAccountingReport() {
|
|
188
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/getAllCurrencies`;
|
|
189
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
190
|
-
return response;
|
|
191
|
-
}));
|
|
192
|
-
}
|
|
193
|
-
// Api 6 - get All Transaction Status
|
|
194
|
-
getAllTransactionStatusForAccountingReport() {
|
|
195
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/GetAllTransactionStatus`;
|
|
196
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
197
|
-
return response;
|
|
198
|
-
}));
|
|
199
|
-
}
|
|
200
|
-
// Api 7 - get All Countries
|
|
201
|
-
getAllCountriesForAccountingReport() {
|
|
202
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/AccountingReport/GetAllCountries`;
|
|
203
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
204
|
-
return response;
|
|
205
|
-
}));
|
|
206
|
-
}
|
|
207
|
-
// Trial Balance - Accounts Report
|
|
208
|
-
// Api 1 - Get Trial Balance - Accounts report
|
|
209
|
-
getTrialBalanceAccountsReport(object) {
|
|
210
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetTrialBalanceAccountsReport`;
|
|
211
|
-
return this.http.post(apiPath, object).pipe(map(response => response || undefined));
|
|
212
|
-
}
|
|
213
|
-
// Api 2 - Get Business Unit
|
|
214
|
-
GetBusinessUnitForTrialBalanceAccountsReport() {
|
|
215
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetBusinessUnit`;
|
|
216
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
217
|
-
return response;
|
|
218
|
-
}));
|
|
219
|
-
}
|
|
220
|
-
// Api 3 - Get Account Status
|
|
221
|
-
GetAccountStatusForTrialBalanceAccountsReport() {
|
|
222
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetAccountStatus`;
|
|
223
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
224
|
-
return response;
|
|
225
|
-
}));
|
|
226
|
-
}
|
|
227
|
-
// Api 4 - Get Date Type
|
|
228
|
-
GetDateTypeForTrialBalanceAccountsReport() {
|
|
229
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetDateType`;
|
|
230
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
231
|
-
return response;
|
|
232
|
-
}));
|
|
233
|
-
}
|
|
234
|
-
// Api 5 - Get Year
|
|
235
|
-
GetYearForTrialBalanceAccountsReport() {
|
|
236
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetFinancialYear`;
|
|
237
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
238
|
-
return response;
|
|
239
|
-
}));
|
|
240
|
-
}
|
|
241
|
-
// Api 6 - Get From Months
|
|
242
|
-
GetFromMonthsForTrialBalanceAccountsReport() {
|
|
243
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetFromMonths`;
|
|
244
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
245
|
-
return response;
|
|
246
|
-
}));
|
|
247
|
-
}
|
|
248
|
-
// Api 7 - Get To Months
|
|
249
|
-
GetToMonthsForTrialBalanceAccountsReport(year, month) {
|
|
250
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetToMonths/${year}/${month}`;
|
|
251
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
252
|
-
return response;
|
|
253
|
-
}));
|
|
254
|
-
}
|
|
255
|
-
// Api 8 - Get From Dates
|
|
256
|
-
GetFromDatesForTrialBalanceAccountsReport(year, fromMonthLabel) {
|
|
257
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetFromDates/${year}/${fromMonthLabel}`;
|
|
258
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
259
|
-
return response;
|
|
260
|
-
}));
|
|
261
|
-
}
|
|
262
|
-
// Api 9 - Get To Dates
|
|
263
|
-
GetToDatesForTrialBalanceAccountsReport(object) {
|
|
264
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetToDates`;
|
|
265
|
-
return this.http.post(apiPath, object).pipe(map(response => {
|
|
266
|
-
return response;
|
|
267
|
-
}));
|
|
268
|
-
}
|
|
269
|
-
// Api 10 - Get Currencies
|
|
270
|
-
GetCurrenciesForTrialBalanceAccountsReport() {
|
|
271
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetCurrencies`;
|
|
272
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
273
|
-
return response;
|
|
274
|
-
}));
|
|
275
|
-
}
|
|
276
|
-
// Api 11 - Get default month,year
|
|
277
|
-
GetParamDateDefaultForTrialBalanceAccountsReport() {
|
|
278
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TrialBalanceAccountsReport/GetParamDateDefault`;
|
|
279
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
280
|
-
return response;
|
|
281
|
-
}));
|
|
282
|
-
}
|
|
283
|
-
//Credit Limit Status Enquiry Report APIs
|
|
284
|
-
getClientsForCreditLimitStatusEnquiryReport() {
|
|
285
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/CreditLimitStatusEnquiry/GetBusinessPartners`;
|
|
286
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
287
|
-
return response;
|
|
288
|
-
}));
|
|
289
|
-
}
|
|
290
|
-
getTransactionTypesForCreditLimitStatusEnquiryReport() {
|
|
291
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/CreditLimitStatusEnquiry/GetTransactionStatus`;
|
|
292
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
293
|
-
return response;
|
|
294
|
-
}));
|
|
295
|
-
}
|
|
296
|
-
getCreditLimitStatusEnquiryReport(model) {
|
|
297
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/CreditLimitStatusEnquiry/GetCreditLimitStatusEnquiryReport`;
|
|
298
|
-
return this.http.post(apiPath, model).pipe(map(response => {
|
|
299
|
-
return response;
|
|
300
|
-
}));
|
|
301
|
-
}
|
|
302
|
-
//Funding Report
|
|
303
|
-
getFundingReport(criteria) {
|
|
304
|
-
const url = `${this.reportServiceUrl}/api/v1/Report/Funding/viewReport`;
|
|
305
|
-
return this.http.post(url, criteria).pipe(map(response => response || {}));
|
|
306
|
-
}
|
|
307
|
-
//Branch Activity Send Summary Report
|
|
308
|
-
getPayInAgentforSendSummaryReport() {
|
|
309
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/SendSummaryReport/GetAllPayInAgents`;
|
|
310
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
311
|
-
return response;
|
|
312
|
-
}));
|
|
313
|
-
}
|
|
314
|
-
getBranchByAgentForSendSummaryReport(code) {
|
|
315
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/SendSummaryReport/GetBranchByAgent/${code}/BH`;
|
|
316
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
317
|
-
retry(2),
|
|
318
|
-
map(response => response);
|
|
319
|
-
return response;
|
|
320
|
-
}));
|
|
321
|
-
}
|
|
322
|
-
getParamsForSendSummaryReport() {
|
|
323
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/SendSummaryReport/GetBranchActivitySendSummaryReportParams`;
|
|
324
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
325
|
-
retry(2),
|
|
326
|
-
map(response => response);
|
|
327
|
-
return response;
|
|
328
|
-
}));
|
|
329
|
-
}
|
|
330
|
-
getBranchActivitySendSummaryReport(data) {
|
|
331
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/SendSummaryReport/GetBranchActivitySendSummaryReport`;
|
|
332
|
-
return this.http.post(apiPath, data).pipe(map(response => {
|
|
333
|
-
return response;
|
|
334
|
-
}));
|
|
335
|
-
}
|
|
336
|
-
//Transaction monitoring Report.
|
|
337
|
-
getParamsForTransactionMonitoringReport() {
|
|
338
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TransactionMonitoringReport/TransactionMonitoringReportParams`;
|
|
339
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
340
|
-
retry(2),
|
|
341
|
-
map(response => response);
|
|
342
|
-
return response;
|
|
343
|
-
}));
|
|
344
|
-
}
|
|
345
|
-
getBranchByAgentForTransactionMonitoringReport(code) {
|
|
346
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TransactionMonitoringReport/GetBranchByAgent/${code}/BH`;
|
|
347
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
348
|
-
retry(2),
|
|
349
|
-
map(response => response);
|
|
350
|
-
return response;
|
|
351
|
-
}));
|
|
352
|
-
}
|
|
353
|
-
getPayInAgentforTransactionMonitoringReport() {
|
|
354
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TransactionMonitoringReport/GetAllPayInAgents`;
|
|
355
|
-
return this.http.get(apiPath).pipe(map(response => {
|
|
356
|
-
return response;
|
|
357
|
-
}));
|
|
358
|
-
}
|
|
359
|
-
getTransactionMonitoringReport(data) {
|
|
360
|
-
const apiPath = `${this.reportServiceUrl}/api/v1/Report/TransactionMonitoringReport/GetTransactionMonitoringReport`;
|
|
361
|
-
return this.http.post(apiPath, data).pipe(map(response => {
|
|
362
|
-
return response;
|
|
363
|
-
}));
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
ReportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ReportService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
367
|
-
ReportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ReportService, providedIn: 'root' });
|
|
368
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ReportService, decorators: [{
|
|
369
|
-
type: Injectable,
|
|
370
|
-
args: [{
|
|
371
|
-
providedIn: 'root'
|
|
372
|
-
}]
|
|
373
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigService }]; } });
|
|
374
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQWtCNUMsTUFBTSxPQUFPLGFBQWE7SUFHeEIsd0NBQXdDO0lBQ3hDLDBFQUEwRTtJQUUxRSxZQUFvQixJQUFnQixFQUFVLE1BQXFCO1FBQS9DLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDBGQUEwRixDQUFDLENBQUM7U0FDN0c7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDM0QsQ0FBQztJQUVNLHFCQUFxQixDQUFDLGFBQWlDLEVBQUUsUUFBZ0I7UUFDOUUsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHlFQUF5RSxhQUFhLElBQUksUUFBUSxFQUFFLENBQUM7UUFDN0ksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBaUMsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELGNBQWM7UUFDWixNQUFNLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0Isa0NBQWtDLENBQUM7UUFDM0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hE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SUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hELEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ04sR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDM0IsT0FBYyxRQUFRLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCwyQ0FBMkM7UUFDekMsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDhEQUE4RCxDQUFDO1FBQ3ZHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoRCxPQUFjLFFBQVEsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUdELDhCQUE4QixDQUFDLElBQW1EO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQiwyRUFBMkUsQ0FBQztRQUNwSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZELE9BQXNELFFBQVEsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7MEdBdmJVLGFBQWE7OEdBQWIsYUFBYSxjQUZaLE1BQU07MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjY0dsRGV0YWlsc0VucXVpcnlSZXBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9hY2MtZ2wtZGV0YWlscy1lbnF1aXJ5LXJlcG9ydC9hY2NnbC1kZXRhaWxzLWVucXVpcnktcmVwb3J0bW9kZWwnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgcmV0cnkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJyYW5jaEFjdGl2aXR5U2VuZFJlcG9ydFJlcXVlc3REb21haW5Nb2RlbCB9IGZyb20gJy4uL21vZGVscy9icmFuY2gtYWN0aXZpdHktcmVwb3J0L2JyYW5jaC1hY3Rpdml0eS1zZW5kLXJlcG9ydC1yZXF1ZXN0LWRvbWFpbi1tb2RlbCc7XHJcbmltcG9ydCB7IEJyYW5jaEFjdGl2aXR5UmVwb3J0IH0gZnJvbSAnLi4vbW9kZWxzL2JyYW5jaC1hY3Rpdml0eS1yZXBvcnQvYnJhbmNoLWFjdGl2aXR5LXNlbmQtcmVwb3J0JztcclxuaW1wb3J0IHsgUHJvZHVjdCwgVXNlciwgQnJhbmNoLCBUcmFuc2FjdGlvbkRhdGEsIFBhZ2VMb2FkRGF0YVJlc3BvbnNlLCBTZWFyY2hDcml0ZXJpYSB9IGZyb20gJy4uL21vZGVscy90cmFuc2FjdGlvbi1lbnF1aXJ5LXJlcG9ydC90cmFuc2FjdGlvbi1lbnF1aXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCcmFuY2hBY3Rpdml0eVJlY2VpdmVSZXBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9icmFuY2gtYWN0aXZpdHktcmVjZWl2ZS1yZXBvcnQvYnJhbmNoLWFjdGl2aXR5LXJlY2VpdmUubW9kZWwnO1xyXG5pbXBvcnQgeyBDYW5jZWxsYXRpb25UcmFuc2FjdGlvbiB9IGZyb20gJy4uL21vZGVscy9jYW5jZWxsYXRpb24tdHJhbnNhY3Rpb24tcmVwb3J0L2NhbmNlbGxhdGlvbi10cmFuc2FjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFJldmVudWVQZXJUcmFuc2FjdGlvblJlc3BvbnNlTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvcmV2ZW51ZS1wZXItdHJhbnNhY3Rpb24tcmVwb3J0L3JldmVudWUtcGVyLXRyYW5zYWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgU3RhdGVtZW50T2ZBY2NvdW50UmVxdWVzdCwgU3RhdGVtZW50T2ZBY2NvdW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvc3RhdGVtZW50LW9mLWFjY291bnQtcmVwb3J0L3N0YXRlbWVudC1vZi1hY2NvdW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IEFjY291bnRpbmdSZXBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9hY2NvdW50aW5nLXJlcG9ydC9hY2NvdW50aW5nLXJlcG9ydC1tb2RlbCc7XHJcbmltcG9ydCB7IFRyaWFsQmFsYW5jZVJlcG9ydCB9IGZyb20gJy4uL21vZGVscy90cmlhbC1iYWxhbmNlLWFjY291bnRzLXJlcG9ydC90cmlhbC1iYWxhbmNlLWFjY291bnRzLm1vZGVscyc7XHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcXVlc3REb21haW5Nb2RlbCB9IGZyb20gJy4uL21vZGVscy90cmFuc2FjdGlvbi1tb25pdG9yaW5nLXJlcG9ydC90cmFuc2FjdGlvbi1tb25pdG9yaW5nLXJlcG9ydC1yZXF1ZXN0LWRvbWFpbi1tb2RlbCc7XHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcG9ydCB9IGZyb20gJy4uL21vZGVscy90cmFuc2FjdGlvbi1tb25pdG9yaW5nLXJlcG9ydC90cmFuc2FjdGlvbi1tb25pdG9yaW5nLXJlcG9ydCc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0U2VydmljZSB7XHJcblxyXG4gIHByaXZhdGUgcmVwb3J0U2VydmljZVVybDogc3RyaW5nO1xyXG4gIC8vIHByaXZhdGUgcmVwb3J0VXJsID0gJy9hcGkvdjEvUmVwb3J0JztcclxuICAvLyBwcml2YXRlIHN5c3RlbVJlcG9ydFVybCA9ICcvYXBpL3YxL0NvbXBhbnlDb25maWd1cmF0aW9uL1N5c3RlbVJlcG9ydHMnO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmdldCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZ1NlcnZpY2UgaXMgbm90IGluaXRpYWxpemVkLiBFbnN1cmUgQVBQX0lOSVRJQUxJWkVSIHJhbiBiZWZvcmUgdXNpbmcgUmVwb3J0U2VydmljZS4nKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVwb3J0U2VydmljZVVybCA9IHRoaXMuY29uZmlnLmdldC5yZXBvcnRTZXJ2aWNlVXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFjY0dMRGV0YWlsc1JlcG9ydChmb3JtYXR0ZWREYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRhdGVUeXBlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFjY0dsRGV0YWlsc0VucXVpcnlSZXBvcnRNb2RlbD4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9BY2NHbERldGFpbHNFbnF1aXJ5UmVwb3J0L0dldEFjY0dMRGV0YWlsc0VucXVpcnlSZXBvcnQvJHtmb3JtYXR0ZWREYXRlfS8ke2RhdGVUeXBlfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBY2NHbERldGFpbHNFbnF1aXJ5UmVwb3J0TW9kZWw+KGFwaVBhdGgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGF5SW5BZ2VudHMoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9HZXRBbGxQYXlJbkFnZW50c2A7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8YW55W10+cmVzcG9uc2U7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXRCcmFuY2hCeUFnZW50KGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvR2V0QnJhbmNoQnlBZ2VudC8ke2NvZGV9L0JIYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0cnkoMiksXHJcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlKVxyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFyYW1zKCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvR2V0QnJhbmNoQWN0aXZpdHlTZW5kUmVwb3J0UGFyYW1zYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0cnkoMiksXHJcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlKVxyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnJhbmNoQWN0aXZpdHlSZXBvcnQoZGF0YTogQnJhbmNoQWN0aXZpdHlTZW5kUmVwb3J0UmVxdWVzdERvbWFpbk1vZGVsIHwgYW55KTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPj4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9HZXRCcmFuY2hBY3Rpdml0eVNlbmRSZXBvcnRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgsIGRhdGEpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPj5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRVc2VyTmFtZUZyb21TZXNzaW9uU3RvcmFnZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGZvc3NpbFVzZXJOYW1lID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9zc2lsdXNlcm5hbWUnKTtcclxuICAgIGxldCBlenJlbWl0dXNlcm5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlenJlbWl0dXNlcm5hbWUnKTtcclxuICAgIGlmIChmb3NzaWxVc2VyTmFtZSkge1xyXG4gICAgICByZXR1cm4gZm9zc2lsVXNlck5hbWUucmVwbGFjZSgvXlwiKC4qKVwiJC8sICckMScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGV6cmVtaXR1c2VybmFtZS5yZXBsYWNlKC9eXCIoLiopXCIkLywgJyQxJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL1RyYXNhY3Rpb24gRW5xdWlyeSBSZXBvcnQgQXBpc1xyXG4gIC8vIEFQSSAxOiBHZXQgaW5pdGlhbCBwYWdlIGxvYWQgZGF0YVxyXG4gIGdldFBhZ2VMb2FkRGF0YSgpOiBPYnNlcnZhYmxlPFBhZ2VMb2FkRGF0YVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJhbnNhY3Rpb25FbnF1aXJ5L3BhZ2VMb2FkRGF0YWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiA8UGFnZUxvYWREYXRhUmVzcG9uc2U+cmVzcG9uc2UpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gQVBJIDI6IEdldCBicmFuY2hlcyBieSBhZ2VudFxyXG4gIGdldEJyYW5jaGVzQnlBZ2VudChhZ2VudENvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8QnJhbmNoW10+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9UcmFuc2FjdGlvbkVucXVpcnkvYnJhbmNoZXMvJHthZ2VudENvZGV9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IDxCcmFuY2hbXT5yZXNwb25zZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBBUEkgNDogR2V0IHVzZXJzIGJ5IGJyYW5jaFxyXG4gIGdldFVzZXJzQnlCcmFuY2goYnVzaW5lc3NQYXJ0bmVyQ29kZTogc3RyaW5nLCBicmFuY2hDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVzZXJbXT4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyYW5zYWN0aW9uRW5xdWlyeS91c2Vycy8ke2J1c2luZXNzUGFydG5lckNvZGV9LyR7YnJhbmNoQ29kZX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKS5waXBlKFxyXG4gICAgICBtYXAocmVzcG9uc2UgPT4gPFVzZXJbXT5yZXNwb25zZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBBUEkgNTogU2VhcmNoIHRyYW5zYWN0aW9uc1xyXG4gIHNlYXJjaFRyYW5zYWN0aW9ucyhkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPFRyYW5zYWN0aW9uRGF0YVtdPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJhbnNhY3Rpb25FbnF1aXJ5L3ZpZXdSZXBvcnRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgZGF0YSkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IDxUcmFuc2FjdGlvbkRhdGFbXT5yZXNwb25zZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBCcmFuY2ggQWN0aXZpdHkgUmVjZWl2ZSBSZXBvcnQgQVBJXHJcbiAgZ2V0QWxsUGF5T3V0QWdlbnRzKCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvQnJhbmNoQWN0aXZpdHlSZWNlaXZlL0dldEFsbFBheW91dEFnZW50cy9gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXBpUGF0aCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICBnZXRCcmFuY2hBY3Rpdml0eVJlY2VpdmVQYXJhbXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9CcmFuY2hBY3Rpdml0eVJlY2VpdmUvR2V0QnJhbmNoQWN0aXZpdHlSZWNlaXZlUmVwb3J0UGFyYW1zYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldEJyYW5jaEFjdGl2aXR5UmVjZWl2ZVBheW91dEFnZW50QnJhbmNoKGNvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvQnJhbmNoQWN0aXZpdHlSZWNlaXZlL0dldEJyYW5jaEJ5UGF5b3V0QWdlbnQvJHtjb2RlfS9CSGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHJ5KDIpLFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZSlcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldEJyYW5jaEFjdGl2aXR5UmVjZWl2ZVJlcG9ydChkYXRhOiBhbnkpOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVjZWl2ZVJlcG9ydE1vZGVsW10+PiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0JyYW5jaEFjdGl2aXR5UmVjZWl2ZS9HZXRCcmFuY2hBY3Rpdml0eVJlY2VpdmVSZXBvcnRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgsIGRhdGEpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlY2VpdmVSZXBvcnRNb2RlbFtdPj5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8vQ2FuY2VsbGF0aW9uIFRyYW5zYWN0aW9uIFJlcG9ydCBhcGlzXHJcbiAgLy9BcGkgMVxyXG4gIGxvYWREYXRhZm9yQ2FuY2FsbGF0aW9uKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0NhbmNlbGxhdGlvblRyYW5zYWN0aW9uUmVwb3J0L3BhZ2VMb2FkRGF0YWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGFwaVBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFwaSAyIC0gR2V0IGxpc3Qgb2YgYnJhbmNoZXMgZm9yIGFuIGFnZW50ICovXHJcbiAgZ2V0QnJhbmNoZXMoYWdlbnRDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJyYW5jaFtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0NhbmNlbGxhdGlvblRyYW5zYWN0aW9uUmVwb3J0L2JyYW5jaGVzLyR7YWdlbnRDb2RlfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxCcmFuY2hbXT4oYXBpUGF0aCkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlIHx8IFtdKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vQXBpIDNcclxuICBnZXRDYW5jZWxsYXRpb25SZXBvcnQoY3JpdGVyaWE6IGFueSk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgQ2FuY2VsbGF0aW9uVHJhbnNhY3Rpb25bXT4+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9DYW5jZWxsYXRpb25UcmFuc2FjdGlvblJlcG9ydC92aWV3UmVwb3J0YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIGNyaXRlcmlhKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8UmVjb3JkPHN0cmluZywgQ2FuY2VsbGF0aW9uVHJhbnNhY3Rpb25bXT4+cmVzcG9uc2U7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXZlbnVlIFBlciBUcmFuc2FjdGlvbiBSZXBvcnQgQVBJXHJcbiAgZ2V0QWdlbnRzRm9yUmV2ZW51ZVBlclRyYW5zYWN0aW9uKCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvUmV2ZW51ZVBlclRyYW5zYWN0aW9uL0dldEFnZW50c0ZvclJldmVudWVQZXJUcmFuc2FjdGlvbmA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8YW55W10+cmVzcG9uc2U7XHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIGdldFJldmVudWVQZXJUcmFuc2FjdGlvblJlcG9ydFBhcmFtcygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9SZXZlbnVlUGVyVHJhbnNhY3Rpb24vR2V0UmV2ZW51ZVBlclRyYW5zYWN0aW9uUGFyYW1zYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmV2ZW51ZVBlclRyYW5zYWN0aW9uUmVwb3J0KGRhdGE6IGFueSk6IE9ic2VydmFibGU8UmV2ZW51ZVBlclRyYW5zYWN0aW9uUmVzcG9uc2VNb2RlbFtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1JldmVudWVQZXJUcmFuc2FjdGlvbi9HZXRSZXZlbnVlUGVyVHJhbnNhY3Rpb25SZXBvcnRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgsIGRhdGEpLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIDxSZXZlbnVlUGVyVHJhbnNhY3Rpb25SZXNwb25zZU1vZGVsW10+cmVzcG9uc2U7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICAvL1N0YXRlbWVudCBvZiBBY2NvdW50cyBSZXBvcnRcclxuICBsb2FkQ2xpZW50c0ZvclN0YXRlbWVudE9mQWNjb3VudHMoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9TdGF0ZW1lbnRvZkFjY291bnRzL0NsaWVudHNgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55W10+KGFwaVBhdGgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tDbGllbnRGb3JTdGF0ZW1lbnRPZkFjY291bnRzKGNsaWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgcmVzdWx0OiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9TdGF0ZW1lbnRvZkFjY291bnRzL2NoZWNrQ2xpZW50LyR7Y2xpZW50SWR9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBzdHJpbmcgfT4oYXBpUGF0aCk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZW1lbnRPZkFjY291bnQoY3JpdGVyaWE6IFN0YXRlbWVudE9mQWNjb3VudFJlcXVlc3QpOiBPYnNlcnZhYmxlPFN0YXRlbWVudE9mQWNjb3VudFJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvU3RhdGVtZW50b2ZBY2NvdW50cy9zdGF0ZW1lbnRPZkFjY291bnRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFN0YXRlbWVudE9mQWNjb3VudFJlc3BvbnNlPih1cmwsIGNyaXRlcmlhKS5waXBlKFxyXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UgfHwge1xyXG4gICAgICAgIG9wZW5pbmdCYWxBbmRGdW5kaW5nOiBbXSxcclxuICAgICAgICBzZW5kRGV0YWlsczogW10sXHJcbiAgICAgICAgcmVjZWl2ZURldGFpbHM6IFtdXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLyBBY2NvdW50aW5nIFJlcG9ydFxyXG5cclxuICAvLyBBcGkgMSAtIGdldCBhY2NvdW50aW5nIHJlcG9ydFxyXG4gIGdldEFjY291bnRpbmdSZXBvcnQob2JqZWN0OiBhbnkpOiBPYnNlcnZhYmxlPEFjY291bnRpbmdSZXBvcnRNb2RlbD4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9BY2NvdW50aW5nUmVwb3J0L0dldEFjY291bnRpbmdSZXBvcnRgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFjY291bnRpbmdSZXBvcnRNb2RlbD4oYXBpUGF0aCwgb2JqZWN0KS5waXBlKFxyXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UgfHwgdW5kZWZpbmVkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIEFwaSAyIC0gZ2V0IEFsbCBjbGllbnRzXHJcbiAgZ2V0Q2xpZW50c0ZvckFjY291bnRpbmdSZXBvcnQoc3lzVXNlcklEOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0FjY291bnRpbmdSZXBvcnQvR2V0QWxsUGF5SW5BZ2VudHMvJHtzeXNVc2VySUR9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgLy8gQXBpIDMgLSBnZXQgYnJhbmNoIGJ5IGFnZW50IG9yIGNsaWVudFxyXG4gIGdldEJyYW5jaEJ5QWdlbnRGb3JBY2NvdW50aW5nUmVwb3J0KHN5c1VzZXJJZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0FjY291bnRpbmdSZXBvcnQvR2V0QnJhbmNoQnlBZ2VudC8ke2NvZGV9LyR7c3lzVXNlcklkfS9CSGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHJ5KDIpLFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZSlcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8vIEFwaSA0IC0gZ2V0IEFsbCB0cmFuc2FjdGlvbiB0eXBlcyAoIHByb2R1Y3RzIClcclxuICBnZXRUcmFuc2FjdGlvblR5cGVzRm9yQWNjb3VudGluZ1JlcG9ydCgpOiBPYnNlcnZhYmxlPFByb2R1Y3RbXT4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0FjY291bnRpbmdSZXBvcnQvZ2V0VHJhbnNhY3Rpb25UeXBlc2A7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiA8UHJvZHVjdFtdPnJlc3BvbnNlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIEFwaSA1IC0gZ2V0IEFsbCBjdXJyZW5jaWVzXHJcbiAgZ2V0QWxsQ3VycmVuY2llc0ZvckFjY291bnRpbmdSZXBvcnQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9BY2NvdW50aW5nUmVwb3J0L2dldEFsbEN1cnJlbmNpZXNgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXBpUGF0aCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICAvLyBBcGkgNiAtIGdldCBBbGwgVHJhbnNhY3Rpb24gU3RhdHVzXHJcbiAgZ2V0QWxsVHJhbnNhY3Rpb25TdGF0dXNGb3JBY2NvdW50aW5nUmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvQWNjb3VudGluZ1JlcG9ydC9HZXRBbGxUcmFuc2FjdGlvblN0YXR1c2A7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8YW55W10+cmVzcG9uc2U7XHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIC8vIEFwaSA3IC0gZ2V0IEFsbCBDb3VudHJpZXNcclxuICBnZXRBbGxDb3VudHJpZXNGb3JBY2NvdW50aW5nUmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvQWNjb3VudGluZ1JlcG9ydC9HZXRBbGxDb3VudHJpZXNgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXBpUGF0aCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gVHJpYWwgQmFsYW5jZSAtIEFjY291bnRzIFJlcG9ydFxyXG5cclxuICAvLyBBcGkgMSAtIEdldCBUcmlhbCBCYWxhbmNlIC0gQWNjb3VudHMgcmVwb3J0XHJcbiAgZ2V0VHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQob2JqZWN0OiBhbnkpOiBPYnNlcnZhYmxlPFRyaWFsQmFsYW5jZVJlcG9ydD4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9UcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydC9HZXRUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VHJpYWxCYWxhbmNlUmVwb3J0PihhcGlQYXRoLCBvYmplY3QpLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZSB8fCB1bmRlZmluZWQpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gQXBpIDIgLSBHZXQgQnVzaW5lc3MgVW5pdFxyXG4gIEdldEJ1c2luZXNzVW5pdEZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQvR2V0QnVzaW5lc3NVbml0YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgLy8gQXBpIDMgLSBHZXQgQWNjb3VudCBTdGF0dXNcclxuICBHZXRBY2NvdW50U3RhdHVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9UcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydC9HZXRBY2NvdW50U3RhdHVzYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgLy8gQXBpIDQgLSBHZXQgRGF0ZSBUeXBlXHJcbiAgR2V0RGF0ZVR5cGVGb3JUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0L0dldERhdGVUeXBlYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgLy8gQXBpIDUgLSBHZXQgWWVhclxyXG4gIEdldFllYXJGb3JUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0L0dldEZpbmFuY2lhbFllYXJgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXBpUGF0aCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICAvLyBBcGkgNiAtIEdldCBGcm9tIE1vbnRoc1xyXG4gIEdldEZyb21Nb250aHNGb3JUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0L0dldEZyb21Nb250aHNgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXBpUGF0aCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICAvLyBBcGkgNyAtIEdldCBUbyBNb250aHNcclxuICBHZXRUb01vbnRoc0ZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQvR2V0VG9Nb250aHMvJHt5ZWFyfS8ke21vbnRofWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8YW55W10+cmVzcG9uc2U7XHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIC8vIEFwaSA4IC0gR2V0IEZyb20gRGF0ZXNcclxuICBHZXRGcm9tRGF0ZXNGb3JUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydCh5ZWFyOiBudW1iZXIsIGZyb21Nb250aExhYmVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0L0dldEZyb21EYXRlcy8ke3llYXJ9LyR7ZnJvbU1vbnRoTGFiZWx9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgLy8gQXBpIDkgLSBHZXQgVG8gRGF0ZXNcclxuICBHZXRUb0RhdGVzRm9yVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQob2JqZWN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0L0dldFRvRGF0ZXNgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgsIG9iamVjdCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICAvLyBBcGkgMTAgLSBHZXQgQ3VycmVuY2llc1xyXG4gIEdldEN1cnJlbmNpZXNGb3JUcmlhbEJhbGFuY2VBY2NvdW50c1JlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1RyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0L0dldEN1cnJlbmNpZXNgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXBpUGF0aCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICAvLyBBcGkgMTEgLSBHZXQgZGVmYXVsdCBtb250aCx5ZWFyXHJcbiAgR2V0UGFyYW1EYXRlRGVmYXVsdEZvclRyaWFsQmFsYW5jZUFjY291bnRzUmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJpYWxCYWxhbmNlQWNjb3VudHNSZXBvcnQvR2V0UGFyYW1EYXRlRGVmYXVsdGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8YW55W10+cmVzcG9uc2U7XHJcbiAgICB9KSlcclxuICB9XHJcblxyXG5cclxuICAgIC8vQ3JlZGl0IExpbWl0IFN0YXR1cyBFbnF1aXJ5IFJlcG9ydCBBUElzXHJcbiAgZ2V0Q2xpZW50c0ZvckNyZWRpdExpbWl0U3RhdHVzRW5xdWlyeVJlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0NyZWRpdExpbWl0U3RhdHVzRW5xdWlyeS9HZXRCdXNpbmVzc1BhcnRuZXJzYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcbiAgXHJcbiAgZ2V0VHJhbnNhY3Rpb25UeXBlc0ZvckNyZWRpdExpbWl0U3RhdHVzRW5xdWlyeVJlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0NyZWRpdExpbWl0U3RhdHVzRW5xdWlyeS9HZXRUcmFuc2FjdGlvblN0YXR1c2A7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHVybiA8YW55W10+cmVzcG9uc2U7XHJcbiAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gIGdldENyZWRpdExpbWl0U3RhdHVzRW5xdWlyeVJlcG9ydChtb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9DcmVkaXRMaW1pdFN0YXR1c0VucXVpcnkvR2V0Q3JlZGl0TGltaXRTdGF0dXNFbnF1aXJ5UmVwb3J0YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlQYXRoLCBtb2RlbCkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpXHJcbiAgfVxyXG4gIC8vRnVuZGluZyBSZXBvcnRcclxuICBnZXRGdW5kaW5nUmVwb3J0KGNyaXRlcmlhOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L0Z1bmRpbmcvdmlld1JlcG9ydGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCBjcml0ZXJpYSkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlIHx8IHt9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeSBSZXBvcnRcclxuICAgZ2V0UGF5SW5BZ2VudGZvclNlbmRTdW1tYXJ5UmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9TZW5kU3VtbWFyeVJlcG9ydC9HZXRBbGxQYXlJbkFnZW50c2A7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBnZXRCcmFuY2hCeUFnZW50Rm9yU2VuZFN1bW1hcnlSZXBvcnQoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgICBjb25zdCBhcGlQYXRoID0gYCR7dGhpcy5yZXBvcnRTZXJ2aWNlVXJsfS9hcGkvdjEvUmVwb3J0L1NlbmRTdW1tYXJ5UmVwb3J0L0dldEJyYW5jaEJ5QWdlbnQvJHtjb2RlfS9CSGA7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXRyeSgyKSxcclxuICAgICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZSlcclxuICAgICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBnZXRQYXJhbXNGb3JTZW5kU3VtbWFyeVJlcG9ydCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvU2VuZFN1bW1hcnlSZXBvcnQvR2V0QnJhbmNoQWN0aXZpdHlTZW5kU3VtbWFyeVJlcG9ydFBhcmFtc2A7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXRyeSgyKSxcclxuICAgICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZSlcclxuICAgICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBnZXRCcmFuY2hBY3Rpdml0eVNlbmRTdW1tYXJ5UmVwb3J0KGRhdGE6IEJyYW5jaEFjdGl2aXR5U2VuZFJlcG9ydFJlcXVlc3REb21haW5Nb2RlbCB8IGFueSk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgQnJhbmNoQWN0aXZpdHlSZXBvcnRbXT4+IHtcclxuICAgICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9TZW5kU3VtbWFyeVJlcG9ydC9HZXRCcmFuY2hBY3Rpdml0eVNlbmRTdW1tYXJ5UmVwb3J0YDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVBhdGgsIGRhdGEpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gPFJlY29yZDxzdHJpbmcsIEJyYW5jaEFjdGl2aXR5UmVwb3J0W10+PnJlc3BvbnNlO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbi8vVHJhbnNhY3Rpb24gbW9uaXRvcmluZyBSZXBvcnQuXHJcbiAgXHJcbiAgZ2V0UGFyYW1zRm9yVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVwb3J0L1RyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcG9ydFBhcmFtc2A7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChhcGlQYXRoKS5waXBlKG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgIHJldHJ5KDIpLFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZSlcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldEJyYW5jaEJ5QWdlbnRGb3JUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXBvcnQoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgYXBpUGF0aCA9IGAke3RoaXMucmVwb3J0U2VydmljZVVybH0vYXBpL3YxL1JlcG9ydC9UcmFuc2FjdGlvbk1vbml0b3JpbmdSZXBvcnQvR2V0QnJhbmNoQnlBZ2VudC8ke2NvZGV9L0JIYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0cnkoMiksXHJcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlKVxyXG4gICAgICByZXR1cm4gPGFueVtdPnJlc3BvbnNlO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuICBcclxuICBnZXRQYXlJbkFnZW50Zm9yVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVwb3J0KCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVwb3J0L0dldEFsbFBheUluQWdlbnRzYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGFwaVBhdGgpLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgcmV0dXJuIDxhbnlbXT5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG5cclxuICBnZXRUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXBvcnQoZGF0YTogVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVxdWVzdERvbWFpbk1vZGVsIHwgYW55KTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXBvcnRbXT4+IHtcclxuICAgIGNvbnN0IGFwaVBhdGggPSBgJHt0aGlzLnJlcG9ydFNlcnZpY2VVcmx9L2FwaS92MS9SZXBvcnQvVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVwb3J0L0dldFRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcG9ydGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpUGF0aCwgZGF0YSkucGlwZShtYXAocmVzcG9uc2UgPT4ge1xyXG4gICAgICByZXR1cm4gPFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcG9ydFtdPj5yZXNwb25zZTtcclxuICAgIH0pKTtcclxuICB9XHJcbn1cclxuIl19
|