@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.
Files changed (211) hide show
  1. package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +240 -0
  2. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +614 -0
  3. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +218 -0
  4. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +263 -0
  5. package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +718 -0
  6. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +275 -0
  7. package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +192 -0
  8. package/esm2020/lib/components/funding-report/funding-report.component.mjs +198 -0
  9. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +244 -0
  10. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +776 -0
  11. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +282 -0
  12. package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +332 -0
  13. package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +631 -0
  14. package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +2 -0
  15. package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +2 -0
  16. package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +2 -0
  17. package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +2 -0
  18. package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +2 -0
  19. package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +2 -0
  20. package/esm2020/lib/models/app-config.model.mjs +2 -0
  21. package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +2 -0
  22. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +6 -0
  23. package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +3 -0
  24. package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -0
  25. package/esm2020/lib/models/component-loading-states.mjs +7 -0
  26. package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +5 -0
  27. package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
  28. package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
  29. package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +8 -0
  30. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +6 -0
  31. package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +5 -0
  32. package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +3 -0
  33. package/esm2020/lib/reports-lib-routing.module.mjs +24 -0
  34. package/esm2020/lib/reports-lib.component.mjs +22 -0
  35. package/esm2020/lib/reports-lib.module.mjs +172 -0
  36. package/esm2020/lib/reports-lib.service.mjs +14 -0
  37. package/esm2020/lib/services/config.service.mjs +39 -0
  38. package/esm2020/lib/services/report.service.mjs +374 -0
  39. package/esm2020/lib/shared/export-generic.service.mjs +443 -0
  40. package/esm2020/lib/shared/export.service.mjs +379 -0
  41. package/esm2020/lib/shared/loader/loader.component.mjs +11 -0
  42. package/esm2020/lib/shared/metadata/metadata.component.mjs +51 -0
  43. package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +44 -0
  44. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +2147 -0
  45. package/esm2020/lib/shared/shared.module.mjs +21 -0
  46. package/esm2020/public-api.mjs +41 -0
  47. package/esm2020/sachin9822-reports-lib.mjs +5 -0
  48. package/fesm2015/sachin9822-reports-lib.mjs +8649 -0
  49. package/fesm2015/sachin9822-reports-lib.mjs.map +1 -0
  50. package/fesm2020/sachin9822-reports-lib.mjs +8510 -0
  51. package/fesm2020/sachin9822-reports-lib.mjs.map +1 -0
  52. package/index.d.ts +5 -0
  53. package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +70 -0
  54. package/lib/components/accounting-report/accounting-report.component.d.ts +76 -0
  55. package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +58 -0
  56. package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +69 -0
  57. package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +78 -0
  58. package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +108 -0
  59. package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +55 -0
  60. package/lib/components/funding-report/funding-report.component.d.ts +55 -0
  61. package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +57 -0
  62. package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +109 -0
  63. package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +76 -0
  64. package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +69 -0
  65. package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +71 -0
  66. package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +8 -0
  67. package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +18 -0
  68. package/lib/models/accounting-report/accounting-report-branch-group.d.ts +6 -0
  69. package/lib/models/accounting-report/accounting-report-entry-model.d.ts +24 -0
  70. package/lib/models/accounting-report/accounting-report-model.d.ts +6 -0
  71. package/{src/lib/models/accounting-report/accounting-report-sub-group.ts → lib/models/accounting-report/accounting-report-sub-group.d.ts} +2 -3
  72. package/{src/lib/models/app-config.model.ts → lib/models/app-config.model.d.ts} +7 -8
  73. package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +18 -0
  74. package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +13 -0
  75. package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +24 -0
  76. package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +44 -0
  77. package/lib/models/component-loading-states.d.ts +5 -0
  78. package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +26 -0
  79. 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
  80. package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
  81. package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +113 -0
  82. package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +13 -0
  83. package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +23 -0
  84. package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +38 -0
  85. package/lib/reports-lib-routing.module.d.ts +7 -0
  86. package/lib/reports-lib.component.d.ts +8 -0
  87. package/lib/reports-lib.module.d.ts +33 -0
  88. package/lib/reports-lib.service.d.ts +6 -0
  89. package/lib/services/config.service.d.ts +20 -0
  90. package/lib/services/report.service.d.ts +80 -0
  91. package/lib/shared/export-generic.service.d.ts +50 -0
  92. package/lib/shared/export.service.d.ts +32 -0
  93. package/lib/shared/loader/loader.component.d.ts +5 -0
  94. package/lib/shared/metadata/metadata.component.d.ts +24 -0
  95. package/lib/shared/page-size-selector/page-size-selector.component.d.ts +15 -0
  96. package/lib/shared/search-filter/search-filter.component.d.ts +127 -0
  97. package/lib/shared/shared.module.d.ts +11 -0
  98. package/package.json +31 -16
  99. package/{src/public-api.ts → public-api.d.ts} +7 -17
  100. package/karma.conf.js +0 -44
  101. package/ng-package.json +0 -17
  102. package/src/assets/images/BreadcrumbArrow.png +0 -0
  103. package/src/assets/images/XMCoral.png +0 -0
  104. package/src/lib/assets/images/Search.svg +0 -10
  105. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +0 -27
  106. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +0 -46
  107. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +0 -23
  108. package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +0 -292
  109. package/src/lib/components/accounting-report/accounting-report.component.html +0 -64
  110. package/src/lib/components/accounting-report/accounting-report.component.scss +0 -24
  111. package/src/lib/components/accounting-report/accounting-report.component.spec.ts +0 -23
  112. package/src/lib/components/accounting-report/accounting-report.component.ts +0 -738
  113. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +0 -46
  114. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +0 -2
  115. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +0 -23
  116. package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +0 -247
  117. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +0 -46
  118. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +0 -3
  119. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +0 -23
  120. package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +0 -276
  121. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +0 -51
  122. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +0 -7
  123. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +0 -23
  124. package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +0 -840
  125. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +0 -68
  126. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +0 -65
  127. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +0 -23
  128. package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +0 -290
  129. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +0 -25
  130. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +0 -1
  131. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +0 -23
  132. package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +0 -213
  133. package/src/lib/components/funding-report/funding-report.component.html +0 -49
  134. package/src/lib/components/funding-report/funding-report.component.scss +0 -1
  135. package/src/lib/components/funding-report/funding-report.component.spec.ts +0 -23
  136. package/src/lib/components/funding-report/funding-report.component.ts +0 -221
  137. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +0 -26
  138. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +0 -1
  139. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +0 -23
  140. package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +0 -267
  141. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +0 -95
  142. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +0 -54
  143. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +0 -23
  144. package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +0 -904
  145. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +0 -49
  146. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +0 -2
  147. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +0 -32
  148. package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +0 -304
  149. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +0 -46
  150. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +0 -7
  151. package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +0 -343
  152. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +0 -25
  153. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +0 -23
  154. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +0 -23
  155. package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +0 -745
  156. package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +0 -10
  157. package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +0 -20
  158. package/src/lib/models/accounting-report/accounting-report-branch-group.ts +0 -7
  159. package/src/lib/models/accounting-report/accounting-report-entry-model.ts +0 -25
  160. package/src/lib/models/accounting-report/accounting-report-model.ts +0 -7
  161. package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +0 -18
  162. package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +0 -16
  163. package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +0 -26
  164. package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +0 -65
  165. package/src/lib/models/component-loading-states.ts +0 -5
  166. package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +0 -28
  167. package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +0 -21
  168. package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +0 -127
  169. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +0 -16
  170. package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +0 -29
  171. package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +0 -46
  172. package/src/lib/reports-lib-routing.module.ts +0 -20
  173. package/src/lib/reports-lib.component.spec.ts +0 -23
  174. package/src/lib/reports-lib.component.ts +0 -20
  175. package/src/lib/reports-lib.module.ts +0 -102
  176. package/src/lib/reports-lib.service.spec.ts +0 -16
  177. package/src/lib/reports-lib.service.ts +0 -9
  178. package/src/lib/services/config.service.ts +0 -43
  179. package/src/lib/services/report.service.spec.ts +0 -16
  180. package/src/lib/services/report.service.ts +0 -463
  181. package/src/lib/shared/export-generic.service.ts +0 -557
  182. package/src/lib/shared/export.service.spec.ts +0 -16
  183. package/src/lib/shared/export.service.ts +0 -457
  184. package/src/lib/shared/loader/loader.component.html +0 -8
  185. package/src/lib/shared/loader/loader.component.scss +0 -52
  186. package/src/lib/shared/loader/loader.component.ts +0 -10
  187. package/src/lib/shared/metadata/metadata.component.html +0 -42
  188. package/src/lib/shared/metadata/metadata.component.scss +0 -95
  189. package/src/lib/shared/metadata/metadata.component.spec.ts +0 -23
  190. package/src/lib/shared/metadata/metadata.component.ts +0 -38
  191. package/src/lib/shared/page-size-selector/page-size-selector.component.html +0 -7
  192. package/src/lib/shared/page-size-selector/page-size-selector.component.scss +0 -42
  193. package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +0 -23
  194. package/src/lib/shared/page-size-selector/page-size-selector.component.ts +0 -38
  195. package/src/lib/shared/search-filter/search-filter.component.html +0 -601
  196. package/src/lib/shared/search-filter/search-filter.component.scss +0 -203
  197. package/src/lib/shared/search-filter/search-filter.component.spec.ts +0 -23
  198. package/src/lib/shared/search-filter/search-filter.component.ts +0 -2387
  199. package/src/lib/shared/shared.module.ts +0 -13
  200. package/src/styles/ag-grid-report-style.scss +0 -71
  201. package/src/styles/common-ag-grid-style.scss +0 -146
  202. package/src/styles/common-report-style.scss +0 -395
  203. package/src/styles/common-style.scss +0 -615
  204. package/src/test.ts +0 -27
  205. package/tsconfig.lib.json +0 -15
  206. package/tsconfig.lib.prod.json +0 -10
  207. package/tsconfig.spec.json +0 -17
  208. /package/{src/lib → lib}/assets/config/app-config.json +0 -0
  209. /package/{src → lib}/assets/images/Search.svg +0 -0
  210. /package/{src/lib → lib}/assets/images/XMLogo.png +0 -0
  211. /package/{src/lib → lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
@@ -0,0 +1,718 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { themeAlpine } from '@ag-grid-community/theming';
3
+ import { ComponentLoadingStates } from '../../models/component-loading-states';
4
+ import { GenericExportService } from '../../shared/export-generic.service';
5
+ // import { formatDate } from '@angular/common';
6
+ // import { ComponentLoadingStates } from 'src/app/models/component-loading-states';
7
+ // import { GenericExportService } from 'src/app/shared/export-generic.service';
8
+ // import { ExportOptions } from 'projects/reports-lib/src/lib/shared/export-generic.service';
9
+ // import { Injectable } from '@angular/core';
10
+ // import jsPDF from 'jspdf';
11
+ // import 'jspdf-autotable';
12
+ import * as ExcelJS from 'exceljs';
13
+ import * as FileSaver from 'file-saver';
14
+ import { formatDate } from '@angular/common';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../../services/report.service";
17
+ import * as i2 from "ag-grid-angular";
18
+ import * as i3 from "@angular/common";
19
+ import * as i4 from "../../shared/page-size-selector/page-size-selector.component";
20
+ import * as i5 from "../../shared/metadata/metadata.component";
21
+ import * as i6 from "@ng-bootstrap/ng-bootstrap";
22
+ import * as i7 from "../../shared/loader/loader.component";
23
+ import * as i8 from "../../shared/search-filter/search-filter.component";
24
+ export class BranchActivitySendSummaryReportComponent {
25
+ constructor(reportService, ngZone) {
26
+ this.reportService = reportService;
27
+ this.ngZone = ngZone;
28
+ this.dataMap = {};
29
+ this.filteredData = {};
30
+ this.proxyData = {};
31
+ this.selectedExportOption = 'excel';
32
+ this.gridApis = [];
33
+ this.user = "";
34
+ this.ComponentLoadingState = ComponentLoadingStates;
35
+ this.loadingState = ComponentLoadingStates.Loading;
36
+ this.ReportName = "Branch Activity Send Summary";
37
+ this.exportService = inject(GenericExportService);
38
+ this.searchCriteria = [];
39
+ // flags
40
+ this.showMessage = false;
41
+ this.noDataFound = false;
42
+ this.isFormValid = false;
43
+ this.clearSearch = false;
44
+ this.isTotalSummary = false;
45
+ this.columnDefs = [
46
+ {
47
+ field: 'businessDateTime', headerName: 'Business Date', flex: 1, wrapText: true, autoHeight: true, headerClass: 'ag-left-aligned-header', minWidth: 70, width: 70, tooltipField: 'businessDateTime',
48
+ valueFormatter: (params) => {
49
+ const row = params.data;
50
+ if (row && row.payinCCcode === 'Total') {
51
+ return ''; // hide date for total row
52
+ }
53
+ return params.value;
54
+ }
55
+ },
56
+ { field: 'product', headerName: 'Product', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, width: 120, tooltipField: 'product' },
57
+ { headerName: 'Is Sender Corporate', field: 'senderType', flex: 1, minWidth: 80,
58
+ valueFormatter: (params) => { if (!params.value)
59
+ return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
60
+ return 'YES'; if (value === 'INDIVIDUAL')
61
+ return 'NO'; return ''; },
62
+ tooltipValueGetter: (params) => { if (!params.value)
63
+ return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
64
+ return 'YES'; if (value === 'INDIVIDUAL')
65
+ return 'NO'; return ''; } },
66
+ { headerName: 'Is Beneficiary Corporate', field: 'beneficiaryType', flex: 1, minWidth: 80,
67
+ valueFormatter: (params) => { if (!params.value)
68
+ return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
69
+ return 'YES'; if (value === 'INDIVIDUAL')
70
+ return 'NO'; return ''; },
71
+ tooltipValueGetter: (params) => { if (!params.value)
72
+ return ''; const value = params.value.toUpperCase(); if (value === 'CORPORATE')
73
+ return 'YES'; if (value === 'INDIVIDUAL')
74
+ return 'NO'; return ''; } },
75
+ { field: 'payoutCCcode', headerName: 'Receive Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, width: 110, tooltipField: 'payoutCCcode' },
76
+ { field: 'payoutAmount', headerName: 'Receive Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payoutAmount' },
77
+ { field: 'payinCCcode', headerName: 'Send Currency', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 90, tooltipField: 'payinCCcode' },
78
+ { field: 'payinAmount', headerName: 'Send Amount', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 120, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'payinAmount' },
79
+ { field: 'transactionCommissionAmount', headerName: 'Service Fee', flex: 1, wrapText: true, autoHeight: true, minWidth: 90, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'transactionCommissionAmount' },
80
+ { field: 'tax', headerName: 'Tax', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'tax' },
81
+ { field: 'totalPayinAmount', headerName: 'Total Send Amount', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'totalPayinAmount' },
82
+ { field: 'transactionCount', headerName: 'Transaction Count', flex: 1, wrapText: true, autoHeight: true, minWidth: 80, maxWidth: 100, cellClass: 'ag-right-aligned-cell compact-cell', tooltipField: 'txnCount' },
83
+ { field: 'status', headerName: 'Transaction Status', minWidth: 100, flex: 1, wrapText: true, autoHeight: true, tooltipField: 'status' }
84
+ ];
85
+ this.defaultColDef = {
86
+ sortable: true,
87
+ filter: true,
88
+ resizable: true,
89
+ minwidth: 40,
90
+ wrapHeaderText: true,
91
+ autoHeaderHeight: true,
92
+ suppressSizeToFit: false,
93
+ wrapText: true
94
+ };
95
+ // rowClassRules = {
96
+ // debugger
97
+ // 'total-row': params => params.data?.isTotalRow
98
+ // };
99
+ this.rowClassRules = {
100
+ 'total-row': (params) => {
101
+ console.log('Row Data:', params.data.isTotalRow);
102
+ if (params.data.isTotalRow) {
103
+ return params.data?.isTotalRow;
104
+ }
105
+ }
106
+ };
107
+ this.rowData = [];
108
+ this.reportTheme = themeAlpine.withParams({
109
+ headerFontSize: '10px',
110
+ fontFamily: ['Arial', 'sans-serif'],
111
+ fontSize: '9px'
112
+ });
113
+ }
114
+ ngOnInit() {
115
+ this.loadingState = ComponentLoadingStates.Complete;
116
+ // Check if User is falcon user or fossilUser
117
+ if (sessionStorage.getItem('fossilusername')) {
118
+ this.sysUserId = sessionStorage.getItem('fossilusername');
119
+ }
120
+ else {
121
+ this.sysUserId = sessionStorage.getItem('ezremitusername');
122
+ }
123
+ this.sysUserId = this.sysUserId.replace(/^["'](.*)["']$/, '$1');
124
+ this.user = this.sysUserId;
125
+ console.log("System User Id : " + this.sysUserId);
126
+ }
127
+ filter(text) {
128
+ this.searchText = text;
129
+ if (this.searchText == null) {
130
+ return;
131
+ }
132
+ if (this.searchText?.length === 0) {
133
+ this.filteredData = structuredClone(this.dataMap);
134
+ return;
135
+ }
136
+ this.searchText = this.searchText?.trim()?.toLowerCase();
137
+ for (const [key, entries] of Object.entries(this.proxyData)) {
138
+ const filteredData = entries.filter(entry => Object.values(entry)
139
+ .some(val => {
140
+ let a = val?.toString().toLowerCase();
141
+ if (a == null) {
142
+ return false;
143
+ }
144
+ return a?.search(this.searchText) == -1 ? false : true;
145
+ }));
146
+ this.filteredData[key] = filteredData;
147
+ }
148
+ this.filteredData;
149
+ }
150
+ onGridReady(params, id) {
151
+ params.api.sizeColumnsToFit();
152
+ this.gridColumnApi = params.columnApi;
153
+ this.gridApis[id] = params.api;
154
+ params.columnApi.setColumnVisible('businessDateTime', !this.isTotalSummary);
155
+ params.api.sizeColumnsToFit();
156
+ }
157
+ handleExport(option) {
158
+ this.selectedExportOption = option;
159
+ if (!this.hasAnyGroups()) {
160
+ alert("There is no data to export based on your current filter.");
161
+ return;
162
+ }
163
+ // If no data, do nothing.
164
+ if (!this.filteredData || Object.keys(this.filteredData).length === 0) {
165
+ alert("No data to export");
166
+ return;
167
+ }
168
+ const title = "Branch Activity Send Summary";
169
+ const reportTimeFormatter = this.dateValueFormatter('dd/MM/yyyy hh:mm a');
170
+ const metadata = [
171
+ ['Report Period ', this.fromDate + " - " + this.toDate],
172
+ ['Report User & Time', this.user ? this.user + " @ " + this.reportDate : '' + " @ " + this.reportDate],
173
+ ];
174
+ // --- search criteria ---
175
+ const searchCriteria = this.searchCriteria;
176
+ //const columns = this.columnDefs;
177
+ //exclude Business Date col for Total Summary Report.
178
+ let columns = [...this.columnDefs];
179
+ const summaryReport = this.searchCriteria.find(x => x[0] === 'Summary Report:')?.[1];
180
+ if (summaryReport === 'Total Summary') {
181
+ columns = columns.filter(col => col.field !== 'businessDateTime');
182
+ }
183
+ // const data = this.dataMap;
184
+ const cleanedData = {};
185
+ Object.keys(this.dataMap).forEach(key => {
186
+ cleanedData[key] = this.dataMap[key].map(row => {
187
+ if (row.isTotalRow) {
188
+ return {
189
+ ...row,
190
+ businessDateTime: '',
191
+ product: '',
192
+ receiveCurrency: '',
193
+ receiveAmount: ''
194
+ };
195
+ }
196
+ return row;
197
+ });
198
+ });
199
+ const data = cleanedData;
200
+ const options = {
201
+ currencyFields: [
202
+ 'payoutAmount', 'payinAmount', 'transactionCommissionAmount', 'tax', 'totalPayinAmount'
203
+ ],
204
+ // specify all date fields expected
205
+ dateFields: [],
206
+ dateFieldFormats: {
207
+ txnDateAndTime: 'dd/MM/yyyy hh:mm a',
208
+ cancellationBranchDateTime: 'dd/MM/yyyy HH:mm',
209
+ cancellationBusinessDate: 'dd/MM/yyyy'
210
+ },
211
+ specialDecimalFields: {
212
+ rate: 8 // future field with 8 decimal places
213
+ },
214
+ groupByKey: true
215
+ };
216
+ switch (this.selectedExportOption) {
217
+ case 'excel':
218
+ this.exportToExcel({ title, metadata, searchCriteria, columns, data, options });
219
+ break;
220
+ case 'pdf':
221
+ this.exportService.exportToPdf({ title, metadata, searchCriteria, columns, data, options });
222
+ break;
223
+ case 'csv':
224
+ this.exportService.exportToCsv({ title, metadata, searchCriteria, columns, data, options });
225
+ break;
226
+ default:
227
+ alert("Please select an export format.");
228
+ }
229
+ }
230
+ async exportToExcel({ title, metadata, searchCriteria, columns, data, options = {} }) {
231
+ const workbook = new ExcelJS.Workbook();
232
+ const worksheet = workbook.addWorksheet(title);
233
+ // ===================== PRE CALC =====================
234
+ const headerLabels = ['Sr No', ...columns.map(col => col.headerName || col.field)];
235
+ const totalCols = headerLabels.length;
236
+ const titleStartCol = 4;
237
+ const titleColLetter = String.fromCharCode(64 + titleStartCol);
238
+ const titleMergeEnd = String.fromCharCode(64 + totalCols);
239
+ // ===================== LOGO =====================
240
+ if (this.logoBase64) {
241
+ const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
242
+ const imageId = workbook.addImage({
243
+ base64: base64Data,
244
+ extension: 'png',
245
+ });
246
+ worksheet.addImage(imageId, {
247
+ tl: { col: 0, row: 0 },
248
+ ext: { width: 145, height: 66 }
249
+ });
250
+ worksheet.getRow(1).height = 24;
251
+ worksheet.getRow(2).height = 22;
252
+ worksheet.getRow(3).height = 22;
253
+ }
254
+ // ===================== TITLE =====================
255
+ worksheet.mergeCells(`${titleColLetter}1:${titleMergeEnd}1`);
256
+ const titleCell = worksheet.getRow(1).getCell(titleStartCol);
257
+ titleCell.value = title;
258
+ titleCell.font = { bold: true, size: 16 };
259
+ titleCell.alignment = { vertical: 'middle', horizontal: 'left' };
260
+ // ===================== METADATA =====================
261
+ let metaRowStart = 4;
262
+ metadata.forEach(([label, value], idx) => {
263
+ const row = worksheet.getRow(metaRowStart + idx);
264
+ row.getCell(1).value = {
265
+ richText: [
266
+ { text: `${label} : `, font: { bold: true } },
267
+ { text: value ?? '', font: { bold: false } }
268
+ ]
269
+ };
270
+ worksheet.mergeCells(`A${row.number}:${titleMergeEnd}${row.number}`);
271
+ });
272
+ let currentRow = metaRowStart + metadata.length;
273
+ worksheet.getRow(++currentRow).height = 6;
274
+ currentRow++;
275
+ // ===================== SEARCH CRITERIA =====================
276
+ worksheet.mergeCells(currentRow, 1, currentRow, 6);
277
+ worksheet.getCell(currentRow, 1).value = 'Search Criteria:-';
278
+ worksheet.getCell(currentRow, 1).font = { bold: true };
279
+ currentRow += 2;
280
+ for (let i = 0; i < searchCriteria.length; i += 2) {
281
+ const left = searchCriteria[i];
282
+ const right = searchCriteria[i + 1];
283
+ const row = worksheet.getRow(currentRow++);
284
+ worksheet.mergeCells(row.number, 1, row.number, 3);
285
+ row.getCell(1).value = {
286
+ richText: [
287
+ { text: (left?.[0] ?? '') + ' ', font: { bold: true } },
288
+ { text: left?.[1] ?? '' }
289
+ ]
290
+ };
291
+ row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
292
+ if (right) {
293
+ worksheet.mergeCells(row.number, 4, row.number, 6);
294
+ row.getCell(4).value = {
295
+ richText: [
296
+ { text: (right?.[0] ?? '') + ' ', font: { bold: true } },
297
+ { text: right?.[1] ?? '' }
298
+ ]
299
+ };
300
+ row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
301
+ }
302
+ }
303
+ currentRow++;
304
+ // ===================== HEADER ROW =====================
305
+ const headerRow = worksheet.getRow(currentRow++);
306
+ headerLabels.forEach((header, i) => {
307
+ const cell = headerRow.getCell(i + 1);
308
+ cell.value = header;
309
+ cell.font = { bold: true };
310
+ cell.fill = {
311
+ type: 'pattern',
312
+ pattern: 'solid',
313
+ fgColor: { argb: 'D9D9D9' }
314
+ };
315
+ cell.alignment = { vertical: 'middle', horizontal: 'center' };
316
+ cell.border = {
317
+ top: { style: 'thin' },
318
+ bottom: { style: 'thin' },
319
+ left: { style: 'thin' },
320
+ right: { style: 'thin' }
321
+ };
322
+ });
323
+ headerRow.eachCell((cell) => {
324
+ if (cell.value === 'Transaction Count') {
325
+ cell.value = 'Transaction\nCount';
326
+ cell.alignment = {
327
+ horizontal: 'center',
328
+ vertical: 'middle',
329
+ wrapText: true
330
+ };
331
+ }
332
+ });
333
+ // ===================== DATA SECTION =====================
334
+ let rowIdx = currentRow;
335
+ let serialNumber = 1;
336
+ if (options.groupByKey && !Array.isArray(data)) {
337
+ for (const [group, items] of Object.entries(data)) {
338
+ const groupRow = worksheet.getRow(rowIdx++);
339
+ groupRow.getCell(1).value = group;
340
+ groupRow.font = { bold: true };
341
+ worksheet.mergeCells(`A${groupRow.number}:${titleMergeEnd}${groupRow.number}`);
342
+ items.forEach((item) => {
343
+ const rowData = this.prepareTableRows([item], columns, options)[0];
344
+ const dataRow = worksheet.getRow(rowIdx++);
345
+ const fullRow = [
346
+ !item?.isTotalRow ? serialNumber++ : '',
347
+ ...rowData
348
+ ];
349
+ fullRow.forEach((val, cIdx) => {
350
+ const cell = dataRow.getCell(cIdx + 1);
351
+ // cell.value = val;
352
+ //added by bharati for
353
+ const field = columns[cIdx - 1]?.field;
354
+ // ✅ Amount fields (Receive Amount, Send Amount, Total Send Amount etc.)
355
+ /*
356
+ if (
357
+ field=='totalPayinAmount'||
358
+ field=='payinAmount'||
359
+ field === 'transactionCommissionAmount' ||
360
+ field === 'tax'
361
+ ) {
362
+ if (val !== '' && val !== null && val !== undefined) {
363
+ cell.value = Number(val);
364
+ cell.numFmt = '#,##0.000';
365
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
366
+ } else {
367
+ cell.value = '';
368
+ }
369
+ }
370
+ else {
371
+ cell.value = val;
372
+ } */
373
+ if (item?.isTotalRow && field === 'receiveAmount') {
374
+ cell.value = '';
375
+ }
376
+ else if (field?.toLowerCase().includes('amount') ||
377
+ field === 'serviceFee' ||
378
+ field === 'tax') {
379
+ if (val !== '' && val !== null && val !== undefined) {
380
+ cell.value = val; // already number
381
+ cell.numFmt = '#,##0.000'; // Excel formatting
382
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
383
+ }
384
+ else {
385
+ cell.value = '';
386
+ }
387
+ }
388
+ else {
389
+ cell.value = val;
390
+ }
391
+ cell.border = {
392
+ top: { style: 'thin' },
393
+ bottom: { style: 'thin' },
394
+ left: { style: 'thin' },
395
+ right: { style: 'thin' }
396
+ };
397
+ });
398
+ if (item?.isTotalRow) {
399
+ dataRow.eachCell(cell => {
400
+ cell.font = {
401
+ ...cell.font,
402
+ bold: true,
403
+ size: 12
404
+ };
405
+ });
406
+ }
407
+ });
408
+ }
409
+ }
410
+ else {
411
+ this.prepareTableRows(data, columns, options)
412
+ .forEach((rowData, index) => {
413
+ const dataRow = worksheet.getRow(rowIdx++);
414
+ const originalItem = data[index];
415
+ const fullRow = [
416
+ !originalItem?.isTotalRow ? serialNumber++ : '',
417
+ ...rowData
418
+ ];
419
+ fullRow.forEach((val, cIdx) => {
420
+ const cell = dataRow.getCell(cIdx + 1);
421
+ //cell.value = val;
422
+ /* if (cIdx === 0) {
423
+ cell.value = val;
424
+ } else {
425
+
426
+ const field = columns[cIdx - 1]?.field;
427
+
428
+ if (
429
+ field=='totalPayinAmount'||
430
+ field=='payinAmount'||
431
+ field === 'transactionCommissionAmount' ||
432
+ field === 'tax'
433
+ ) {
434
+ cell.value = Number(val);
435
+ cell.numFmt = '#,##0.000';
436
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
437
+ }
438
+ else {
439
+ cell.value = val;
440
+ }
441
+ } */
442
+ const field = columns[cIdx - 1]?.field;
443
+ if (cIdx === 0) {
444
+ cell.value = val;
445
+ }
446
+ else if (originalItem?.isTotalRow && field === 'receiveAmount') {
447
+ cell.value = '';
448
+ }
449
+ else if (field?.toLowerCase().includes('amount') ||
450
+ field === 'serviceFee' ||
451
+ field === 'tax') {
452
+ if (val !== '' && val !== null && val !== undefined) {
453
+ cell.value = val; // already number
454
+ cell.numFmt = '#,##0.000'; // Excel formatting
455
+ cell.alignment = { horizontal: 'right', vertical: 'middle' };
456
+ }
457
+ else {
458
+ cell.value = '';
459
+ }
460
+ }
461
+ else {
462
+ cell.value = val;
463
+ }
464
+ cell.border = {
465
+ top: { style: 'thin' },
466
+ bottom: { style: 'thin' },
467
+ left: { style: 'thin' },
468
+ right: { style: 'thin' }
469
+ };
470
+ });
471
+ if (originalItem?.isTotalRow) {
472
+ dataRow.eachCell(cell => {
473
+ cell.font = {
474
+ ...cell.font,
475
+ bold: true,
476
+ size: 12
477
+ };
478
+ });
479
+ }
480
+ });
481
+ }
482
+ // ===================== AUTO WIDTH =====================
483
+ for (let i = 1; i <= totalCols; i++) {
484
+ let maxLength = 10;
485
+ worksheet.eachRow({ includeEmpty: true }, (row) => {
486
+ const cell = row.getCell(i);
487
+ if (cell.isMerged)
488
+ return;
489
+ let cellValue = '';
490
+ if (cell.value == null) {
491
+ cellValue = '';
492
+ }
493
+ else if (typeof cell.value === 'object' && 'richText' in cell.value) {
494
+ cellValue = cell.value.richText.map(rt => rt.text).join('');
495
+ }
496
+ else {
497
+ cellValue = cell.value.toString();
498
+ }
499
+ maxLength = Math.max(maxLength, cellValue.length);
500
+ });
501
+ worksheet.getColumn(i).width = Math.min(maxLength, 50);
502
+ }
503
+ //new code:bharati
504
+ worksheet.columns.forEach((column, index) => {
505
+ if (index === 0)
506
+ return; // skip Sr No
507
+ const field = columns[index - 1]?.field;
508
+ if (field === 'payinAmount') {
509
+ column.width = 14;
510
+ }
511
+ if (field === 'payoutAmount') {
512
+ column.width = 15;
513
+ }
514
+ if (field === 'transactionCount') {
515
+ column.width = 14;
516
+ }
517
+ });
518
+ // worksheet.columns.forEach((column) => {
519
+ // if (column.header === 'Send Amount') {
520
+ // column.width = 25;
521
+ // }
522
+ // });
523
+ // ===================== SAVE FILE =====================
524
+ const buffer = await workbook.xlsx.writeBuffer();
525
+ FileSaver.saveAs(new Blob([buffer], {
526
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
527
+ }), title.replace(/\s/g, '-') + '.xlsx');
528
+ }
529
+ // private prepareTableRows(data: any[], columns: any[], options: ExportOptions = {}): any[][] {
530
+ // const {
531
+ // excludeFields = [],
532
+ // currencyFields = [],
533
+ // dateFields = [],
534
+ // dateFieldFormats = {},
535
+ // specialDecimalFields = {}
536
+ // } = options;
537
+ // const filtered = columns.filter(c =>
538
+ // c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f))
539
+ // );
540
+ // return data.map((row) => ([
541
+ // ...filtered.map(col => {
542
+ // let value = row[col.field];
543
+ // // Format date fields with custom formats if specified
544
+ // if (col.field && (dateFields.includes(col.field) || col.field in dateFieldFormats)) {
545
+ // const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
546
+ // value = this.formatDateByFormat(value, format);
547
+ // }
548
+ // // Format special decimal fields with specific decimals
549
+ // else if (col.field && col.field in specialDecimalFields && value != null) {
550
+ // const decimals = specialDecimalFields[col.field];
551
+ // value = parseFloat(value).toFixed(decimals);
552
+ // }
553
+ // // Format regular currency fields with 3 decimals
554
+ // else if (col.field && currencyFields.includes(col.field) && value != null) {
555
+ // value = parseFloat(value).toFixed(3);
556
+ // }
557
+ // return value ?? '';
558
+ // })
559
+ // ]));
560
+ // }
561
+ prepareTableRows(data, columns, options = {}) {
562
+ const { excludeFields = [], currencyFields = [], dateFields = [], dateFieldFormats = {}, specialDecimalFields = {} } = options;
563
+ const filtered = columns.filter(c => c.field && !excludeFields.some(f => c.field.toLowerCase().includes(f)));
564
+ return data.map((row) => ([
565
+ ...filtered.map(col => {
566
+ let value = row[col.field];
567
+ // ✅ Date formatting (keep as string)
568
+ if (col.field &&
569
+ (dateFields.includes(col.field) || col.field in dateFieldFormats)) {
570
+ const format = dateFieldFormats[col.field] || 'dd/MM/yyyy';
571
+ value = this.formatDateByFormat(value, format);
572
+ }
573
+ // ✅ Special decimal fields → return NUMBER (no toFixed)
574
+ else if (col.field &&
575
+ col.field in specialDecimalFields &&
576
+ value != null) {
577
+ value = Number(value);
578
+ }
579
+ // ✅ Currency fields → return NUMBER (no toFixed)
580
+ else if (col.field &&
581
+ currencyFields.includes(col.field) &&
582
+ value != null) {
583
+ value = Number(value);
584
+ }
585
+ return value ?? '';
586
+ })
587
+ ]));
588
+ }
589
+ formatDateByFormat(val, format) {
590
+ // Helper to pad single digits
591
+ const pad = (n) => n.toString().padStart(2, '0');
592
+ // Parse date for "DD/MM/YYYY hh:mm AM/PM" format manually
593
+ if (typeof val === 'string' && /^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2} [AP]M$/.test(val)) {
594
+ const parts = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}) ([AP]M)$/);
595
+ if (!parts)
596
+ return '';
597
+ let [, dd, mm, yyyy, hh, min, ampm] = parts;
598
+ let hours = parseInt(hh, 10);
599
+ if (ampm === 'PM' && hours !== 12)
600
+ hours += 12;
601
+ if (ampm === 'AM' && hours === 12)
602
+ hours = 0;
603
+ val = new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10), hours, parseInt(min, 10));
604
+ }
605
+ else {
606
+ val = new Date(val);
607
+ }
608
+ if (isNaN(val.getTime()))
609
+ return '';
610
+ const dt = val;
611
+ switch (format) {
612
+ case 'dd/MM/yyyy hh:mm a': { // 11/07/2025 10:56 PM
613
+ let hours12 = dt.getHours() % 12 || 12;
614
+ let ampm = dt.getHours() >= 12 ? 'PM' : 'AM';
615
+ return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(hours12)}:${pad(dt.getMinutes())} ${ampm}`;
616
+ }
617
+ case 'dd/MM/yyyy HH:mm': { // 28/07/2025 13:08
618
+ return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()} ${pad(dt.getHours())}:${pad(dt.getMinutes())}`;
619
+ }
620
+ case 'dd/MM/yyyy': { // 28/07/2025
621
+ return `${pad(dt.getDate())}/${pad(dt.getMonth() + 1)}/${dt.getFullYear()}`;
622
+ }
623
+ default:
624
+ return dt.toLocaleString();
625
+ }
626
+ }
627
+ dateValueFormatter(format) {
628
+ return (params) => {
629
+ if (!params.value)
630
+ return '';
631
+ try {
632
+ return formatDate(params.value, format, 'en-US');
633
+ }
634
+ catch {
635
+ return '';
636
+ }
637
+ };
638
+ }
639
+ getKeys(obj) {
640
+ return obj ? Object.keys(obj) : [];
641
+ }
642
+ hasAnyGroups() {
643
+ return this.filteredData && this.getKeys(this.filteredData).length > 0;
644
+ }
645
+ formatAmount(params) {
646
+ const value = params?.value;
647
+ if (value !== null && value !== undefined && value !== '') {
648
+ const num = Number(value);
649
+ return (Math.trunc(num * 1000) / 1000).toFixed(3);
650
+ }
651
+ return '';
652
+ }
653
+ handleSearch(criteria) {
654
+ this.searchCriteria = criteria.searchCriteria;
655
+ this.reportDate = new Date().toISOString();
656
+ this.reportDate = formatDate(this.reportDate, 'dd/MM/yyyy hh:mm a', 'en-US');
657
+ const modal = criteria.modal;
658
+ this.user = criteria.sysUserID;
659
+ this.fromDate = formatDate(modal.fromDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
660
+ this.toDate = formatDate(modal.toDate, 'dd/MM/yyyy hh:mm a', 'en-US').slice(0, 10);
661
+ console.log(modal);
662
+ // Code For Meta Data
663
+ this.leftData = {
664
+ 'Report Period': this.fromDate + " - " + this.toDate,
665
+ };
666
+ this.metaDataTwo = {
667
+ 'Report User & Time': this.user + " @ " + this.reportDate,
668
+ };
669
+ const isTotalSummary = modal.summaryReport === 'Total Summary';
670
+ this.isTotalSummary = isTotalSummary;
671
+ const searchData = {
672
+ "StartDate": modal.fromDate,
673
+ "EndDate": modal.toDate,
674
+ "SendCountryCode": modal.sendCountry,
675
+ "RecvCountryCode": modal.receiveCountry,
676
+ "BusinessPartnerCode": modal.client,
677
+ "TransactionStatus": modal.transactionStatus.join(","),
678
+ "PayoutCurrency": modal.receiveCurrency,
679
+ "TransactionType": modal.product,
680
+ "BranchCode": modal.branch,
681
+ "SummaryReport": modal.summaryReport
682
+ };
683
+ this.showMessage = true;
684
+ this.clearSearch = true;
685
+ this.loadingState = ComponentLoadingStates.Loading;
686
+ this.reportService.getBranchActivitySendSummaryReport(searchData).subscribe({
687
+ next: (data) => {
688
+ console.log(data);
689
+ this.dataMap = JSON.parse(JSON.stringify(data));
690
+ this.filteredData = data;
691
+ this.noDataFound = Object.keys(this.filteredData).length == 0 ? true : false;
692
+ this.proxyData = structuredClone(data);
693
+ this.paginationArray = new Array(Object.keys(this.filteredData).length).fill(15);
694
+ this.showMessage = Object.keys(this.filteredData).length == 0 ? true : false;
695
+ this.showReport = true;
696
+ },
697
+ error: (err) => {
698
+ this.loadingState = ComponentLoadingStates.Complete;
699
+ this.clearSearch = false;
700
+ },
701
+ complete: () => {
702
+ this.loadingState = ComponentLoadingStates.Complete;
703
+ this.showReport = true;
704
+ this.clearSearch = false;
705
+ }
706
+ });
707
+ }
708
+ handleFormValid(isValid) {
709
+ this.isFormValid = isValid;
710
+ }
711
+ }
712
+ BranchActivitySendSummaryReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, deps: [{ token: i1.ReportService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
713
+ BranchActivitySendSummaryReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BranchActivitySendSummaryReportComponent, selector: "lib-branch-activity-send-summary-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!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}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"], dependencies: [{ kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PageSizeSelectorComponent, selector: "lib-page-size-selector", inputs: ["pageSizeArray", "defaultSize", "totalEntries", "gridApi"] }, { kind: "component", type: i5.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i6.NgbAccordion, selector: "ngb-accordion", inputs: ["animation", "activeIds", "closeOthers", "destroyOnHide", "type"], outputs: ["panelChange", "shown", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i6.NgbPanel, selector: "ngb-panel", inputs: ["disabled", "id", "title", "type", "cardClass"], outputs: ["shown", "hidden"] }, { kind: "directive", type: i6.NgbPanelTitle, selector: "ng-template[ngbPanelTitle]" }, { kind: "directive", type: i6.NgbPanelContent, selector: "ng-template[ngbPanelContent]" }, { kind: "component", type: i7.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i8.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName", "initialFilters"], outputs: ["searchClicked", "formValid"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }] });
714
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BranchActivitySendSummaryReportComponent, decorators: [{
715
+ type: Component,
716
+ args: [{ selector: 'lib-branch-activity-send-summary-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\"\r\n (formValid)=\"handleFormValid($event)\">\r\n</lib-search-filter >\r\n<app-loader class=\"\" *ngIf=\"loadingState == ComponentLoadingState.Loading\"></app-loader>\r\n\r\n<section *ngIf=\"showReport && isFormValid && !clearSearch\" class=\"my-2\">\r\n <ng-container *ngIf=\"!noDataFound\">\r\n <lib-metadata [reportName]=\"ReportName\" [showmetaDataOne]=\"true\" [showmetaDataTwo]=\"true\" [metaDataOne]=\"leftData\" [metaDataTwo]=\"metaDataTwo\"(exportEvent)=\"handleExport($event)\" (searchEvent)=\"filter($event)\"></lib-metadata>\r\n\r\n <ngb-accordion #acc=\"ngbAccordion\" [closeOthers]=\"false\">\r\n <ng-container *ngFor=\"let item of filteredData | keyvalue; let i = index\">\r\n <ngb-panel *ngIf=\"item.value.length > 0\" [id]=\"'panel-' + i\">\r\n\r\n <ng-template ngbPanelTitle style=\"height: 10%;\">\r\n <label\r\n class=\"panel-cls\">{{\r\n item.key\r\n }}</label>\r\n </ng-template>\r\n\r\n <ng-template ngbPanelContent>\r\n <div style=\"position: relative;\">\r\n <lib-page-size-selector [totalEntries]=\"item?.value?.length\"\r\n [defaultSize]=\"'15'\" [gridApi]=\"gridApis[i]\">\r\n ></lib-page-size-selector>\r\n\r\n <ag-grid-angular class=\"ag-theme-alpine transaction-grid\" style=\"width: 100%;height: 380px;\"\r\n [columnDefs]=\"columnDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [rowData]=\"item.value\" \r\n [rowHeight]=\"20\"\r\n [headerHeight]=\"22\"\r\n [pagination]=\"true\" \r\n [paginationPageSize]=\"paginationArray[i]\" \r\n [rowClassRules]=\"rowClassRules\"\r\n (gridReady)=\"onGridReady($event,i)\"\r\n >\r\n </ag-grid-angular>\r\n </div>\r\n </ng-template>\r\n\r\n </ngb-panel>\r\n </ng-container>\r\n </ngb-accordion>\r\n </ng-container>\r\n <div class=\"alert alert-warning mt-3\" *ngIf=\"noDataFound\">\r\n No Data found matching your search criteria.\r\n </div>\r\n</section>", styles: [".btn-report{border-radius:4px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:110px;margin:0 0 0 20px!important;padding:4px 15px!important}.tooltip-block{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid #ccc!important}.dpicker{border:1px solid #ccc!important;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"!important;font-size:12px!important;font-weight:400!important;height:32px!important}.dpicker:focus{box-shadow:0 0 5px 3px #1877f2!important}.cal{height:32px!important;background-color:#1877f2!important}.cal:focus{box-shadow:none!important}.input-group-button{background:none;border:1px solid #0081c6;background-color:#0081c6;border-radius:0 3px 3px 0;min-width:35px;margin-left:1px;cursor:pointer}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.label-data{font-weight:600!important;font-size:.7rem!important;line-height:1rem}.meta-td{padding:0!important}.title{text-align:center;font-size:18px;font-weight:700!important}.export-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important;margin-right:-1;margin-left:.4rem}.opt-cls{display:block;height:100%;width:5rem;border:1px solid #ccc!important;border-radius:4px!important;margin-right:1rem!important;outline:none!important}.opt-cls:focus{box-shadow:0 0 5px 3px #1877f2}.export-selector{height:2rem!important;width:100%}.search-btn{height:32px!important;height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-btn:hover{background-color:#8091a5}.search-icon{height:16px;width:16px;object-fit:contain}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.searchBox{margin-right:auto;display:flex}table{width:100%;border-collapse:separate;margin-bottom:0!important;table-layout:fixed!important}td{padding:0 1rem 6px 0!important;border-right:0 solid #ffffff!important;background-color:#fff!important}.row-cls{height:2.5rem!important}.inputbox{padding-left:1rem;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Liberation Sans,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\"}::ng-deep .ng-select.ng-select-single .ng-select-container{height:32px I!important}::ng-deep .ng-select.ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;overflow-y:auto;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container{max-height:32px!important;overflow-x:auto!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-multiple .ng-select-container .ng-value-container .ng-value{max-width:200px!important;overflow:hidden!important;text-overflow:hidden!important;white-space:nowrap!important}::ng-deep .ng-select .ng-select-container{cursor:default;display:flex;outline:none;overflow:hidden;position:relative;width:100%}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{box-sizing:border-box;cursor:pointer;display:block;white-space:nowrap;overflow-x:scroll!important;text-overflow:clip!important}::ng-deep .ng-dropdown-panel .ng-dropdown-panel-items .ng-option::-webkit-scrollbar{display:none!important;width:0!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}::ng-deep .ng-select .ng-select-container,::ng-deep .ng-select.ng-select-single .ng-select-container,::ng-deep .ng-select.ng-select-multiple .ng-select-container{min-height:32px!important;height:32px!important;font-size:12px!important}.panel-cls{font-weight:700;font-size:13px;line-height:1.2;margin:0;padding:2px 0;color:#16181e}.transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important;font-weight:500!important}.transaction-grid ::ng-deep .ag-row.total-row .ag-cell{font-weight:700!important;font-size:11px!important}\n"] }]
717
+ }], ctorParameters: function () { return [{ type: i1.ReportService }, { type: i0.NgZone }]; } });
718
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmNoLWFjdGl2aXR5LXNlbmQtc3VtbWFyeS1yZXBvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0L2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUUxRixnREFBZ0Q7QUFDaEQsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRiw4RkFBOEY7QUFDOUYsOENBQThDO0FBQzlDLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDM0IsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyx3Q0FBd0M7SUE0Rm5ELFlBQW9CLGFBQTRCLEVBQVUsTUFBYztRQUFwRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFdB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LElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7WUFFRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDO2dCQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBZ0I7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQzs7cUlBbHpCVSx3Q0FBd0M7eUhBQXhDLHdDQUF3QywrRUN4QnJELDJyRUFrRFU7MkZEMUJHLHdDQUF3QztrQkFMcEQsU0FBUzsrQkFDRSx5Q0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyIgaW1wb3J0IHsgQ29tcG9uZW50LCBOZ1pvbmUsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAvLyBpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiBpbXBvcnQgeyBDb2xEZWYsIEdyaWRBcGksIEdyaWRSZWFkeUV2ZW50IH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG4gaW1wb3J0IHsgdGhlbWVBbHBpbmUgfSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvdGhlbWluZyc7XHJcbmltcG9ydCB7IEJyYW5jaEFjdGl2aXR5UmVwb3J0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2JyYW5jaC1hY3Rpdml0eS1yZXBvcnQvYnJhbmNoLWFjdGl2aXR5LXNlbmQtcmVwb3J0JztcclxuaW1wb3J0IHsgQ29tcG9uZW50TG9hZGluZ1N0YXRlcyB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb25lbnQtbG9hZGluZy1zdGF0ZXMnO1xyXG5pbXBvcnQgeyBFeHBvcnRPcHRpb25zLCBHZW5lcmljRXhwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9leHBvcnQtZ2VuZXJpYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbi8vIGltcG9ydCB7IENvbXBvbmVudExvYWRpbmdTdGF0ZXMgfSBmcm9tICdzcmMvYXBwL21vZGVscy9jb21wb25lbnQtbG9hZGluZy1zdGF0ZXMnO1xyXG4vLyBpbXBvcnQgeyBHZW5lcmljRXhwb3J0U2VydmljZSB9IGZyb20gJ3NyYy9hcHAvc2hhcmVkL2V4cG9ydC1nZW5lcmljLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBFeHBvcnRPcHRpb25zIH0gZnJvbSAncHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvZXhwb3J0LWdlbmVyaWMuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuLy8gaW1wb3J0IGpzUERGIGZyb20gJ2pzcGRmJztcclxuLy8gaW1wb3J0ICdqc3BkZi1hdXRvdGFibGUnO1xyXG4gaW1wb3J0ICogYXMgRXhjZWxKUyBmcm9tICdleGNlbGpzJztcclxuIGltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JyYW5jaC1hY3Rpdml0eS1zZW5kLXN1bW1hcnktcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9icmFuY2gtYWN0aXZpdHktc2VuZC1zdW1tYXJ5LXJlcG9ydC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmFuY2hBY3Rpdml0eVNlbmRTdW1tYXJ5UmVwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBkYXRhTWFwOiBSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPiA9IHt9XHJcbiAgZmlsdGVyZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPiA9IHt9XHJcbiAgcHJveHlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBCcmFuY2hBY3Rpdml0eVJlcG9ydFtdPiA9IHt9XHJcbiAgc2hvd1JlcG9ydDogYm9vbGVhbjtcclxuICBwYWdpbmF0aW9uQXJyYXk6IGFueVtdO1xyXG4gIHNlbGVjdGVkRXhwb3J0T3B0aW9uID0gJ2V4Y2VsJztcclxuICBncmlkQXBpczogR3JpZEFwaVtdID0gW107XHJcbiAgZ3JpZENvbHVtbkFwaTtcclxuICB1c2VyOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHJlcG9ydERhdGU6IHN0cmluZztcclxuICBmcm9tRGF0ZTogc3RyaW5nO1xyXG4gIHRvRGF0ZTogc3RyaW5nO1xyXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcclxuICBidWZmZXI6IGFueTtcclxuICBzeXNVc2VySWQ6IHN0cmluZztcclxuICBwcml2YXRlIGxvZ29CYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBDb21wb25lbnRMb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzO1xyXG4gIGxvYWRpbmdTdGF0ZTogQ29tcG9uZW50TG9hZGluZ1N0YXRlcyA9IENvbXBvbmVudExvYWRpbmdTdGF0ZXMuTG9hZGluZztcclxuICBSZXBvcnROYW1lOiBzdHJpbmcgPSBcIkJyYW5jaCBBY3Rpdml0eSBTZW5kIFN1bW1hcnlcIjtcclxuICBsZWZ0RGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBtZXRhRGF0YVR3bzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBleHBvcnRTZXJ2aWNlOiBHZW5lcmljRXhwb3J0U2VydmljZSA9IGluamVjdChHZW5lcmljRXhwb3J0U2VydmljZSk7XHJcbiAgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xyXG5cclxuICAvLyBmbGFnc1xyXG4gIHNob3dNZXNzYWdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbm9EYXRhRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0Zvcm1WYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNsZWFyU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNUb3RhbFN1bW1hcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjb2x1bW5EZWZzOiBDb2xEZWY8QnJhbmNoQWN0aXZpdHlSZXBvcnQ+W10gPSBbXHJcblxyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ2J1c2luZXNzRGF0ZVRpbWUnLCBoZWFkZXJOYW1lOiAnQnVzaW5lc3MgRGF0ZScsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBoZWFkZXJDbGFzczogJ2FnLWxlZnQtYWxpZ25lZC1oZWFkZXInLCBtaW5XaWR0aDogNzAsIHdpZHRoOiA3MCwgdG9vbHRpcEZpZWxkOiAnYnVzaW5lc3NEYXRlVGltZScsXHJcbiAgICAgIHZhbHVlRm9ybWF0dGVyOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gcGFyYW1zLmRhdGEgYXMgQnJhbmNoQWN0aXZpdHlSZXBvcnQgfCBudWxsO1xyXG5cclxuICAgICAgICBpZiAocm93ICYmIHJvdy5wYXlpbkNDY29kZSA9PT0gJ1RvdGFsJykge1xyXG4gICAgICAgICAgcmV0dXJuICcnOyAvLyBoaWRlIGRhdGUgZm9yIHRvdGFsIHJvd1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcy52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHsgZmllbGQ6ICdwcm9kdWN0JywgaGVhZGVyTmFtZTogJ1Byb2R1Y3QnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDgwLCB3aWR0aDogMTIwLCB0b29sdGlwRmllbGQ6ICdwcm9kdWN0JyB9LFxyXG4gICAgeyBoZWFkZXJOYW1lOiAnSXMgU2VuZGVyIENvcnBvcmF0ZScsIGZpZWxkOiAnc2VuZGVyVHlwZScsIGZsZXg6IDEsIG1pbldpZHRoOiA4MCwgXHJcbiAgICAgIHZhbHVlRm9ybWF0dGVyOiAocGFyYW1zKSA9PiB7IGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7IGNvbnN0IHZhbHVlID0gcGFyYW1zLnZhbHVlLnRvVXBwZXJDYXNlKCk7IGlmICh2YWx1ZSA9PT0gJ0NPUlBPUkFURScpIHJldHVybiAnWUVTJzsgaWYgKHZhbHVlID09PSAnSU5ESVZJRFVBTCcpIHJldHVybiAnTk8nOyByZXR1cm4gJyc7IH0sXHJcbiAgICAgIHRvb2x0aXBWYWx1ZUdldHRlcjogKHBhcmFtcykgPT4geyBpZiAoIXBhcmFtcy52YWx1ZSkgcmV0dXJuICcnOyBjb25zdCB2YWx1ZSA9IHBhcmFtcy52YWx1ZS50b1VwcGVyQ2FzZSgpOyBpZiAodmFsdWUgPT09ICdDT1JQT1JBVEUnKSByZXR1cm4gJ1lFUyc7IGlmICh2YWx1ZSA9PT0gJ0lORElWSURVQUwnKSByZXR1cm4gJ05PJzsgcmV0dXJuICcnOyB9IH0sXHJcbiAgICB7IGhlYWRlck5hbWU6ICdJcyBCZW5lZmljaWFyeSBDb3Jwb3JhdGUnLCBmaWVsZDogJ2JlbmVmaWNpYXJ5VHlwZScsIGZsZXg6IDEsIG1pbldpZHRoOiA4MCxcclxuICAgICAgdmFsdWVGb3JtYXR0ZXI6IChwYXJhbXMpID0+IHsgaWYgKCFwYXJhbXMudmFsdWUpIHJldHVybiAnJzsgY29uc3QgdmFsdWUgPSBwYXJhbXMudmFsdWUudG9VcHBlckNhc2UoKTsgaWYgKHZhbHVlID09PSAnQ09SUE9SQVRFJykgcmV0dXJuICdZRVMnOyBpZiAodmFsdWUgPT09ICdJTkRJVklEVUFMJykgcmV0dXJuICdOTyc7IHJldHVybiAnJzsgfSxcclxuICAgICAgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zKSA9PiB7IGlmICghcGFyYW1zLnZhbHVlKSByZXR1cm4gJyc7IGNvbnN0IHZhbHVlID0gcGFyYW1zLnZhbHVlLnRvVXBwZXJDYXNlKCk7IGlmICh2YWx1ZSA9PT0gJ0NPUlBPUkFURScpIHJldHVybiAnWUVTJzsgaWYgKHZhbHVlID09PSAnSU5ESVZJRFVBTCcpIHJldHVybiAnTk8nOyByZXR1cm4gJyc7IH0gfSxcclxuICAgIHsgZmllbGQ6ICdwYXlvdXRDQ2NvZGUnLCBoZWFkZXJOYW1lOiAnUmVjZWl2ZSBDdXJyZW5jeScsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogOTAsIHdpZHRoOiAxMTAsIHRvb2x0aXBGaWVsZDogJ3BheW91dENDY29kZScgfSxcclxuICAgIHsgZmllbGQ6ICdwYXlvdXRBbW91bnQnLCBoZWFkZXJOYW1lOiAnUmVjZWl2ZSBBbW91bnQnLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogMTIwLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAncGF5b3V0QW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3BheWluQ0Njb2RlJywgaGVhZGVyTmFtZTogJ1NlbmQgQ3VycmVuY3knLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgbWluV2lkdGg6IDkwLCBtYXhXaWR0aDogOTAsIHRvb2x0aXBGaWVsZDogJ3BheWluQ0Njb2RlJyB9LFxyXG4gICAgeyBmaWVsZDogJ3BheWluQW1vdW50JywgaGVhZGVyTmFtZTogJ1NlbmQgQW1vdW50JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA4MCwgbWF4V2lkdGg6IDEyMCwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3BheWluQW1vdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcsIGhlYWRlck5hbWU6ICdTZXJ2aWNlIEZlZScsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogOTAsIG1heFdpZHRoOiAxMDAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnIH0sXHJcbiAgICB7IGZpZWxkOiAndGF4JywgaGVhZGVyTmFtZTogJ1RheCcsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBtaW5XaWR0aDogODAsIG1heFdpZHRoOiAxMDAsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCBjb21wYWN0LWNlbGwnLCB0b29sdGlwRmllbGQ6ICd0YXgnIH0sXHJcbiAgICB7IGZpZWxkOiAndG90YWxQYXlpbkFtb3VudCcsIGhlYWRlck5hbWU6ICdUb3RhbCBTZW5kIEFtb3VudCcsIG1pbldpZHRoOiAxMDAsIGZsZXg6IDEsIHdyYXBUZXh0OiB0cnVlLCBhdXRvSGVpZ2h0OiB0cnVlLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwgY29tcGFjdC1jZWxsJywgdG9vbHRpcEZpZWxkOiAndG90YWxQYXlpbkFtb3VudCcgfSxcclxuICAgIHsgZmllbGQ6ICd0cmFuc2FjdGlvbkNvdW50JywgaGVhZGVyTmFtZTogJ1RyYW5zYWN0aW9uIENvdW50JywgZmxleDogMSwgd3JhcFRleHQ6IHRydWUsIGF1dG9IZWlnaHQ6IHRydWUsIG1pbldpZHRoOiA4MCwgbWF4V2lkdGg6IDEwMCwgY2VsbENsYXNzOiAnYWctcmlnaHQtYWxpZ25lZC1jZWxsIGNvbXBhY3QtY2VsbCcsIHRvb2x0aXBGaWVsZDogJ3R4bkNvdW50JyB9LFxyXG4gICAgeyBmaWVsZDogJ3N0YXR1cycsIGhlYWRlck5hbWU6ICdUcmFuc2FjdGlvbiBTdGF0dXMnLCBtaW5XaWR0aDogMTAwLCBmbGV4OiAxLCB3cmFwVGV4dDogdHJ1ZSwgYXV0b0hlaWdodDogdHJ1ZSwgdG9vbHRpcEZpZWxkOiAnc3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcblxyXG4gIGRlZmF1bHRDb2xEZWYgPSB7XHJcbiAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgIG1pbndpZHRoOiA0MCxcclxuICAgIHdyYXBIZWFkZXJUZXh0OiB0cnVlLFxyXG4gICAgYXV0b0hlYWRlckhlaWdodDogdHJ1ZSxcclxuICAgIHN1cHByZXNzU2l6ZVRvRml0OiBmYWxzZSxcclxuICAgIHdyYXBUZXh0OiB0cnVlXHJcbiAgfTtcclxuXHJcbiAgLy8gcm93Q2xhc3NSdWxlcyA9IHtcclxuICAvLyAgIGRlYnVnZ2VyXHJcbiAgLy8gICAndG90YWwtcm93JzogcGFyYW1zID0+IHBhcmFtcy5kYXRhPy5pc1RvdGFsUm93XHJcbiAgLy8gfTtcclxuXHJcbiAgcm93Q2xhc3NSdWxlcyA9IHtcclxuICAgICd0b3RhbC1yb3cnOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdSb3cgRGF0YTonLCBwYXJhbXMuZGF0YS5pc1RvdGFsUm93KTtcclxuICAgICAgaWYgKHBhcmFtcy5kYXRhLmlzVG90YWxSb3cpIHtcclxuICAgICAgICByZXR1cm4gcGFyYW1zLmRhdGE/LmlzVG90YWxSb3c7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcm93RGF0YTogQnJhbmNoQWN0aXZpdHlSZXBvcnRbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlcG9ydFNlcnZpY2U6IFJlcG9ydFNlcnZpY2UsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICByZXBvcnRUaGVtZSA9IHRoZW1lQWxwaW5lLndpdGhQYXJhbXMoe1xyXG4gICAgaGVhZGVyRm9udFNpemU6ICcxMHB4JyxcclxuICAgIGZvbnRGYW1pbHk6IFsnQXJpYWwnLCAnc2Fucy1zZXJpZiddLFxyXG4gICAgZm9udFNpemU6ICc5cHgnXHJcbiAgfSk7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgLy8gQ2hlY2sgaWYgVXNlciBpcyBmYWxjb24gdXNlciBvciBmb3NzaWxVc2VyXHJcbiAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9zc2lsdXNlcm5hbWUnKSkge1xyXG4gICAgICB0aGlzLnN5c1VzZXJJZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvc3NpbHVzZXJuYW1lJylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnN5c1VzZXJJZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2V6cmVtaXR1c2VybmFtZScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zeXNVc2VySWQgPSB0aGlzLnN5c1VzZXJJZC5yZXBsYWNlKC9eW1wiJ10oLiopW1wiJ10kLywgJyQxJyk7XHJcbiAgICB0aGlzLnVzZXIgPSB0aGlzLnN5c1VzZXJJZDtcclxuICAgIGNvbnNvbGUubG9nKFwiU3lzdGVtIFVzZXIgSWQgOiBcIiArIHRoaXMuc3lzVXNlcklkKTtcclxuICB9XHJcblxyXG4gIGZpbHRlcih0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRleHQ7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0ID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dD8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gc3RydWN0dXJlZENsb25lKHRoaXMuZGF0YU1hcCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoVGV4dD8udHJpbSgpPy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnByb3h5RGF0YSkpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gZW50cmllcy5maWx0ZXIoZW50cnkgPT4gT2JqZWN0LnZhbHVlcyhlbnRyeSlcclxuICAgICAgICAuc29tZSh2YWwgPT4ge1xyXG4gICAgICAgICAgbGV0IGE6IHN0cmluZyA9IHZhbD8udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYoYSA9PSBudWxsKXtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGE/LnNlYXJjaCh0aGlzLnNlYXJjaFRleHQpID09IC0xID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAgIH0pKVxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJlZERhdGFba2V5XSA9IGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyZWREYXRhO1xyXG4gIH1cclxuXHJcbiAgb25HcmlkUmVhZHkocGFyYW1zOiBHcmlkUmVhZHlFdmVudCwgaWQ6IG51bWJlcikge1xyXG4gICAgcGFyYW1zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB0aGlzLmdyaWRDb2x1bW5BcGkgPSBwYXJhbXMuY29sdW1uQXBpO1xyXG4gICAgdGhpcy5ncmlkQXBpc1tpZF0gPSBwYXJhbXMuYXBpO1xyXG4gICAgcGFyYW1zLmNvbHVtbkFwaS5zZXRDb2x1bW5WaXNpYmxlKCdidXNpbmVzc0RhdGVUaW1lJywgIXRoaXMuaXNUb3RhbFN1bW1hcnkpO1xyXG4gICAgcGFyYW1zLmFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFeHBvcnQob3B0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24gPSBvcHRpb247XHJcbiAgICBpZiAoIXRoaXMuaGFzQW55R3JvdXBzKCkpIHtcclxuICAgICAgYWxlcnQoXCJUaGVyZSBpcyBubyBkYXRhIHRvIGV4cG9ydCBiYXNlZCBvbiB5b3VyIGN1cnJlbnQgZmlsdGVyLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgbm8gZGF0YSwgZG8gbm90aGluZy5cclxuICAgIGlmICghdGhpcy5maWx0ZXJlZERhdGEgfHwgT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBhbGVydChcIk5vIGRhdGEgdG8gZXhwb3J0XCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aXRsZSA9IFwiQnJhbmNoIEFjdGl2aXR5IFNlbmQgU3VtbWFyeVwiO1xyXG4gICAgY29uc3QgcmVwb3J0VGltZUZvcm1hdHRlciA9IHRoaXMuZGF0ZVZhbHVlRm9ybWF0dGVyKCdkZC9NTS95eXl5IGhoOm1tIGEnKTtcclxuICAgIGNvbnN0IG1ldGFkYXRhOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXHJcbiAgICAgIFsnUmVwb3J0IFBlcmlvZCAnLCB0aGlzLmZyb21EYXRlICsgXCIgLSBcIiArIHRoaXMudG9EYXRlXSxcclxuICAgICAgWydSZXBvcnQgVXNlciAmIFRpbWUnLCB0aGlzLnVzZXIgPyB0aGlzLnVzZXIgKyBcIiBAIFwiICsgdGhpcy5yZXBvcnREYXRlIDogJycgKyBcIiBAIFwiICsgdGhpcy5yZXBvcnREYXRlXSxcclxuICAgIF07XHJcbiAgICAvLyAtLS0gc2VhcmNoIGNyaXRlcmlhIC0tLVxyXG4gICAgY29uc3Qgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSA9IHRoaXMuc2VhcmNoQ3JpdGVyaWE7XHJcbiAgICAvL2NvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkRlZnM7XHJcblxyXG4gICAgLy9leGNsdWRlIEJ1c2luZXNzIERhdGUgY29sIGZvciBUb3RhbCBTdW1tYXJ5IFJlcG9ydC5cclxuICAgIGxldCBjb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uRGVmc107XHJcbiAgICBjb25zdCBzdW1tYXJ5UmVwb3J0ID0gdGhpcy5zZWFyY2hDcml0ZXJpYS5maW5kKHggPT4geFswXSA9PT0gJ1N1bW1hcnkgUmVwb3J0OicpPy5bMV07XHJcbiAgICAgXHJcbiAgICBpZiAoc3VtbWFyeVJlcG9ydCA9PT0gJ1RvdGFsIFN1bW1hcnknKSB7XHJcbiAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmZpZWxkICE9PSAnYnVzaW5lc3NEYXRlVGltZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFNYXA7XHJcbiAgICBjb25zdCBjbGVhbmVkRGF0YSA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YU1hcCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBjbGVhbmVkRGF0YVtrZXldID0gdGhpcy5kYXRhTWFwW2tleV0ubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgaWYgKHJvdy5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5yb3csXHJcbiAgICAgICAgICAgIGJ1c2luZXNzRGF0ZVRpbWU6ICcnLFxyXG4gICAgICAgICAgICBwcm9kdWN0OiAnJyxcclxuICAgICAgICAgICAgcmVjZWl2ZUN1cnJlbmN5OiAnJyxcclxuICAgICAgICAgICAgcmVjZWl2ZUFtb3VudDogJydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3c7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGF0YSA9IGNsZWFuZWREYXRhO1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgY3VycmVuY3lGaWVsZHM6IFtcclxuICAgICAgICAncGF5b3V0QW1vdW50JywgJ3BheWluQW1vdW50JywgJ3RyYW5zYWN0aW9uQ29tbWlzc2lvbkFtb3VudCcsICd0YXgnLCAndG90YWxQYXlpbkFtb3VudCdcclxuICAgICAgXSxcclxuICAgICAgLy8gc3BlY2lmeSBhbGwgZGF0ZSBmaWVsZHMgZXhwZWN0ZWRcclxuICAgICAgZGF0ZUZpZWxkczogW10sXHJcblxyXG4gICAgICBkYXRlRmllbGRGb3JtYXRzOiB7XHJcbiAgICAgICAgdHhuRGF0ZUFuZFRpbWU6ICdkZC9NTS95eXl5IGhoOm1tIGEnLFxyXG4gICAgICAgIGNhbmNlbGxhdGlvbkJyYW5jaERhdGVUaW1lOiAnZGQvTU0veXl5eSBISDptbScsXHJcbiAgICAgICAgY2FuY2VsbGF0aW9uQnVzaW5lc3NEYXRlOiAnZGQvTU0veXl5eSdcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHNwZWNpYWxEZWNpbWFsRmllbGRzOiB7XHJcbiAgICAgICAgcmF0ZTogOCAgICAgICAvLyBmdXR1cmUgZmllbGQgd2l0aCA4IGRlY2ltYWwgcGxhY2VzXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBncm91cEJ5S2V5OiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbikge1xyXG4gICAgICBjYXNlICdleGNlbCc6XHJcbiAgICAgICAgdGhpcy5leHBvcnRUb0V4Y2VsKHsgdGl0bGUsIG1ldGFkYXRhLCBzZWFyY2hDcml0ZXJpYSwgY29sdW1ucywgZGF0YSwgb3B0aW9ucyB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncGRmJzpcclxuICAgICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0VG9QZGYoeyB0aXRsZSwgbWV0YWRhdGEsIHNlYXJjaENyaXRlcmlhLCBjb2x1bW5zLCBkYXRhLCBvcHRpb25zIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjc3YnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnRUb0Nzdih7IHRpdGxlLCBtZXRhZGF0YSwgc2VhcmNoQ3JpdGVyaWEsIGNvbHVtbnMsIGRhdGEsIG9wdGlvbnMgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYWxlcnQoXCJQbGVhc2Ugc2VsZWN0IGFuIGV4cG9ydCBmb3JtYXQuXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZXhwb3J0VG9FeGNlbCh7XHJcbiAgICB0aXRsZSxcclxuICAgIG1ldGFkYXRhLFxyXG4gICAgc2VhcmNoQ3JpdGVyaWEsXHJcbiAgICBjb2x1bW5zLFxyXG4gICAgZGF0YSxcclxuICAgIG9wdGlvbnMgPSB7fVxyXG4gIH06IHtcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdO1xyXG4gICAgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAgIGNvbHVtbnM6IGFueVtdO1xyXG4gICAgZGF0YTogYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XHJcbiAgICBvcHRpb25zPzogRXhwb3J0T3B0aW9ucztcclxuICB9KTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gd29ya2Jvb2suYWRkV29ya3NoZWV0KHRpdGxlKTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gUFJFIENBTEMgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBjb25zdCBoZWFkZXJMYWJlbHMgPSBbJ1NyIE5vJywgLi4uY29sdW1ucy5tYXAoY29sID0+IGNvbC5oZWFkZXJOYW1lIHx8IGNvbC5maWVsZCldO1xyXG4gICAgY29uc3QgdG90YWxDb2xzID0gaGVhZGVyTGFiZWxzLmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCB0aXRsZVN0YXJ0Q29sID0gNDtcclxuICAgIGNvbnN0IHRpdGxlQ29sTGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NCArIHRpdGxlU3RhcnRDb2wpO1xyXG4gICAgY29uc3QgdGl0bGVNZXJnZUVuZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjQgKyB0b3RhbENvbHMpO1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBMT0dPID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBjb25zdCBiYXNlNjREYXRhID0gdGhpcy5sb2dvQmFzZTY0LnJlcGxhY2UoL15kYXRhOmltYWdlXFwvXFx3KztiYXNlNjQsLywgJycpO1xyXG5cclxuICAgICAgY29uc3QgaW1hZ2VJZCA9IHdvcmtib29rLmFkZEltYWdlKHtcclxuICAgICAgICBiYXNlNjQ6IGJhc2U2NERhdGEsXHJcbiAgICAgICAgZXh0ZW5zaW9uOiAncG5nJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQuYWRkSW1hZ2UoaW1hZ2VJZCwge1xyXG4gICAgICAgIHRsOiB7IGNvbDogMCwgcm93OiAwIH0sXHJcbiAgICAgICAgZXh0OiB7IHdpZHRoOiAxNDUsIGhlaWdodDogNjYgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdvcmtzaGVldC5nZXRSb3coMSkuaGVpZ2h0ID0gMjQ7XHJcbiAgICAgIHdvcmtzaGVldC5nZXRSb3coMikuaGVpZ2h0ID0gMjI7XHJcbiAgICAgIHdvcmtzaGVldC5nZXRSb3coMykuaGVpZ2h0ID0gMjI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFRJVExFID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMoYCR7dGl0bGVDb2xMZXR0ZXJ9MToke3RpdGxlTWVyZ2VFbmR9MWApO1xyXG4gICAgY29uc3QgdGl0bGVDZWxsID0gd29ya3NoZWV0LmdldFJvdygxKS5nZXRDZWxsKHRpdGxlU3RhcnRDb2wpO1xyXG4gICAgdGl0bGVDZWxsLnZhbHVlID0gdGl0bGU7XHJcbiAgICB0aXRsZUNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcclxuICAgIHRpdGxlQ2VsbC5hbGlnbm1lbnQgPSB7IHZlcnRpY2FsOiAnbWlkZGxlJywgaG9yaXpvbnRhbDogJ2xlZnQnIH07XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IE1FVEFEQVRBID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgbGV0IG1ldGFSb3dTdGFydCA9IDQ7XHJcblxyXG4gICAgbWV0YWRhdGEuZm9yRWFjaCgoW2xhYmVsLCB2YWx1ZV0sIGlkeCkgPT4ge1xyXG4gICAgICBjb25zdCByb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KG1ldGFSb3dTdGFydCArIGlkeCk7XHJcblxyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS52YWx1ZSA9IHtcclxuICAgICAgICByaWNoVGV4dDogW1xyXG4gICAgICAgICAgeyB0ZXh0OiBgJHtsYWJlbH0gOiBgLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiB2YWx1ZSA/PyAnJywgZm9udDogeyBib2xkOiBmYWxzZSB9IH1cclxuICAgICAgICBdXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhgQSR7cm93Lm51bWJlcn06JHt0aXRsZU1lcmdlRW5kfSR7cm93Lm51bWJlcn1gKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBjdXJyZW50Um93ID0gbWV0YVJvd1N0YXJ0ICsgbWV0YWRhdGEubGVuZ3RoO1xyXG5cclxuICAgIHdvcmtzaGVldC5nZXRSb3coKytjdXJyZW50Um93KS5oZWlnaHQgPSA2O1xyXG4gICAgY3VycmVudFJvdysrO1xyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTRUFSQ0ggQ1JJVEVSSUEgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhjdXJyZW50Um93LCAxLCBjdXJyZW50Um93LCA2KTtcclxuICAgIHdvcmtzaGVldC5nZXRDZWxsKGN1cnJlbnRSb3csIDEpLnZhbHVlID0gJ1NlYXJjaCBDcml0ZXJpYTotJztcclxuICAgIHdvcmtzaGVldC5nZXRDZWxsKGN1cnJlbnRSb3csIDEpLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIGN1cnJlbnRSb3cgKz0gMjtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaENyaXRlcmlhLmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgY29uc3QgcmlnaHQgPSBzZWFyY2hDcml0ZXJpYVtpICsgMV07XHJcblxyXG4gICAgICBjb25zdCByb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcblxyXG4gICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhyb3cubnVtYmVyLCAxLCByb3cubnVtYmVyLCAzKTtcclxuICAgICAgcm93LmdldENlbGwoMSkudmFsdWUgPSB7XHJcbiAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgIHsgdGV4dDogKGxlZnQ/LlswXSA/PyAnJykgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICB7IHRleHQ6IGxlZnQ/LlsxXSA/PyAnJyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gICAgICByb3cuZ2V0Q2VsbCgxKS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuXHJcbiAgICAgIGlmIChyaWdodCkge1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIDQsIHJvdy5udW1iZXIsIDYpO1xyXG4gICAgICAgIHJvdy5nZXRDZWxsKDQpLnZhbHVlID0ge1xyXG4gICAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiAocmlnaHQ/LlswXSA/PyAnJykgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIHsgdGV4dDogcmlnaHQ/LlsxXSA/PyAnJyB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCg0KS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnRSb3crKztcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSIFJPVyA9PT09PT09PT09PT09PT09PT09PT1cclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcclxuXHJcbiAgICBoZWFkZXJMYWJlbHMuZm9yRWFjaCgoaGVhZGVyLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNlbGwgPSBoZWFkZXJSb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgIGNlbGwudmFsdWUgPSBoZWFkZXI7XHJcbiAgICAgIGNlbGwuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgICBjZWxsLmZpbGwgPSB7XHJcbiAgICAgICAgdHlwZTogJ3BhdHRlcm4nLFxyXG4gICAgICAgIHBhdHRlcm46ICdzb2xpZCcsXHJcbiAgICAgICAgZmdDb2xvcjogeyBhcmdiOiAnRDlEOUQ5JyB9XHJcbiAgICAgIH07XHJcbiAgICAgIGNlbGwuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdjZW50ZXInIH07XHJcbiAgICAgIGNlbGwuYm9yZGVyID0ge1xyXG4gICAgICAgIHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICByaWdodDogeyBzdHlsZTogJ3RoaW4nIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgaGVhZGVyUm93LmVhY2hDZWxsKChjZWxsKSA9PiB7XHJcbiAgICAgIGlmIChjZWxsLnZhbHVlID09PSAnVHJhbnNhY3Rpb24gQ291bnQnKSB7XHJcbiAgICAgICAgY2VsbC52YWx1ZSA9ICdUcmFuc2FjdGlvblxcbkNvdW50JztcclxuICAgICAgICBjZWxsLmFsaWdubWVudCA9IHtcclxuICAgICAgICAgIGhvcml6b250YWw6ICdjZW50ZXInLFxyXG4gICAgICAgICAgdmVydGljYWw6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgd3JhcFRleHQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBEQVRBIFNFQ1RJT04gPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBsZXQgcm93SWR4ID0gY3VycmVudFJvdztcclxuICAgIGxldCBzZXJpYWxOdW1iZXIgPSAxO1xyXG5cclxuICAgIGlmIChvcHRpb25zLmdyb3VwQnlLZXkgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgW2dyb3VwLCBpdGVtc10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd0lkeCsrKTtcclxuICAgICAgICBncm91cFJvdy5nZXRDZWxsKDEpLnZhbHVlID0gZ3JvdXA7XHJcbiAgICAgICAgZ3JvdXBSb3cuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGBBJHtncm91cFJvdy5udW1iZXJ9OiR7dGl0bGVNZXJnZUVuZH0ke2dyb3VwUm93Lm51bWJlcn1gKTtcclxuXHJcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLnByZXBhcmVUYWJsZVJvd3MoW2l0ZW1dLCBjb2x1bW5zLCBvcHRpb25zKVswXTtcclxuICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd0lkeCsrKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBmdWxsUm93ID0gW1xyXG4gICAgICAgICAgICAhaXRlbT8uaXNUb3RhbFJvdyA/IHNlcmlhbE51bWJlcisrIDogJycsXHJcbiAgICAgICAgICAgIC4uLnJvd0RhdGFcclxuICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgZnVsbFJvdy5mb3JFYWNoKCh2YWwsIGNJZHgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGRhdGFSb3cuZ2V0Q2VsbChjSWR4ICsgMSk7XHJcbiAgICAgICAgICAgIC8vICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgLy9hZGRlZCBieSBiaGFyYXRpIGZvciBcclxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW5zW2NJZHggLSAxXT8uZmllbGQ7XHJcblxyXG4gICAgICAgICAgICAvLyDinIUgQW1vdW50IGZpZWxkcyAoUmVjZWl2ZSBBbW91bnQsIFNlbmQgQW1vdW50LCBUb3RhbCBTZW5kIEFtb3VudCBldGMuKVxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZmllbGQ9PSd0b3RhbFBheWluQW1vdW50J3x8XHJcbiAgICAgICAgICAgICAgZmllbGQ9PSdwYXlpbkFtb3VudCd8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAndHJhbnNhY3Rpb25Db21taXNzaW9uQW1vdW50JyB8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAndGF4J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycgJiYgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gTnVtYmVyKHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLm51bUZtdCA9ICcjLCMjMC4wMDAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB9ICovXHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbT8uaXNUb3RhbFJvdyAmJiBmaWVsZCA9PT0gJ3JlY2VpdmVBbW91bnQnKSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgIGZpZWxkPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhbW91bnQnKSB8fFxyXG4gICAgICAgICAgICAgIGZpZWxkID09PSAnc2VydmljZUZlZScgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3RheCdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycgJiYgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsOyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG51bWJlclxyXG4gICAgICAgICAgICAgICAgY2VsbC5udW1GbXQgPSAnIywjIzAuMDAwJzsgICAgICAgLy8gRXhjZWwgZm9ybWF0dGluZ1xyXG4gICAgICAgICAgICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2VsbC5ib3JkZXIgPSB7XHJcbiAgICAgICAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGl0ZW0/LmlzVG90YWxSb3cpIHtcclxuICAgICAgICAgICAgZGF0YVJvdy5lYWNoQ2VsbChjZWxsID0+IHtcclxuICAgICAgICAgICAgICAgY2VsbC5mb250ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uY2VsbC5mb250LFxyXG4gICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNpemU6IDEyXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5wcmVwYXJlVGFibGVSb3dzKGRhdGEgYXMgYW55W10sIGNvbHVtbnMsIG9wdGlvbnMpXHJcbiAgICAgICAgLmZvckVhY2goKHJvd0RhdGEsIGluZGV4KSA9PiB7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGF0YVJvdyA9IHdvcmtzaGVldC5nZXRSb3cocm93SWR4KyspO1xyXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxJdGVtID0gKGRhdGEgYXMgYW55W10pW2luZGV4XTtcclxuXHJcbiAgICAgICAgICBjb25zdCBmdWxsUm93ID0gW1xyXG4gICAgICAgICAgICAhb3JpZ2luYWxJdGVtPy5pc1RvdGFsUm93ID8gc2VyaWFsTnVtYmVyKysgOiAnJyxcclxuICAgICAgICAgICAgLi4ucm93RGF0YVxyXG4gICAgICAgICAgXTtcclxuXHJcbiAgICAgICAgICBmdWxsUm93LmZvckVhY2goKHZhbCwgY0lkeCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZGF0YVJvdy5nZXRDZWxsKGNJZHggKyAxKTtcclxuICAgICAgICAgICAgLy9jZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICAvKiAgIGlmIChjSWR4ID09PSAwKSB7XHJcbiBjZWxsLnZhbHVlID0gdmFsO1xyXG59IGVsc2Uge1xyXG5cclxuIGNvbnN0IGZpZWxkID0gY29sdW1uc1tjSWR4IC0gMV0/LmZpZWxkO1xyXG5cclxuIGlmIChcclxuICAgICBmaWVsZD09J3RvdGFsUGF5aW5BbW91bnQnfHxcclxuICAgICBmaWVsZD09J3BheWluQW1vdW50J3x8XHJcbiAgICAgZmllbGQgPT09ICd0cmFuc2FjdGlvbkNvbW1pc3Npb25BbW91bnQnIHx8XHJcbiAgICAgZmllbGQgPT09ICd0YXgnXHJcbiApIHtcclxuICAgICBjZWxsLnZhbHVlID0gTnVtYmVyKHZhbCk7XHJcbiAgICAgY2VsbC5udW1GbXQgPSAnIywjIzAuMDAwJztcclxuICAgICBjZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JywgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiB9XHJcbiBlbHNlIHtcclxuICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gfVxyXG59ICovXHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbnNbY0lkeCAtIDFdPy5maWVsZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjSWR4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW5hbEl0ZW0/LmlzVG90YWxSb3cgJiYgZmllbGQgPT09ICdyZWNlaXZlQW1vdW50Jykge1xyXG4gICAgICAgICAgICAgIGNlbGwudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICBmaWVsZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYW1vdW50JykgfHxcclxuICAgICAgICAgICAgICBmaWVsZCA9PT0gJ3NlcnZpY2VGZWUnIHx8XHJcbiAgICAgICAgICAgICAgZmllbGQgPT09ICd0YXgnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IHZhbDsgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBudW1iZXJcclxuICAgICAgICAgICAgICAgIGNlbGwubnVtRm10ID0gJyMsIyMwLjAwMCc7ICAgICAgIC8vIEV4Y2VsIGZvcm1hdHRpbmdcclxuICAgICAgICAgICAgICAgIGNlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAncmlnaHQnLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjZWxsLmJvcmRlciA9IHtcclxuICAgICAgICAgICAgICB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgICAgIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgICAgICAgbGVmdDogeyBzdHlsZTogJ3RoaW4nIH0sXHJcbiAgICAgICAgICAgICAgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAob3JpZ2luYWxJdGVtPy5pc1RvdGFsUm93KSB7XHJcbiAgICAgICAgICAgIGRhdGFSb3cuZWFjaENlbGwoY2VsbCA9PiB7XHJcbiAgICAgICAgICAgICAgIGNlbGwuZm9udCA9IHtcclxuICAgICAgICAgICAgICAgIC4uLmNlbGwuZm9udCxcclxuICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAxMlxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBBVVRPIFdJRFRIID09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxDb2xzOyBpKyspIHtcclxuICAgICAgbGV0IG1heExlbmd0aCA9IDEwO1xyXG5cclxuICAgICAgd29ya3NoZWV0LmVhY2hSb3coeyBpbmNsdWRlRW1wdHk6IHRydWUgfSwgKHJvdykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3cuZ2V0Q2VsbChpKTtcclxuICAgICAgICBpZiAoY2VsbC5pc01lcmdlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY2VsbFZhbHVlID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChjZWxsLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIGNlbGxWYWx1ZSA9ICcnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNlbGwudmFsdWUgPT09ICdvYmplY3QnICYmICdyaWNoVGV4dCcgaW4gY2VsbC52YWx1ZSkge1xyXG4gICAgICAgICAgY2VsbFZhbHVlID0gY2VsbC52YWx1ZS5yaWNoVGV4dC5tYXAocnQgPT4gcnQudGV4dCkuam9pbignJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNlbGxWYWx1ZSA9IGNlbGwudmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCwgY2VsbFZhbHVlLmxlbmd0aCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd29ya3NoZWV0LmdldENvbHVtbihpKS53aWR0aCA9IE1hdGgubWluKG1heExlbmd0aCwgNTApO1xyXG4gICAgfVxyXG4gICAgLy9uZXcgY29kZTpiaGFyYXRpXHJcblxyXG4gICAgd29ya3NoZWV0LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG5cclxuICAgICAgaWYgKGluZGV4ID09PSAwKSByZXR1cm47IC8vIHNraXAgU3IgTm9cclxuXHJcbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uc1tpbmRleCAtIDFdPy5maWVsZDtcclxuXHJcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3BheWluQW1vdW50Jykge1xyXG4gICAgICAgIGNvbHVtbi53aWR0aCA9IDE0O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3BheW91dEFtb3VudCcpIHtcclxuICAgICAgICBjb2x1bW4ud2lkdGggPSAxNTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmllbGQgPT09ICd0cmFuc2FjdGlvbkNvdW50Jykge1xyXG4gICAgICAgIGNvbHVtbi53aWR0aCA9IDE0O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyB3b3Jrc2hlZXQuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgIC8vICAgaWYgKGNvbHVtbi5oZWFkZXIgPT09ICdTZW5kIEFtb3VudCcpIHtcclxuICAgIC8vICAgICBjb2x1bW4ud2lkdGggPSAyNTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcblxyXG5cclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTQVZFIEZJTEUgPT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCk7XHJcblxyXG4gICAgRmlsZVNhdmVyLnNhdmVBcyhcclxuICAgICAgbmV3IEJsb2IoW2J1ZmZlcl0sIHtcclxuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXHJcbiAgICAgIH0pLFxyXG4gICAgICB0aXRsZS5yZXBsYWNlKC9cXHMvZywgJy0nKSArICcueGxzeCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyAgIHByaXZhdGUgcHJlcGFyZVRhYmxlUm93cyhkYXRhOiBhbnlbXSwgY29sdW1uczogYW55W10sIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnMgPSB7fSk6IGFueVtdW10ge1xyXG4gIC8vICAgICAgICAgICBjb25zdCB7XHJcbiAgLy8gICAgICAgICAgICAgICBleGNsdWRlRmllbGRzID0gW10sXHJcbiAgLy8gICAgICAgICAgICAgICBjdXJyZW5jeUZpZWxkcyA9IFtdLFxyXG4gIC8vICAgICAgICAgICAgICAgZGF0ZUZpZWxkcyA9IFtdLFxyXG4gIC8vICAgICAgICAgICAgICAgZGF0ZUZpZWxkRm9ybWF0cyA9IHt9LFxyXG4gIC8vICAgICAgICAgICAgICAgc3BlY2lhbERlY2ltYWxGaWVsZHMgPSB7fVxyXG4gIC8vICAgICAgICAgICB9ID0gb3B0aW9ucztcclxuXHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gY29sdW1ucy5maWx0ZXIoYyA9PlxyXG4gIC8vICAgICAgICAgICAgICAgYy5maWVsZCAmJiAhZXhjbHVkZUZpZWxkcy5zb21lKGYgPT4gYy5maWVsZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGYpKVxyXG4gIC8vICAgICAgICAgICApO1xyXG5cclxuICAvLyAgICAgICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiAoW1xyXG4gIC8vIC4uLmZpbHRlcmVkLm1hcChjb2wgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHJvd1tjb2wuZmllbGRdO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBkYXRlIGZpZWxkcyB3aXRoIGN1c3RvbSBmb3JtYXRzIGlmIHNwZWNpZmllZFxyXG4gIC8vICAgICAgICAgICAgICAgICAgIGlmIChjb2wuZmllbGQgJiYgKGRhdGVGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSB8fCBjb2wuZmllbGQgaW4gZGF0ZUZpZWxkRm9ybWF0cykpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gZGF0ZUZpZWxkRm9ybWF0c1tjb2wuZmllbGRdIHx8ICdkZC9NTS95eXl5JztcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdERhdGVCeUZvcm1hdCh2YWx1ZSwgZm9ybWF0KTtcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0IHNwZWNpYWwgZGVjaW1hbCBmaWVsZHMgd2l0aCBzcGVjaWZpYyBkZWNpbWFsc1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5maWVsZCAmJiBjb2wuZmllbGQgaW4gc3BlY2lhbERlY2ltYWxGaWVsZHMgJiYgdmFsdWUgIT0gbnVsbCkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNpbWFscyA9IHNwZWNpYWxEZWNpbWFsRmllbGRzW2NvbC5maWVsZF07XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZChkZWNpbWFscyk7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCByZWd1bGFyIGN1cnJlbmN5IGZpZWxkcyB3aXRoIDMgZGVjaW1hbHNcclxuICAvLyAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZmllbGQgJiYgY3VycmVuY3lGaWVsZHMuaW5jbHVkZXMoY29sLmZpZWxkKSAmJiB2YWx1ZSAhPSBudWxsKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZCgzKTtcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gIC8vICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyAnJztcclxuICAvLyAgICAgICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAgIF0pKTtcclxuICAvLyAgICAgICB9XHJcbiAgcHJpdmF0ZSBwcmVwYXJlVGFibGVSb3dzKFxyXG4gICAgZGF0YTogYW55W10sXHJcbiAgICBjb2x1bW5zOiBhbnlbXSxcclxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnMgPSB7fVxyXG4gICk6IGFueVtdW10ge1xyXG5cclxuICAgIGNvbnN0IHtcclxuICAgICAgZXhjbHVkZUZpZWxkcyA9IFtdLFxyXG4gICAgICBjdXJyZW5jeUZpZWxkcyA9IFtdLFxyXG4gICAgICBkYXRlRmllbGRzID0gW10sXHJcbiAgICAgIGRhdGVGaWVsZEZvcm1hdHMgPSB7fSxcclxuICAgICAgc3BlY2lhbERlY2ltYWxGaWVsZHMgPSB7fVxyXG4gICAgfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWQgPSBjb2x1bW5zLmZpbHRlcihjID0+XHJcbiAgICAgIGMuZmllbGQgJiYgIWV4Y2x1ZGVGaWVsZHMuc29tZShmID0+IGMuZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmKSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IChbXHJcbiAgICAgIC4uLmZpbHRlcmVkLm1hcChjb2wgPT4ge1xyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSByb3dbY29sLmZpZWxkXTtcclxuXHJcbiAgICAgICAgLy8g4pyFIERhdGUgZm9ybWF0dGluZyAoa2VlcCBhcyBzdHJpbmcpXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29sLmZpZWxkICYmXHJcbiAgICAgICAgICAoZGF0ZUZpZWxkcy5pbmNsdWRlcyhjb2wuZmllbGQpIHx8IGNvbC5maWVsZCBpbiBkYXRlRmllbGRGb3JtYXRzKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gZGF0ZUZpZWxkRm9ybWF0c1tjb2wuZmllbGRdIHx8ICdkZC9NTS95eXl5JztcclxuICAgICAgICAgIHZhbHVlID0gdGhpcy5mb3JtYXREYXRlQnlGb3JtYXQodmFsdWUsIGZvcm1hdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDinIUgU3BlY2lhbCBkZWNpbWFsIGZpZWxkcyDihpIgcmV0dXJuIE5VTUJFUiAobm8gdG9GaXhlZClcclxuICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgIGNvbC5maWVsZCAmJlxyXG4gICAgICAgICAgY29sLmZpZWxkIGluIHNwZWNpYWxEZWNpbWFsRmllbGRzICYmXHJcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDinIUgQ3VycmVuY3kgZmllbGRzIOKGkiByZXR1cm4gTlVNQkVSIChubyB0b0ZpeGVkKVxyXG4gICAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgICAgY29sLmZpZWxkICYmXHJcbiAgICAgICAgICBjdXJyZW5jeUZpZWxkcy5pbmNsdWRlcyhjb2wuZmllbGQpICYmXHJcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XHJcbiAgICAgIH0pXHJcbiAgICBdKSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0RGF0ZUJ5Rm9ybWF0KHZhbDogYW55LCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAvLyBIZWxwZXIgdG8gcGFkIHNpbmdsZSBkaWdpdHNcclxuICAgIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpID0+IG4udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG5cclxuICAgIC8vIFBhcnNlIGRhdGUgZm9yIFwiREQvTU0vWVlZWSBoaDptbSBBTS9QTVwiIGZvcm1hdCBtYW51YWxseVxyXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIC9eXFxkezJ9XFwvXFxkezJ9XFwvXFxkezR9IFxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KHZhbCkpIHtcclxuXHJcbiAgICAgIGNvbnN0IHBhcnRzID0gdmFsLm1hdGNoKC9eKFxcZHsyfSlcXC8oXFxkezJ9KVxcLyhcXGR7NH0pIChcXGR7Mn0pOihcXGR7Mn0pIChbQVBdTSkkLyk7XHJcbiAgICAgIGlmICghcGFydHMpIHJldHVybiAnJztcclxuICAgICAgbGV0IFssIGRkLCBtbSwgeXl5eSwgaGgsIG1pbiwgYW1wbV0gPSBwYXJ0cztcclxuICAgICAgbGV0IGhvdXJzID0gcGFyc2VJbnQoaGgsIDEwKTtcclxuICAgICAgaWYgKGFtcG0gPT09ICdQTScgJiYgaG91cnMgIT09IDEyKSBob3VycyArPSAxMjtcclxuICAgICAgaWYgKGFtcG0gPT09ICdBTScgJiYgaG91cnMgPT09IDEyKSBob3VycyA9IDA7XHJcbiAgICAgIHZhbCA9IG5ldyBEYXRlKHBhcnNlSW50KHl5eXksIDEwKSwgcGFyc2VJbnQobW0sIDEwKSAtIDEsIHBhcnNlSW50KGRkLCAxMCksIGhvdXJzLCBwYXJzZUludChtaW4sIDEwKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWwgPSBuZXcgRGF0ZSh2YWwpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc05hTih2YWwuZ2V0VGltZSgpKSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IGR0ID0gdmFsO1xyXG5cclxuICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgIGNhc2UgJ2RkL01NL3l5eXkgaGg6bW0gYSc6IHsgLy8gMTEvMDcvMjAyNSAxMDo1NiBQTVxyXG4gICAgICAgIGxldCBob3VyczEyID0gZHQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xyXG4gICAgICAgIGxldCBhbXBtID0gZHQuZ2V0SG91cnMoKSA+PSAxMiA/ICdQTScgOiAnQU0nO1xyXG4gICAgICAgIHJldHVybiBgJHtwYWQoZHQuZ2V0RGF0ZSgpKX0vJHtwYWQoZHQuZ2V0TW9udGgoKSArIDEpfS8ke2R0LmdldEZ1bGxZZWFyKCl9ICR7cGFkKGhvdXJzMTIpfToke3BhZChkdC5nZXRNaW51dGVzKCkpfSAke2FtcG19YDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdkZC9NTS95eXl5IEhIOm1tJzogeyAvLyAyOC8wNy8yMDI1IDEzOjA4XHJcbiAgICAgICAgcmV0dXJuIGAke3BhZChkdC5nZXREYXRlKCkpfS8ke3BhZChkdC5nZXRNb250aCgpICsgMSl9LyR7ZHQuZ2V0RnVsbFllYXIoKX0gJHtwYWQoZHQuZ2V0SG91cnMoKSl9OiR7cGFkKGR0LmdldE1pbnV0ZXMoKSl9YDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdkZC9NTS95eXl5JzogeyAvLyAyOC8wNy8yMDI1XHJcbiAgICAgICAgcmV0dXJuIGAke3BhZChkdC5nZXREYXRlKCkpfS8ke3BhZChkdC5nZXRNb250aCgpICsgMSl9LyR7ZHQuZ2V0RnVsbFllYXIoKX1gO1xyXG4gICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGR0LnRvTG9jYWxlU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlVmFsdWVGb3JtYXR0ZXIoZm9ybWF0OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAocGFyYW1zOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFwYXJhbXMudmFsdWUpIHJldHVybiAnJztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZShwYXJhbXMudmFsdWUsIGZvcm1hdCwgJ2VuLVVTJyk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0S2V5cyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIG9iaiA/IE9iamVjdC5rZXlzKG9iaikgOiBbXTtcclxuICB9XHJcblxyXG4gIGhhc0FueUdyb3VwcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YSAmJiB0aGlzLmdldEtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRBbW91bnQocGFyYW1zOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbXM/LnZhbHVlO1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgIHJldHVybiAoTWF0aC50cnVuYyhudW0gKiAxMDAwKSAvIDEwMDApLnRvRml4ZWQoMyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWFyY2goY3JpdGVyaWE6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hDcml0ZXJpYSA9IGNyaXRlcmlhLnNlYXJjaENyaXRlcmlhO1xyXG4gICAgdGhpcy5yZXBvcnREYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgdGhpcy5yZXBvcnREYXRlID0gZm9ybWF0RGF0ZSh0aGlzLnJlcG9ydERhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKTtcclxuICAgIGNvbnN0IG1vZGFsID0gY3JpdGVyaWEubW9kYWw7XHJcbiAgICB0aGlzLnVzZXIgPSBjcml0ZXJpYS5zeXNVc2VySUQ7XHJcbiAgICB0aGlzLmZyb21EYXRlID0gZm9ybWF0RGF0ZShtb2RhbC5mcm9tRGF0ZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpLnNsaWNlKDAsIDEwKTtcclxuICAgIHRoaXMudG9EYXRlID0gZm9ybWF0RGF0ZShtb2RhbC50b0RhdGUsICdkZC9NTS95eXl5IGhoOm1tIGEnLCAnZW4tVVMnKS5zbGljZSgwLCAxMCk7XHJcbiAgICBjb25zb2xlLmxvZyhtb2RhbCk7XHJcbiAgICAvLyBDb2RlIEZvciBNZXRhIERhdGFcclxuICAgIHRoaXMubGVmdERhdGEgPSB7XHJcbiAgICAgICdSZXBvcnQgUGVyaW9kJzogdGhpcy5mcm9tRGF0ZSArIFwiIC0gXCIgKyB0aGlzLnRvRGF0ZSxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1ldGFEYXRhVHdvID0ge1xyXG4gICAgICAnUmVwb3J0IFVzZXIgJiBUaW1lJzogdGhpcy51c2VyICsgXCIgQCBcIiArIHRoaXMucmVwb3J0RGF0ZSxcclxuICAgIH1cclxuICAgIGNvbnN0IGlzVG90YWxTdW1tYXJ5ID0gbW9kYWwuc3VtbWFyeVJlcG9ydCA9PT0gJ1RvdGFsIFN1bW1hcnknO1xyXG4gICAgdGhpcy5pc1RvdGFsU3VtbWFyeSA9IGlzVG90YWxTdW1tYXJ5O1xyXG5cclxuICAgIGNvbnN0IHNlYXJjaERhdGEgPSB7XHJcbiAgICAgIFwiU3RhcnREYXRlXCI6IG1vZGFsLmZyb21EYXRlLFxyXG4gICAgICBcIkVuZERhdGVcIjogbW9kYWwudG9EYXRlLFxyXG4gICAgICBcIlNlbmRDb3VudHJ5Q29kZVwiOiBtb2RhbC5zZW5kQ291bnRyeSxcclxuICAgICAgXCJSZWN2Q291bnRyeUNvZGVcIjogbW9kYWwucmVjZWl2ZUNvdW50cnksXHJcbiAgICAgIFwiQnVzaW5lc3NQYXJ0bmVyQ29kZVwiOiBtb2RhbC5jbGllbnQsXHJcbiAgICAgIFwiVHJhbnNhY3Rpb25TdGF0dXNcIjogbW9kYWwudHJhbnNhY3Rpb25TdGF0dXMuam9pbihcIixcIiksXHJcbiAgICAgIFwiUGF5b3V0Q3VycmVuY3lcIjogbW9kYWwucmVjZWl2ZUN1cnJlbmN5LFxyXG4gICAgICBcIlRyYW5zYWN0aW9uVHlwZVwiOiBtb2RhbC5wcm9kdWN0LFxyXG4gICAgICBcIkJyYW5jaENvZGVcIjogbW9kYWwuYnJhbmNoLFxyXG4gICAgICBcIlN1bW1hcnlSZXBvcnRcIjogbW9kYWwuc3VtbWFyeVJlcG9ydFxyXG5cclxuICAgIH07XHJcbiAgICB0aGlzLnNob3dNZXNzYWdlID0gdHJ1ZTtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2ggPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkxvYWRpbmc7XHJcbiAgICB0aGlzLnJlcG9ydFNlcnZpY2UuZ2V0QnJhbmNoQWN0aXZpdHlTZW5kU3VtbWFyeVJlcG9ydChzZWFyY2hEYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuZGF0YU1hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gT2JqZWN0LmtleXModGhpcy5maWx0ZXJlZERhdGEpLmxlbmd0aCA9PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucHJveHlEYXRhID0gc3RydWN0dXJlZENsb25lKGRhdGEpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkFycmF5ID0gbmV3IEFycmF5KE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyZWREYXRhKS5sZW5ndGgpLmZpbGwoMTUpO1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UgPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcmVkRGF0YSkubGVuZ3RoID09IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93UmVwb3J0ID0gdHJ1ZTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jbGVhclNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRm9ybVZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbiIsIjxsaWItc2VhcmNoLWZpbHRlciBcclxuICAgIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBcclxuICAgIChzZWFyY2hDbGlja2VkKT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcclxuICAgIChmb3JtVmFsaWQpPVwiaGFuZGxlRm9ybVZhbGlkKCRldmVudClcIj5cclxuPC9saWItc2VhcmNoLWZpbHRlciA+XHJcbjxhcHAtbG9hZGVyIGNsYXNzPVwiXCIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkxvYWRpbmdcIj48L2FwcC1sb2FkZXI+XHJcblxyXG48c2VjdGlvbiAqbmdJZj1cInNob3dSZXBvcnQgJiYgaXNGb3JtVmFsaWQgJiYgIWNsZWFyU2VhcmNoXCIgY2xhc3M9XCJteS0yXCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFub0RhdGFGb3VuZFwiPlxyXG4gICAgIDxsaWItbWV0YWRhdGEgW3JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIFtzaG93bWV0YURhdGFPbmVdPVwidHJ1ZVwiIFtzaG93bWV0YURhdGFUd29dPVwidHJ1ZVwiIFttZXRhRGF0YU9uZV09XCJsZWZ0RGF0YVwiIFttZXRhRGF0YVR3b109XCJtZXRhRGF0YVR3b1wiKGV4cG9ydEV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCIgKHNlYXJjaEV2ZW50KT1cImZpbHRlcigkZXZlbnQpXCI+PC9saWItbWV0YWRhdGE+XHJcblxyXG4gIDxuZ2ItYWNjb3JkaW9uICNhY2M9XCJuZ2JBY2NvcmRpb25cIiBbY2xvc2VPdGhlcnNdPVwiZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWREYXRhIHwga2V5dmFsdWU7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgPG5nYi1wYW5lbCAqbmdJZj1cIml0ZW0udmFsdWUubGVuZ3RoID4gMFwiIFtpZF09XCIncGFuZWwtJyArIGlcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nYlBhbmVsVGl0bGUgc3R5bGU9XCJoZWlnaHQ6IDEwJTtcIj5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInBhbmVsLWNsc1wiPnt7XHJcbiAgICAgICAgICAgIGl0ZW0ua2V5XHJcbiAgICAgICAgICAgIH19PC9sYWJlbD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbmdiUGFuZWxDb250ZW50PlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgPGxpYi1wYWdlLXNpemUtc2VsZWN0b3IgW3RvdGFsRW50cmllc109XCJpdGVtPy52YWx1ZT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgW2RlZmF1bHRTaXplXT1cIicxNSdcIiBbZ3JpZEFwaV09XCJncmlkQXBpc1tpXVwiPlxyXG4gICAgICAgICAgICA+PC9saWItcGFnZS1zaXplLXNlbGVjdG9yPlxyXG5cclxuICAgICAgICAgICAgPGFnLWdyaWQtYW5ndWxhciBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtoZWlnaHQ6IDM4MHB4O1wiXHJcbiAgICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiIFxyXG4gICAgICAgICAgICAgIFtkZWZhdWx0Q29sRGVmXT1cImRlZmF1bHRDb2xEZWZcIiBcclxuICAgICAgICAgICAgICBbcm93RGF0YV09XCJpdGVtLnZhbHVlXCIgXHJcbiAgICAgICAgICAgICAgW3Jvd0hlaWdodF09XCIyMFwiXHJcbiAgICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCIyMlwiXHJcbiAgICAgICAgICAgICAgW3BhZ2luYXRpb25dPVwidHJ1ZVwiIFxyXG4gICAgICAgICAgICAgIFtwYWdpbmF0aW9uUGFnZVNpemVdPVwicGFnaW5hdGlvbkFycmF5W2ldXCIgXHJcbiAgICAgICAgICAgICAgW3Jvd0NsYXNzUnVsZXNdPVwicm93Q2xhc3NSdWxlc1wiXHJcbiAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJvbkdyaWRSZWFkeSgkZXZlbnQsaSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9hZy1ncmlkLWFuZ3VsYXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPC9uZ2ItcGFuZWw+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L25nYi1hY2NvcmRpb24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmcgbXQtM1wiICpuZ0lmPVwibm9EYXRhRm91bmRcIj5cclxuICAgIE5vIERhdGEgZm91bmQgbWF0Y2hpbmcgeW91ciBzZWFyY2ggY3JpdGVyaWEuXHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj4iXX0=