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