raise-common-lib 0.0.206 → 0.0.208

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 (266) hide show
  1. package/README.md +57 -57
  2. package/bundles/raise-common-lib.umd.js +28020 -1275
  3. package/bundles/raise-common-lib.umd.js.map +1 -1
  4. package/bundles/raise-common-lib.umd.min.js +1 -1
  5. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  6. package/esm2015/lib/dashboard/api.js +46 -0
  7. package/esm2015/lib/dashboard/bar-charts/bar-charts.component.js +638 -0
  8. package/esm2015/lib/dashboard/bar-charts/utils.js +40 -0
  9. package/esm2015/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.js +700 -0
  10. package/esm2015/lib/dashboard/dashboard.service.js +650 -0
  11. package/esm2015/lib/dashboard/dashboardPorlets.service.js +3107 -0
  12. package/esm2015/lib/dashboard/dialog-group/download/index.component.js +358 -0
  13. package/esm2015/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.js +67 -0
  14. package/esm2015/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.js +4443 -0
  15. package/esm2015/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.js +4293 -0
  16. package/esm2015/lib/dashboard/gadget-group/gadget-table/gadget-table.component.js +1553 -0
  17. package/esm2015/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.js +857 -0
  18. package/esm2015/lib/dashboard/pane-group-new.component.js +2930 -0
  19. package/esm2015/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.js +1016 -0
  20. package/esm2015/lib/dashboard/sidebar-iconlist/field-format/field-format.component.js +1003 -0
  21. package/esm2015/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.js +319 -0
  22. package/esm2015/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.js +1638 -0
  23. package/esm2015/lib/form/checkbox-group/index.component.js +60 -5
  24. package/esm2015/lib/raise-common-lib.module.js +56 -3
  25. package/esm2015/lib/service/InjectionToken.js +13 -0
  26. package/esm2015/public-api.js +3 -1
  27. package/esm2015/raise-common-lib.js +22 -6
  28. package/esm5/lib/dashboard/api.js +48 -0
  29. package/esm5/lib/dashboard/bar-charts/bar-charts.component.js +733 -0
  30. package/esm5/lib/dashboard/bar-charts/utils.js +45 -0
  31. package/esm5/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.js +772 -0
  32. package/esm5/lib/dashboard/dashboard.service.js +846 -0
  33. package/esm5/lib/dashboard/dashboardPorlets.service.js +3536 -0
  34. package/esm5/lib/dashboard/dialog-group/download/index.component.js +441 -0
  35. package/esm5/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.js +78 -0
  36. package/esm5/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.js +4940 -0
  37. package/esm5/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.js +4751 -0
  38. package/esm5/lib/dashboard/gadget-group/gadget-table/gadget-table.component.js +1683 -0
  39. package/esm5/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.js +931 -0
  40. package/esm5/lib/dashboard/pane-group-new.component.js +3307 -0
  41. package/esm5/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.js +1138 -0
  42. package/esm5/lib/dashboard/sidebar-iconlist/field-format/field-format.component.js +1184 -0
  43. package/esm5/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.js +354 -0
  44. package/esm5/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.js +1792 -0
  45. package/esm5/lib/form/checkbox-group/index.component.js +74 -5
  46. package/esm5/lib/raise-common-lib.module.js +56 -3
  47. package/esm5/lib/service/InjectionToken.js +13 -0
  48. package/esm5/public-api.js +3 -1
  49. package/esm5/raise-common-lib.js +22 -6
  50. package/fesm2015/raise-common-lib.js +24747 -1110
  51. package/fesm2015/raise-common-lib.js.map +1 -1
  52. package/fesm5/raise-common-lib.js +27815 -1263
  53. package/fesm5/raise-common-lib.js.map +1 -1
  54. package/lib/dashboard/api.d.ts +21 -0
  55. package/lib/dashboard/bar-charts/bar-charts.component.d.ts +60 -0
  56. package/lib/dashboard/bar-charts/utils.d.ts +1 -0
  57. package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +49 -0
  58. package/lib/dashboard/dashboard.service.d.ts +149 -0
  59. package/lib/dashboard/dashboardPorlets.service.d.ts +211 -0
  60. package/lib/dashboard/dialog-group/download/index.component.d.ts +33 -0
  61. package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +12 -0
  62. package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +125 -0
  63. package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +128 -0
  64. package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +74 -0
  65. package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +44 -0
  66. package/lib/dashboard/pane-group-new.component.d.ts +165 -0
  67. package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +53 -0
  68. package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +59 -0
  69. package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +27 -0
  70. package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +147 -0
  71. package/lib/form/checkbox-group/index.component.d.ts +5 -0
  72. package/lib/service/InjectionToken.d.ts +4 -0
  73. package/package.json +1 -1
  74. package/public-api.d.ts +2 -0
  75. package/raise-common-lib.d.ts +20 -4
  76. package/raise-common-lib.metadata.json +1 -1
  77. package/src/assets/img/arrow_right.svg +4 -4
  78. package/src/assets/img/calendar-disabled.svg +6 -6
  79. package/src/assets/img/calendar.svg +6 -6
  80. package/src/assets/img/calendar_arrow_left.svg +3 -3
  81. package/src/assets/img/calendar_arrow_right.svg +3 -3
  82. package/src/assets/img/checked-vector.svg +3 -3
  83. package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
  84. package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
  85. package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
  86. package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
  87. package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
  88. package/src/assets/img/dashboard_icon/Close.svg +4 -0
  89. package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
  90. package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
  91. package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
  92. package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
  93. package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
  94. package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
  95. package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
  96. package/src/assets/img/dashboard_icon/area-white.svg +3 -0
  97. package/src/assets/img/dashboard_icon/area.svg +3 -0
  98. package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
  99. package/src/assets/img/dashboard_icon/bar.svg +14 -0
  100. package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
  101. package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
  102. package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
  103. package/src/assets/img/dashboard_icon/column-white.svg +14 -0
  104. package/src/assets/img/dashboard_icon/column.svg +26 -0
  105. package/src/assets/img/dashboard_icon/customize.png +0 -0
  106. package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
  107. package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
  108. package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
  109. package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
  110. package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
  111. package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
  112. package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
  113. package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
  114. package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
  115. package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
  116. package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
  117. package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
  118. package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
  119. package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
  120. package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
  121. package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
  122. package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
  123. package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
  124. package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
  125. package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
  126. package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
  127. package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
  128. package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
  129. package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
  130. package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
  131. package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
  132. package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
  133. package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
  134. package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
  135. package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
  136. package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
  137. package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
  138. package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
  139. package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
  140. package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
  141. package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
  142. package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
  143. package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
  144. package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
  145. package/src/assets/img/dashboard_icon/ftable.svg +24 -0
  146. package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
  147. package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
  148. package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
  149. package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
  150. package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
  151. package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
  152. package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
  153. package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
  154. package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
  155. package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
  156. package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
  157. package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
  158. package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
  159. package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
  160. package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
  161. package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
  162. package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
  163. package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
  164. package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
  165. package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
  166. package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
  167. package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
  168. package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
  169. package/src/assets/img/dashboard_icon/geo.svg +14 -0
  170. package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
  171. package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
  172. package/src/assets/img/dashboard_icon/information-1.png +0 -0
  173. package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
  174. package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
  175. package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
  176. package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
  177. package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
  178. package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
  179. package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
  180. package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
  181. package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
  182. package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
  183. package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
  184. package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
  185. package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
  186. package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
  187. package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
  188. package/src/assets/img/dashboard_icon/more_View.svg +3 -0
  189. package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
  190. package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
  191. package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
  192. package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
  193. package/src/assets/img/dashboard_icon/pie.svg +16 -0
  194. package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
  195. package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
  196. package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
  197. package/src/assets/img/dashboard_icon/pivot.svg +8 -0
  198. package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
  199. package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
  200. package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
  201. package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
  202. package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
  203. package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
  204. package/src/assets/img/dashboard_icon/radar.svg +19 -0
  205. package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
  206. package/src/assets/img/dashboard_icon/search_input.svg +4 -0
  207. package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
  208. package/src/assets/img/dashboard_icon/table-3.svg +16 -0
  209. package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
  210. package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
  211. package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
  212. package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
  213. package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
  214. package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
  215. package/src/assets/img/dashboard_icon/tick.svg +26 -0
  216. package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
  217. package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
  218. package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
  219. package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
  220. package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
  221. package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
  222. package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
  223. package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
  224. package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
  225. package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
  226. package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
  227. package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
  228. package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
  229. package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
  230. package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
  231. package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
  232. package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
  233. package/src/assets/img/dashboard_icon/transpose.svg +16 -0
  234. package/src/assets/img/dialog-close.svg +4 -4
  235. package/src/assets/img/dialog-grow.svg +6 -6
  236. package/src/assets/img/dialog-shrink.svg +6 -6
  237. package/src/assets/img/plus.svg +4 -4
  238. package/src/assets/img/search.svg +4 -4
  239. package/src/assets/img/shrink-icon.svg +6 -6
  240. package/src/assets/img/time-disabled.svg +4 -4
  241. package/src/assets/img/time.svg +4 -4
  242. package/src/assets/img/toolbar-action-addFolder.svg +17 -17
  243. package/src/assets/img/toolbar-action-calculator.svg +11 -11
  244. package/src/assets/img/toolbar-action-collapse.svg +7 -7
  245. package/src/assets/img/toolbar-action-combine.svg +4 -4
  246. package/src/assets/img/toolbar-action-edit.svg +4 -4
  247. package/src/assets/img/toolbar-action-expand.svg +7 -7
  248. package/src/assets/img/toolbar-action-folderMove.svg +8 -8
  249. package/src/assets/img/toolbar-action-lock.svg +6 -6
  250. package/src/assets/img/toolbar-action-preview.svg +7 -7
  251. package/src/assets/img/toolbar-action-publish.svg +5 -5
  252. package/src/assets/img/toolbar-action-reminders.svg +10 -10
  253. package/src/assets/img/toolbar-action-rename.svg +7 -7
  254. package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
  255. package/src/assets/img/toolbar-action-send-file.svg +5 -5
  256. package/src/assets/img/toolbar-action-settle.svg +7 -7
  257. package/src/assets/img/toolbar-action-share.svg +5 -5
  258. package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
  259. package/src/assets/img/toolbar-action-sync.svg +4 -4
  260. package/src/assets/img/toolbar-action-template.svg +6 -6
  261. package/src/assets/img/toolbar-action-workflow.svg +9 -9
  262. package/src/assets/style/reset/button.scss +0 -1
  263. package/src/assets/style/reset/checkbox.scss +8 -3
  264. package/src/assets/style/reset/mat-dialog.scss +11 -5
  265. package/src/assets/style/style.scss +14 -4
  266. package/src/assets/style/variables.scss +1 -0
@@ -0,0 +1,3107 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/dashboard/dashboardPorlets.service.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import * as tslib_1 from "tslib";
7
+ import { Inject, Injectable, Optional } from "@angular/core";
8
+ import { ApiList } from "./api";
9
+ import { MatDialog } from "@angular/material";
10
+ import { DashboardService } from "./dashboard.service";
11
+ import { forEach } from "lodash";
12
+ import moment from "moment";
13
+ import { HttpClient, HttpHeaders } from "@angular/common/http";
14
+ import { API_SERVICE_TOKEN, PBF_TOKEN } from "../service/InjectionToken";
15
+ import { DialogService } from "../service/dialog.service";
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "./api";
18
+ import * as i2 from "@angular/material/dialog";
19
+ import * as i3 from "../service/dialog.service";
20
+ import * as i4 from "./dashboard.service";
21
+ import * as i5 from "@angular/common/http";
22
+ import * as i6 from "../service/InjectionToken";
23
+ export class DashboardPorletsService {
24
+ /**
25
+ * @param {?} api
26
+ * @param {?} dialog
27
+ * @param {?} dialogService
28
+ * @param {?} DashboardService
29
+ * @param {?} httpClient
30
+ * @param {?} pbf
31
+ * @param {?} http
32
+ */
33
+ constructor(api, dialog, dialogService, DashboardService, httpClient, pbf, http) {
34
+ this.api = api;
35
+ this.dialog = dialog;
36
+ this.dialogService = dialogService;
37
+ this.DashboardService = DashboardService;
38
+ this.httpClient = httpClient;
39
+ this.pbf = pbf;
40
+ this.http = http;
41
+ // public config;
42
+ this.companyDropdownList = [];
43
+ this.currencyDropdownList = [];
44
+ this.currencyList = [];
45
+ this.portlets = [];
46
+ this.portletsCopy = [];
47
+ this.companyCharts = [];
48
+ this.colorsTotal = [
49
+ "#0b5496",
50
+ "#0081ff",
51
+ "#22cce2",
52
+ "#606ede",
53
+ "#8598f7",
54
+ "#00a744",
55
+ "#12c177",
56
+ "#fdbf5e",
57
+ "#ff8a48",
58
+ "#ea4258",
59
+ ];
60
+ this.fetch_disabled = true;
61
+ this.update_loading = false;
62
+ this.loading_show = false;
63
+ this.sortingPortlet = [];
64
+ this.pagingChanging = [];
65
+ this.selected_enyity_fileds = [];
66
+ this.checkedAll = false;
67
+ this.updated = false;
68
+ this.dataMartTables = {};
69
+ this.length = 0;
70
+ this.templateList = [];
71
+ this.fieldsArr = {};
72
+ this.sourcesData = {};
73
+ // newDashboard
74
+ this.portletResults_New = {}; // 以DataTable为单位 存储新数据
75
+ // 以DataTable为单位 存储新数据
76
+ this.portletData_New = {}; // 以portlet为单位 存储新数据
77
+ // 以portlet为单位 存储新数据
78
+ this.portletFields_Temp = {}; // 存储当前portlet所用到的字段
79
+ // 存储当前portlet所用到的字段
80
+ this.dashboardConfig = {}; // 当前Dashboard的config, 用于获取orderByColumns
81
+ // 当前Dashboard的config, 用于获取orderByColumns
82
+ this.entityIds = [];
83
+ this.entityIdObj = {};
84
+ this.allFieldsObj = {};
85
+ this.GetDataTypes = (/**
86
+ * @return {?}
87
+ */
88
+ function () {
89
+ return [
90
+ { key: "budget", val: this.translation.BUDGET },
91
+ { key: "actual", val: this.translation.ACTUAL },
92
+ { key: "forecast", val: this.translation.FORECAST },
93
+ { key: "rolling", val: "Rolling" },
94
+ ];
95
+ });
96
+ this.ExcelFormulas = {
97
+ DaysBetween: (/**
98
+ * @param {?} date1
99
+ * @param {?} date2
100
+ * @return {?}
101
+ */
102
+ function (date1, date2) {
103
+ /** @type {?} */
104
+ var oneDay = 24 * 60 * 60 * 1000;
105
+ return Math.round(Math.abs((date1.getTime() - date2.getTime()) / oneDay));
106
+ }),
107
+ XNPV: (/**
108
+ * @param {?} rate
109
+ * @param {?} values
110
+ * @return {?}
111
+ */
112
+ function (rate, values) {
113
+ /** @type {?} */
114
+ var xnpv = 0.0;
115
+ /** @type {?} */
116
+ var firstDate = new Date(values[0].date);
117
+ for (var key in values) {
118
+ /** @type {?} */
119
+ var tmp = values[key];
120
+ /** @type {?} */
121
+ var value = tmp.amount;
122
+ /** @type {?} */
123
+ var date = new Date(tmp.date);
124
+ xnpv +=
125
+ value / Math.pow(1 + rate, this.DaysBetween(firstDate, date) / 365);
126
+ }
127
+ return xnpv;
128
+ }),
129
+ XIRR: (/**
130
+ * @param {?} values
131
+ * @param {?} guess
132
+ * @return {?}
133
+ */
134
+ function (values, guess) {
135
+ /** @type {?} */
136
+ var x1 = 0.0;
137
+ /** @type {?} */
138
+ var x2 = guess;
139
+ /** @type {?} */
140
+ var f1 = this.XNPV(x1, values);
141
+ /** @type {?} */
142
+ var f2 = this.XNPV(x2, values);
143
+ for (var i = 0; i < 100; i++) {
144
+ if (f1 * f2 < 0.0)
145
+ break;
146
+ if (Math.abs(f1) < Math.abs(f2)) {
147
+ f1 = this.XNPV((x1 += 1.6 * (x1 - x2)), values);
148
+ }
149
+ else {
150
+ f2 = this.XNPV((x2 += 1.6 * (x2 - x1)), values);
151
+ }
152
+ }
153
+ if (f1 * f2 > 0.0)
154
+ return null;
155
+ /** @type {?} */
156
+ var f = this.XNPV(x1, values);
157
+ if (f < 0.0) {
158
+ /** @type {?} */
159
+ var rtb = x1;
160
+ /** @type {?} */
161
+ var dx = x2 - x1;
162
+ }
163
+ else {
164
+ /** @type {?} */
165
+ var rtb = x2;
166
+ /** @type {?} */
167
+ var dx = x1 - x2;
168
+ }
169
+ for (var i = 0; i < 100; i++) {
170
+ dx *= 0.5;
171
+ /** @type {?} */
172
+ var x_mid = rtb + dx;
173
+ /** @type {?} */
174
+ var f_mid = this.XNPV(x_mid, values);
175
+ if (f_mid <= 0.0)
176
+ rtb = x_mid;
177
+ if (Math.abs(f_mid) < 1.0e-6 || Math.abs(dx) < 1.0e-6)
178
+ return x_mid;
179
+ }
180
+ return null;
181
+ }),
182
+ _DaysBetween: (/**
183
+ * @param {?} date1
184
+ * @param {?} date2
185
+ * @return {?}
186
+ */
187
+ function (date1, date2) {
188
+ //const time1 =new Date(Date.UTC(date1.getUTCFullYear(), date1.getUTCMonth(), date1.getUTCDate(), date1.getUTCHours(), date1.getUTCMinutes(), date1.getUTCSeconds())).getTime();
189
+ //const time2 =new Date(Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate(), date2.getUTCHours(), date2.getUTCMinutes(), date2.getUTCSeconds())).getTime();
190
+ /** @type {?} */
191
+ const oneDay = 24 * 60 * 60 * 1000;
192
+ // 一天的毫秒数
193
+ //const time1 = date1.getTime(); // date1的毫秒表示
194
+ //const time2 = date2.getTime(); // date2的毫秒表示
195
+ /** @type {?} */
196
+ const firstDate = new Date(date1);
197
+ /** @type {?} */
198
+ const secondDate = new Date(date2);
199
+ /** @type {?} */
200
+ const diffDays = Math.round(
201
+ // @ts-ignore
202
+ Math.abs((firstDate - secondDate) / oneDay));
203
+ return diffDays;
204
+ }),
205
+ _lcl_sca_XirrResult: (/**
206
+ * @param {?} values
207
+ * @param {?} dates
208
+ * @param {?} fRate
209
+ * @return {?}
210
+ */
211
+ function (values, dates, fRate) {
212
+ /** @type {?} */
213
+ var D_0 = dates[0];
214
+ /** @type {?} */
215
+ let r = fRate + 1.0;
216
+ /** @type {?} */
217
+ var fResult = values[0];
218
+ for (var i = 1, nCount = values.length; i < nCount; ++i) {
219
+ /** @type {?} */
220
+ var temp = Math.pow(r, this._DaysBetween(dates[i], D_0) / 365.0);
221
+ fResult += values[i] / temp;
222
+ }
223
+ return fResult;
224
+ }),
225
+ _lcl_sca_XirrResult_Deriv1: (/**
226
+ * @param {?} values
227
+ * @param {?} dates
228
+ * @param {?} fRate
229
+ * @return {?}
230
+ */
231
+ function (values, dates, fRate) {
232
+ /** @type {?} */
233
+ var D_0 = dates[0];
234
+ /** @type {?} */
235
+ var r = fRate + 1.0;
236
+ /** @type {?} */
237
+ var fResult = 0.0;
238
+ for (var i = 1, nCount = values.length; i < nCount; ++i) {
239
+ /** @type {?} */
240
+ var E_i = this._DaysBetween(dates[i], D_0) / 365.0;
241
+ fResult -= (E_i * values[i]) / Math.pow(r, E_i + 1.0);
242
+ }
243
+ return fResult;
244
+ }),
245
+ _CalculateXirrOpenOffice: (/**
246
+ * @param {?} values
247
+ * @param {?} dates
248
+ * @param {?} guess
249
+ * @return {?}
250
+ */
251
+ function (values, dates, guess) {
252
+ if (values.length < 2 || values.length != dates.length) {
253
+ return null;
254
+ }
255
+ /** @type {?} */
256
+ var fResultRate = guess;
257
+ if (fResultRate <= -1) {
258
+ return null;
259
+ }
260
+ /** @type {?} */
261
+ var fMaxEps = 0.00000001;
262
+ /** @type {?} */
263
+ var nMaxIter = 50;
264
+ /** @type {?} */
265
+ var fNewRate;
266
+ /** @type {?} */
267
+ var fRateEps;
268
+ /** @type {?} */
269
+ var fResultValue;
270
+ /** @type {?} */
271
+ var nIter = 0;
272
+ /** @type {?} */
273
+ var nIterScan = 0;
274
+ /** @type {?} */
275
+ var bContLoop = false;
276
+ /** @type {?} */
277
+ var bResultRateScanEnd = false;
278
+ do {
279
+ if (nIterScan >= 1) {
280
+ fResultRate = -0.99 + (nIterScan - 1) * 0.01;
281
+ }
282
+ do {
283
+ fResultValue = this._lcl_sca_XirrResult(values, dates, fResultRate);
284
+ fNewRate =
285
+ fResultRate -
286
+ fResultValue /
287
+ this._lcl_sca_XirrResult_Deriv1(values, dates, fResultRate);
288
+ fRateEps = Math.abs(fNewRate - fResultRate);
289
+ fResultRate = fNewRate;
290
+ bContLoop = fRateEps > fMaxEps && Math.abs(fResultValue) > fMaxEps;
291
+ } while (bContLoop && ++nIter < nMaxIter);
292
+ nIter = 0;
293
+ if (isNaN(fResultRate) ||
294
+ !isFinite(fResultRate) ||
295
+ isNaN(fResultValue) ||
296
+ !isFinite(fResultValue)) {
297
+ bContLoop = true;
298
+ }
299
+ ++nIterScan;
300
+ bResultRateScanEnd = nIterScan >= 100;
301
+ } while (bContLoop && !bResultRateScanEnd);
302
+ if (bContLoop) {
303
+ return null;
304
+ }
305
+ return fResultRate;
306
+ }),
307
+ _CalculateXirr: (/**
308
+ * @param {?} valueList
309
+ * @param {?} dateList
310
+ * @param {?} navAdjust
311
+ * @param {?} latestDate
312
+ * @return {?}
313
+ */
314
+ function (valueList, dateList, navAdjust, latestDate) {
315
+ /** @type {?} */
316
+ var positiveCashflow = valueList.some((/**
317
+ * @param {?} v
318
+ * @return {?}
319
+ */
320
+ function (v) {
321
+ return v > 0;
322
+ }))
323
+ ? true
324
+ : navAdjust > 0
325
+ ? true
326
+ : false;
327
+ /** @type {?} */
328
+ var negativeCashflow = valueList.some((/**
329
+ * @param {?} v
330
+ * @return {?}
331
+ */
332
+ function (v) {
333
+ return v < 0;
334
+ }))
335
+ ? true
336
+ : navAdjust < 0
337
+ ? true
338
+ : false;
339
+ if (positiveCashflow == false || negativeCashflow == false) {
340
+ return null;
341
+ }
342
+ if (navAdjust != null) {
343
+ valueList.push(navAdjust);
344
+ dateList.push(latestDate);
345
+ }
346
+ /** @type {?} */
347
+ var xirrResult = null;
348
+ try {
349
+ /** @type {?} */
350
+ var excelGuess = valueList.reduce((/**
351
+ * @param {?} sum
352
+ * @param {?} value
353
+ * @return {?}
354
+ */
355
+ function (sum, value) {
356
+ return sum + value;
357
+ }), 0) < 0
358
+ ? -0.1
359
+ : 0.1;
360
+ xirrResult = this._CalculateXirrOpenOffice(valueList, dateList, excelGuess);
361
+ }
362
+ catch (error) {
363
+ return null;
364
+ }
365
+ return xirrResult;
366
+ }),
367
+ };
368
+ }
369
+ /**
370
+ * @private
371
+ * @param {?} res
372
+ * @return {?}
373
+ */
374
+ setEntityType(res) {
375
+ if (res && res.entityList && res.entityList.length) {
376
+ /** @type {?} */
377
+ const entityData = res.entityList[0];
378
+ if (!entityData) {
379
+ return res;
380
+ }
381
+ const { linkedType = "" } = entityData;
382
+ if (!linkedType) {
383
+ return res;
384
+ }
385
+ this.entityType =
386
+ linkedType === "PropertyId"
387
+ ? "Property"
388
+ : linkedType === "portfolioCompId" ||
389
+ linkedType === "assetCompId" ||
390
+ linkedType === "otherCompId"
391
+ ? "Company"
392
+ : linkedType === "portfolioFundId" || linkedType === "assetFundId"
393
+ ? "Fund"
394
+ : "AssetPortfolio";
395
+ res.entityType = this.entityType;
396
+ }
397
+ return res;
398
+ }
399
+ /**
400
+ * @param {?} dashboardId
401
+ * @param {?} roGet
402
+ * @param {?} callback
403
+ * @param {?=} isRefresh
404
+ * @param {?=} callbackForDashboard
405
+ * @return {?}
406
+ */
407
+ GetDashboardV1(dashboardId, roGet, callback, isRefresh = false, callbackForDashboard) {
408
+ if (!isRefresh) {
409
+ this.portlets = [];
410
+ }
411
+ this.getInfo();
412
+ /** @type {?} */
413
+ const dataObj = { dashboardId, language: this.lang };
414
+ this.http.post(this.api.urlList.GetDashboardV2, dataObj, (/**
415
+ * @param {?} res
416
+ * @return {?}
417
+ */
418
+ (res) => {
419
+ res = this.pbf.convertKeysToLowerCase(res);
420
+ if (!res) {
421
+ callback(null);
422
+ return;
423
+ }
424
+ res = this.setEntityType(res);
425
+ // 初始化fromDate
426
+ if (res.fromDate === "1900-01-01T00:00:00Z") {
427
+ res.fromDate = "";
428
+ }
429
+ if (callbackForDashboard) {
430
+ callbackForDashboard(res);
431
+ }
432
+ this.entityIds =
433
+ res.entityList && res.entityList.length > 0
434
+ ? res.entityList.map((/**
435
+ * @param {?} e
436
+ * @return {?}
437
+ */
438
+ (e) => {
439
+ return e["linkedGuid"];
440
+ }))
441
+ : [];
442
+ if (res.entityList)
443
+ this.entityList = [...res.entityList];
444
+ this.entityIdObj = {
445
+ id: JSON.stringify(this.entityIds),
446
+ };
447
+ this.portletResults_New[res.id] = {};
448
+ this.portletData_New[res.id] = {};
449
+ this.DashboardService.dashboardGroupId[res.id] = res.dashboardGroupId;
450
+ this.DashboardService.dashboardGroupName[res.id] = res.dashboardGroupName;
451
+ this.DashboardService.RegionDataSetId[res.id] = res.RegionDataSetId;
452
+ this.DashboardService.dashboardName[res.id] = res.name;
453
+ this.DashboardService.shareUsers[res.id] = res.sharedUsers;
454
+ this.dashboardConfig[res.id] = res.config && JSON.parse(res.config);
455
+ if (res) {
456
+ // this.dataMartTables[res.id] = uniqBy(
457
+ // res.dataMartTables,
458
+ // "langCode"
459
+ // );
460
+ this.dataMartTables[res.id] = [...res.dataMartTables];
461
+ this.sortDataMartTables(this.dataMartTables[res.id]);
462
+ this.DashboardService.dashboardDescription = res.description;
463
+ this.img = res.img;
464
+ // 如果可选开始日期,屏蔽默认的1900-01-01
465
+ this.currencyCode = res.currencyCode;
466
+ //@ts-ignore
467
+ this.columnCount = res.columnCount ? res.columnCount : 4;
468
+ if (res.portlets) {
469
+ if (!isRefresh) {
470
+ this.portlets = JSON.parse(JSON.stringify(res.portlets));
471
+ }
472
+ this.rowCount =
473
+ res.portlets.length > 0
474
+ ? Math.max.apply(Math, res.portlets.map((/**
475
+ * @param {?} o
476
+ * @return {?}
477
+ */
478
+ function (o) {
479
+ return o.posY;
480
+ }))) + 2
481
+ : 2;
482
+ // new Dashboard
483
+ if (this.portlets && this.portlets.length) {
484
+ this.fieldsArr[res.id] = {};
485
+ this.portlets.forEach((/**
486
+ * @param {?} el
487
+ * @return {?}
488
+ */
489
+ (el) => {
490
+ if (!Object.keys(this.fieldsArr[res.id]).includes(el.figureCode)) {
491
+ this.fieldsArr[res.id][el.figureCode] = JSON.parse(el.config).fields;
492
+ }
493
+ }));
494
+ this.portlets = this.portlets.filter((/**
495
+ * @param {?} item
496
+ * @return {?}
497
+ */
498
+ (item) => item.figureCode));
499
+ this.getDataByPortletsNew(this.portlets, (/**
500
+ * @param {?} _res
501
+ * @return {?}
502
+ */
503
+ (_res) => {
504
+ callback(res, this.portlets);
505
+ }), null, isRefresh, res, roGet);
506
+ }
507
+ else {
508
+ callback(res, this.portlets);
509
+ }
510
+ }
511
+ else {
512
+ this.portlets = [];
513
+ this.columnCount = 4;
514
+ this.rowCount = 2;
515
+ callback(res, this.portlets);
516
+ }
517
+ }
518
+ }));
519
+ }
520
+ /**
521
+ * @param {?} portlet
522
+ * @param {?} filterSettings
523
+ * @param {?} dashboard
524
+ * @param {?} callback
525
+ * @return {?}
526
+ */
527
+ filterTriggerGetData(portlet, filterSettings, dashboard, callback) {
528
+ /** @type {?} */
529
+ const config = portlet.config && JSON.parse(portlet.config);
530
+ /** @type {?} */
531
+ let id = portlet.id === "00000000-0000-0000-0000-000000000000"
532
+ ? portlet.newId
533
+ : portlet.id;
534
+ /** @type {?} */
535
+ let params = this.getParamsByPortlet(portlet, null, null, dashboard);
536
+ /** @type {?} */
537
+ let initFieldsArr;
538
+ /** @type {?} */
539
+ let curFieldsArr;
540
+ if (!params.isTable) {
541
+ // 赋值portletFields_Temp
542
+ initFieldsArr = this.portletFields_Temp[id];
543
+ curFieldsArr = params.displayColumnFilter.split(",");
544
+ if (!initFieldsArr ||
545
+ this.needGetPortletData(initFieldsArr, curFieldsArr)) {
546
+ this.portletFields_Temp[id] = curFieldsArr;
547
+ }
548
+ }
549
+ if (filterSettings && filterSettings.length) {
550
+ if (!params.columnFilter) {
551
+ params.columnFilter = [];
552
+ }
553
+ config.filterSettings = filterSettings;
554
+ filterSettings.forEach((/**
555
+ * @param {?} setting
556
+ * @return {?}
557
+ */
558
+ (setting) => {
559
+ if (config.portletType === "pivot") {
560
+ return;
561
+ }
562
+ /** @type {?} */
563
+ const _field = config.fields.find((/**
564
+ * @param {?} item
565
+ * @return {?}
566
+ */
567
+ (item) => item.colName === setting.name));
568
+ /** @type {?} */
569
+ const Type = _field && _field.dataType;
570
+ if (setting.items) {
571
+ setting.items.forEach((/**
572
+ * @param {?} item
573
+ * @return {?}
574
+ */
575
+ (item) => {
576
+ params.columnFilter.push({
577
+ Field: setting.name,
578
+ Operator: "equal",
579
+ Type,
580
+ Value: Type === "date"
581
+ ? moment(item).format("yyyy-MM-DD")
582
+ : Type === "datetime"
583
+ ? moment(item).format("yyyy-MM-DD hh:mm:ss")
584
+ : item,
585
+ });
586
+ }));
587
+ }
588
+ else if (setting.operator) {
589
+ params.columnFilter.push({
590
+ Field: setting.field,
591
+ Operator: "equal",
592
+ Type: setting.type,
593
+ Value: setting.type === "date"
594
+ ? moment(setting.value).format("yyyy-MM-DD")
595
+ : setting.type === "datetime"
596
+ ? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
597
+ : setting.value,
598
+ });
599
+ }
600
+ }));
601
+ }
602
+ else {
603
+ config.filterSettings = [];
604
+ }
605
+ if (params.columnFilter instanceof Array) {
606
+ params.columnFilter = params.columnFilter.filter((/**
607
+ * @param {?} item
608
+ * @return {?}
609
+ */
610
+ (item) => item.Field));
611
+ }
612
+ // json buffer
613
+ params["dashboardVersion"] = 2;
614
+ // json buffer
615
+ this.httpClient
616
+ .post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
617
+ headers: new HttpHeaders({
618
+ Authorization: `Bearer`,
619
+ }),
620
+ })
621
+ .subscribe((/**
622
+ * @param {?} result
623
+ * @return {?}
624
+ */
625
+ (result) => {
626
+ result["data"].forEach((/**
627
+ * @param {?} item
628
+ * @return {?}
629
+ */
630
+ (item) => {
631
+ item.Sector = this.translation[item.Sector] || item.Sector;
632
+ }));
633
+ this.portletData_New[dashboard.id][id] = result;
634
+ this.pbf.triggerDashboardFilterChange.next({
635
+ id: dashboard.id,
636
+ newId: portlet.newId,
637
+ });
638
+ callback({ newId: portlet && portlet.newId, config });
639
+ }));
640
+ }
641
+ /**
642
+ * @param {?} str
643
+ * @return {?}
644
+ */
645
+ removeParentheses(str) {
646
+ return str.split("(").join("").split(")").join("").split('"').join("");
647
+ }
648
+ /**
649
+ * @return {?}
650
+ */
651
+ getInfo() {
652
+ this.translation = JSON.parse(localStorage.getItem("translation"));
653
+ this.userInfo = JSON.parse(localStorage.getItem("userInfo"));
654
+ this.lang = this.pbf.getLanguageParams();
655
+ this.translation.DASHBOARD_ROLLING = this.translation.DASHBOARD_ROLLING
656
+ ? this.translation.DASHBOARD_ROLLING
657
+ : "DASHBOARD_ROLLING";
658
+ }
659
+ /* Financial Analysis I get select Dropdown */
660
+ /**
661
+ * @return {?}
662
+ */
663
+ GetChartTypes() {
664
+ // Chart Type
665
+ return [
666
+ {
667
+ val: "mscombi2d",
668
+ displayVal: this.translation.SINGLEY2D,
669
+ hasSecondaryYAxis: false,
670
+ canSelectStyle: true,
671
+ },
672
+ {
673
+ val: "mscombi3d",
674
+ displayVal: this.translation.SINGLEY3D,
675
+ hasSecondaryYAxis: false,
676
+ canSelectStyle: true,
677
+ },
678
+ {
679
+ val: "mscombidy2d",
680
+ displayVal: this.translation.DUALY2D,
681
+ hasSecondaryYAxis: true,
682
+ canSelectStyle: true,
683
+ },
684
+ {
685
+ val: "msbar2d",
686
+ displayVal: this.translation.BAR2D,
687
+ hasSecondaryYAxis: false,
688
+ canSelectStyle: false,
689
+ },
690
+ {
691
+ val: "msbar3d",
692
+ displayVal: this.translation.BAR3D,
693
+ hasSecondaryYAxis: false,
694
+ canSelectStyle: false,
695
+ },
696
+ {
697
+ val: "stackedcolumn2dline",
698
+ displayVal: this.translation.STACKEDBAR2D,
699
+ hasSecondaryYAxis: false,
700
+ canSelectStyle: true,
701
+ },
702
+ {
703
+ val: "stackedcolumn3dline",
704
+ displayVal: this.translation.STACKEDBAR3D,
705
+ hasSecondaryYAxis: false,
706
+ canSelectStyle: true,
707
+ },
708
+ ];
709
+ }
710
+ /**
711
+ * @return {?}
712
+ */
713
+ getCompanyDropdown() {
714
+ // company
715
+ /** @type {?} */
716
+ let data = {
717
+ accountId: this.userInfo.accountId,
718
+ username: this.userInfo.username,
719
+ language: this.lang,
720
+ companyType: "portfolio",
721
+ };
722
+ this.http.post(this.api.urlList.GetAllCompanyByAccount, data, (/**
723
+ * @param {?} res
724
+ * @return {?}
725
+ */
726
+ (res) => {
727
+ if (res) {
728
+ this.companyDropdownList = res;
729
+ // return res;
730
+ }
731
+ }));
732
+ }
733
+ /**
734
+ * @return {?}
735
+ */
736
+ getCurrencyDropdown() {
737
+ // Currency
738
+ /** @type {?} */
739
+ let data = {
740
+ accountId: this.userInfo.accountId,
741
+ username: this.userInfo.username,
742
+ language: this.lang,
743
+ alias: "Currency",
744
+ };
745
+ this.http.post(this.api.urlList.GetDropdown, data, (/**
746
+ * @param {?} res
747
+ * @return {?}
748
+ */
749
+ (res) => {
750
+ if (res) {
751
+ this.currencyDropdownList = res;
752
+ // return res;
753
+ }
754
+ }));
755
+ }
756
+ /**
757
+ * @return {?}
758
+ */
759
+ GetTimeMeasure() {
760
+ // Time Measure
761
+ return [
762
+ {
763
+ key: "MTD",
764
+ // 月度
765
+ val: this.translation.MONTHLY,
766
+ },
767
+ {
768
+ key: "QTD",
769
+ // 季度
770
+ val: this.translation.QUARTERLY,
771
+ },
772
+ {
773
+ key: "SYTD",
774
+ // 半年度
775
+ val: this.translation.SEMIANNUALLY,
776
+ },
777
+ {
778
+ key: "YTD",
779
+ // 年度
780
+ val: this.translation.ANNUALLY,
781
+ },
782
+ {
783
+ key: "FYTD",
784
+ // 年度(财政年度)
785
+ val: this.translation.ANNUALLYFY,
786
+ },
787
+ {
788
+ key: "LTM",
789
+ // 最近十二个月
790
+ val: this.translation.LAST12MONTH,
791
+ },
792
+ ];
793
+ }
794
+ /**
795
+ * @return {?}
796
+ */
797
+ GetPeriods() {
798
+ // Previous Period
799
+ return [
800
+ {
801
+ val: 2,
802
+ displayVal: this.translation.LAST2DATA,
803
+ },
804
+ {
805
+ val: 3,
806
+ displayVal: this.translation.LAST3DATA,
807
+ },
808
+ {
809
+ val: 4,
810
+ displayVal: this.translation.LAST4DATA,
811
+ },
812
+ {
813
+ val: 5,
814
+ displayVal: this.translation.LAST5DATA,
815
+ },
816
+ {
817
+ val: 6,
818
+ displayVal: this.translation.LAST6DATA,
819
+ },
820
+ {
821
+ val: 7,
822
+ displayVal: this.translation.LAST7DATA,
823
+ },
824
+ {
825
+ val: 8,
826
+ displayVal: this.translation.LAST8DATA,
827
+ },
828
+ {
829
+ val: 9,
830
+ displayVal: this.translation.LAST9DATA,
831
+ },
832
+ {
833
+ val: 10,
834
+ displayVal: this.translation.LAST10DATA,
835
+ },
836
+ {
837
+ val: 11,
838
+ displayVal: this.translation.LAST11DATA,
839
+ },
840
+ {
841
+ val: 12,
842
+ displayVal: this.translation.LAST12DATA,
843
+ },
844
+ {
845
+ val: 13,
846
+ displayVal: this.translation.LAST13DATA,
847
+ },
848
+ {
849
+ val: 14,
850
+ displayVal: this.translation.LAST14DATA,
851
+ },
852
+ {
853
+ val: 15,
854
+ displayVal: this.translation.LAST15DATA,
855
+ },
856
+ {
857
+ val: 16,
858
+ displayVal: this.translation.LAST16DATA,
859
+ },
860
+ {
861
+ val: 17,
862
+ displayVal: this.translation.LAST17DATA,
863
+ },
864
+ {
865
+ val: 18,
866
+ displayVal: this.translation.LAST18DATA,
867
+ },
868
+ {
869
+ val: 19,
870
+ displayVal: this.translation.LAST19DATA,
871
+ },
872
+ {
873
+ val: 20,
874
+ displayVal: this.translation.LAST20DATA,
875
+ },
876
+ {
877
+ val: 21,
878
+ displayVal: this.translation.LAST21DATA,
879
+ },
880
+ {
881
+ val: 22,
882
+ displayVal: this.translation.LAST22DATA,
883
+ },
884
+ {
885
+ val: 23,
886
+ displayVal: this.translation.LAST23DATA,
887
+ },
888
+ {
889
+ val: 24,
890
+ displayVal: this.translation.LAST24DATA,
891
+ },
892
+ ];
893
+ }
894
+ /**
895
+ * @return {?}
896
+ */
897
+ GetFollowingPeriods() {
898
+ // Following Period
899
+ return [
900
+ {
901
+ val: 0,
902
+ displayVal: this.translation.NONEXTDATA,
903
+ },
904
+ {
905
+ val: 3,
906
+ displayVal: this.translation.NEXT3DATA,
907
+ },
908
+ {
909
+ val: 4,
910
+ displayVal: this.translation.NEXT4DATA,
911
+ },
912
+ {
913
+ val: 5,
914
+ displayVal: this.translation.NEXT5DATA,
915
+ },
916
+ {
917
+ val: 6,
918
+ displayVal: this.translation.NEXT6DATA,
919
+ },
920
+ {
921
+ val: 7,
922
+ displayVal: this.translation.NEXT7DATA,
923
+ },
924
+ {
925
+ val: 8,
926
+ displayVal: this.translation.NEXT8DATA,
927
+ },
928
+ {
929
+ val: 9,
930
+ displayVal: this.translation.NEXT9DATA,
931
+ },
932
+ {
933
+ val: 10,
934
+ displayVal: this.translation.NEXT10DATA,
935
+ },
936
+ {
937
+ val: 11,
938
+ displayVal: this.translation.NEXT11DATA,
939
+ },
940
+ {
941
+ val: 12,
942
+ displayVal: this.translation.NEXT12DATA,
943
+ },
944
+ ];
945
+ }
946
+ /**
947
+ * @return {?}
948
+ */
949
+ GetFinancialFigureCodes() {
950
+ // Financial Type
951
+ return [
952
+ {
953
+ key: "accountAssetFigure",
954
+ val: this.translation.DASHD_ACCOUNTASSETFIGURE,
955
+ },
956
+ {
957
+ key: "accountEquityFigure",
958
+ val: this.translation.DASHD_ACCOUNTEQUITYFIGURE,
959
+ },
960
+ {
961
+ key: "accountLiabilityFigure",
962
+ val: this.translation.DASHD_ACCOUNTLIABILITYFIGURE,
963
+ },
964
+ {
965
+ key: "accountPLFigure",
966
+ val: this.translation.DASHD_ACCOUNTPLFIGURE,
967
+ },
968
+ {
969
+ key: "accountCashflowFigure",
970
+ val: this.translation.DASHD_ACCOUNTCASHFLOWFIGURE,
971
+ },
972
+ {
973
+ key: "accountOperationKPIFigure",
974
+ val: this.translation.DASHD_ACCOUNTOPERATIONKPIFIGURE,
975
+ },
976
+ {
977
+ key: "accountRATIOFigure",
978
+ val: this.translation.DASHD_ACCOUNTRATIOFIGURE,
979
+ },
980
+ ];
981
+ }
982
+ /**
983
+ * @param {?} financials
984
+ * @return {?}
985
+ */
986
+ GetFinancialSubType(financials) {
987
+ /** @type {?} */
988
+ var financialTypes = [];
989
+ for (var item in financials) {
990
+ financialTypes.push({
991
+ subType: item["subType"],
992
+ subTypeCode: item["subTypeCode"],
993
+ });
994
+ }
995
+ return financialTypes;
996
+ }
997
+ /**
998
+ * @param {?} id
999
+ * @param {?} key
1000
+ * @return {?}
1001
+ */
1002
+ GetFinancialItems(id, key) {
1003
+ /** @type {?} */
1004
+ let data = {
1005
+ username: this.userInfo.username,
1006
+ accountId: this.userInfo.accountId,
1007
+ investeeIds: [id],
1008
+ figureCode: key,
1009
+ language: this.lang,
1010
+ };
1011
+ this.http.post(this.api.urlList.GetFinancialItems, data, (/**
1012
+ * @param {?} res
1013
+ * @return {?}
1014
+ */
1015
+ (res) => {
1016
+ if (res) {
1017
+ return res;
1018
+ }
1019
+ }));
1020
+ }
1021
+ /* get toggle */
1022
+ /**
1023
+ * @return {?}
1024
+ */
1025
+ GetTheme() {
1026
+ return [
1027
+ { key: "zune", val: this.translation.CHARTTHEME_ZUNE },
1028
+ { key: "ocean", val: this.translation.CHARTTHEME_OCEAN },
1029
+ { key: "carbon", val: this.translation.CHARTTHEME_CARBON },
1030
+ ];
1031
+ }
1032
+ /**
1033
+ * @return {?}
1034
+ */
1035
+ GetFollowingDataType() {
1036
+ return [
1037
+ { key: "budget", val: this.translation.BUDGET },
1038
+ { key: "forecast", val: this.translation.FORECAST },
1039
+ // { key: 'rolling', val: this.translation.DASHBOARD_ROLLING },
1040
+ { key: "rolling", val: "Rolling" },
1041
+ ];
1042
+ }
1043
+ /**
1044
+ * @return {?}
1045
+ */
1046
+ GetFormat() {
1047
+ return [
1048
+ { key: "number", val: this.translation.NUMBER },
1049
+ { key: "percentage", val: this.translation.PERCENTAGE },
1050
+ ];
1051
+ }
1052
+ /**
1053
+ * @return {?}
1054
+ */
1055
+ GetChartStyle() {
1056
+ return [
1057
+ { key: "bar", val: this.translation.BAR },
1058
+ { key: "line", val: this.translation.LINE },
1059
+ { key: "area", val: this.translation.AREA },
1060
+ ];
1061
+ }
1062
+ /* Fund Operation Summary */
1063
+ /**
1064
+ * @return {?}
1065
+ */
1066
+ getFundDropdown() {
1067
+ /** @type {?} */
1068
+ let data = {
1069
+ username: this.userInfo.username,
1070
+ accountId: this.userInfo.accountId,
1071
+ investorId: this.userInfo.accountId,
1072
+ language: this.lang,
1073
+ };
1074
+ this.http.post(this.api.urlList.GetFundListByInvestorId, data, (/**
1075
+ * @param {?} res
1076
+ * @return {?}
1077
+ */
1078
+ (res) => {
1079
+ if (res) {
1080
+ this.fundDropdownList = res;
1081
+ // return res;
1082
+ }
1083
+ }));
1084
+ }
1085
+ /* Fund performance */
1086
+ /**
1087
+ * @return {?}
1088
+ */
1089
+ GetGrouping() {
1090
+ return [
1091
+ { key: "null", val: "" },
1092
+ { key: "investor", val: this.translation.DASHD_GP_INVESTOR },
1093
+ { key: "fund", val: this.translation.DASHD_GP_FUND },
1094
+ ];
1095
+ }
1096
+ /* Fund Operation Summary */
1097
+ /**
1098
+ * @param {?} callbake
1099
+ * @return {?}
1100
+ */
1101
+ getFundDropdown_(callbake) {
1102
+ /** @type {?} */
1103
+ let data = {
1104
+ username: this.userInfo.username,
1105
+ accountId: this.userInfo.accountId,
1106
+ investorId: this.userInfo.accountId,
1107
+ language: this.lang,
1108
+ };
1109
+ this.http.post(this.api.urlList.GetFundListByInvestorId, data, (/**
1110
+ * @param {?} res
1111
+ * @return {?}
1112
+ */
1113
+ (res) => {
1114
+ if (res) {
1115
+ this.fundDropdownList = res;
1116
+ // this.GetAllInvestee(res => {
1117
+ callbake();
1118
+ // });
1119
+ }
1120
+ }));
1121
+ }
1122
+ /* Investor position */
1123
+ /**
1124
+ * @param {?} callbake
1125
+ * @return {?}
1126
+ */
1127
+ GetAllInvestee(callbake) {
1128
+ /** @type {?} */
1129
+ let data = {
1130
+ username: this.userInfo.username,
1131
+ accountId: this.userInfo.accountId,
1132
+ language: this.lang,
1133
+ };
1134
+ this.http.post(this.api.urlList.GetAllInvestee, data, (/**
1135
+ * @param {?} res
1136
+ * @return {?}
1137
+ */
1138
+ (res) => {
1139
+ if (res) {
1140
+ this.allInvesteeList = res;
1141
+ callbake();
1142
+ }
1143
+ }));
1144
+ }
1145
+ /**
1146
+ * @param {?} num
1147
+ * @return {?}
1148
+ */
1149
+ pivotTableformatNumber(num) {
1150
+ switch (num) {
1151
+ case 1:
1152
+ case 2:
1153
+ case 3:
1154
+ return "#,###;(#,###)";
1155
+ case 4:
1156
+ case 5:
1157
+ case 6:
1158
+ return "#,###.0;(#,###.0)";
1159
+ case 7:
1160
+ case 8:
1161
+ case 9:
1162
+ return "#,###.00;(#,###.00)";
1163
+ case 10:
1164
+ case 11:
1165
+ case 12:
1166
+ return "#,###,,;(#,###,,)";
1167
+ case 13:
1168
+ case 14:
1169
+ case 15:
1170
+ return "#,###,,.0;(#,###,,.0)";
1171
+ case 16:
1172
+ case 17:
1173
+ case 18:
1174
+ return "#,###,,.00;(#,###,,.00)";
1175
+ default:
1176
+ return "#,###.00;-#,###.00";
1177
+ }
1178
+ }
1179
+ /**
1180
+ * @param {?} num
1181
+ * @return {?}
1182
+ */
1183
+ pivotTableformatInteger(num) {
1184
+ switch (num) {
1185
+ case 1:
1186
+ case 3:
1187
+ case 4:
1188
+ return "#,###;(#,###)";
1189
+ case 4:
1190
+ case 5:
1191
+ case 6:
1192
+ return "#,###,,;(#,###,,)";
1193
+ default:
1194
+ return "#,###;(#,###)";
1195
+ }
1196
+ }
1197
+ /**
1198
+ * @param {?} num
1199
+ * @return {?}
1200
+ */
1201
+ pivotTableformatPercent(num) {
1202
+ switch (num) {
1203
+ case 1:
1204
+ case 2:
1205
+ case 3:
1206
+ return "P";
1207
+ case 4:
1208
+ case 5:
1209
+ case 6:
1210
+ return "P1";
1211
+ case 7:
1212
+ case 8:
1213
+ case 9:
1214
+ return "P2";
1215
+ case 10:
1216
+ case 11:
1217
+ case 12:
1218
+ return "#,###0.00'x';(#,###0.00'x')";
1219
+ default:
1220
+ return "P2";
1221
+ }
1222
+ }
1223
+ /**
1224
+ * @param {?} num
1225
+ * @return {?}
1226
+ */
1227
+ pivotTableformatPercentNum(num) {
1228
+ switch (num) {
1229
+ case 1:
1230
+ return "####'%'";
1231
+ case 2:
1232
+ return "####.0'%'";
1233
+ case 3:
1234
+ return "####.00'%'";
1235
+ default:
1236
+ return "####.00'%'";
1237
+ }
1238
+ }
1239
+ /**
1240
+ * @param {?} num
1241
+ * @return {?}
1242
+ */
1243
+ pivotTableformatMultiple(num) {
1244
+ switch (num) {
1245
+ case 1:
1246
+ return "####'x'";
1247
+ case 2:
1248
+ return "###0.0'x'";
1249
+ case 3:
1250
+ return "###0.00'x'";
1251
+ default:
1252
+ return "###0.00'x'";
1253
+ }
1254
+ }
1255
+ /**
1256
+ * @param {?} num
1257
+ * @return {?}
1258
+ */
1259
+ formatNumber(num) {
1260
+ switch (num) {
1261
+ case 0:
1262
+ return "N";
1263
+ case 1:
1264
+ return "N1";
1265
+ case 2:
1266
+ return "N2";
1267
+ case 3:
1268
+ return "N3";
1269
+ case 4:
1270
+ return "N4";
1271
+ case 5:
1272
+ return "N5";
1273
+ case 6:
1274
+ return "N6";
1275
+ default:
1276
+ return "N2";
1277
+ }
1278
+ }
1279
+ /**
1280
+ * @param {?} num
1281
+ * @return {?}
1282
+ */
1283
+ formatPercent(num) {
1284
+ switch (num) {
1285
+ case 0:
1286
+ return "P";
1287
+ case 1:
1288
+ return "P1";
1289
+ case 2:
1290
+ return "P2";
1291
+ case 3:
1292
+ return "P3";
1293
+ case 4:
1294
+ return "P4";
1295
+ case 5:
1296
+ return "P5";
1297
+ case 6:
1298
+ return "P6";
1299
+ default:
1300
+ return "P2";
1301
+ }
1302
+ }
1303
+ /**
1304
+ * @param {?} num
1305
+ * @return {?}
1306
+ */
1307
+ formatPercentNum(num) {
1308
+ switch (num) {
1309
+ case 0:
1310
+ return "####'%'";
1311
+ case 1:
1312
+ return "###0.0'%'";
1313
+ case 2:
1314
+ return "###0.00'%'";
1315
+ default:
1316
+ return "###0.00'%'";
1317
+ }
1318
+ }
1319
+ /**
1320
+ * @param {?} num
1321
+ * @return {?}
1322
+ */
1323
+ formatMultiple(num) {
1324
+ switch (num) {
1325
+ case 0:
1326
+ return "####'x'";
1327
+ case 1:
1328
+ return "###0.0'x'";
1329
+ case 2:
1330
+ return "###0.00'x'";
1331
+ default:
1332
+ return "###0.00'x'";
1333
+ }
1334
+ }
1335
+ /**
1336
+ * @return {?}
1337
+ */
1338
+ GetFigureFormat() {
1339
+ // return [
1340
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 1 }, //
1341
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 2 }, //
1342
+ // { key1: "1,234,567.00", key2: "(1,234,567.00)", key3: "-", val: 3 }, //
1343
+ // { key1: "1,234,567.00", key2: "(1,234,567.00)", key3: "-", val: 4 }, //
1344
+ // { key1: "1", key2: "(1)", key3: "-", val: 5 }, //
1345
+ // { key1: "1", key2: "(1)", key3: "-", val: 6 }, //
1346
+ // { key1: "1.2", key2: "(1.2)", key3: "0.0", val: 7 }, //
1347
+ // { key1: "1.2", key2: "(1.2)", key3: "0.0", val: 8 }, //
1348
+ // { key1: "1.23", key2: "(1.23)", key3: "0.00", val: 9 }, //
1349
+ // { key1: "1.23", key2: "(1.23)", key3: "0.00", val: 10 }, //
1350
+ // ];
1351
+ return [
1352
+ { key: "1,234,567;(1,234,567);0", val: 1 },
1353
+ { key: "1,234,567;(1,234,567);-", val: 2 },
1354
+ { key: "1,234,567;(1,234,567);", val: 3 },
1355
+ { key: "1,234,567.0;(1,234,567.0);0.0", val: 4 },
1356
+ { key: "1,234,567.0;(1,234,567.0);-", val: 5 },
1357
+ { key: "1,234,567.0;(1,234,567.0);", val: 6 },
1358
+ { key: "1,234,567.00;(1,234,567.00);0.00", val: 7 },
1359
+ { key: "1,234,567.00;(1,234,567.00);-", val: 8 },
1360
+ { key: "1,234,567.00;(1,234,567.00);", val: 9 },
1361
+ { key: "1;(1);0", val: 10 },
1362
+ { key: "1;(1);-", val: 11 },
1363
+ { key: "1;(1);", val: 12 },
1364
+ { key: "1.2;(1.2);0.0", val: 13 },
1365
+ { key: "1.2;(1.2);-", val: 14 },
1366
+ { key: "1.2;(1.2);", val: 15 },
1367
+ { key: "1.23;(1.23);0.00", val: 16 },
1368
+ { key: "1.23;(1.23);-", val: 17 },
1369
+ { key: "1.23;(1.23);", val: 18 },
1370
+ ];
1371
+ }
1372
+ // public GetFigureFormat2() {
1373
+ // return [
1374
+ // // 1234567
1375
+ // { key: "1,234,567", val: 11 },
1376
+ // { key: "1,234,567.00", val: 12 },
1377
+ // { key: "1", val: 13 },
1378
+ // { key: "1.2", val: 14 },
1379
+ // { key: "1.23", val: 15 },
1380
+ // ];
1381
+ // };
1382
+ /**
1383
+ * @return {?}
1384
+ */
1385
+ GetFigureFormat3() {
1386
+ // return [
1387
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 1 }, //
1388
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 2 }, //
1389
+ // { key1: "1", key2: "(1)", key3: "-", val: 3 }, //
1390
+ // { key1: "1", key2: "(1)", key3: "-", val: 4 }, //
1391
+ // { key: "1", val: 5 },
1392
+ // ];
1393
+ return [
1394
+ { key: "1,234,567;(1,234,567);0", val: 1 },
1395
+ { key: "1,234,567;(1,234,567);-", val: 2 },
1396
+ { key: "1,234,567;(1,234,567);", val: 3 },
1397
+ { key: "1;(1);0", val: 4 },
1398
+ { key: "1;(1);-", val: 5 },
1399
+ { key: "1;(1);", val: 6 },
1400
+ ];
1401
+ }
1402
+ /**
1403
+ * @return {?}
1404
+ */
1405
+ GetPercentFormats() {
1406
+ // return [
1407
+ // { key1: "0%", key2: "0%", key3: "-", val: 1 },
1408
+ // { key1: "0%", key2: "(0%)", key3: "-", val: 2 },
1409
+ // { key1: "0.0%", key2: "0.0%", key3: "-", val: 3 },
1410
+ // { key1: "0.0%", key2: "(0.0%)", key3: "-", val: 4 },
1411
+ // { key1: "0.00%", key2: "0.00%", key3: "-", val: 5 },
1412
+ // { key1: "0.00%", key2: "(0.00%)", key3: "-", val: 6 },
1413
+ // ];
1414
+ return [
1415
+ { key: "1%;(1%);0%", val: 1 },
1416
+ { key: "1%;(1%);-", val: 2 },
1417
+ { key: "1%;(1%);", val: 3 },
1418
+ { key: "1.2%;(1.2%);0.0%", val: 4 },
1419
+ { key: "1.2%;(1.2%);-", val: 5 },
1420
+ { key: "1.2%;(1.2%);", val: 6 },
1421
+ { key: "1.23%;(1.23%);0.00%", val: 7 },
1422
+ { key: "1.23%;(1.23%);-", val: 8 },
1423
+ { key: "1.23%;(1.23%);", val: 9 },
1424
+ { key: "1.23x;(1.23x);0.00x", val: 10 },
1425
+ { key: "1.23x;(1.23x);-", val: 11 },
1426
+ { key: "1.23x;(1.23x);", val: 12 },
1427
+ ];
1428
+ }
1429
+ /**
1430
+ * @return {?}
1431
+ */
1432
+ GetMultipleFormats() {
1433
+ return [
1434
+ { key: "0x", val: 1 },
1435
+ { key: "0.0x", val: 2 },
1436
+ { key: "0.00x", val: 3 },
1437
+ ];
1438
+ }
1439
+ /**
1440
+ * @param {?} aggregateType
1441
+ * @return {?}
1442
+ */
1443
+ getAggregateType(aggregateType) {
1444
+ switch (aggregateType) {
1445
+ case "CalculateIRR":
1446
+ return "CI";
1447
+ case "CalculateIRRIRRDate":
1448
+ return "CI_IRR";
1449
+ case "CalculateIRRBeforeCarried":
1450
+ return "CI_BEFORE_CARRY";
1451
+ case "CalculateIRRReported":
1452
+ return "CI_REPORTED";
1453
+ case "CalculateIRRActualAudited":
1454
+ return "CI_ACTUAL_AUDITED";
1455
+ case "CalculateIRRMTD":
1456
+ return "CI_MTD";
1457
+ case "CalculateIRRQTD":
1458
+ return "CI_QTD";
1459
+ case "CalculateIRRYTD":
1460
+ return "CI_YTD";
1461
+ case "CalculateTWRMTD":
1462
+ return "CTWR_MTD";
1463
+ case "CalculateTWRQTD":
1464
+ return "CTWR_QTD";
1465
+ case "CalculateTWRYTD":
1466
+ return "CTWR_YTD";
1467
+ case "CalculateVARMTD_99":
1468
+ return "CVAR_MTD_99";
1469
+ case "CalculateVARQTD_99":
1470
+ return "CVAR_QTD_99";
1471
+ case "CalculateVARYTD_99":
1472
+ return "CVAR_YTD_99";
1473
+ case "CalculateVARMTD_95":
1474
+ return "CVAR_MTD_95";
1475
+ case "CalculateVARQTD_95":
1476
+ return "CVAR_QTD_95";
1477
+ case "CalculateVARYTD_95":
1478
+ return "CVAR_YTD_95";
1479
+ case "CalculateMultiple":
1480
+ return "CM";
1481
+ case "CalculatePIC":
1482
+ return "CP";
1483
+ case "CalculateDPI":
1484
+ return "CD";
1485
+ case "CalculateTVPI":
1486
+ return "CT";
1487
+ case "CalculateRVPI":
1488
+ return "CR";
1489
+ case "CalculateMActualAudited":
1490
+ return "CM_ACTUAL_AUDITED";
1491
+ case "CalculateMReported":
1492
+ return "CM_REPORTED";
1493
+ }
1494
+ }
1495
+ /**
1496
+ * @param {?} colName
1497
+ * @return {?}
1498
+ */
1499
+ getCalculateMethod(colName) {
1500
+ switch (colName) {
1501
+ case "CI":
1502
+ return "CalculateIRR";
1503
+ case "CI_IRR":
1504
+ return "CalculateIRRIRRDate";
1505
+ case "CI_BEFORE_CARRY":
1506
+ return "CalculateIRRBeforeCarried";
1507
+ case "CI_REPORTED":
1508
+ return "CalculateIRRReported";
1509
+ case "CI_ACTUAL_AUDITED":
1510
+ return "CalculateIRRActualAudited";
1511
+ case "CI_MTD":
1512
+ return "CalculateIRRMTD";
1513
+ case "CI_QTD":
1514
+ return "CalculateIRRQTD";
1515
+ case "CI_YTD":
1516
+ return "CalculateIRRYTD";
1517
+ case "CTWR_MTD":
1518
+ return "CalculateTWRMTD";
1519
+ case "CTWR_QTD":
1520
+ return "CalculateTWRQTD";
1521
+ case "CTWR_YTD":
1522
+ return "CalculateTWRYTD";
1523
+ case "CVAR_MTD_99":
1524
+ return "CalculateVARMTD_99";
1525
+ case "CVAR_QTD_99":
1526
+ return "CalculateVARQTD_99";
1527
+ case "CVAR_YTD_99":
1528
+ return "CalculateVARYTD_99";
1529
+ case "CVAR_MTD_95":
1530
+ return "CalculateVARMTD_95";
1531
+ case "CVAR_QTD_95":
1532
+ return "CalculateVARQTD_95";
1533
+ case "CVAR_YTD_95":
1534
+ return "CalculateVARYTD_95";
1535
+ case "CM":
1536
+ return "CalculateMultiple";
1537
+ case "CP":
1538
+ return "CalculatePIC";
1539
+ case "CD":
1540
+ return "CalculateDPI";
1541
+ case "CT":
1542
+ return "CalculateTVPI";
1543
+ case "CR":
1544
+ return "CalculateRVPI";
1545
+ case "CM_ACTUAL_AUDITED":
1546
+ return "CalculateMActualAudited";
1547
+ case "CM_REPORTED":
1548
+ return "CalculateMReported";
1549
+ }
1550
+ }
1551
+ // 格式化数字
1552
+ /**
1553
+ * @param {?} number
1554
+ * @param {?} decimals
1555
+ * @param {?} dec_point
1556
+ * @param {?} thousands_sep
1557
+ * @param {?} roundtag
1558
+ * @return {?}
1559
+ */
1560
+ number_format(number, decimals, dec_point, thousands_sep, roundtag) {
1561
+ /*
1562
+ * 参数说明:
1563
+ * number:要格式化的数字
1564
+ * decimals:保留几位小数
1565
+ * dec_point:小数点符号
1566
+ * thousands_sep:千分位符号
1567
+ * roundtag:舍入参数,默认 "ceil" 向上取,"floor"向下取,"round" 四舍五入
1568
+ * */
1569
+ number = (number + "").replace(/[^0-9+-Ee.]/g, "");
1570
+ roundtag = roundtag || "ceil"; //"ceil","floor","round"
1571
+ //"ceil","floor","round"
1572
+ /** @type {?} */
1573
+ let n = !isFinite(+number) ? 0 : +number;
1574
+ /** @type {?} */
1575
+ let prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
1576
+ /** @type {?} */
1577
+ let sep = typeof thousands_sep === "undefined" ? "," : thousands_sep;
1578
+ /** @type {?} */
1579
+ let dec = typeof dec_point === "undefined" ? "." : dec_point;
1580
+ // let s = '';
1581
+ /** @type {?} */
1582
+ let s = (prec
1583
+ ? this.toFixedFix(n, prec, roundtag)
1584
+ : "" + this.pbf.tofixedNum(n, decimals)).split(".");
1585
+ //this.pbf.tofixedNum(Math.abs(value), decimal)
1586
+ /** @type {?} */
1587
+ var re = /(-?\d+)(\d{3})/;
1588
+ while (re.test(s[0])) {
1589
+ s[0] = s[0].replace(re, "$1" + sep + "$2");
1590
+ }
1591
+ if ((s[1] || "").length < prec) {
1592
+ s[1] = s[1] || "";
1593
+ s[1] += new Array(prec - s[1].length + 1).join("0");
1594
+ }
1595
+ return s.join(dec);
1596
+ }
1597
+ /**
1598
+ * @private
1599
+ * @param {?} n
1600
+ * @param {?} prec
1601
+ * @param {?} roundtag
1602
+ * @return {?}
1603
+ */
1604
+ toFixedFix(n, prec, roundtag) {
1605
+ /** @type {?} */
1606
+ var k = Math.pow(10, prec);
1607
+ return ("" +
1608
+ parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)) /
1609
+ k);
1610
+ }
1611
+ /**
1612
+ * @param {?} portlet
1613
+ * @param {?=} isGetTotal
1614
+ * @param {?=} copyId
1615
+ * @param {?=} id
1616
+ * @return {?}
1617
+ */
1618
+ getResultByDataTable(portlet, isGetTotal = false, copyId = false, id) {
1619
+ /** @type {?} */
1620
+ let result = [];
1621
+ /** @type {?} */
1622
+ let datamartCode = portlet.figureCode;
1623
+ /** @type {?} */
1624
+ let identifier = portlet.id === "00000000-0000-0000-0000-000000000000"
1625
+ ? portlet.newId
1626
+ : portlet.id;
1627
+ if (portlet.copyId) {
1628
+ identifier = portlet.copyId;
1629
+ }
1630
+ if (this.portletData_New[id][identifier]) {
1631
+ result = isGetTotal
1632
+ ? this.portletData_New[id][identifier] &&
1633
+ this.portletData_New[id][identifier].total
1634
+ : this.portletData_New[id][identifier] &&
1635
+ this.portletData_New[id][identifier].data;
1636
+ }
1637
+ else {
1638
+ result = isGetTotal
1639
+ ? this.portletResults_New[id][datamartCode] &&
1640
+ this.portletResults_New[id][datamartCode].total
1641
+ : this.portletResults_New[id][datamartCode] &&
1642
+ this.portletResults_New[id][datamartCode].data;
1643
+ }
1644
+ return result;
1645
+ }
1646
+ // SMP2-3708 END
1647
+ /**
1648
+ * @param {?} datamartCode
1649
+ * @param {?} dashboard
1650
+ * @return {?}
1651
+ */
1652
+ getOrderByColumnsNew(datamartCode, dashboard) {
1653
+ return new Promise((/**
1654
+ * @param {?} resolve
1655
+ * @return {?}
1656
+ */
1657
+ (resolve) => {
1658
+ if (this.sourcesData[dashboard.id] && dashboard) {
1659
+ /** @type {?} */
1660
+ const outputRes = [];
1661
+ if (this.sourcesData[dashboard.id].length) {
1662
+ /** @type {?} */
1663
+ let config = JSON.parse(dashboard.config);
1664
+ /** @type {?} */
1665
+ const dataViews = config.views;
1666
+ if (dashboard && dashboard.config) {
1667
+ /** @type {?} */
1668
+ const dataMart = this.sourcesData[dashboard.id].filter((/**
1669
+ * @param {?} item
1670
+ * @return {?}
1671
+ */
1672
+ (item) => item.entityType === dashboard.entityType));
1673
+ dataMart.forEach((/**
1674
+ * @param {?} _data
1675
+ * @return {?}
1676
+ */
1677
+ (_data) => {
1678
+ _data.views.forEach((/**
1679
+ * @param {?} view
1680
+ * @return {?}
1681
+ */
1682
+ (view) => {
1683
+ if (dataViews.find((/**
1684
+ * @param {?} item
1685
+ * @return {?}
1686
+ */
1687
+ (item) => item.datamartViewId === view.id))) {
1688
+ view.tables.forEach((/**
1689
+ * @param {?} table
1690
+ * @return {?}
1691
+ */
1692
+ (table) => {
1693
+ outputRes.push(table);
1694
+ }));
1695
+ }
1696
+ }));
1697
+ }));
1698
+ }
1699
+ }
1700
+ resolve(outputRes);
1701
+ }
1702
+ else {
1703
+ // 处理 this.sourcesData 没有值
1704
+ /** @type {?} */
1705
+ let data = {
1706
+ accountId: this.userInfo.accountId,
1707
+ language: this.lang,
1708
+ dashboardVersion: 2,
1709
+ };
1710
+ this.http.post(this.api.urlList.GetSources, data, (/**
1711
+ * @param {?} res
1712
+ * @return {?}
1713
+ */
1714
+ (res) => {
1715
+ /** @type {?} */
1716
+ const outputRes = [];
1717
+ if (res && res.length) {
1718
+ this.sourcesData[dashboard.id] = res;
1719
+ /** @type {?} */
1720
+ let config = JSON.parse(dashboard.config);
1721
+ /** @type {?} */
1722
+ const dataViews = config.views;
1723
+ if (dashboard && dashboard.config) {
1724
+ /** @type {?} */
1725
+ const dataMart = res.filter((/**
1726
+ * @param {?} item
1727
+ * @return {?}
1728
+ */
1729
+ (item) => item.entityType === dashboard.entityType));
1730
+ dataMart.forEach((/**
1731
+ * @param {?} _data
1732
+ * @return {?}
1733
+ */
1734
+ (_data) => {
1735
+ _data.views.forEach((/**
1736
+ * @param {?} view
1737
+ * @return {?}
1738
+ */
1739
+ (view) => {
1740
+ if (dataViews.find((/**
1741
+ * @param {?} item
1742
+ * @return {?}
1743
+ */
1744
+ (item) => item.datamartViewId === view.id))) {
1745
+ view.tables.forEach((/**
1746
+ * @param {?} table
1747
+ * @return {?}
1748
+ */
1749
+ (table) => {
1750
+ outputRes.push(table);
1751
+ }));
1752
+ }
1753
+ }));
1754
+ }));
1755
+ }
1756
+ }
1757
+ resolve(outputRes);
1758
+ }));
1759
+ }
1760
+ }));
1761
+ }
1762
+ /**
1763
+ * @param {?} input
1764
+ * @return {?}
1765
+ */
1766
+ decompressArrayBuffer(input) {
1767
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
1768
+ //create the stream
1769
+ /** @type {?} */
1770
+ const ds = new ((/** @type {?} */ (window))).DecompressionStream("deflate-raw");
1771
+ //create the writer
1772
+ /** @type {?} */
1773
+ const writer = ds.writable.getWriter();
1774
+ //write the buffer to the writer thus decompressing it
1775
+ writer.write(input);
1776
+ writer.close();
1777
+ //create the output
1778
+ /** @type {?} */
1779
+ const output = [];
1780
+ //create the reader
1781
+ /** @type {?} */
1782
+ const reader = ds.readable.getReader();
1783
+ /** @type {?} */
1784
+ let totalSize = 0;
1785
+ //go through each chunk and add it to the output
1786
+ while (true) {
1787
+ const { value, done } = yield reader.read();
1788
+ if (done)
1789
+ break;
1790
+ output.push(value);
1791
+ totalSize += value.byteLength;
1792
+ }
1793
+ /** @type {?} */
1794
+ const concatenated = new Uint8Array(totalSize);
1795
+ /** @type {?} */
1796
+ let offset = 0;
1797
+ //finally build the compressed array and return it
1798
+ for (const array of output) {
1799
+ concatenated.set(array, offset);
1800
+ offset += array.byteLength;
1801
+ }
1802
+ return concatenated;
1803
+ });
1804
+ }
1805
+ /**
1806
+ * @private
1807
+ * @param {?} item
1808
+ * @param {?} dashboard
1809
+ * @return {?}
1810
+ */
1811
+ getAllFields(item, dashboard) {
1812
+ /** @type {?} */
1813
+ const lang = this.pbf.getLanguageParams();
1814
+ return new Promise((/**
1815
+ * @param {?} resolve
1816
+ * @param {?} reject
1817
+ * @return {?}
1818
+ */
1819
+ (resolve, reject) => {
1820
+ /** @type {?} */
1821
+ const dataMartCode = item.figureCode;
1822
+ /** @type {?} */
1823
+ const dataObj = {
1824
+ language: lang,
1825
+ dataMartCode,
1826
+ };
1827
+ this.setSchemaParams(dataObj, dataMartCode, dashboard);
1828
+ this.http.post(this.api.urlList.GetSchema, dataObj, (/**
1829
+ * @param {?} res
1830
+ * @return {?}
1831
+ */
1832
+ (res) => {
1833
+ resolve(res);
1834
+ }));
1835
+ }));
1836
+ }
1837
+ /**
1838
+ * @param {?} dataObj
1839
+ * @param {?} figureCode
1840
+ * @param {?} dashboard
1841
+ * @return {?}
1842
+ */
1843
+ setSchemaParams(dataObj, figureCode, dashboard) {
1844
+ if (this.checkIsQ2Q(dashboard.dataMartTables)) {
1845
+ dataObj["fromDate"] = dashboard.fromDate;
1846
+ dataObj["asOfDate"] = dashboard.asOfDate;
1847
+ }
1848
+ else if (figureCode.indexOf("FinancialFigure") !== -1) {
1849
+ dataObj["entityType"] = dashboard.entityList.map((/**
1850
+ * @param {?} item
1851
+ * @return {?}
1852
+ */
1853
+ (item) => item.linkedType));
1854
+ dataObj["fromDate"] = dashboard.fromDate || "";
1855
+ dataObj["asOfDate"] = dashboard.asOfDate;
1856
+ }
1857
+ if (dashboard &&
1858
+ (figureCode === "FundOperations" ||
1859
+ figureCode === "FundOperationTableSequoia" ||
1860
+ figureCode.indexOf("FinancialFigure") !== -1)) {
1861
+ dataObj["entityIds"] = dashboard.entityList.map((/**
1862
+ * @param {?} item
1863
+ * @return {?}
1864
+ */
1865
+ (item) => item.linkedGuid));
1866
+ }
1867
+ }
1868
+ // 判断是否可选开始日期
1869
+ /**
1870
+ * @param {?} dataMart
1871
+ * @return {?}
1872
+ */
1873
+ checkHasFromDate(dataMart) {
1874
+ /** @type {?} */
1875
+ const has = dataMart.find((/**
1876
+ * @param {?} item
1877
+ * @return {?}
1878
+ */
1879
+ (item) => !item.isHide && item.datamartCode === "FundOperationTableSequoia"));
1880
+ return !!has;
1881
+ }
1882
+ // 判断Q2Q,控制顶部日期选择类型
1883
+ /**
1884
+ * @param {?} dataMart
1885
+ * @return {?}
1886
+ */
1887
+ checkIsQ2Q(dataMart) {
1888
+ return false;
1889
+ /** @type {?} */
1890
+ const Q2QPatchList = [
1891
+ "SeeThroughHisPosition",
1892
+ "SeeThroughHisPositionByInvestor",
1893
+ ];
1894
+ /** @type {?} */
1895
+ const has = dataMart.find((/**
1896
+ * @param {?} it
1897
+ * @return {?}
1898
+ */
1899
+ (it) => {
1900
+ return !it.isHide && Q2QPatchList.includes(it.datamartCode);
1901
+ }));
1902
+ return !!has;
1903
+ }
1904
+ /**
1905
+ * 使用自定义保存的列数据,覆盖通用列配置数据
1906
+ * @param {?} allFields 自定义数据
1907
+ * @param {?} fields 通用列配置数据
1908
+ * @return {?}
1909
+ */
1910
+ setConfigFields(allFields, fields) {
1911
+ allFields.forEach((/**
1912
+ * @param {?} _field
1913
+ * @return {?}
1914
+ */
1915
+ (_field) => {
1916
+ fields.forEach((/**
1917
+ * @param {?} field
1918
+ * @return {?}
1919
+ */
1920
+ (field) => {
1921
+ if (_field.colName === field.colName) {
1922
+ _field.isHidden = field.isHidden;
1923
+ _field.visible = field.visible;
1924
+ _field.format = field.format;
1925
+ _field.formula = field.formula;
1926
+ if (field.showGrandTotals !== undefined) {
1927
+ _field.showGrandTotals = field.showGrandTotals;
1928
+ }
1929
+ if (field.showSubTotals !== undefined) {
1930
+ _field.showSubTotals = field.showSubTotals;
1931
+ }
1932
+ }
1933
+ }));
1934
+ }));
1935
+ fields.forEach((/**
1936
+ * @param {?} field
1937
+ * @return {?}
1938
+ */
1939
+ (field) => {
1940
+ if (field.isCalculatedField) {
1941
+ allFields.push(field);
1942
+ }
1943
+ }));
1944
+ /** @type {?} */
1945
+ const fieldsName = [];
1946
+ /** @type {?} */
1947
+ const outputFields = [];
1948
+ allFields.forEach((/**
1949
+ * @param {?} field
1950
+ * @return {?}
1951
+ */
1952
+ (field) => {
1953
+ // q2q当中langCode很多相同,去重要多判断一下addtionName
1954
+ // if (!fieldsName.includes(field.langCode) || !!field.addtionName) {
1955
+ if (!fieldsName.includes(field.langCode) &&
1956
+ !fieldsName.includes(field.langValue)) {
1957
+ /** @type {?} */
1958
+ const value = field.langCode || field.langValue;
1959
+ fieldsName.push(value);
1960
+ outputFields.push(field);
1961
+ }
1962
+ }));
1963
+ return outputFields.sort((/**
1964
+ * @param {?} a
1965
+ * @param {?} b
1966
+ * @return {?}
1967
+ */
1968
+ (a, b) => (a.seq >= b.seq ? 1 : -1)));
1969
+ }
1970
+ /**
1971
+ * @param {?} portlets
1972
+ * @param {?} callback
1973
+ * @param {?=} pageSetting
1974
+ * @param {?=} isRefresh
1975
+ * @param {?=} dashboard
1976
+ * @param {?=} roGet
1977
+ * @return {?}
1978
+ */
1979
+ getDataByPortletsNew(portlets, callback, pageSetting, isRefresh = false, dashboard, roGet = false) {
1980
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
1981
+ /** @type {?} */
1982
+ let length = 0;
1983
+ if (portlets && portlets.length) {
1984
+ for (let portlet of portlets) {
1985
+ /** @type {?} */
1986
+ let id = portlet.id === "00000000-0000-0000-0000-000000000000"
1987
+ ? portlet.newId
1988
+ : portlet.id;
1989
+ /** @type {?} */
1990
+ const allFields = yield this.getAllFields(portlet, dashboard);
1991
+ /** @type {?} */
1992
+ let params = this.getParamsByPortlet(portlet, pageSetting, allFields, dashboard);
1993
+ /** @type {?} */
1994
+ let initFieldsArr;
1995
+ /** @type {?} */
1996
+ let curFieldsArr;
1997
+ if (!params.isTable && !roGet) {
1998
+ // 赋值portletFields_Temp
1999
+ initFieldsArr = this.portletFields_Temp[id];
2000
+ curFieldsArr = params.displayColumnFilter.split(",");
2001
+ if (!initFieldsArr ||
2002
+ this.needGetPortletData(initFieldsArr, curFieldsArr)) {
2003
+ this.portletFields_Temp[id] = curFieldsArr;
2004
+ }
2005
+ else {
2006
+ length++;
2007
+ if (portlets.length === length) {
2008
+ callback();
2009
+ }
2010
+ continue;
2011
+ }
2012
+ }
2013
+ /** @type {?} */
2014
+ const config = portlet.config && JSON.parse(portlet.config);
2015
+ if (config.filterSettings && config.filterSettings.length) {
2016
+ if (!params.columnFilter) {
2017
+ params.columnFilter = [];
2018
+ }
2019
+ config.filterSettings.forEach((/**
2020
+ * @param {?} setting
2021
+ * @return {?}
2022
+ */
2023
+ (setting) => {
2024
+ if (config.portletType === "pivot") {
2025
+ return;
2026
+ }
2027
+ /** @type {?} */
2028
+ const _field = config.fields.find((/**
2029
+ * @param {?} item
2030
+ * @return {?}
2031
+ */
2032
+ (item) => item.colName === setting.name));
2033
+ /** @type {?} */
2034
+ const Type = _field && _field.dataType;
2035
+ if (setting.items) {
2036
+ setting.items.forEach((/**
2037
+ * @param {?} item
2038
+ * @return {?}
2039
+ */
2040
+ (item) => {
2041
+ params.columnFilter.push({
2042
+ Field: setting.name,
2043
+ Operator: "equal",
2044
+ Type,
2045
+ Value: Type === "date"
2046
+ ? moment(item).format("yyyy-MM-DD")
2047
+ : Type === "datetime"
2048
+ ? moment(item).format("yyyy-MM-DD hh:mm:ss")
2049
+ : item,
2050
+ });
2051
+ }));
2052
+ }
2053
+ else if (setting.operator) {
2054
+ params.columnFilter.push({
2055
+ Field: setting.field,
2056
+ Operator: "equal",
2057
+ Type: setting.type,
2058
+ Value: setting.type === "date"
2059
+ ? moment(setting.value).format("yyyy-MM-DD")
2060
+ : setting.type === "datetime"
2061
+ ? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
2062
+ : setting.value,
2063
+ });
2064
+ }
2065
+ }));
2066
+ }
2067
+ if (params.columnFilter instanceof Array) {
2068
+ params.columnFilter = params.columnFilter.filter((/**
2069
+ * @param {?} item
2070
+ * @return {?}
2071
+ */
2072
+ (item) => item.Field));
2073
+ }
2074
+ // json buffer
2075
+ params["dashboardVersion"] = 2;
2076
+ this.httpClient
2077
+ .post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
2078
+ headers: new HttpHeaders({
2079
+ Authorization: `Bearer`,
2080
+ }),
2081
+ })
2082
+ .subscribe((/**
2083
+ * @param {?} result
2084
+ * @return {?}
2085
+ */
2086
+ (result) => {
2087
+ if (!result) {
2088
+ this.portletData_New[dashboard.id][id] = {
2089
+ total: 0,
2090
+ data: [],
2091
+ };
2092
+ if (isRefresh) {
2093
+ this.DashboardService.refreshGadget.next({
2094
+ newId: id,
2095
+ });
2096
+ }
2097
+ length++;
2098
+ if (isRefresh) {
2099
+ this.DashboardService.refreshGadget.next({
2100
+ newId: id,
2101
+ });
2102
+ }
2103
+ if (portlets.length === length) {
2104
+ if (isRefresh) {
2105
+ this.DashboardService.startRefresh.next(false);
2106
+ }
2107
+ callback();
2108
+ }
2109
+ }
2110
+ else {
2111
+ result["data"].forEach((/**
2112
+ * @param {?} item
2113
+ * @return {?}
2114
+ */
2115
+ (item) => {
2116
+ item.Sector = this.translation[item.Sector] || item.Sector;
2117
+ }));
2118
+ this.portletData_New[dashboard.id][id] = result;
2119
+ if (isRefresh) {
2120
+ this.DashboardService.refreshGadget.next({
2121
+ newId: id,
2122
+ });
2123
+ }
2124
+ length++;
2125
+ if (portlets.length === length) {
2126
+ if (isRefresh) {
2127
+ this.DashboardService.startRefresh.next(false);
2128
+ }
2129
+ callback();
2130
+ }
2131
+ }
2132
+ }), (/**
2133
+ * @param {?} response
2134
+ * @return {?}
2135
+ */
2136
+ (response) => {
2137
+ this.portletFields_Temp[id] = initFieldsArr;
2138
+ length++;
2139
+ if (portlets.length === length) {
2140
+ callback();
2141
+ }
2142
+ }), (/**
2143
+ * @return {?}
2144
+ */
2145
+ () => { }));
2146
+ }
2147
+ }
2148
+ else {
2149
+ callback();
2150
+ }
2151
+ });
2152
+ }
2153
+ /**
2154
+ * @param {?} portlet
2155
+ * @return {?}
2156
+ */
2157
+ clearFieldsObj(portlet) {
2158
+ Reflect.deleteProperty(this.allFieldsObj, portlet.id);
2159
+ }
2160
+ // 根据portlet 解析params
2161
+ /**
2162
+ * @param {?} portlet
2163
+ * @param {?=} pageSetting
2164
+ * @param {?=} allFields
2165
+ * @param {?=} dashboard
2166
+ * @return {?}
2167
+ */
2168
+ getParamsByPortlet(portlet, pageSetting, allFields, dashboard) {
2169
+ /** @type {?} */
2170
+ let dashboardDataTableId = portlet.dashboardDataTableId;
2171
+ //SMP2-7731 get the dashboardDataTableid from dataMartTables arrary
2172
+ /** @type {?} */
2173
+ let curDataMart = this.dataMartTables[dashboard.id].find((/**
2174
+ * @param {?} d
2175
+ * @return {?}
2176
+ */
2177
+ (d) => d.datamartCode === portlet.figureCode));
2178
+ if (curDataMart) {
2179
+ dashboardDataTableId = curDataMart.id;
2180
+ }
2181
+ /** @type {?} */
2182
+ let config = portlet.config && JSON.parse(portlet.config);
2183
+ if (portlet.id !== "00000000-0000-0000-0000-000000000000") {
2184
+ this.allFieldsObj[portlet.id] = allFields;
2185
+ }
2186
+ /** @type {?} */
2187
+ let fields = allFields
2188
+ ? this.setConfigFields(allFields, config.fields)
2189
+ : config.fields;
2190
+ if (allFields) {
2191
+ config.fields = fields;
2192
+ portlet.config = JSON.stringify(config);
2193
+ }
2194
+ /** @type {?} */
2195
+ let calculatedFields = config.calculatedFieldSettings;
2196
+ /** @type {?} */
2197
+ let needFields = [];
2198
+ /** @type {?} */
2199
+ let params = {};
2200
+ /** @type {?} */
2201
+ const portletType = config.portletType === "historicalIRR"
2202
+ ? config.selectedVisualType
2203
+ : config.portletType;
2204
+ if (portletType === "table") {
2205
+ fields &&
2206
+ fields.forEach((/**
2207
+ * @param {?} x
2208
+ * @return {?}
2209
+ */
2210
+ (x) => {
2211
+ needFields.push(x.colName);
2212
+ }));
2213
+ params.startIndex = 0;
2214
+ params.pageSize = 10;
2215
+ if (pageSetting && pageSetting.currentPage) {
2216
+ params.startIndex =
2217
+ (pageSetting.currentPage - 1) * pageSetting.pageSize;
2218
+ params.pageSize = pageSetting.pageSize;
2219
+ }
2220
+ // 处理 sort
2221
+ if (pageSetting && pageSetting.sortedColumn) {
2222
+ params.sortedColumn = pageSetting.sortedColumn;
2223
+ params.sort = pageSetting.sort;
2224
+ }
2225
+ // 处理 filter
2226
+ if (config.filterSettings.length) {
2227
+ /** @type {?} */
2228
+ let filterSettings = JSON.parse(JSON.stringify(config.filterSettings));
2229
+ params.columnFilter = filterSettings.map((/**
2230
+ * @param {?} x
2231
+ * @return {?}
2232
+ */
2233
+ (x) => {
2234
+ if (x.type === "date") {
2235
+ /** @type {?} */
2236
+ const date = new Date(x.value);
2237
+ /** @type {?} */
2238
+ const year = date.getFullYear();
2239
+ /** @type {?} */
2240
+ const month = String(date.getMonth() + 1).padStart(2, "0");
2241
+ /** @type {?} */
2242
+ const day = String(date.getDate()).padStart(2, "0");
2243
+ /** @type {?} */
2244
+ const formattedDate = `${year}-${month}-${day}`;
2245
+ x.value = formattedDate;
2246
+ }
2247
+ return x;
2248
+ }));
2249
+ }
2250
+ params.isTable = true;
2251
+ }
2252
+ else if (portletType === "transpose") {
2253
+ fields &&
2254
+ fields.forEach((/**
2255
+ * @param {?} x
2256
+ * @return {?}
2257
+ */
2258
+ (x) => {
2259
+ if (!x.isHidden) {
2260
+ needFields.push(x.colName);
2261
+ }
2262
+ }));
2263
+ }
2264
+ else if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
2265
+ if (config.selectedY && config.selectedY.length > 0) {
2266
+ config.selectedY.forEach((/**
2267
+ * @param {?} e
2268
+ * @return {?}
2269
+ */
2270
+ (e) => {
2271
+ needFields.push(e);
2272
+ }));
2273
+ }
2274
+ if (config.selectedSecondY && config.selectedSecondY.length > 0) {
2275
+ config.selectedSecondY.forEach((/**
2276
+ * @param {?} e
2277
+ * @return {?}
2278
+ */
2279
+ (e) => {
2280
+ needFields.push(e);
2281
+ }));
2282
+ }
2283
+ }
2284
+ else {
2285
+ // 处理 filters
2286
+ /** @type {?} */
2287
+ let filters = config.filters;
2288
+ if (filters && filters.length) {
2289
+ for (let item of filters) {
2290
+ needFields.push(item.name);
2291
+ }
2292
+ }
2293
+ // 处理 values
2294
+ /** @type {?} */
2295
+ let series = config.yaxis.series;
2296
+ if (series && series.length) {
2297
+ for (let item of series) {
2298
+ if ([
2299
+ "CalculateIRR",
2300
+ "CalculateIRRMTD",
2301
+ "CalculateIRRQTD",
2302
+ "CalculateIRRYTD",
2303
+ "CalculateTWRMTD",
2304
+ "CalculateTWRQTD",
2305
+ "CalculateTWRYTD",
2306
+ "CalculateVARMTD_99",
2307
+ "CalculateVARQTD_99",
2308
+ "CalculateVARYTD_99",
2309
+ "CalculateVARMTD_95",
2310
+ "CalculateVARQTD_95",
2311
+ "CalculateVARYTD_95",
2312
+ ].includes(item.calMethod)) {
2313
+ needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
2314
+ }
2315
+ else if (item.calMethod === "CalculateIRRBeforeCarried") {
2316
+ needFields.push("IRRAmount", "IRRDate", "IRRAdjValueBeforeCarry");
2317
+ }
2318
+ else if (item.calMethod === "CalculateIRRIRRDate") {
2319
+ needFields.push("IRRAmount", "CalculateIRRDate", "IRRAdjValue");
2320
+ }
2321
+ else if (item.calMethod === "CalculateIRRActualAudited") {
2322
+ portlet.figureCode === "GrossNet" ||
2323
+ portlet.figureCode === "CombinedInvestmentFundNCompanyCashflow"
2324
+ ? needFields.push("IRRAmount", "IRRDate", "ActualAuditedNAV")
2325
+ : needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
2326
+ }
2327
+ else if (item.calMethod === "CalculateIRRReported") {
2328
+ portlet.figureCode === "GrossNet" ||
2329
+ portlet.figureCode === "CombinedInvestmentFundNCompanyCashflow"
2330
+ ? needFields.push("IRRAmount", "IRRDate", "ReportedNAV")
2331
+ : needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
2332
+ }
2333
+ else if (item.calMethod === "CalculatedField") {
2334
+ }
2335
+ else {
2336
+ /** @type {?} */
2337
+ let colName = this.getAggregateType(item.calMethod);
2338
+ if (colName) {
2339
+ /** @type {?} */
2340
+ let curField = fields.find((/**
2341
+ * @param {?} f
2342
+ * @return {?}
2343
+ */
2344
+ (f) => f.colName === colName));
2345
+ if (curField && curField.formula) {
2346
+ /** @type {?} */
2347
+ let fs = curField.formula.split("/");
2348
+ fs && fs.map((/**
2349
+ * @param {?} f
2350
+ * @return {?}
2351
+ */
2352
+ (f) => needFields.push(f)));
2353
+ }
2354
+ }
2355
+ else {
2356
+ needFields.push(item.colName);
2357
+ }
2358
+ }
2359
+ }
2360
+ }
2361
+ // 处理 rows
2362
+ /** @type {?} */
2363
+ let groups = config.xaxis.groups;
2364
+ if (groups && groups.length) {
2365
+ for (let gitem of groups) {
2366
+ needFields.push(gitem.name);
2367
+ }
2368
+ }
2369
+ // 处理 colunms
2370
+ /** @type {?} */
2371
+ let columnGroup = config.columnGroup;
2372
+ if (columnGroup && columnGroup.length) {
2373
+ for (let item of columnGroup) {
2374
+ needFields.push(item.name);
2375
+ }
2376
+ }
2377
+ // 处理 calculatedField
2378
+ if (calculatedFields && calculatedFields.length) {
2379
+ calculatedFields.map((/**
2380
+ * @param {?} f
2381
+ * @return {?}
2382
+ */
2383
+ (f) => {
2384
+ /** @type {?} */
2385
+ let string = f.formula;
2386
+ /** @type {?} */
2387
+ const regex = /\((.*?)\)/g;
2388
+ /** @type {?} */
2389
+ const matches = string
2390
+ .match(regex)
2391
+ .map((/**
2392
+ * @param {?} match
2393
+ * @return {?}
2394
+ */
2395
+ (match) => match.slice(1, -1)));
2396
+ needFields.push(...matches);
2397
+ }));
2398
+ }
2399
+ // 处理 orderByColumns
2400
+ if (this.dashboardConfig && this.dashboardConfig[dashboard.id]) {
2401
+ params.datamartViewId =
2402
+ this.dashboardConfig[dashboard.id].datamartViewId;
2403
+ params.datamartId = this.dashboardConfig[dashboard.id].datamartId;
2404
+ params.datamartCode = portlet.figureCode;
2405
+ }
2406
+ // 处理config.fields里的sortColumn
2407
+ /** @type {?} */
2408
+ let fieldSortColumns = [];
2409
+ fields.map((/**
2410
+ * @param {?} x
2411
+ * @return {?}
2412
+ */
2413
+ (x) => {
2414
+ if (x.sortColumn && !fieldSortColumns.includes(x.sortColumn)) {
2415
+ fieldSortColumns.push(x.sortColumn);
2416
+ }
2417
+ }));
2418
+ if (fieldSortColumns.length) {
2419
+ needFields.push(...fieldSortColumns);
2420
+ }
2421
+ }
2422
+ needFields = Array.from(new Set(needFields));
2423
+ // 去除非法字段
2424
+ /** @type {?} */
2425
+ let legalFields = fields.map((/**
2426
+ * @param {?} x
2427
+ * @return {?}
2428
+ */
2429
+ (x) => x.colName));
2430
+ needFields.map((/**
2431
+ * @param {?} x
2432
+ * @param {?} i
2433
+ * @return {?}
2434
+ */
2435
+ (x, i) => {
2436
+ if (!legalFields.includes(x)) {
2437
+ needFields.splice(i, 1);
2438
+ }
2439
+ }));
2440
+ if (needFields.length === 0) {
2441
+ if (legalFields[0]) {
2442
+ needFields.push(legalFields[0]);
2443
+ }
2444
+ }
2445
+ // 默认获取Seq字段 SMP2-4582 AGIC - Dashboard item sequence
2446
+ needFields.push("Seq");
2447
+ // "newcolumn", "newline", "newcolumnline" 如果是这三种类型默认加 OperationDate 字段
2448
+ if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
2449
+ needFields.push(config.selectedX);
2450
+ params["IsOnlyShowDisplayColum"] = true;
2451
+ }
2452
+ if (config.portletType === "historicalIRR") {
2453
+ if (!params.columnFilter) {
2454
+ params.columnFilter = [];
2455
+ }
2456
+ params.columnFilter.push({
2457
+ Field: "Frequencys",
2458
+ Operator: "equal",
2459
+ Type: "string",
2460
+ Value: config.selectedMultiples,
2461
+ }, {
2462
+ Field: "InvestorType",
2463
+ Operator: "equal",
2464
+ Type: "string",
2465
+ Value: config.selectedInvestor,
2466
+ });
2467
+ }
2468
+ params.dashboardDataTableId = dashboardDataTableId;
2469
+ params.displayColumnFilter = needFields.join(",");
2470
+ params.responseType = "json";
2471
+ return params;
2472
+ }
2473
+ // 是否需要重新发起请求
2474
+ /**
2475
+ * @param {?=} origin
2476
+ * @param {?=} compare
2477
+ * @return {?}
2478
+ */
2479
+ needGetPortletData(origin = [], compare = []) {
2480
+ return compare.some((/**
2481
+ * @param {?} c
2482
+ * @return {?}
2483
+ */
2484
+ (c) => !origin.includes(c)));
2485
+ }
2486
+ /**
2487
+ * @param {?} figureCodes
2488
+ * @param {?} callback
2489
+ * @param {?=} portletTypes
2490
+ * @param {?=} dashboardId
2491
+ * @param {?=} portlet
2492
+ * @return {?}
2493
+ */
2494
+ setDataManager(figureCodes, callback, portletTypes = [], dashboardId, portlet) {
2495
+ /** @type {?} */
2496
+ let length = 0;
2497
+ if (!this.fieldsArr[dashboardId]) {
2498
+ this.fieldsArr[dashboardId] = {};
2499
+ }
2500
+ if (this.dataMartTables[dashboardId] &&
2501
+ this.dataMartTables[dashboardId].length) {
2502
+ this.pbf.pageLoading = true;
2503
+ this.pbf.pageLoading_.next(true);
2504
+ /** @type {?} */
2505
+ let dataMartTables = this.dataMartTables[dashboardId].filter((/**
2506
+ * @param {?} el
2507
+ * @return {?}
2508
+ */
2509
+ (el) => figureCodes.includes(el.datamartCode)));
2510
+ if (dataMartTables.length) {
2511
+ forEach(dataMartTables, (/**
2512
+ * @param {?} item
2513
+ * @param {?} index
2514
+ * @return {?}
2515
+ */
2516
+ (item, index) => {
2517
+ /** @type {?} */
2518
+ let allFields;
2519
+ /** @type {?} */
2520
+ let config;
2521
+ if (portlet) {
2522
+ config = JSON.parse(portlet.config);
2523
+ }
2524
+ if (["newcolumn", "newline", "newcolumnline"].includes(portletTypes[0])) {
2525
+ allFields = config.selectedY
2526
+ .concat(config.selectedSecondY)
2527
+ .concat([config.selectedX])
2528
+ .map((/**
2529
+ * @param {?} e
2530
+ * @return {?}
2531
+ */
2532
+ (e) => {
2533
+ return {
2534
+ colName: e,
2535
+ };
2536
+ }));
2537
+ }
2538
+ else {
2539
+ allFields =
2540
+ this.fieldsArr[dashboardId] &&
2541
+ this.fieldsArr[dashboardId][item.datamartCode]
2542
+ ? this.fieldsArr[dashboardId][item.datamartCode]
2543
+ : [];
2544
+ }
2545
+ /** @type {?} */
2546
+ let displayColumnFilter = allFields && allFields.map((/**
2547
+ * @param {?} x
2548
+ * @return {?}
2549
+ */
2550
+ (x) => x.colName)).join(",");
2551
+ /** @type {?} */
2552
+ let params = {
2553
+ dashboardDataTableId: item.id,
2554
+ displayColumnFilter: displayColumnFilter,
2555
+ responseType: "json",
2556
+ dashboardVersion: 2,
2557
+ };
2558
+ params.startIndex = 0;
2559
+ params.pageSize = 10;
2560
+ if (portletTypes &&
2561
+ portletTypes.length > 0 &&
2562
+ (portletTypes.includes("newcolumn") ||
2563
+ portletTypes.includes("newline") ||
2564
+ portletTypes.includes("newcolumnline"))) {
2565
+ params.pageSize = 1000000;
2566
+ params["IsOnlyShowDisplayColum"] = true;
2567
+ }
2568
+ if (config) {
2569
+ /** @type {?} */
2570
+ const filterSettings = config.filterSettings;
2571
+ if (filterSettings && filterSettings.length) {
2572
+ if (!params.columnFilter) {
2573
+ params.columnFilter = [];
2574
+ }
2575
+ filterSettings.forEach((/**
2576
+ * @param {?} setting
2577
+ * @return {?}
2578
+ */
2579
+ (setting) => {
2580
+ if (config.portletType === "pivot") {
2581
+ return;
2582
+ }
2583
+ /** @type {?} */
2584
+ const _field = config.fields.find((/**
2585
+ * @param {?} item
2586
+ * @return {?}
2587
+ */
2588
+ (item) => item.colName === setting.name));
2589
+ /** @type {?} */
2590
+ const Type = _field && _field.dataType;
2591
+ if (setting.items) {
2592
+ setting.items.forEach((/**
2593
+ * @param {?} item
2594
+ * @return {?}
2595
+ */
2596
+ (item) => {
2597
+ params.columnFilter.push({
2598
+ Field: setting.name,
2599
+ Operator: "equal",
2600
+ Type,
2601
+ Value: Type === "date"
2602
+ ? moment(item).format("yyyy-MM-DD")
2603
+ : Type === "datetime"
2604
+ ? moment(item).format("yyyy-MM-DD hh:mm:ss")
2605
+ : item,
2606
+ });
2607
+ }));
2608
+ }
2609
+ else if (setting.operator) {
2610
+ params.columnFilter.push({
2611
+ Field: setting.field,
2612
+ Operator: "equal",
2613
+ Type: setting.type,
2614
+ Value: setting.type === "date"
2615
+ ? moment(setting.value).format("yyyy-MM-DD")
2616
+ : setting.type === "datetime"
2617
+ ? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
2618
+ : setting.value,
2619
+ });
2620
+ }
2621
+ }));
2622
+ }
2623
+ if (config.portletType === "historicalIRR") {
2624
+ if (!params.columnFilter) {
2625
+ params.columnFilter = [];
2626
+ }
2627
+ params.columnFilter.push({
2628
+ Field: "Frequencys",
2629
+ Operator: "equal",
2630
+ Type: "string",
2631
+ Value: config.selectedMultiples,
2632
+ }, {
2633
+ Field: "InvestorType",
2634
+ Operator: "equal",
2635
+ Type: "string",
2636
+ Value: config.selectedInvestor,
2637
+ });
2638
+ }
2639
+ }
2640
+ if (params.columnFilter instanceof Array) {
2641
+ params.columnFilter = params.columnFilter.filter((/**
2642
+ * @param {?} item
2643
+ * @return {?}
2644
+ */
2645
+ (item) => item.Field));
2646
+ }
2647
+ // json buffer
2648
+ this.httpClient
2649
+ .post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
2650
+ headers: new HttpHeaders({
2651
+ Authorization: `Bearer`,
2652
+ }),
2653
+ })
2654
+ .subscribe((/**
2655
+ * @param {?} result
2656
+ * @return {?}
2657
+ */
2658
+ (result) => {
2659
+ /** @type {?} */
2660
+ let identifier = portlet.id === "00000000-0000-0000-0000-000000000000"
2661
+ ? portlet.newId
2662
+ : portlet.id;
2663
+ if (!result) {
2664
+ this.portletResults_New[dashboardId][item.datamartCode] = [];
2665
+ if (portlet) {
2666
+ this.portletData_New[dashboardId][identifier] = {
2667
+ total: 0,
2668
+ data: [],
2669
+ };
2670
+ }
2671
+ /** @type {?} */
2672
+ let message = this.translation.NO_DATA
2673
+ ? this.translation.NO_DATA
2674
+ : ".No data, please choose another data type";
2675
+ this.dialogService.showNotification(message, {
2676
+ status: "Error",
2677
+ });
2678
+ length++;
2679
+ if (dataMartTables.length === length) {
2680
+ callback();
2681
+ }
2682
+ }
2683
+ else {
2684
+ result["data"].forEach((/**
2685
+ * @param {?} item
2686
+ * @return {?}
2687
+ */
2688
+ (item) => {
2689
+ item.Sector = this.translation[item.Sector] || item.Sector;
2690
+ }));
2691
+ if (this.fieldsArr[dashboardId] &&
2692
+ Object.keys(this.fieldsArr[dashboardId]).length) {
2693
+ this.portletResults_New[dashboardId][item.datamartCode] =
2694
+ result;
2695
+ }
2696
+ if (portlet) {
2697
+ this.portletData_New[dashboardId][identifier] = result;
2698
+ }
2699
+ length++;
2700
+ if (dataMartTables.length === length) {
2701
+ callback();
2702
+ }
2703
+ }
2704
+ }), (/**
2705
+ * @param {?} response
2706
+ * @return {?}
2707
+ */
2708
+ (response) => {
2709
+ length++;
2710
+ if (dataMartTables.length === length) {
2711
+ callback();
2712
+ }
2713
+ }), (/**
2714
+ * @return {?}
2715
+ */
2716
+ () => { }));
2717
+ }));
2718
+ }
2719
+ else {
2720
+ callback();
2721
+ }
2722
+ }
2723
+ }
2724
+ // 拿到数据后,先遍历config.filterSettings,如果在数据中不存在,就删除这一项
2725
+ /**
2726
+ * @param {?} config
2727
+ * @param {?} fields
2728
+ * @param {?} data
2729
+ * @return {?}
2730
+ */
2731
+ checkFilterSettings(config, fields, data) {
2732
+ /** @type {?} */
2733
+ let filterSettings = config.filterSettings;
2734
+ if (filterSettings && filterSettings.length) {
2735
+ for (let i = 0; i < filterSettings.length; i++) {
2736
+ /** @type {?} */
2737
+ const element = filterSettings[i];
2738
+ /** @type {?} */
2739
+ let __field = fields.filter((/**
2740
+ * @param {?} field
2741
+ * @return {?}
2742
+ */
2743
+ (field) => field.colName == element.name))[0];
2744
+ if (!__field) {
2745
+ // 处理自定义 Group的Filter
2746
+ continue;
2747
+ }
2748
+ /** @type {?} */
2749
+ const dataType = __field.dataType;
2750
+ if (element.items && element.items.length) {
2751
+ for (let r = 0; r < element.items.length; r++) {
2752
+ /** @type {?} */
2753
+ const item = element.items[r];
2754
+ /** @type {?} */
2755
+ let res = [];
2756
+ if (dataType !== "date" &&
2757
+ dataType !== "datetime" &&
2758
+ data &&
2759
+ data.length) {
2760
+ if (dataType == "string") {
2761
+ res = data.filter((/**
2762
+ * @param {?} obj
2763
+ * @return {?}
2764
+ */
2765
+ (obj) => obj[element.name] === item));
2766
+ }
2767
+ else {
2768
+ res = data.filter((/**
2769
+ * @param {?} obj
2770
+ * @return {?}
2771
+ */
2772
+ (obj) => Number(obj[element.name]) === Number(item)));
2773
+ }
2774
+ }
2775
+ if (dataType == "date" || dataType == "datetime") {
2776
+ res = data.filter((/**
2777
+ * @param {?} obj
2778
+ * @return {?}
2779
+ */
2780
+ (obj) => moment(obj[element.name]).format("YYYY-MM-DD") ==
2781
+ moment(item).format("YYYY-MM-DD")));
2782
+ }
2783
+ if (!res.length) {
2784
+ element.items.splice(r, 1);
2785
+ r--;
2786
+ }
2787
+ }
2788
+ if (!element.items.length) {
2789
+ filterSettings.splice(i, 1);
2790
+ i--;
2791
+ }
2792
+ }
2793
+ }
2794
+ return filterSettings;
2795
+ }
2796
+ else {
2797
+ return [];
2798
+ }
2799
+ // callback(filterSettings);
2800
+ }
2801
+ /**
2802
+ * @param {?} data
2803
+ * @return {?}
2804
+ */
2805
+ sortDataMartTables(data) {
2806
+ data.sort((/**
2807
+ * @param {?} a
2808
+ * @param {?} b
2809
+ * @return {?}
2810
+ */
2811
+ (a, b) => {
2812
+ /** @type {?} */
2813
+ const langValueA = a.langValue.toLowerCase();
2814
+ /** @type {?} */
2815
+ const langValueB = b.langValue.toLowerCase();
2816
+ if (langValueA < langValueB) {
2817
+ return -1;
2818
+ }
2819
+ if (langValueA > langValueB) {
2820
+ return 1;
2821
+ }
2822
+ return 0;
2823
+ }));
2824
+ }
2825
+ /**
2826
+ * @param {?} data
2827
+ * @param {?} id
2828
+ * @param {?} entityType
2829
+ * @return {?}
2830
+ */
2831
+ renameDataMartTables(data, id, entityType) {
2832
+ if (this.sourcesData[id]) {
2833
+ this.sourcesData[id].forEach((/**
2834
+ * @param {?} sources
2835
+ * @return {?}
2836
+ */
2837
+ (sources) => {
2838
+ if (sources.entityType === entityType) {
2839
+ data.forEach((/**
2840
+ * @param {?} _data
2841
+ * @return {?}
2842
+ */
2843
+ (_data) => {
2844
+ sources.views.forEach((/**
2845
+ * @param {?} view
2846
+ * @return {?}
2847
+ */
2848
+ (view) => {
2849
+ view.tables.forEach((/**
2850
+ * @param {?} table
2851
+ * @return {?}
2852
+ */
2853
+ (table) => {
2854
+ if (table.datamartCode === _data.datamartCode) {
2855
+ _data.langValue = table.langValue;
2856
+ _data.langCode = table.langCode;
2857
+ }
2858
+ }));
2859
+ }));
2860
+ }));
2861
+ }
2862
+ }));
2863
+ }
2864
+ else {
2865
+ return data;
2866
+ }
2867
+ }
2868
+ }
2869
+ DashboardPorletsService.decorators = [
2870
+ { type: Injectable, args: [{
2871
+ providedIn: "root",
2872
+ },] }
2873
+ ];
2874
+ /** @nocollapse */
2875
+ DashboardPorletsService.ctorParameters = () => [
2876
+ { type: ApiList },
2877
+ { type: MatDialog },
2878
+ { type: DialogService },
2879
+ { type: DashboardService },
2880
+ { type: HttpClient },
2881
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PBF_TOKEN,] }] },
2882
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [API_SERVICE_TOKEN,] }] }
2883
+ ];
2884
+ /** @nocollapse */ DashboardPorletsService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function DashboardPorletsService_Factory() { return new DashboardPorletsService(i0.ɵɵinject(i1.ApiList), i0.ɵɵinject(i2.MatDialog), i0.ɵɵinject(i3.DialogService), i0.ɵɵinject(i4.DashboardService), i0.ɵɵinject(i5.HttpClient), i0.ɵɵinject(i6.PBF_TOKEN, 8), i0.ɵɵinject(i6.API_SERVICE_TOKEN, 8)); }, token: DashboardPorletsService, providedIn: "root" });
2885
+ if (false) {
2886
+ /** @type {?} */
2887
+ DashboardPorletsService.prototype.translation;
2888
+ /**
2889
+ * @type {?}
2890
+ * @private
2891
+ */
2892
+ DashboardPorletsService.prototype.userInfo;
2893
+ /**
2894
+ * @type {?}
2895
+ * @private
2896
+ */
2897
+ DashboardPorletsService.prototype.lang;
2898
+ /** @type {?} */
2899
+ DashboardPorletsService.prototype.companyDropdownList;
2900
+ /** @type {?} */
2901
+ DashboardPorletsService.prototype.currencyDropdownList;
2902
+ /** @type {?} */
2903
+ DashboardPorletsService.prototype.currencyList;
2904
+ /** @type {?} */
2905
+ DashboardPorletsService.prototype.portlets;
2906
+ /** @type {?} */
2907
+ DashboardPorletsService.prototype.portletsCopy;
2908
+ /** @type {?} */
2909
+ DashboardPorletsService.prototype.columnCount;
2910
+ /** @type {?} */
2911
+ DashboardPorletsService.prototype.rowCount;
2912
+ /** @type {?} */
2913
+ DashboardPorletsService.prototype.companyCharts;
2914
+ /** @type {?} */
2915
+ DashboardPorletsService.prototype.portletData;
2916
+ /** @type {?} */
2917
+ DashboardPorletsService.prototype.fundDropdownList;
2918
+ /** @type {?} */
2919
+ DashboardPorletsService.prototype.allInvesteeList;
2920
+ /** @type {?} */
2921
+ DashboardPorletsService.prototype.fundInvesteeList;
2922
+ /** @type {?} */
2923
+ DashboardPorletsService.prototype.seletedAllInvestee;
2924
+ /** @type {?} */
2925
+ DashboardPorletsService.prototype.colorsTotal;
2926
+ /** @type {?} */
2927
+ DashboardPorletsService.prototype.fetch_disabled;
2928
+ /** @type {?} */
2929
+ DashboardPorletsService.prototype.update_loading;
2930
+ /** @type {?} */
2931
+ DashboardPorletsService.prototype.currencyCode;
2932
+ /** @type {?} */
2933
+ DashboardPorletsService.prototype.update_config;
2934
+ /** @type {?} */
2935
+ DashboardPorletsService.prototype.loading_show;
2936
+ /** @type {?} */
2937
+ DashboardPorletsService.prototype.img;
2938
+ /** @type {?} */
2939
+ DashboardPorletsService.prototype.sortingPortlet;
2940
+ /** @type {?} */
2941
+ DashboardPorletsService.prototype.pagingChanging;
2942
+ /** @type {?} */
2943
+ DashboardPorletsService.prototype.timeMeasure;
2944
+ /** @type {?} */
2945
+ DashboardPorletsService.prototype.entityList;
2946
+ /** @type {?} */
2947
+ DashboardPorletsService.prototype.entityType;
2948
+ /** @type {?} */
2949
+ DashboardPorletsService.prototype.selected_enyity_fileds;
2950
+ /** @type {?} */
2951
+ DashboardPorletsService.prototype.isEntitySelectAll;
2952
+ /** @type {?} */
2953
+ DashboardPorletsService.prototype.checkedAll;
2954
+ /** @type {?} */
2955
+ DashboardPorletsService.prototype.selectedNum;
2956
+ /** @type {?} */
2957
+ DashboardPorletsService.prototype.updated;
2958
+ /** @type {?} */
2959
+ DashboardPorletsService.prototype.dataMartTables;
2960
+ /** @type {?} */
2961
+ DashboardPorletsService.prototype.length;
2962
+ /** @type {?} */
2963
+ DashboardPorletsService.prototype.GetSourcesRes;
2964
+ /** @type {?} */
2965
+ DashboardPorletsService.prototype.ListEntitiesRes;
2966
+ /** @type {?} */
2967
+ DashboardPorletsService.prototype.templateList;
2968
+ /** @type {?} */
2969
+ DashboardPorletsService.prototype.fieldsArr;
2970
+ /** @type {?} */
2971
+ DashboardPorletsService.prototype.sourcesData;
2972
+ /** @type {?} */
2973
+ DashboardPorletsService.prototype.portletResults_New;
2974
+ /** @type {?} */
2975
+ DashboardPorletsService.prototype.portletData_New;
2976
+ /** @type {?} */
2977
+ DashboardPorletsService.prototype.portletFields_Temp;
2978
+ /** @type {?} */
2979
+ DashboardPorletsService.prototype.dashboardConfig;
2980
+ /** @type {?} */
2981
+ DashboardPorletsService.prototype.entityIds;
2982
+ /** @type {?} */
2983
+ DashboardPorletsService.prototype.entityIdObj;
2984
+ /** @type {?} */
2985
+ DashboardPorletsService.prototype.allFieldsObj;
2986
+ /** @type {?} */
2987
+ DashboardPorletsService.prototype.GetDataTypes;
2988
+ /** @type {?} */
2989
+ DashboardPorletsService.prototype.ExcelFormulas;
2990
+ /**
2991
+ * @type {?}
2992
+ * @private
2993
+ */
2994
+ DashboardPorletsService.prototype.api;
2995
+ /** @type {?} */
2996
+ DashboardPorletsService.prototype.dialog;
2997
+ /**
2998
+ * @type {?}
2999
+ * @private
3000
+ */
3001
+ DashboardPorletsService.prototype.dialogService;
3002
+ /**
3003
+ * @type {?}
3004
+ * @private
3005
+ */
3006
+ DashboardPorletsService.prototype.DashboardService;
3007
+ /**
3008
+ * @type {?}
3009
+ * @private
3010
+ */
3011
+ DashboardPorletsService.prototype.httpClient;
3012
+ /**
3013
+ * @type {?}
3014
+ * @private
3015
+ */
3016
+ DashboardPorletsService.prototype.pbf;
3017
+ /**
3018
+ * @type {?}
3019
+ * @private
3020
+ */
3021
+ DashboardPorletsService.prototype.http;
3022
+ }
3023
+ /** @type {?} */
3024
+ export const ALL_AGGREGATE_TYPES = [
3025
+ "Sum",
3026
+ "First",
3027
+ "Last",
3028
+ "CalculateIRR",
3029
+ "CalculateIRRIRRDate",
3030
+ "CalculateIRRBeforeCarried",
3031
+ "CalculateIRRActualAudited",
3032
+ "CalculateIRRReported",
3033
+ "CalculateIRRMTD",
3034
+ "CalculateIRRQTD",
3035
+ "CalculateIRRYTD",
3036
+ "CalculateTWRMTD",
3037
+ "CalculateTWRQTD",
3038
+ "CalculateTWRYTD",
3039
+ "CalculateVARMTD_99",
3040
+ "CalculateVARQTD_99",
3041
+ "CalculateVARYTD_99",
3042
+ "CalculateVARMTD_95",
3043
+ "CalculateVARQTD_95",
3044
+ "CalculateVARYTD_95",
3045
+ "CalculateMultiple",
3046
+ "CalculatePIC",
3047
+ "CalculateDPI",
3048
+ "CalculateTVPI",
3049
+ "CalculateRVPI",
3050
+ "CalculateMActualAudited",
3051
+ "CalculateMReported",
3052
+ "Count",
3053
+ "DistinctCount",
3054
+ "Product",
3055
+ "Min",
3056
+ "Max",
3057
+ "Avg",
3058
+ "Median",
3059
+ "Index",
3060
+ "PopulationVar",
3061
+ "SampleVar",
3062
+ "PopulationStDev",
3063
+ "SampleStDev",
3064
+ "RunningTotals",
3065
+ "PercentageOfGrandTotal",
3066
+ "PercentageOfColumnTotal",
3067
+ "PercentageOfRowTotal",
3068
+ "PercentageOfParentColumnTotal",
3069
+ "PercentageOfParentRowTotal",
3070
+ "DifferenceFrom",
3071
+ "PercentageOfDifferenceFrom",
3072
+ "PercentageOfParentTotal",
3073
+ ];
3074
+ /** @type {?} */
3075
+ let translation = JSON.parse(localStorage.getItem("translation") || "{}");
3076
+ /** @type {?} */
3077
+ export const AGGREGATE_TYPES_TEXT = {
3078
+ CalculateIRR: translation.CALCULATE_IRR || "Calculate IRR",
3079
+ CalculateIRRIRRDate: translation.CALCULATE_IRR_IRR_DATE || "Calculate IRR (IRR Date)",
3080
+ CalculateIRRBeforeCarried: translation.CALCULATE_IRR_BEFORE_CARRY || "Calculate IRR Before Carried",
3081
+ CalculateIRRActualAudited: translation.CALCULATE_IRR_ACTUAL_AUDITED || "Calculate IRR Actual/Audited",
3082
+ CalculateIRRReported: translation.CI_REPORTED || "Calculate IRR Reported",
3083
+ CalculateIRRMTD: translation.CALCULATE_IRR_MTD || "Calculate IRR (MTD)",
3084
+ CalculateIRRQTD: translation.CALCULATE_IRR_QTD || "Calculate IRR (QTD)",
3085
+ CalculateIRRYTD: translation.CALCULATE_IRR_YTD || "Calculate IRR (YTD)",
3086
+ CalculateTWRMTD: translation.CALCULATE_TWR_MTD || "Calculate TWR (M)",
3087
+ CalculateTWRQTD: translation.CALCULATE_TWR_QTD || "Calculate TWR (Q)",
3088
+ CalculateTWRYTD: translation.CALCULATE_TWR_YTD || "Calculate TWR (Y)",
3089
+ CalculateVARMTD_99: translation.CALCULATE_VAR_MTD_99 || "Calculate VAR (M 99%)",
3090
+ CalculateVARQTD_99: translation.CALCULATE_VAR_QTD_99 || "Calculate VAR (Q 99%)",
3091
+ CalculateVARYTD_99: translation.CALCULATE_VAR_YTD_99 || "Calculate VAR (Y 99%)",
3092
+ CalculateVARMTD_95: translation.CALCULATE_VAR_MTD_95 || "Calculate VAR (M 95%)",
3093
+ CalculateVARQTD_95: translation.CALCULATE_VAR_QTD_95 || "Calculate VAR (Q 95%)",
3094
+ CalculateVARYTD_95: translation.CALCULATE_VAR_YTD_95 || "Calculate VAR (Y 95%)",
3095
+ CalculateMultiple: translation.CALCULATE_MULTIPLE || "Calculate Multiple",
3096
+ CalculatePIC: translation.CALCULATE_PIC || "Calculate PIC",
3097
+ CalculateDPI: translation.CALCULATE_DPI || "Calculate DPI",
3098
+ CalculateTVPI: translation.CALCULATE_TVPI || "Calculate TVPI",
3099
+ CalculateRVPI: translation.CALCULATE_RVPI || "Calculate RVPI",
3100
+ CalculateMActualAudited: translation.CALCULATE_MULTIPLE_ACTUAL_AUDITED ||
3101
+ "Calculate Multiple Actual/Audited",
3102
+ CalculateMReported: translation.CALCULATE_MULTIPLE_REPORTED || "Calculate Multiple Reported",
3103
+ First: translation.FIRST || "First",
3104
+ Last: translation.LAST || "Last",
3105
+ Median: translation.MEDIAN || "Median",
3106
+ };
3107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kYXNoYm9hcmQvZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBSzFELE1BQU0sT0FBTyx1QkFBdUI7Ozs7Ozs7Ozs7SUE4RGxDLFlBQ1UsR0FBWSxFQUNiLE1BQWlCLEVBQ2hCLGFBQTRCLEVBQzVCLGdCQUFrQyxFQUNsQyxVQUFzQixFQUNTLEdBQVEsRUFDQSxJQUFTO1FBTmhELFFBQUcsR0FBSCxHQUFHLENBQVM7UUFDYixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNTLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFDQSxTQUFJLEdBQUosSUFBSSxDQUFLOztRQWhF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aEMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLElBQUksUUFBUTtDQUN2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBcGlMaXN0IH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbFwiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSBcIi4vZGFzaGJvYXJkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEFQSV9TRVJWSUNFX1RPS0VOLCBQQkZfVE9LRU4gfSBmcm9tIFwiLi4vc2VydmljZS9JbmplY3Rpb25Ub2tlblwiO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvZGlhbG9nLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZFBvcmxldHNTZXJ2aWNlIHtcclxuICBwdWJsaWMgdHJhbnNsYXRpb247XHJcbiAgcHJpdmF0ZSB1c2VySW5mbztcclxuICBwcml2YXRlIGxhbmc7XHJcbiAgLy8gcHVibGljIGNvbmZpZztcclxuICBwdWJsaWMgY29tcGFueURyb3Bkb3duTGlzdCA9IFtdO1xyXG4gIHB1YmxpYyBjdXJyZW5jeURyb3Bkb3duTGlzdCA9IFtdO1xyXG4gIHB1YmxpYyBjdXJyZW5jeUxpc3QgPSBbXTtcclxuICBwdWJsaWMgcG9ydGxldHMgPSBbXTtcclxuICBwdWJsaWMgcG9ydGxldHNDb3B5ID0gW107XHJcbiAgcHVibGljIGNvbHVtbkNvdW50O1xyXG4gIHB1YmxpYyByb3dDb3VudDtcclxuICBwdWJsaWMgY29tcGFueUNoYXJ0cyA9IFtdO1xyXG4gIHB1YmxpYyBwb3J0bGV0RGF0YTtcclxuICBwdWJsaWMgZnVuZERyb3Bkb3duTGlzdDtcclxuICBwdWJsaWMgYWxsSW52ZXN0ZWVMaXN0O1xyXG4gIHB1YmxpYyBmdW5kSW52ZXN0ZWVMaXN0O1xyXG4gIHB1YmxpYyBzZWxldGVkQWxsSW52ZXN0ZWU6IGJvb2xlYW47XHJcbiAgcHVibGljIGNvbG9yc1RvdGFsID0gW1xyXG4gICAgXCIjMGI1NDk2XCIsXHJcbiAgICBcIiMwMDgxZmZcIixcclxuICAgIFwiIzIyY2NlMlwiLFxyXG4gICAgXCIjNjA2ZWRlXCIsXHJcbiAgICBcIiM4NTk4ZjdcIixcclxuICAgIFwiIzAwYTc0NFwiLFxyXG4gICAgXCIjMTJjMTc3XCIsXHJcbiAgICBcIiNmZGJmNWVcIixcclxuICAgIFwiI2ZmOGE0OFwiLFxyXG4gICAgXCIjZWE0MjU4XCIsXHJcbiAgXTtcclxuICBwdWJsaWMgZmV0Y2hfZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyB1cGRhdGVfbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjdXJyZW5jeUNvZGU7XHJcbiAgcHVibGljIHVwZGF0ZV9jb25maWc7XHJcbiAgcHVibGljIGxvYWRpbmdfc2hvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpbWc7XHJcbiAgcHVibGljIHNvcnRpbmdQb3J0bGV0ID0gW107XHJcbiAgcHVibGljIHBhZ2luZ0NoYW5naW5nID0gW107XHJcbiAgcHVibGljIHRpbWVNZWFzdXJlO1xyXG4gIHB1YmxpYyBlbnRpdHlMaXN0O1xyXG4gIHB1YmxpYyBlbnRpdHlUeXBlO1xyXG4gIHB1YmxpYyBzZWxlY3RlZF9lbnlpdHlfZmlsZWRzID0gW107XHJcbiAgcHVibGljIGlzRW50aXR5U2VsZWN0QWxsO1xyXG4gIHB1YmxpYyBjaGVja2VkQWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkTnVtO1xyXG4gIHB1YmxpYyB1cGRhdGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGRhdGFNYXJ0VGFibGVzID0ge307XHJcbiAgcHVibGljIGxlbmd0aCA9IDA7XHJcbiAgcHVibGljIEdldFNvdXJjZXNSZXM7XHJcbiAgcHVibGljIExpc3RFbnRpdGllc1JlcztcclxuICBwdWJsaWMgdGVtcGxhdGVMaXN0ID0gW107XHJcbiAgcHVibGljIGZpZWxkc0FyciA9IHt9O1xyXG4gIHB1YmxpYyBzb3VyY2VzRGF0YSA9IHt9O1xyXG4gIC8vIG5ld0Rhc2hib2FyZFxyXG4gIHB1YmxpYyBwb3J0bGV0UmVzdWx0c19OZXcgPSB7fTsgLy8g5LulRGF0YVRhYmxl5Li65Y2V5L2NIOWtmOWCqOaWsOaVsOaNrlxyXG4gIHB1YmxpYyBwb3J0bGV0RGF0YV9OZXcgPSB7fTsgLy8g5LulcG9ydGxldOS4uuWNleS9jSDlrZjlgqjmlrDmlbDmja5cclxuICBwdWJsaWMgcG9ydGxldEZpZWxkc19UZW1wID0ge307IC8vIOWtmOWCqOW9k+WJjXBvcnRsZXTmiYDnlKjliLDnmoTlrZfmrrVcclxuICBwdWJsaWMgZGFzaGJvYXJkQ29uZmlnOiBhbnkgPSB7fTsgLy8g5b2T5YmNRGFzaGJvYXJk55qEY29uZmlnLCDnlKjkuo7ojrflj5ZvcmRlckJ5Q29sdW1uc1xyXG4gIHB1YmxpYyBlbnRpdHlJZHM6IGFueSA9IFtdO1xyXG4gIHB1YmxpYyBlbnRpdHlJZE9iajogYW55ID0ge307XHJcbiAgcHVibGljIGFsbEZpZWxkc09iaiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpOiBBcGlMaXN0LFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBEYXNoYm9hcmRTZXJ2aWNlOiBEYXNoYm9hcmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChQQkZfVE9LRU4pIHByaXZhdGUgcGJmOiBhbnksXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9TRVJWSUNFX1RPS0VOKSBwcml2YXRlIGh0dHA6IGFueVxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBzZXRFbnRpdHlUeXBlKHJlcykge1xyXG4gICAgaWYgKHJlcyAmJiByZXMuZW50aXR5TGlzdCAmJiByZXMuZW50aXR5TGlzdC5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZW50aXR5RGF0YSA9IHJlcy5lbnRpdHlMaXN0WzBdO1xyXG4gICAgICBpZiAoIWVudGl0eURhdGEpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHsgbGlua2VkVHlwZSA9IFwiXCIgfSA9IGVudGl0eURhdGE7XHJcbiAgICAgIGlmICghbGlua2VkVHlwZSkge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbnRpdHlUeXBlID1cclxuICAgICAgICBsaW5rZWRUeXBlID09PSBcIlByb3BlcnR5SWRcIlxyXG4gICAgICAgICAgPyBcIlByb3BlcnR5XCJcclxuICAgICAgICAgIDogbGlua2VkVHlwZSA9PT0gXCJwb3J0Zm9saW9Db21wSWRcIiB8fFxyXG4gICAgICAgICAgICBsaW5rZWRUeXBlID09PSBcImFzc2V0Q29tcElkXCIgfHxcclxuICAgICAgICAgICAgbGlua2VkVHlwZSA9PT0gXCJvdGhlckNvbXBJZFwiXHJcbiAgICAgICAgICA/IFwiQ29tcGFueVwiXHJcbiAgICAgICAgICA6IGxpbmtlZFR5cGUgPT09IFwicG9ydGZvbGlvRnVuZElkXCIgfHwgbGlua2VkVHlwZSA9PT0gXCJhc3NldEZ1bmRJZFwiXHJcbiAgICAgICAgICA/IFwiRnVuZFwiXHJcbiAgICAgICAgICA6IFwiQXNzZXRQb3J0Zm9saW9cIjtcclxuICAgICAgcmVzLmVudGl0eVR5cGUgPSB0aGlzLmVudGl0eVR5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldERhc2hib2FyZFYxKFxyXG4gICAgZGFzaGJvYXJkSWQ6IHN0cmluZyxcclxuICAgIHJvR2V0LFxyXG4gICAgY2FsbGJhY2s6IEZ1bmN0aW9uLFxyXG4gICAgaXNSZWZyZXNoID0gZmFsc2UsXHJcbiAgICBjYWxsYmFja0ZvckRhc2hib2FyZD86IEZ1bmN0aW9uXHJcbiAgKSB7XHJcbiAgICBpZiAoIWlzUmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnBvcnRsZXRzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldEluZm8oKTtcclxuICAgIGNvbnN0IGRhdGFPYmogPSB7IGRhc2hib2FyZElkLCBsYW5ndWFnZTogdGhpcy5sYW5nIH07XHJcbiAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldERhc2hib2FyZFYyLCBkYXRhT2JqLCAocmVzKSA9PiB7XHJcbiAgICAgIHJlcyA9IHRoaXMucGJmLmNvbnZlcnRLZXlzVG9Mb3dlckNhc2UocmVzKTtcclxuICAgICAgaWYgKCFyZXMpIHtcclxuICAgICAgICBjYWxsYmFjayhudWxsKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgcmVzID0gdGhpcy5zZXRFbnRpdHlUeXBlKHJlcyk7XHJcbiAgICAgIC8vIOWIneWni+WMlmZyb21EYXRlXHJcbiAgICAgIGlmIChyZXMuZnJvbURhdGUgPT09IFwiMTkwMC0wMS0wMVQwMDowMDowMFpcIikge1xyXG4gICAgICAgIHJlcy5mcm9tRGF0ZSA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNhbGxiYWNrRm9yRGFzaGJvYXJkKSB7XHJcbiAgICAgICAgY2FsbGJhY2tGb3JEYXNoYm9hcmQocmVzKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVudGl0eUlkcyA9XHJcbiAgICAgICAgcmVzLmVudGl0eUxpc3QgJiYgcmVzLmVudGl0eUxpc3QubGVuZ3RoID4gMFxyXG4gICAgICAgICAgPyByZXMuZW50aXR5TGlzdC5tYXAoKGUpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gZVtcImxpbmtlZEd1aWRcIl07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICA6IFtdO1xyXG4gICAgICBpZiAocmVzLmVudGl0eUxpc3QpIHRoaXMuZW50aXR5TGlzdCA9IFsuLi5yZXMuZW50aXR5TGlzdF07XHJcbiAgICAgIHRoaXMuZW50aXR5SWRPYmogPSB7XHJcbiAgICAgICAgaWQ6IEpTT04uc3RyaW5naWZ5KHRoaXMuZW50aXR5SWRzKSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5wb3J0bGV0UmVzdWx0c19OZXdbcmVzLmlkXSA9IHt9O1xyXG4gICAgICB0aGlzLnBvcnRsZXREYXRhX05ld1tyZXMuaWRdID0ge307XHJcbiAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5kYXNoYm9hcmRHcm91cElkW3Jlcy5pZF0gPSByZXMuZGFzaGJvYXJkR3JvdXBJZDtcclxuICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLmRhc2hib2FyZEdyb3VwTmFtZVtyZXMuaWRdID0gcmVzLmRhc2hib2FyZEdyb3VwTmFtZTtcclxuICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLlJlZ2lvbkRhdGFTZXRJZFtyZXMuaWRdID0gcmVzLlJlZ2lvbkRhdGFTZXRJZDtcclxuICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLmRhc2hib2FyZE5hbWVbcmVzLmlkXSA9IHJlcy5uYW1lO1xyXG4gICAgICB0aGlzLkRhc2hib2FyZFNlcnZpY2Uuc2hhcmVVc2Vyc1tyZXMuaWRdID0gcmVzLnNoYXJlZFVzZXJzO1xyXG4gICAgICB0aGlzLmRhc2hib2FyZENvbmZpZ1tyZXMuaWRdID0gcmVzLmNvbmZpZyAmJiBKU09OLnBhcnNlKHJlcy5jb25maWcpO1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhTWFydFRhYmxlc1tyZXMuaWRdID0gdW5pcUJ5KFxyXG4gICAgICAgIC8vIFx0cmVzLmRhdGFNYXJ0VGFibGVzLFxyXG4gICAgICAgIC8vIFx0XCJsYW5nQ29kZVwiXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgICB0aGlzLmRhdGFNYXJ0VGFibGVzW3Jlcy5pZF0gPSBbLi4ucmVzLmRhdGFNYXJ0VGFibGVzXTtcclxuICAgICAgICB0aGlzLnNvcnREYXRhTWFydFRhYmxlcyh0aGlzLmRhdGFNYXJ0VGFibGVzW3Jlcy5pZF0pO1xyXG4gICAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5kYXNoYm9hcmREZXNjcmlwdGlvbiA9IHJlcy5kZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLmltZyA9IHJlcy5pbWc7XHJcbiAgICAgICAgLy8g5aaC5p6c5Y+v6YCJ5byA5aeL5pel5pyf77yM5bGP6JS96buY6K6k55qEMTkwMC0wMS0wMVxyXG4gICAgICAgIHRoaXMuY3VycmVuY3lDb2RlID0gcmVzLmN1cnJlbmN5Q29kZTtcclxuICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLmNvbHVtbkNvdW50ID0gcmVzLmNvbHVtbkNvdW50ID8gcmVzLmNvbHVtbkNvdW50IDogNDtcclxuICAgICAgICBpZiAocmVzLnBvcnRsZXRzKSB7XHJcbiAgICAgICAgICBpZiAoIWlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcnRsZXRzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMucG9ydGxldHMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucm93Q291bnQgPVxyXG4gICAgICAgICAgICByZXMucG9ydGxldHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgID8gTWF0aC5tYXguYXBwbHkoXHJcbiAgICAgICAgICAgICAgICAgIE1hdGgsXHJcbiAgICAgICAgICAgICAgICAgIHJlcy5wb3J0bGV0cy5tYXAoZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5wb3NZO1xyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKSArIDJcclxuICAgICAgICAgICAgICA6IDI7XHJcblxyXG4gICAgICAgICAgLy8gbmV3IERhc2hib2FyZFxyXG4gICAgICAgICAgaWYgKHRoaXMucG9ydGxldHMgJiYgdGhpcy5wb3J0bGV0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5maWVsZHNBcnJbcmVzLmlkXSA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLnBvcnRsZXRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgIU9iamVjdC5rZXlzKHRoaXMuZmllbGRzQXJyW3Jlcy5pZF0pLmluY2x1ZGVzKGVsLmZpZ3VyZUNvZGUpXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkc0FycltyZXMuaWRdW2VsLmZpZ3VyZUNvZGVdID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgICAgICAgZWwuY29uZmlnXHJcbiAgICAgICAgICAgICAgICApLmZpZWxkcztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3J0bGV0cyA9IHRoaXMucG9ydGxldHMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZpZ3VyZUNvZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmdldERhdGFCeVBvcnRsZXRzTmV3KFxyXG4gICAgICAgICAgICAgIHRoaXMucG9ydGxldHMsXHJcbiAgICAgICAgICAgICAgKF9yZXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlcywgdGhpcy5wb3J0bGV0cyk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgIGlzUmVmcmVzaCxcclxuICAgICAgICAgICAgICByZXMsXHJcbiAgICAgICAgICAgICAgcm9HZXRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlcywgdGhpcy5wb3J0bGV0cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucG9ydGxldHMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuY29sdW1uQ291bnQgPSA0O1xyXG4gICAgICAgICAgdGhpcy5yb3dDb3VudCA9IDI7XHJcbiAgICAgICAgICBjYWxsYmFjayhyZXMsIHRoaXMucG9ydGxldHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyVHJpZ2dlckdldERhdGEocG9ydGxldCwgZmlsdGVyU2V0dGluZ3MsIGRhc2hib2FyZCwgY2FsbGJhY2spIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHBvcnRsZXQuY29uZmlnICYmIEpTT04ucGFyc2UocG9ydGxldC5jb25maWcpO1xyXG4gICAgbGV0IGlkID1cclxuICAgICAgcG9ydGxldC5pZCA9PT0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIlxyXG4gICAgICAgID8gcG9ydGxldC5uZXdJZFxyXG4gICAgICAgIDogcG9ydGxldC5pZDtcclxuICAgIGxldCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtc0J5UG9ydGxldChwb3J0bGV0LCBudWxsLCBudWxsLCBkYXNoYm9hcmQpO1xyXG4gICAgbGV0IGluaXRGaWVsZHNBcnI7XHJcbiAgICBsZXQgY3VyRmllbGRzQXJyO1xyXG4gICAgaWYgKCFwYXJhbXMuaXNUYWJsZSkge1xyXG4gICAgICAvLyDotYvlgLxwb3J0bGV0RmllbGRzX1RlbXBcclxuICAgICAgaW5pdEZpZWxkc0FyciA9IHRoaXMucG9ydGxldEZpZWxkc19UZW1wW2lkXTtcclxuICAgICAgY3VyRmllbGRzQXJyID0gcGFyYW1zLmRpc3BsYXlDb2x1bW5GaWx0ZXIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIWluaXRGaWVsZHNBcnIgfHxcclxuICAgICAgICB0aGlzLm5lZWRHZXRQb3J0bGV0RGF0YShpbml0RmllbGRzQXJyLCBjdXJGaWVsZHNBcnIpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMucG9ydGxldEZpZWxkc19UZW1wW2lkXSA9IGN1ckZpZWxkc0FycjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGZpbHRlclNldHRpbmdzICYmIGZpbHRlclNldHRpbmdzLmxlbmd0aCkge1xyXG4gICAgICBpZiAoIXBhcmFtcy5jb2x1bW5GaWx0ZXIpIHtcclxuICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyID0gW107XHJcbiAgICAgIH1cclxuICAgICAgY29uZmlnLmZpbHRlclNldHRpbmdzID0gZmlsdGVyU2V0dGluZ3M7XHJcblxyXG4gICAgICBmaWx0ZXJTZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5wb3J0bGV0VHlwZSA9PT0gXCJwaXZvdFwiKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IF9maWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChcclxuICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmNvbE5hbWUgPT09IHNldHRpbmcubmFtZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgVHlwZSA9IF9maWVsZCAmJiBfZmllbGQuZGF0YVR5cGU7XHJcbiAgICAgICAgaWYgKHNldHRpbmcuaXRlbXMpIHtcclxuICAgICAgICAgIHNldHRpbmcuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgIEZpZWxkOiBzZXR0aW5nLm5hbWUsXHJcbiAgICAgICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgICAgICBUeXBlLFxyXG4gICAgICAgICAgICAgIFZhbHVlOlxyXG4gICAgICAgICAgICAgICAgVHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgPyBtb21lbnQoaXRlbSkuZm9ybWF0KFwieXl5eS1NTS1ERFwiKVxyXG4gICAgICAgICAgICAgICAgICA6IFR5cGUgPT09IFwiZGF0ZXRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICA/IG1vbWVudChpdGVtKS5mb3JtYXQoXCJ5eXl5LU1NLUREIGhoOm1tOnNzXCIpXHJcbiAgICAgICAgICAgICAgICAgIDogaXRlbSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmcub3BlcmF0b3IpIHtcclxuICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIucHVzaCh7XHJcbiAgICAgICAgICAgIEZpZWxkOiBzZXR0aW5nLmZpZWxkLFxyXG4gICAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgICBUeXBlOiBzZXR0aW5nLnR5cGUsXHJcbiAgICAgICAgICAgIFZhbHVlOlxyXG4gICAgICAgICAgICAgIHNldHRpbmcudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgICAgID8gbW9tZW50KHNldHRpbmcudmFsdWUpLmZvcm1hdChcInl5eXktTU0tRERcIilcclxuICAgICAgICAgICAgICAgIDogc2V0dGluZy50eXBlID09PSBcImRhdGV0aW1lXCJcclxuICAgICAgICAgICAgICAgID8gbW9tZW50KHNldHRpbmcudmFsdWUpLmZvcm1hdChcInl5eXktTU0tREQgaGg6bW06c3NcIilcclxuICAgICAgICAgICAgICAgIDogc2V0dGluZy52YWx1ZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25maWcuZmlsdGVyU2V0dGluZ3MgPSBbXTtcclxuICAgIH1cclxuICAgIGlmIChwYXJhbXMuY29sdW1uRmlsdGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IHBhcmFtcy5jb2x1bW5GaWx0ZXIuZmlsdGVyKChpdGVtKSA9PiBpdGVtLkZpZWxkKTtcclxuICAgIH1cclxuICAgIC8vIGpzb24gYnVmZmVyXHJcbiAgICBwYXJhbXNbXCJkYXNoYm9hcmRWZXJzaW9uXCJdID0gMjtcclxuICAgIC8vIGpzb24gYnVmZmVyXHJcbiAgICB0aGlzLmh0dHBDbGllbnRcclxuICAgICAgLnBvc3QoXHJcbiAgICAgICAgdGhpcy5hcGkuYmFzZXVybCArIHRoaXMuYXBpLnVybExpc3QuR2V0UG9ydGxldERhdGFPckNyZWF0ZSxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlcmAsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgcmVzdWx0W1wiZGF0YVwiXS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpdGVtLlNlY3RvciA9IHRoaXMudHJhbnNsYXRpb25baXRlbS5TZWN0b3JdIHx8IGl0ZW0uU2VjdG9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W2Rhc2hib2FyZC5pZF1baWRdID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMucGJmLnRyaWdnZXJEYXNoYm9hcmRGaWx0ZXJDaGFuZ2UubmV4dCh7XHJcbiAgICAgICAgICBpZDogZGFzaGJvYXJkLmlkLFxyXG4gICAgICAgICAgbmV3SWQ6IHBvcnRsZXQubmV3SWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY2FsbGJhY2soeyBuZXdJZDogcG9ydGxldCAmJiBwb3J0bGV0Lm5ld0lkLCBjb25maWcgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZVBhcmVudGhlc2VzKHN0cikge1xyXG4gICAgcmV0dXJuIHN0ci5zcGxpdChcIihcIikuam9pbihcIlwiKS5zcGxpdChcIilcIikuam9pbihcIlwiKS5zcGxpdCgnXCInKS5qb2luKFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEluZm8oKSB7XHJcbiAgICB0aGlzLnRyYW5zbGF0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInRyYW5zbGF0aW9uXCIpKTtcclxuICAgIHRoaXMudXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlckluZm9cIikpO1xyXG4gICAgdGhpcy5sYW5nID0gdGhpcy5wYmYuZ2V0TGFuZ3VhZ2VQYXJhbXMoKTtcclxuICAgIHRoaXMudHJhbnNsYXRpb24uREFTSEJPQVJEX1JPTExJTkcgPSB0aGlzLnRyYW5zbGF0aW9uLkRBU0hCT0FSRF9ST0xMSU5HXHJcbiAgICAgID8gdGhpcy50cmFuc2xhdGlvbi5EQVNIQk9BUkRfUk9MTElOR1xyXG4gICAgICA6IFwiREFTSEJPQVJEX1JPTExJTkdcIjtcclxuICB9XHJcblxyXG4gIC8qICAgICBGaW5hbmNpYWwgQW5hbHlzaXMgSSAgICAgIGdldCBzZWxlY3QgRHJvcGRvd24gKi9cclxuICBwdWJsaWMgR2V0Q2hhcnRUeXBlcygpIHtcclxuICAgIC8vIENoYXJ0IFR5cGVcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IFwibXNjb21iaTJkXCIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5TSU5HTEVZMkQsXHJcbiAgICAgICAgaGFzU2Vjb25kYXJ5WUF4aXM6IGZhbHNlLFxyXG4gICAgICAgIGNhblNlbGVjdFN0eWxlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiBcIm1zY29tYmkzZFwiLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uU0lOR0xFWTNELFxyXG4gICAgICAgIGhhc1NlY29uZGFyeVlBeGlzOiBmYWxzZSxcclxuICAgICAgICBjYW5TZWxlY3RTdHlsZTogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogXCJtc2NvbWJpZHkyZFwiLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uRFVBTFkyRCxcclxuICAgICAgICBoYXNTZWNvbmRhcnlZQXhpczogdHJ1ZSxcclxuICAgICAgICBjYW5TZWxlY3RTdHlsZTogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogXCJtc2JhcjJkXCIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5CQVIyRCxcclxuICAgICAgICBoYXNTZWNvbmRhcnlZQXhpczogZmFsc2UsXHJcbiAgICAgICAgY2FuU2VsZWN0U3R5bGU6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiBcIm1zYmFyM2RcIixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkJBUjNELFxyXG4gICAgICAgIGhhc1NlY29uZGFyeVlBeGlzOiBmYWxzZSxcclxuICAgICAgICBjYW5TZWxlY3RTdHlsZTogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IFwic3RhY2tlZGNvbHVtbjJkbGluZVwiLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uU1RBQ0tFREJBUjJELFxyXG4gICAgICAgIGhhc1NlY29uZGFyeVlBeGlzOiBmYWxzZSxcclxuICAgICAgICBjYW5TZWxlY3RTdHlsZTogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogXCJzdGFja2VkY29sdW1uM2RsaW5lXCIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5TVEFDS0VEQkFSM0QsXHJcbiAgICAgICAgaGFzU2Vjb25kYXJ5WUF4aXM6IGZhbHNlLFxyXG4gICAgICAgIGNhblNlbGVjdFN0eWxlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIGdldENvbXBhbnlEcm9wZG93bigpIHtcclxuICAgIC8vIGNvbXBhbnlcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBhY2NvdW50SWQ6IHRoaXMudXNlckluZm8uYWNjb3VudElkLFxyXG4gICAgICB1c2VybmFtZTogdGhpcy51c2VySW5mby51c2VybmFtZSxcclxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZyxcclxuICAgICAgY29tcGFueVR5cGU6IFwicG9ydGZvbGlvXCIsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5HZXRBbGxDb21wYW55QnlBY2NvdW50LCBkYXRhLCAocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICB0aGlzLmNvbXBhbnlEcm9wZG93bkxpc3QgPSByZXM7XHJcbiAgICAgICAgLy8gcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRDdXJyZW5jeURyb3Bkb3duKCkge1xyXG4gICAgLy8gQ3VycmVuY3lcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBhY2NvdW50SWQ6IHRoaXMudXNlckluZm8uYWNjb3VudElkLFxyXG4gICAgICB1c2VybmFtZTogdGhpcy51c2VySW5mby51c2VybmFtZSxcclxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZyxcclxuICAgICAgYWxpYXM6IFwiQ3VycmVuY3lcIixcclxuICAgIH07XHJcbiAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldERyb3Bkb3duLCBkYXRhLCAocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbmN5RHJvcGRvd25MaXN0ID0gcmVzO1xyXG4gICAgICAgIC8vIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBwdWJsaWMgR2V0VGltZU1lYXN1cmUoKSB7XHJcbiAgICAvLyBUaW1lIE1lYXN1cmVcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiTVREXCIsIC8vIOaciOW6plxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5NT05USExZLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcIlFURFwiLCAvLyDlraPluqZcclxuICAgICAgICB2YWw6IHRoaXMudHJhbnNsYXRpb24uUVVBUlRFUkxZLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcIlNZVERcIiwgLy8g5Y2K5bm05bqmXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLlNFTUlBTk5VQUxMWSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJZVERcIiwgLy8g5bm05bqmXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkFOTlVBTExZLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcIkZZVERcIiwgLy8g5bm05bqm77yI6LSi5pS/5bm05bqm77yJXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkFOTlVBTExZRlksXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiTFRNXCIsIC8vIOacgOi/keWNgeS6jOS4quaciFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMTJNT05USCxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRQZXJpb2RzKCkge1xyXG4gICAgLy8gUHJldmlvdXMgUGVyaW9kXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAyLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDJEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAzLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDNEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA0LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDREQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA1LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDVEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA2LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDZEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA3LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDdEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA4LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDhEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA5LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDlEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxMCxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxMERBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDExLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDExREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMTJEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxMyxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxM0RBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDE0LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDE0REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTUsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMTVEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxNixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxNkRBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDE3LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDE3REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTgsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMThEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxOSxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxOURBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDIwLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDIwREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMjEsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMjFEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAyMixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QyMkRBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDIzLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDIzREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMjQsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMjREQVRBLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIEdldEZvbGxvd2luZ1BlcmlvZHMoKSB7XHJcbiAgICAvLyBGb2xsb3dpbmcgUGVyaW9kXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAwLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTk9ORVhUREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMyxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQzREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogNCxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQ0REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogNSxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQ1REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogNixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQ2REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogNyxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQ3REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogOCxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQ4REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogOSxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQ5REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTAsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5ORVhUMTBEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxMSxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQxMURBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDEyLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDEyREFUQSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRGaW5hbmNpYWxGaWd1cmVDb2RlcygpIHtcclxuICAgIC8vIEZpbmFuY2lhbCBUeXBlXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcImFjY291bnRBc3NldEZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5UQVNTRVRGSUdVUkUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiYWNjb3VudEVxdWl0eUZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5URVFVSVRZRklHVVJFLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcImFjY291bnRMaWFiaWxpdHlGaWd1cmVcIixcclxuICAgICAgICB2YWw6IHRoaXMudHJhbnNsYXRpb24uREFTSERfQUNDT1VOVExJQUJJTElUWUZJR1VSRSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJhY2NvdW50UExGaWd1cmVcIixcclxuICAgICAgICB2YWw6IHRoaXMudHJhbnNsYXRpb24uREFTSERfQUNDT1VOVFBMRklHVVJFLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcImFjY291bnRDYXNoZmxvd0ZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5UQ0FTSEZMT1dGSUdVUkUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiYWNjb3VudE9wZXJhdGlvbktQSUZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5UT1BFUkFUSU9OS1BJRklHVVJFLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcImFjY291bnRSQVRJT0ZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5UUkFUSU9GSUdVUkUsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICBwdWJsaWMgR2V0RmluYW5jaWFsU3ViVHlwZShmaW5hbmNpYWxzKSB7XHJcbiAgICB2YXIgZmluYW5jaWFsVHlwZXMgPSBbXTtcclxuICAgIGZvciAodmFyIGl0ZW0gaW4gZmluYW5jaWFscykge1xyXG4gICAgICBmaW5hbmNpYWxUeXBlcy5wdXNoKHtcclxuICAgICAgICBzdWJUeXBlOiBpdGVtW1wic3ViVHlwZVwiXSxcclxuICAgICAgICBzdWJUeXBlQ29kZTogaXRlbVtcInN1YlR5cGVDb2RlXCJdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmluYW5jaWFsVHlwZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRGaW5hbmNpYWxJdGVtcyhpZCwga2V5KSB7XHJcbiAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgdXNlcm5hbWU6IHRoaXMudXNlckluZm8udXNlcm5hbWUsXHJcbiAgICAgIGFjY291bnRJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIGludmVzdGVlSWRzOiBbaWRdLFxyXG4gICAgICBmaWd1cmVDb2RlOiBrZXksXHJcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmcsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5HZXRGaW5hbmNpYWxJdGVtcywgZGF0YSwgKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qIGdldCB0b2dnbGUgKi9cclxuICBwdWJsaWMgR2V0VGhlbWUoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogXCJ6dW5lXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5DSEFSVFRIRU1FX1pVTkUgfSxcclxuICAgICAgeyBrZXk6IFwib2NlYW5cIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkNIQVJUVEhFTUVfT0NFQU4gfSxcclxuICAgICAgeyBrZXk6IFwiY2FyYm9uXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5DSEFSVFRIRU1FX0NBUkJPTiB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIEdldEZvbGxvd2luZ0RhdGFUeXBlKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6IFwiYnVkZ2V0XCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5CVURHRVQgfSxcclxuICAgICAgeyBrZXk6IFwiZm9yZWNhc3RcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkZPUkVDQVNUIH0sXHJcbiAgICAgIC8vIHsga2V5OiAncm9sbGluZycsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIQk9BUkRfUk9MTElORyB9LFxyXG4gICAgICB7IGtleTogXCJyb2xsaW5nXCIsIHZhbDogXCJSb2xsaW5nXCIgfSxcclxuICAgIF07XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRGb3JtYXQoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogXCJudW1iZXJcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5VTUJFUiB9LFxyXG4gICAgICB7IGtleTogXCJwZXJjZW50YWdlXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5QRVJDRU5UQUdFIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICBwdWJsaWMgR2V0Q2hhcnRTdHlsZSgpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcImJhclwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uQkFSIH0sXHJcbiAgICAgIHsga2V5OiBcImxpbmVcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxJTkUgfSxcclxuICAgICAgeyBrZXk6IFwiYXJlYVwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uQVJFQSB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIEdldERhdGFUeXBlcyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcImJ1ZGdldFwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uQlVER0VUIH0sXHJcbiAgICAgIHsga2V5OiBcImFjdHVhbFwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uQUNUVUFMIH0sXHJcbiAgICAgIHsga2V5OiBcImZvcmVjYXN0XCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5GT1JFQ0FTVCB9LFxyXG4gICAgICB7IGtleTogXCJyb2xsaW5nXCIsIHZhbDogXCJSb2xsaW5nXCIgfSxcclxuICAgIF07XHJcbiAgfTtcclxuICAvKiAgICAgRnVuZCBPcGVyYXRpb24gU3VtbWFyeSAgICAgICAqL1xyXG4gIHB1YmxpYyBnZXRGdW5kRHJvcGRvd24oKSB7XHJcbiAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgdXNlcm5hbWU6IHRoaXMudXNlckluZm8udXNlcm5hbWUsXHJcbiAgICAgIGFjY291bnRJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIGludmVzdG9ySWQ6IHRoaXMudXNlckluZm8uYWNjb3VudElkLFxyXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0RnVuZExpc3RCeUludmVzdG9ySWQsIGRhdGEsIChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMuZnVuZERyb3Bkb3duTGlzdCA9IHJlcztcclxuICAgICAgICAvLyByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyogICAgIEZ1bmQgcGVyZm9ybWFuY2UgICAgICAgKi9cclxuICBwdWJsaWMgR2V0R3JvdXBpbmcoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogXCJudWxsXCIsIHZhbDogXCJcIiB9LFxyXG4gICAgICB7IGtleTogXCJpbnZlc3RvclwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uREFTSERfR1BfSU5WRVNUT1IgfSxcclxuICAgICAgeyBrZXk6IFwiZnVuZFwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uREFTSERfR1BfRlVORCB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgLyogICAgIEZ1bmQgT3BlcmF0aW9uIFN1bW1hcnkgICAgICAgKi9cclxuICBwdWJsaWMgZ2V0RnVuZERyb3Bkb3duXyhjYWxsYmFrZTogRnVuY3Rpb24pIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICB1c2VybmFtZTogdGhpcy51c2VySW5mby51c2VybmFtZSxcclxuICAgICAgYWNjb3VudElkOiB0aGlzLnVzZXJJbmZvLmFjY291bnRJZCxcclxuICAgICAgaW52ZXN0b3JJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmcsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5HZXRGdW5kTGlzdEJ5SW52ZXN0b3JJZCwgZGF0YSwgKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5mdW5kRHJvcGRvd25MaXN0ID0gcmVzO1xyXG4gICAgICAgIC8vIHRoaXMuR2V0QWxsSW52ZXN0ZWUocmVzID0+IHtcclxuICAgICAgICBjYWxsYmFrZSgpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyogICAgIEludmVzdG9yIHBvc2l0aW9uICAgICAgICovXHJcbiAgcHVibGljIEdldEFsbEludmVzdGVlKGNhbGxiYWtlOiBGdW5jdGlvbikge1xyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJJbmZvLnVzZXJuYW1lLFxyXG4gICAgICBhY2NvdW50SWQ6IHRoaXMudXNlckluZm8uYWNjb3VudElkLFxyXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0QWxsSW52ZXN0ZWUsIGRhdGEsIChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMuYWxsSW52ZXN0ZWVMaXN0ID0gcmVzO1xyXG4gICAgICAgIGNhbGxiYWtlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBwdWJsaWMgcGl2b3RUYWJsZWZvcm1hdE51bWJlcihudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyM7KCMsIyMjKVwiO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgY2FzZSA2OlxyXG4gICAgICAgIHJldHVybiBcIiMsIyMjLjA7KCMsIyMjLjApXCI7XHJcbiAgICAgIGNhc2UgNzpcclxuICAgICAgY2FzZSA4OlxyXG4gICAgICBjYXNlIDk6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMuMDA7KCMsIyMjLjAwKVwiO1xyXG4gICAgICBjYXNlIDEwOlxyXG4gICAgICBjYXNlIDExOlxyXG4gICAgICBjYXNlIDEyOlxyXG4gICAgICAgIHJldHVybiBcIiMsIyMjLCw7KCMsIyMjLCwpXCI7XHJcbiAgICAgIGNhc2UgMTM6XHJcbiAgICAgIGNhc2UgMTQ6XHJcbiAgICAgIGNhc2UgMTU6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMsLC4wOygjLCMjIywsLjApXCI7XHJcbiAgICAgIGNhc2UgMTY6XHJcbiAgICAgIGNhc2UgMTc6XHJcbiAgICAgIGNhc2UgMTg6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMsLC4wMDsoIywjIyMsLC4wMClcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIy4wMDstIywjIyMuMDBcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwaXZvdFRhYmxlZm9ybWF0SW50ZWdlcihudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyM7KCMsIyMjKVwiO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgY2FzZSA2OlxyXG4gICAgICAgIHJldHVybiBcIiMsIyMjLCw7KCMsIyMjLCwpXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyM7KCMsIyMjKVwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBpdm90VGFibGVmb3JtYXRQZXJjZW50KG51bSkge1xyXG4gICAgc3dpdGNoIChudW0pIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICByZXR1cm4gXCJQXCI7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgY2FzZSA1OlxyXG4gICAgICBjYXNlIDY6XHJcbiAgICAgICAgcmV0dXJuIFwiUDFcIjtcclxuICAgICAgY2FzZSA3OlxyXG4gICAgICBjYXNlIDg6XHJcbiAgICAgIGNhc2UgOTpcclxuICAgICAgICByZXR1cm4gXCJQMlwiO1xyXG4gICAgICBjYXNlIDEwOlxyXG4gICAgICBjYXNlIDExOlxyXG4gICAgICBjYXNlIDEyOlxyXG4gICAgICAgIHJldHVybiBcIiMsIyMjMC4wMCd4JzsoIywjIyMwLjAwJ3gnKVwiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIlAyXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGl2b3RUYWJsZWZvcm1hdFBlcmNlbnROdW0obnVtKSB7XHJcbiAgICBzd2l0Y2ggKG51bSkge1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjIyclJ1wiO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjIy4wJyUnXCI7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICByZXR1cm4gXCIjIyMjLjAwJyUnXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjIy4wMCclJ1wiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBpdm90VGFibGVmb3JtYXRNdWx0aXBsZShudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICByZXR1cm4gXCIjIyMjJ3gnXCI7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAneCdcIjtcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMDAneCdcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAwJ3gnXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9ybWF0TnVtYmVyKG51bSkge1xyXG4gICAgc3dpdGNoIChudW0pIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHJldHVybiBcIk5cIjtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHJldHVybiBcIk4xXCI7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICByZXR1cm4gXCJOMlwiO1xyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgICAgcmV0dXJuIFwiTjNcIjtcclxuICAgICAgY2FzZSA0OlxyXG4gICAgICAgIHJldHVybiBcIk40XCI7XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgICByZXR1cm4gXCJONVwiO1xyXG4gICAgICBjYXNlIDY6XHJcbiAgICAgICAgcmV0dXJuIFwiTjZcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCJOMlwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcm1hdFBlcmNlbnQobnVtKSB7XHJcbiAgICBzd2l0Y2ggKG51bSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgcmV0dXJuIFwiUFwiO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgcmV0dXJuIFwiUDFcIjtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHJldHVybiBcIlAyXCI7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICByZXR1cm4gXCJQM1wiO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgICAgcmV0dXJuIFwiUDRcIjtcclxuICAgICAgY2FzZSA1OlxyXG4gICAgICAgIHJldHVybiBcIlA1XCI7XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgICByZXR1cm4gXCJQNlwiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIlAyXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9ybWF0UGVyY2VudE51bShudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICByZXR1cm4gXCIjIyMjJyUnXCI7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAnJSdcIjtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMDAnJSdcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAwJyUnXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9ybWF0TXVsdGlwbGUobnVtKSB7XHJcbiAgICBzd2l0Y2ggKG51bSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjIyd4J1wiO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjMC4wJ3gnXCI7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAwJ3gnXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjMC4wMCd4J1wiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldEZpZ3VyZUZvcm1hdCgpIHtcclxuICAgIC8vIHJldHVybiBbXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLDIzNCw1NjdcIiwga2V5MjogXCIoMSwyMzQsNTY3KVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAxIH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLDIzNCw1NjdcIiwga2V5MjogXCIoMSwyMzQsNTY3KVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAyIH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLDIzNCw1NjcuMDBcIiwga2V5MjogXCIoMSwyMzQsNTY3LjAwKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAzIH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLDIzNCw1NjcuMDBcIiwga2V5MjogXCIoMSwyMzQsNTY3LjAwKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiA0IH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxXCIsIGtleTI6IFwiKDEpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDUgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjFcIiwga2V5MjogXCIoMSlcIiwga2V5MzogXCItXCIsIHZhbDogNiB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMS4yXCIsIGtleTI6IFwiKDEuMilcIiwga2V5MzogXCIwLjBcIiwgdmFsOiA3IH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLjJcIiwga2V5MjogXCIoMS4yKVwiLCBrZXkzOiBcIjAuMFwiLCB2YWw6IDggfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjEuMjNcIiwga2V5MjogXCIoMS4yMylcIiwga2V5MzogXCIwLjAwXCIsIHZhbDogOSB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMS4yM1wiLCBrZXkyOiBcIigxLjIzKVwiLCBrZXkzOiBcIjAuMDBcIiwgdmFsOiAxMCB9LCAvL1xyXG4gICAgLy8gXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2NzsoMSwyMzQsNTY3KTswXCIsIHZhbDogMSB9LFxyXG4gICAgICB7IGtleTogXCIxLDIzNCw1Njc7KDEsMjM0LDU2Nyk7LVwiLCB2YWw6IDIgfSxcclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3OygxLDIzNCw1NjcpO1wiLCB2YWw6IDMgfSxcclxuXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2Ny4wOygxLDIzNCw1NjcuMCk7MC4wXCIsIHZhbDogNCB9LFxyXG4gICAgICB7IGtleTogXCIxLDIzNCw1NjcuMDsoMSwyMzQsNTY3LjApOy1cIiwgdmFsOiA1IH0sXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2Ny4wOygxLDIzNCw1NjcuMCk7XCIsIHZhbDogNiB9LFxyXG5cclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3LjAwOygxLDIzNCw1NjcuMDApOzAuMDBcIiwgdmFsOiA3IH0sXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2Ny4wMDsoMSwyMzQsNTY3LjAwKTstXCIsIHZhbDogOCB9LFxyXG4gICAgICB7IGtleTogXCIxLDIzNCw1NjcuMDA7KDEsMjM0LDU2Ny4wMCk7XCIsIHZhbDogOSB9LFxyXG5cclxuICAgICAgeyBrZXk6IFwiMTsoMSk7MFwiLCB2YWw6IDEwIH0sXHJcbiAgICAgIHsga2V5OiBcIjE7KDEpOy1cIiwgdmFsOiAxMSB9LFxyXG4gICAgICB7IGtleTogXCIxOygxKTtcIiwgdmFsOiAxMiB9LFxyXG5cclxuICAgICAgeyBrZXk6IFwiMS4yOygxLjIpOzAuMFwiLCB2YWw6IDEzIH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMjsoMS4yKTstXCIsIHZhbDogMTQgfSxcclxuICAgICAgeyBrZXk6IFwiMS4yOygxLjIpO1wiLCB2YWw6IDE1IH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxLjIzOygxLjIzKTswLjAwXCIsIHZhbDogMTYgfSxcclxuICAgICAgeyBrZXk6IFwiMS4yMzsoMS4yMyk7LVwiLCB2YWw6IDE3IH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMjM7KDEuMjMpO1wiLCB2YWw6IDE4IH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIEdldEZpZ3VyZUZvcm1hdDIoKSB7XHJcbiAgLy8gXHRyZXR1cm4gW1xyXG4gIC8vIFx0XHQvLyAxMjM0NTY3XHJcbiAgLy8gXHRcdHsga2V5OiBcIjEsMjM0LDU2N1wiLCB2YWw6IDExIH0sXHJcbiAgLy8gXHRcdHsga2V5OiBcIjEsMjM0LDU2Ny4wMFwiLCB2YWw6IDEyIH0sXHJcbiAgLy8gXHRcdHsga2V5OiBcIjFcIiwgdmFsOiAxMyB9LFxyXG4gIC8vIFx0XHR7IGtleTogXCIxLjJcIiwgdmFsOiAxNCB9LFxyXG4gIC8vIFx0XHR7IGtleTogXCIxLjIzXCIsIHZhbDogMTUgfSxcclxuICAvLyBcdF07XHJcbiAgLy8gfTtcclxuXHJcbiAgcHVibGljIEdldEZpZ3VyZUZvcm1hdDMoKSB7XHJcbiAgICAvLyByZXR1cm4gW1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMSwyMzQsNTY3XCIsIGtleTI6IFwiKDEsMjM0LDU2NylcIiwga2V5MzogXCItXCIsIHZhbDogMSB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMSwyMzQsNTY3XCIsIGtleTI6IFwiKDEsMjM0LDU2NylcIiwga2V5MzogXCItXCIsIHZhbDogMiB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMVwiLCBrZXkyOiBcIigxKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAzIH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxXCIsIGtleTI6IFwiKDEpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDQgfSwgLy9cclxuICAgIC8vIFx0eyBrZXk6IFwiMVwiLCB2YWw6IDUgfSxcclxuICAgIC8vIF07XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogXCIxLDIzNCw1Njc7KDEsMjM0LDU2Nyk7MFwiLCB2YWw6IDEgfSxcclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3OygxLDIzNCw1NjcpOy1cIiwgdmFsOiAyIH0sXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2NzsoMSwyMzQsNTY3KTtcIiwgdmFsOiAzIH0sXHJcbiAgICAgIHsga2V5OiBcIjE7KDEpOzBcIiwgdmFsOiA0IH0sXHJcbiAgICAgIHsga2V5OiBcIjE7KDEpOy1cIiwgdmFsOiA1IH0sXHJcbiAgICAgIHsga2V5OiBcIjE7KDEpO1wiLCB2YWw6IDYgfSxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0UGVyY2VudEZvcm1hdHMoKSB7XHJcbiAgICAvLyByZXR1cm4gW1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMCVcIiwga2V5MjogXCIwJVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAxIH0sXHJcbiAgICAvLyBcdHsga2V5MTogXCIwJVwiLCBrZXkyOiBcIigwJSlcIiwga2V5MzogXCItXCIsIHZhbDogMiB9LFxyXG4gICAgLy8gXHR7IGtleTE6IFwiMC4wJVwiLCBrZXkyOiBcIjAuMCVcIiwga2V5MzogXCItXCIsIHZhbDogMyB9LFxyXG4gICAgLy8gXHR7IGtleTE6IFwiMC4wJVwiLCBrZXkyOiBcIigwLjAlKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiA0IH0sXHJcbiAgICAvLyBcdHsga2V5MTogXCIwLjAwJVwiLCBrZXkyOiBcIjAuMDAlXCIsIGtleTM6IFwiLVwiLCB2YWw6IDUgfSxcclxuICAgIC8vIFx0eyBrZXkxOiBcIjAuMDAlXCIsIGtleTI6IFwiKDAuMDAlKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiA2IH0sXHJcbiAgICAvLyBdO1xyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcIjElOygxJSk7MCVcIiwgdmFsOiAxIH0sXHJcbiAgICAgIHsga2V5OiBcIjElOygxJSk7LVwiLCB2YWw6IDIgfSxcclxuICAgICAgeyBrZXk6IFwiMSU7KDElKTtcIiwgdmFsOiAzIH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxLjIlOygxLjIlKTswLjAlXCIsIHZhbDogNCB9LFxyXG4gICAgICB7IGtleTogXCIxLjIlOygxLjIlKTstXCIsIHZhbDogNSB9LFxyXG4gICAgICB7IGtleTogXCIxLjIlOygxLjIlKTtcIiwgdmFsOiA2IH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxLjIzJTsoMS4yMyUpOzAuMDAlXCIsIHZhbDogNyB9LFxyXG4gICAgICB7IGtleTogXCIxLjIzJTsoMS4yMyUpOy1cIiwgdmFsOiA4IH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMjMlOygxLjIzJSk7XCIsIHZhbDogOSB9LFxyXG5cclxuICAgICAgeyBrZXk6IFwiMS4yM3g7KDEuMjN4KTswLjAweFwiLCB2YWw6IDEwIH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMjN4OygxLjIzeCk7LVwiLCB2YWw6IDExIH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMjN4OygxLjIzeCk7XCIsIHZhbDogMTIgfSxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0TXVsdGlwbGVGb3JtYXRzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6IFwiMHhcIiwgdmFsOiAxIH0sXHJcbiAgICAgIHsga2V5OiBcIjAuMHhcIiwgdmFsOiAyIH0sXHJcbiAgICAgIHsga2V5OiBcIjAuMDB4XCIsIHZhbDogMyB9LFxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRBZ2dyZWdhdGVUeXBlKGFnZ3JlZ2F0ZVR5cGUpIHtcclxuICAgIHN3aXRjaCAoYWdncmVnYXRlVHlwZSkge1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ0lcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZUlSUklSUkRhdGVcIjpcclxuICAgICAgICByZXR1cm4gXCJDSV9JUlJcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZUlSUkJlZm9yZUNhcnJpZWRcIjpcclxuICAgICAgICByZXR1cm4gXCJDSV9CRUZPUkVfQ0FSUllcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZUlSUlJlcG9ydGVkXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ0lfUkVQT1JURURcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZUlSUkFjdHVhbEF1ZGl0ZWRcIjpcclxuICAgICAgICByZXR1cm4gXCJDSV9BQ1RVQUxfQVVESVRFRFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSTVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ0lfTVREXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVJUlJRVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDSV9RVERcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZUlSUllURFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNJX1lURFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlVFdSTVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RXUl9NVERcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVRXUlFURFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNUV1JfUVREXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVUV1JZVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDVFdSX1lURFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlVkFSTVREXzk5XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1ZBUl9NVERfOTlcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVZBUlFURF85OVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNWQVJfUVREXzk5XCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVWQVJZVERfOTlcIjpcclxuICAgICAgICByZXR1cm4gXCJDVkFSX1lURF85OVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlVkFSTVREXzk1XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1ZBUl9NVERfOTVcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVZBUlFURF85NVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNWQVJfUVREXzk1XCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVWQVJZVERfOTVcIjpcclxuICAgICAgICByZXR1cm4gXCJDVkFSX1lURF85NVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlTXVsdGlwbGVcIjpcclxuICAgICAgICByZXR1cm4gXCJDTVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlUElDXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1BcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZURQSVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNEXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVUVlBJXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVJWUElcIjpcclxuICAgICAgICByZXR1cm4gXCJDUlwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlTUFjdHVhbEF1ZGl0ZWRcIjpcclxuICAgICAgICByZXR1cm4gXCJDTV9BQ1RVQUxfQVVESVRFRFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlTVJlcG9ydGVkXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ01fUkVQT1JURURcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDYWxjdWxhdGVNZXRob2QoY29sTmFtZSkge1xyXG4gICAgc3dpdGNoIChjb2xOYW1lKSB7XHJcbiAgICAgIGNhc2UgXCJDSVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZUlSUlwiO1xyXG4gICAgICBjYXNlIFwiQ0lfSVJSXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlSVJSSVJSRGF0ZVwiO1xyXG4gICAgICBjYXNlIFwiQ0lfQkVGT1JFX0NBUlJZXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlSVJSQmVmb3JlQ2FycmllZFwiO1xyXG4gICAgICBjYXNlIFwiQ0lfUkVQT1JURURcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVJUlJSZXBvcnRlZFwiO1xyXG4gICAgICBjYXNlIFwiQ0lfQUNUVUFMX0FVRElURURcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVJUlJBY3R1YWxBdWRpdGVkXCI7XHJcbiAgICAgIGNhc2UgXCJDSV9NVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVJUlJNVERcIjtcclxuICAgICAgY2FzZSBcIkNJX1FURFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZUlSUlFURFwiO1xyXG4gICAgICBjYXNlIFwiQ0lfWVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlSVJSWVREXCI7XHJcbiAgICAgIGNhc2UgXCJDVFdSX01URFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVRXUk1URFwiO1xyXG4gICAgICBjYXNlIFwiQ1RXUl9RVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVUV1JRVERcIjtcclxuICAgICAgY2FzZSBcIkNUV1JfWVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVFdSWVREXCI7XHJcbiAgICAgIGNhc2UgXCJDVkFSX01URF85OVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVZBUk1URF85OVwiO1xyXG4gICAgICBjYXNlIFwiQ1ZBUl9RVERfOTlcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVWQVJRVERfOTlcIjtcclxuICAgICAgY2FzZSBcIkNWQVJfWVREXzk5XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVkFSWVREXzk5XCI7XHJcbiAgICAgIGNhc2UgXCJDVkFSX01URF85NVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVZBUk1URF85NVwiO1xyXG4gICAgICBjYXNlIFwiQ1ZBUl9RVERfOTVcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVWQVJRVERfOTVcIjtcclxuICAgICAgY2FzZSBcIkNWQVJfWVREXzk1XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVkFSWVREXzk1XCI7XHJcbiAgICAgIGNhc2UgXCJDTVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZU11bHRpcGxlXCI7XHJcbiAgICAgIGNhc2UgXCJDUFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVBJQ1wiO1xyXG4gICAgICBjYXNlIFwiQ0RcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVEUElcIjtcclxuICAgICAgY2FzZSBcIkNUXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVFZQSVwiO1xyXG4gICAgICBjYXNlIFwiQ1JcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVSVlBJXCI7XHJcbiAgICAgIGNhc2UgXCJDTV9BQ1RVQUxfQVVESVRFRFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZU1BY3R1YWxBdWRpdGVkXCI7XHJcbiAgICAgIGNhc2UgXCJDTV9SRVBPUlRFRFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZU1SZXBvcnRlZFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5qC85byP5YyW5pWw5a2XXHJcbiAgcHVibGljIG51bWJlcl9mb3JtYXQobnVtYmVyLCBkZWNpbWFscywgZGVjX3BvaW50LCB0aG91c2FuZHNfc2VwLCByb3VuZHRhZykge1xyXG4gICAgLypcclxuICAgICAqIOWPguaVsOivtOaYju+8mlxyXG4gICAgICogbnVtYmVy77ya6KaB5qC85byP5YyW55qE5pWw5a2XXHJcbiAgICAgKiBkZWNpbWFsc++8muS/neeVmeWHoOS9jeWwj+aVsFxyXG4gICAgICogZGVjX3BvaW5077ya5bCP5pWw54K556ym5Y+3XHJcbiAgICAgKiB0aG91c2FuZHNfc2Vw77ya5Y2D5YiG5L2N56ym5Y+3XHJcbiAgICAgKiByb3VuZHRhZzroiI3lhaXlj4LmlbDvvIzpu5jorqQgXCJjZWlsXCIg5ZCR5LiK5Y+WLFwiZmxvb3JcIuWQkeS4i+WPlixcInJvdW5kXCIg5Zub6IiN5LqU5YWlXHJcbiAgICAgKiAqL1xyXG4gICAgbnVtYmVyID0gKG51bWJlciArIFwiXCIpLnJlcGxhY2UoL1teMC05Ky1FZS5dL2csIFwiXCIpO1xyXG4gICAgcm91bmR0YWcgPSByb3VuZHRhZyB8fCBcImNlaWxcIjsgLy9cImNlaWxcIixcImZsb29yXCIsXCJyb3VuZFwiXHJcbiAgICBsZXQgbiA9ICFpc0Zpbml0ZSgrbnVtYmVyKSA/IDAgOiArbnVtYmVyO1xyXG4gICAgbGV0IHByZWMgPSAhaXNGaW5pdGUoK2RlY2ltYWxzKSA/IDAgOiBNYXRoLmFicyhkZWNpbWFscyk7XHJcbiAgICBsZXQgc2VwID0gdHlwZW9mIHRob3VzYW5kc19zZXAgPT09IFwidW5kZWZpbmVkXCIgPyBcIixcIiA6IHRob3VzYW5kc19zZXA7XHJcbiAgICBsZXQgZGVjID0gdHlwZW9mIGRlY19wb2ludCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwiLlwiIDogZGVjX3BvaW50O1xyXG4gICAgLy8gbGV0ICBzID0gJyc7XHJcbiAgICBsZXQgcyA9IChcclxuICAgICAgcHJlY1xyXG4gICAgICAgID8gdGhpcy50b0ZpeGVkRml4KG4sIHByZWMsIHJvdW5kdGFnKVxyXG4gICAgICAgIDogXCJcIiArIHRoaXMucGJmLnRvZml4ZWROdW0obiwgZGVjaW1hbHMpXHJcbiAgICApLnNwbGl0KFwiLlwiKTsgLy90aGlzLnBiZi50b2ZpeGVkTnVtKE1hdGguYWJzKHZhbHVlKSwgZGVjaW1hbClcclxuICAgIHZhciByZSA9IC8oLT9cXGQrKShcXGR7M30pLztcclxuICAgIHdoaWxlIChyZS50ZXN0KHNbMF0pKSB7XHJcbiAgICAgIHNbMF0gPSBzWzBdLnJlcGxhY2UocmUsIFwiJDFcIiArIHNlcCArIFwiJDJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKChzWzFdIHx8IFwiXCIpLmxlbmd0aCA8IHByZWMpIHtcclxuICAgICAgc1sxXSA9IHNbMV0gfHwgXCJcIjtcclxuICAgICAgc1sxXSArPSBuZXcgQXJyYXkocHJlYyAtIHNbMV0ubGVuZ3RoICsgMSkuam9pbihcIjBcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy5qb2luKGRlYyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvRml4ZWRGaXgobiwgcHJlYywgcm91bmR0YWcpIHtcclxuICAgIHZhciBrID0gTWF0aC5wb3coMTAsIHByZWMpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgXCJcIiArXHJcbiAgICAgIHBhcnNlRmxvYXQoXHJcbiAgICAgICAgTWF0aFtyb3VuZHRhZ10ocGFyc2VGbG9hdCgobiAqIGspLnRvRml4ZWQocHJlYyAqIDIpKSkudG9GaXhlZChwcmVjICogMilcclxuICAgICAgKSAvXHJcbiAgICAgICAga1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRSZXN1bHRCeURhdGFUYWJsZShcclxuICAgIHBvcnRsZXQsXHJcbiAgICBpc0dldFRvdGFsID0gZmFsc2UsXHJcbiAgICBjb3B5SWQgPSBmYWxzZSxcclxuICAgIGlkOiBzdHJpbmdcclxuICApIHtcclxuICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgIGxldCBkYXRhbWFydENvZGUgPSBwb3J0bGV0LmZpZ3VyZUNvZGU7XHJcbiAgICBsZXQgaWRlbnRpZmllciA9XHJcbiAgICAgIHBvcnRsZXQuaWQgPT09IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCJcclxuICAgICAgICA/IHBvcnRsZXQubmV3SWRcclxuICAgICAgICA6IHBvcnRsZXQuaWQ7XHJcbiAgICBpZiAocG9ydGxldC5jb3B5SWQpIHtcclxuICAgICAgaWRlbnRpZmllciA9IHBvcnRsZXQuY29weUlkO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucG9ydGxldERhdGFfTmV3W2lkXVtpZGVudGlmaWVyXSkge1xyXG4gICAgICByZXN1bHQgPSBpc0dldFRvdGFsXHJcbiAgICAgICAgPyB0aGlzLnBvcnRsZXREYXRhX05ld1tpZF1baWRlbnRpZmllcl0gJiZcclxuICAgICAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W2lkXVtpZGVudGlmaWVyXS50b3RhbFxyXG4gICAgICAgIDogdGhpcy5wb3J0bGV0RGF0YV9OZXdbaWRdW2lkZW50aWZpZXJdICYmXHJcbiAgICAgICAgICB0aGlzLnBvcnRsZXREYXRhX05ld1tpZF1baWRlbnRpZmllcl0uZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IGlzR2V0VG90YWxcclxuICAgICAgICA/IHRoaXMucG9ydGxldFJlc3VsdHNfTmV3W2lkXVtkYXRhbWFydENvZGVdICYmXHJcbiAgICAgICAgICB0aGlzLnBvcnRsZXRSZXN1bHRzX05ld1tpZF1bZGF0YW1hcnRDb2RlXS50b3RhbFxyXG4gICAgICAgIDogdGhpcy5wb3J0bGV0UmVzdWx0c19OZXdbaWRdW2RhdGFtYXJ0Q29kZV0gJiZcclxuICAgICAgICAgIHRoaXMucG9ydGxldFJlc3VsdHNfTmV3W2lkXVtkYXRhbWFydENvZGVdLmRhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8gU01QMi0zNzA4IEVORFxyXG5cclxuICBwdWJsaWMgZ2V0T3JkZXJCeUNvbHVtbnNOZXcoZGF0YW1hcnRDb2RlLCBkYXNoYm9hcmQpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc291cmNlc0RhdGFbZGFzaGJvYXJkLmlkXSAmJiBkYXNoYm9hcmQpIHtcclxuICAgICAgICBjb25zdCBvdXRwdXRSZXMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VzRGF0YVtkYXNoYm9hcmQuaWRdLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04ucGFyc2UoZGFzaGJvYXJkLmNvbmZpZyk7XHJcbiAgICAgICAgICBjb25zdCBkYXRhVmlld3MgPSBjb25maWcudmlld3M7XHJcbiAgICAgICAgICBpZiAoZGFzaGJvYXJkICYmIGRhc2hib2FyZC5jb25maWcpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YU1hcnQgPSB0aGlzLnNvdXJjZXNEYXRhW2Rhc2hib2FyZC5pZF0uZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmVudGl0eVR5cGUgPT09IGRhc2hib2FyZC5lbnRpdHlUeXBlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGRhdGFNYXJ0LmZvckVhY2goKF9kYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgX2RhdGEudmlld3MuZm9yRWFjaCgodmlldykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFWaWV3cy5maW5kKChpdGVtKSA9PiBpdGVtLmRhdGFtYXJ0Vmlld0lkID09PSB2aWV3LmlkKSkge1xyXG4gICAgICAgICAgICAgICAgICB2aWV3LnRhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFJlcy5wdXNoKHRhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvbHZlKG91dHB1dFJlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8g5aSE55CGIHRoaXMuc291cmNlc0RhdGEg5rKh5pyJ5YC8XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICBhY2NvdW50SWQ6IHRoaXMudXNlckluZm8uYWNjb3VudElkLFxyXG4gICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZyxcclxuICAgICAgICAgIGRhc2hib2FyZFZlcnNpb246IDIsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldFNvdXJjZXMsIGRhdGEsIChyZXMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG91dHB1dFJlcyA9IFtdO1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlc0RhdGFbZGFzaGJvYXJkLmlkXSA9IHJlcztcclxuICAgICAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04ucGFyc2UoZGFzaGJvYXJkLmNvbmZpZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3cyA9IGNvbmZpZy52aWV3cztcclxuICAgICAgICAgICAgaWYgKGRhc2hib2FyZCAmJiBkYXNoYm9hcmQuY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0YU1hcnQgPSByZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uZW50aXR5VHlwZSA9PT0gZGFzaGJvYXJkLmVudGl0eVR5cGVcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGRhdGFNYXJ0LmZvckVhY2goKF9kYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBfZGF0YS52aWV3cy5mb3JFYWNoKCh2aWV3KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBkYXRhVmlld3MuZmluZCgoaXRlbSkgPT4gaXRlbS5kYXRhbWFydFZpZXdJZCA9PT0gdmlldy5pZClcclxuICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlldy50YWJsZXMuZm9yRWFjaCgodGFibGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFJlcy5wdXNoKHRhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlc29sdmUob3V0cHV0UmVzKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVjb21wcmVzc0FycmF5QnVmZmVyKGlucHV0OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8VWludDhBcnJheT4ge1xyXG4gICAgLy9jcmVhdGUgdGhlIHN0cmVhbVxyXG4gICAgY29uc3QgZHMgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkRlY29tcHJlc3Npb25TdHJlYW0oXCJkZWZsYXRlLXJhd1wiKTtcclxuICAgIC8vY3JlYXRlIHRoZSB3cml0ZXJcclxuICAgIGNvbnN0IHdyaXRlciA9IGRzLndyaXRhYmxlLmdldFdyaXRlcigpO1xyXG4gICAgLy93cml0ZSB0aGUgYnVmZmVyIHRvIHRoZSB3cml0ZXIgdGh1cyBkZWNvbXByZXNzaW5nIGl0XHJcbiAgICB3cml0ZXIud3JpdGUoaW5wdXQpO1xyXG4gICAgd3JpdGVyLmNsb3NlKCk7XHJcbiAgICAvL2NyZWF0ZSB0aGUgb3V0cHV0XHJcbiAgICBjb25zdCBvdXRwdXQ6IFVpbnQ4QXJyYXlbXSA9IFtdO1xyXG4gICAgLy9jcmVhdGUgdGhlIHJlYWRlclxyXG4gICAgY29uc3QgcmVhZGVyID0gZHMucmVhZGFibGUuZ2V0UmVhZGVyKCk7XHJcbiAgICBsZXQgdG90YWxTaXplID0gMDtcclxuICAgIC8vZ28gdGhyb3VnaCBlYWNoIGNodW5rIGFuZCBhZGQgaXQgdG8gdGhlIG91dHB1dFxyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcclxuICAgICAgaWYgKGRvbmUpIGJyZWFrO1xyXG4gICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XHJcbiAgICAgIHRvdGFsU2l6ZSArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29uY2F0ZW5hdGVkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcclxuICAgIGxldCBvZmZzZXQgPSAwO1xyXG4gICAgLy9maW5hbGx5IGJ1aWxkIHRoZSBjb21wcmVzc2VkIGFycmF5IGFuZCByZXR1cm4gaXRcclxuICAgIGZvciAoY29uc3QgYXJyYXkgb2Ygb3V0cHV0KSB7XHJcbiAgICAgIGNvbmNhdGVuYXRlZC5zZXQoYXJyYXksIG9mZnNldCk7XHJcbiAgICAgIG9mZnNldCArPSBhcnJheS5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmNhdGVuYXRlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRmllbGRzKGl0ZW0sIGRhc2hib2FyZCk6IFByb21pc2U8YW55W10+IHtcclxuICAgIGNvbnN0IGxhbmcgPSB0aGlzLnBiZi5nZXRMYW5ndWFnZVBhcmFtcygpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgZGF0YU1hcnRDb2RlID0gaXRlbS5maWd1cmVDb2RlO1xyXG4gICAgICBjb25zdCBkYXRhT2JqID0ge1xyXG4gICAgICAgIGxhbmd1YWdlOiBsYW5nLFxyXG4gICAgICAgIGRhdGFNYXJ0Q29kZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5zZXRTY2hlbWFQYXJhbXMoZGF0YU9iaiwgZGF0YU1hcnRDb2RlLCBkYXNoYm9hcmQpO1xyXG4gICAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldFNjaGVtYSwgZGF0YU9iaiwgKHJlcykgPT4ge1xyXG4gICAgICAgIHJlc29sdmUocmVzKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTY2hlbWFQYXJhbXMoZGF0YU9iaiwgZmlndXJlQ29kZSwgZGFzaGJvYXJkKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja0lzUTJRKGRhc2hib2FyZC5kYXRhTWFydFRhYmxlcykpIHtcclxuICAgICAgZGF0YU9ialtcImZyb21EYXRlXCJdID0gZGFzaGJvYXJkLmZyb21EYXRlO1xyXG4gICAgICBkYXRhT2JqW1wiYXNPZkRhdGVcIl0gPSBkYXNoYm9hcmQuYXNPZkRhdGU7XHJcbiAgICB9IGVsc2UgaWYgKGZpZ3VyZUNvZGUuaW5kZXhPZihcIkZpbmFuY2lhbEZpZ3VyZVwiKSAhPT0gLTEpIHtcclxuICAgICAgZGF0YU9ialtcImVudGl0eVR5cGVcIl0gPSBkYXNoYm9hcmQuZW50aXR5TGlzdC5tYXAoXHJcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0ubGlua2VkVHlwZVxyXG4gICAgICApO1xyXG4gICAgICBkYXRhT2JqW1wiZnJvbURhdGVcIl0gPSBkYXNoYm9hcmQuZnJvbURhdGUgfHwgXCJcIjtcclxuICAgICAgZGF0YU9ialtcImFzT2ZEYXRlXCJdID0gZGFzaGJvYXJkLmFzT2ZEYXRlO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICBkYXNoYm9hcmQgJiZcclxuICAgICAgKGZpZ3VyZUNvZGUgPT09IFwiRnVuZE9wZXJhdGlvbnNcIiB8fFxyXG4gICAgICAgIGZpZ3VyZUNvZGUgPT09IFwiRnVuZE9wZXJhdGlvblRhYmxlU2VxdW9pYVwiIHx8XHJcbiAgICAgICAgZmlndXJlQ29kZS5pbmRleE9mKFwiRmluYW5jaWFsRmlndXJlXCIpICE9PSAtMSlcclxuICAgICkge1xyXG4gICAgICBkYXRhT2JqW1wiZW50aXR5SWRzXCJdID0gZGFzaGJvYXJkLmVudGl0eUxpc3QubWFwKFxyXG4gICAgICAgIChpdGVtKSA9PiBpdGVtLmxpbmtlZEd1aWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreaYr+WQpuWPr+mAieW8gOWni+aXpeacn1xyXG4gIHB1YmxpYyBjaGVja0hhc0Zyb21EYXRlKGRhdGFNYXJ0KSB7XHJcbiAgICBjb25zdCBoYXMgPSBkYXRhTWFydC5maW5kKFxyXG4gICAgICAoaXRlbSkgPT5cclxuICAgICAgICAhaXRlbS5pc0hpZGUgJiYgaXRlbS5kYXRhbWFydENvZGUgPT09IFwiRnVuZE9wZXJhdGlvblRhYmxlU2VxdW9pYVwiXHJcbiAgICApO1xyXG4gICAgcmV0dXJuICEhaGFzO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5patUTJR77yM5o6n5Yi26aG26YOo5pel5pyf6YCJ5oup57G75Z6LXHJcbiAgcHVibGljIGNoZWNrSXNRMlEoZGF0YU1hcnQpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IFEyUVBhdGNoTGlzdCA9IFtcclxuICAgICAgXCJTZWVUaHJvdWdoSGlzUG9zaXRpb25cIixcclxuICAgICAgXCJTZWVUaHJvdWdoSGlzUG9zaXRpb25CeUludmVzdG9yXCIsXHJcbiAgICBdO1xyXG4gICAgY29uc3QgaGFzID0gZGF0YU1hcnQuZmluZCgoaXQpID0+IHtcclxuICAgICAgcmV0dXJuICFpdC5pc0hpZGUgJiYgUTJRUGF0Y2hMaXN0LmluY2x1ZGVzKGl0LmRhdGFtYXJ0Q29kZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAhIWhhcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOS9v+eUqOiHquWumuS5ieS/neWtmOeahOWIl+aVsOaNru+8jOimhueblumAmueUqOWIl+mFjee9ruaVsOaNrlxyXG4gICAqIEBwYXJhbSBhbGxGaWVsZHMg6Ieq5a6a5LmJ5pWw5o2uXHJcbiAgICogQHBhcmFtIGZpZWxkcyDpgJrnlKjliJfphY3nva7mlbDmja5cclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRDb25maWdGaWVsZHMoYWxsRmllbGRzLCBmaWVsZHMpIHtcclxuICAgIGFsbEZpZWxkcy5mb3JFYWNoKChfZmllbGQpID0+IHtcclxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKF9maWVsZC5jb2xOYW1lID09PSBmaWVsZC5jb2xOYW1lKSB7XHJcbiAgICAgICAgICBfZmllbGQuaXNIaWRkZW4gPSBmaWVsZC5pc0hpZGRlbjtcclxuICAgICAgICAgIF9maWVsZC52aXNpYmxlID0gZmllbGQudmlzaWJsZTtcclxuICAgICAgICAgIF9maWVsZC5mb3JtYXQgPSBmaWVsZC5mb3JtYXQ7XHJcbiAgICAgICAgICBfZmllbGQuZm9ybXVsYSA9IGZpZWxkLmZvcm11bGE7XHJcbiAgICAgICAgICBpZiAoZmllbGQuc2hvd0dyYW5kVG90YWxzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgX2ZpZWxkLnNob3dHcmFuZFRvdGFscyA9IGZpZWxkLnNob3dHcmFuZFRvdGFscztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmaWVsZC5zaG93U3ViVG90YWxzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgX2ZpZWxkLnNob3dTdWJUb3RhbHMgPSBmaWVsZC5zaG93U3ViVG90YWxzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICBpZiAoZmllbGQuaXNDYWxjdWxhdGVkRmllbGQpIHtcclxuICAgICAgICBhbGxGaWVsZHMucHVzaChmaWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgZmllbGRzTmFtZSA9IFtdO1xyXG4gICAgY29uc3Qgb3V0cHV0RmllbGRzID0gW107XHJcbiAgICBhbGxGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgLy8gcTJx5b2T5LitbGFuZ0NvZGXlvojlpJrnm7jlkIzvvIzljrvph43opoHlpJrliKTmlq3kuIDkuIthZGR0aW9uTmFtZVxyXG4gICAgICAvLyBpZiAoIWZpZWxkc05hbWUuaW5jbHVkZXMoZmllbGQubGFuZ0NvZGUpIHx8ICEhZmllbGQuYWRkdGlvbk5hbWUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICFmaWVsZHNOYW1lLmluY2x1ZGVzKGZpZWxkLmxhbmdDb2RlKSAmJlxyXG4gICAgICAgICFmaWVsZHNOYW1lLmluY2x1ZGVzKGZpZWxkLmxhbmdWYWx1ZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5sYW5nQ29kZSB8fCBmaWVsZC5sYW5nVmFsdWU7XHJcbiAgICAgICAgZmllbGRzTmFtZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICBvdXRwdXRGaWVsZHMucHVzaChmaWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG91dHB1dEZpZWxkcy5zb3J0KChhLCBiKSA9PiAoYS5zZXEgPj0gYi5zZXEgPyAxIDogLTEpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREYXRhQnlQb3J0bGV0c05ldyhcclxuICAgIHBvcnRsZXRzLFxyXG4gICAgY2FsbGJhY2ssXHJcbiAgICBwYWdlU2V0dGluZz8sXHJcbiAgICBpc1JlZnJlc2ggPSBmYWxzZSxcclxuICAgIGRhc2hib2FyZD86IGFueSxcclxuICAgIHJvR2V0ID0gZmFsc2VcclxuICApIHtcclxuICAgIGxldCBsZW5ndGggPSAwO1xyXG4gICAgaWYgKHBvcnRsZXRzICYmIHBvcnRsZXRzLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBwb3J0bGV0IG9mIHBvcnRsZXRzKSB7XHJcbiAgICAgICAgbGV0IGlkID1cclxuICAgICAgICAgIHBvcnRsZXQuaWQgPT09IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCJcclxuICAgICAgICAgICAgPyBwb3J0bGV0Lm5ld0lkXHJcbiAgICAgICAgICAgIDogcG9ydGxldC5pZDtcclxuICAgICAgICBjb25zdCBhbGxGaWVsZHMgPSBhd2FpdCB0aGlzLmdldEFsbEZpZWxkcyhwb3J0bGV0LCBkYXNoYm9hcmQpO1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtc0J5UG9ydGxldChcclxuICAgICAgICAgIHBvcnRsZXQsXHJcbiAgICAgICAgICBwYWdlU2V0dGluZyxcclxuICAgICAgICAgIGFsbEZpZWxkcyxcclxuICAgICAgICAgIGRhc2hib2FyZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IGluaXRGaWVsZHNBcnI7XHJcbiAgICAgICAgbGV0IGN1ckZpZWxkc0FycjtcclxuICAgICAgICBpZiAoIXBhcmFtcy5pc1RhYmxlICYmICFyb0dldCkge1xyXG4gICAgICAgICAgLy8g6LWL5YC8cG9ydGxldEZpZWxkc19UZW1wXHJcbiAgICAgICAgICBpbml0RmllbGRzQXJyID0gdGhpcy5wb3J0bGV0RmllbGRzX1RlbXBbaWRdO1xyXG4gICAgICAgICAgY3VyRmllbGRzQXJyID0gcGFyYW1zLmRpc3BsYXlDb2x1bW5GaWx0ZXIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhaW5pdEZpZWxkc0FyciB8fFxyXG4gICAgICAgICAgICB0aGlzLm5lZWRHZXRQb3J0bGV0RGF0YShpbml0RmllbGRzQXJyLCBjdXJGaWVsZHNBcnIpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5wb3J0bGV0RmllbGRzX1RlbXBbaWRdID0gY3VyRmllbGRzQXJyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgIGlmIChwb3J0bGV0cy5sZW5ndGggPT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHBvcnRsZXQuY29uZmlnICYmIEpTT04ucGFyc2UocG9ydGxldC5jb25maWcpO1xyXG4gICAgICAgIGlmIChjb25maWcuZmlsdGVyU2V0dGluZ3MgJiYgY29uZmlnLmZpbHRlclNldHRpbmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKCFwYXJhbXMuY29sdW1uRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbmZpZy5maWx0ZXJTZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb25maWcucG9ydGxldFR5cGUgPT09IFwicGl2b3RcIikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBfZmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoXHJcbiAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uY29sTmFtZSA9PT0gc2V0dGluZy5uYW1lXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IFR5cGUgPSBfZmllbGQgJiYgX2ZpZWxkLmRhdGFUeXBlO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5pdGVtcykge1xyXG4gICAgICAgICAgICAgIHNldHRpbmcuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgRmllbGQ6IHNldHRpbmcubmFtZSxcclxuICAgICAgICAgICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgICAgICAgICAgVHlwZSxcclxuICAgICAgICAgICAgICAgICAgVmFsdWU6XHJcbiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgID8gbW9tZW50KGl0ZW0pLmZvcm1hdChcInl5eXktTU0tRERcIilcclxuICAgICAgICAgICAgICAgICAgICAgIDogVHlwZSA9PT0gXCJkYXRldGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChpdGVtKS5mb3JtYXQoXCJ5eXl5LU1NLUREIGhoOm1tOnNzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nLm9wZXJhdG9yKSB7XHJcbiAgICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlci5wdXNoKHtcclxuICAgICAgICAgICAgICAgIEZpZWxkOiBzZXR0aW5nLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgICAgICAgIFR5cGU6IHNldHRpbmcudHlwZSxcclxuICAgICAgICAgICAgICAgIFZhbHVlOlxyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5nLnR5cGUgPT09IFwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPyBtb21lbnQoc2V0dGluZy52YWx1ZSkuZm9ybWF0KFwieXl5eS1NTS1ERFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIDogc2V0dGluZy50eXBlID09PSBcImRhdGV0aW1lXCJcclxuICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChzZXR0aW5nLnZhbHVlKS5mb3JtYXQoXCJ5eXl5LU1NLUREIGhoOm1tOnNzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5nLnZhbHVlLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmFtcy5jb2x1bW5GaWx0ZXIgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IHBhcmFtcy5jb2x1bW5GaWx0ZXIuZmlsdGVyKFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5GaWVsZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGpzb24gYnVmZmVyXHJcbiAgICAgICAgcGFyYW1zW1wiZGFzaGJvYXJkVmVyc2lvblwiXSA9IDI7XHJcbiAgICAgICAgdGhpcy5odHRwQ2xpZW50XHJcbiAgICAgICAgICAucG9zdChcclxuICAgICAgICAgICAgdGhpcy5hcGkuYmFzZXVybCArIHRoaXMuYXBpLnVybExpc3QuR2V0UG9ydGxldERhdGFPckNyZWF0ZSxcclxuICAgICAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXJgLFxyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W2Rhc2hib2FyZC5pZF1baWRdID0ge1xyXG4gICAgICAgICAgICAgICAgICB0b3RhbDogMCxcclxuICAgICAgICAgICAgICAgICAgZGF0YTogW10sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkRhc2hib2FyZFNlcnZpY2UucmVmcmVzaEdhZGdldC5uZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdJZDogaWQsXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5yZWZyZXNoR2FkZ2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0lkOiBpZCxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocG9ydGxldHMubGVuZ3RoID09PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5zdGFydFJlZnJlc2gubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiZGF0YVwiXS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW0uU2VjdG9yID0gdGhpcy50cmFuc2xhdGlvbltpdGVtLlNlY3Rvcl0gfHwgaXRlbS5TZWN0b3I7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W2Rhc2hib2FyZC5pZF1baWRdID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkRhc2hib2FyZFNlcnZpY2UucmVmcmVzaEdhZGdldC5uZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdJZDogaWQsXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9ydGxldHMubGVuZ3RoID09PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5zdGFydFJlZnJlc2gubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucG9ydGxldEZpZWxkc19UZW1wW2lkXSA9IGluaXRGaWVsZHNBcnI7XHJcbiAgICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgaWYgKHBvcnRsZXRzLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKCkgPT4ge31cclxuICAgICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJGaWVsZHNPYmoocG9ydGxldCkge1xyXG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0aGlzLmFsbEZpZWxkc09iaiwgcG9ydGxldC5pZCk7XHJcbiAgfVxyXG5cclxuICAvLyDmoLnmja5wb3J0bGV0IOino+aekHBhcmFtc1xyXG4gIHB1YmxpYyBnZXRQYXJhbXNCeVBvcnRsZXQoXHJcbiAgICBwb3J0bGV0LFxyXG4gICAgcGFnZVNldHRpbmc/LFxyXG4gICAgYWxsRmllbGRzPzogYW55W10sXHJcbiAgICBkYXNoYm9hcmQ/OiBhbnlcclxuICApIHtcclxuICAgIGxldCBkYXNoYm9hcmREYXRhVGFibGVJZCA9IHBvcnRsZXQuZGFzaGJvYXJkRGF0YVRhYmxlSWQ7XHJcbiAgICAvL1NNUDItNzczMSBnZXQgdGhlIGRhc2hib2FyZERhdGFUYWJsZWlkIGZyb20gZGF0YU1hcnRUYWJsZXMgYXJyYXJ5XHJcbiAgICBsZXQgY3VyRGF0YU1hcnQgPSB0aGlzLmRhdGFNYXJ0VGFibGVzW2Rhc2hib2FyZC5pZF0uZmluZChcclxuICAgICAgKGQpID0+IGQuZGF0YW1hcnRDb2RlID09PSBwb3J0bGV0LmZpZ3VyZUNvZGVcclxuICAgICk7XHJcbiAgICBpZiAoY3VyRGF0YU1hcnQpIHtcclxuICAgICAgZGFzaGJvYXJkRGF0YVRhYmxlSWQgPSBjdXJEYXRhTWFydC5pZDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29uZmlnID0gcG9ydGxldC5jb25maWcgJiYgSlNPTi5wYXJzZShwb3J0bGV0LmNvbmZpZyk7XHJcbiAgICBpZiAocG9ydGxldC5pZCAhPT0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIikge1xyXG4gICAgICB0aGlzLmFsbEZpZWxkc09ialtwb3J0bGV0LmlkXSA9IGFsbEZpZWxkcztcclxuICAgIH1cclxuICAgIGxldCBmaWVsZHMgPSBhbGxGaWVsZHNcclxuICAgICAgPyB0aGlzLnNldENvbmZpZ0ZpZWxkcyhhbGxGaWVsZHMsIGNvbmZpZy5maWVsZHMpXHJcbiAgICAgIDogY29uZmlnLmZpZWxkcztcclxuICAgIGlmIChhbGxGaWVsZHMpIHtcclxuICAgICAgY29uZmlnLmZpZWxkcyA9IGZpZWxkcztcclxuICAgICAgcG9ydGxldC5jb25maWcgPSBKU09OLnN0cmluZ2lmeShjb25maWcpO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhbGN1bGF0ZWRGaWVsZHMgPSBjb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3M7XHJcbiAgICBsZXQgbmVlZEZpZWxkcyA9IFtdO1xyXG4gICAgbGV0IHBhcmFtczogYW55ID0ge307XHJcbiAgICBjb25zdCBwb3J0bGV0VHlwZSA9XHJcbiAgICAgIGNvbmZpZy5wb3J0bGV0VHlwZSA9PT0gXCJoaXN0b3JpY2FsSVJSXCJcclxuICAgICAgICA/IGNvbmZpZy5zZWxlY3RlZFZpc3VhbFR5cGVcclxuICAgICAgICA6IGNvbmZpZy5wb3J0bGV0VHlwZTtcclxuICAgIGlmIChwb3J0bGV0VHlwZSA9PT0gXCJ0YWJsZVwiKSB7XHJcbiAgICAgIGZpZWxkcyAmJlxyXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgICBuZWVkRmllbGRzLnB1c2goeC5jb2xOYW1lKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIHBhcmFtcy5zdGFydEluZGV4ID0gMDtcclxuICAgICAgcGFyYW1zLnBhZ2VTaXplID0gMTA7XHJcbiAgICAgIGlmIChwYWdlU2V0dGluZyAmJiBwYWdlU2V0dGluZy5jdXJyZW50UGFnZSkge1xyXG4gICAgICAgIHBhcmFtcy5zdGFydEluZGV4ID1cclxuICAgICAgICAgIChwYWdlU2V0dGluZy5jdXJyZW50UGFnZSAtIDEpICogcGFnZVNldHRpbmcucGFnZVNpemU7XHJcbiAgICAgICAgcGFyYW1zLnBhZ2VTaXplID0gcGFnZVNldHRpbmcucGFnZVNpemU7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSE55CGIHNvcnRcclxuICAgICAgaWYgKHBhZ2VTZXR0aW5nICYmIHBhZ2VTZXR0aW5nLnNvcnRlZENvbHVtbikge1xyXG4gICAgICAgIHBhcmFtcy5zb3J0ZWRDb2x1bW4gPSBwYWdlU2V0dGluZy5zb3J0ZWRDb2x1bW47XHJcbiAgICAgICAgcGFyYW1zLnNvcnQgPSBwYWdlU2V0dGluZy5zb3J0O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWkhOeQhiBmaWx0ZXJcclxuICAgICAgaWYgKGNvbmZpZy5maWx0ZXJTZXR0aW5ncy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgZmlsdGVyU2V0dGluZ3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmZpZy5maWx0ZXJTZXR0aW5ncykpO1xyXG4gICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIgPSBmaWx0ZXJTZXR0aW5ncy5tYXAoKHgpID0+IHtcclxuICAgICAgICAgIGlmICh4LnR5cGUgPT09IFwiZGF0ZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh4LnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XHJcbiAgICAgICAgICAgIHgudmFsdWUgPSBmb3JtYXR0ZWREYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zLmlzVGFibGUgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChwb3J0bGV0VHlwZSA9PT0gXCJ0cmFuc3Bvc2VcIikge1xyXG4gICAgICBmaWVsZHMgJiZcclxuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF4LmlzSGlkZGVuKSB7XHJcbiAgICAgICAgICAgIG5lZWRGaWVsZHMucHVzaCh4LmNvbE5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgW1wibmV3Y29sdW1uXCIsIFwibmV3bGluZVwiLCBcIm5ld2NvbHVtbmxpbmVcIl0uaW5jbHVkZXMocG9ydGxldFR5cGUpXHJcbiAgICApIHtcclxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3RlZFkgJiYgY29uZmlnLnNlbGVjdGVkWS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uZmlnLnNlbGVjdGVkWS5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICBuZWVkRmllbGRzLnB1c2goZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3RlZFNlY29uZFkgJiYgY29uZmlnLnNlbGVjdGVkU2Vjb25kWS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uZmlnLnNlbGVjdGVkU2Vjb25kWS5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICBuZWVkRmllbGRzLnB1c2goZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWkhOeQhiBmaWx0ZXJzXHJcbiAgICAgIGxldCBmaWx0ZXJzID0gY29uZmlnLmZpbHRlcnM7XHJcbiAgICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBmaWx0ZXJzKSB7XHJcbiAgICAgICAgICBuZWVkRmllbGRzLnB1c2goaXRlbS5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOWkhOeQhiB2YWx1ZXNcclxuICAgICAgbGV0IHNlcmllcyA9IGNvbmZpZy55YXhpcy5zZXJpZXM7XHJcbiAgICAgIGlmIChzZXJpZXMgJiYgc2VyaWVzLmxlbmd0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2Ygc2VyaWVzKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZUlSUlwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlSVJSTVREXCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVJUlJRVERcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZUlSUllURFwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlVFdSTVREXCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVUV1JRVERcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZVRXUllURFwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlVkFSTVREXzk5XCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVWQVJRVERfOTlcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZVZBUllURF85OVwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlVkFSTVREXzk1XCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVWQVJRVERfOTVcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZVZBUllURF85NVwiLFxyXG4gICAgICAgICAgICBdLmluY2x1ZGVzKGl0ZW0uY2FsTWV0aG9kKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG5lZWRGaWVsZHMucHVzaChcIklSUkFtb3VudFwiLCBcIklSUkRhdGVcIiwgXCJJUlJBZGpWYWx1ZVwiKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5jYWxNZXRob2QgPT09IFwiQ2FsY3VsYXRlSVJSQmVmb3JlQ2FycmllZFwiKSB7XHJcbiAgICAgICAgICAgIG5lZWRGaWVsZHMucHVzaChcIklSUkFtb3VudFwiLCBcIklSUkRhdGVcIiwgXCJJUlJBZGpWYWx1ZUJlZm9yZUNhcnJ5XCIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmNhbE1ldGhvZCA9PT0gXCJDYWxjdWxhdGVJUlJJUlJEYXRlXCIpIHtcclxuICAgICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKFwiSVJSQW1vdW50XCIsIFwiQ2FsY3VsYXRlSVJSRGF0ZVwiLCBcIklSUkFkalZhbHVlXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmNhbE1ldGhvZCA9PT0gXCJDYWxjdWxhdGVJUlJBY3R1YWxBdWRpdGVkXCIpIHtcclxuICAgICAgICAgICAgcG9ydGxldC5maWd1cmVDb2RlID09PSBcIkdyb3NzTmV0XCIgfHxcclxuICAgICAgICAgICAgcG9ydGxldC5maWd1cmVDb2RlID09PSBcIkNvbWJpbmVkSW52ZXN0bWVudEZ1bmROQ29tcGFueUNhc2hmbG93XCJcclxuICAgICAgICAgICAgICA/IG5lZWRGaWVsZHMucHVzaChcIklSUkFtb3VudFwiLCBcIklSUkRhdGVcIiwgXCJBY3R1YWxBdWRpdGVkTkFWXCIpXHJcbiAgICAgICAgICAgICAgOiBuZWVkRmllbGRzLnB1c2goXCJJUlJBbW91bnRcIiwgXCJJUlJEYXRlXCIsIFwiSVJSQWRqVmFsdWVcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uY2FsTWV0aG9kID09PSBcIkNhbGN1bGF0ZUlSUlJlcG9ydGVkXCIpIHtcclxuICAgICAgICAgICAgcG9ydGxldC5maWd1cmVDb2RlID09PSBcIkdyb3NzTmV0XCIgfHxcclxuICAgICAgICAgICAgcG9ydGxldC5maWd1cmVDb2RlID09PSBcIkNvbWJpbmVkSW52ZXN0bWVudEZ1bmROQ29tcGFueUNhc2hmbG93XCJcclxuICAgICAgICAgICAgICA/IG5lZWRGaWVsZHMucHVzaChcIklSUkFtb3VudFwiLCBcIklSUkRhdGVcIiwgXCJSZXBvcnRlZE5BVlwiKVxyXG4gICAgICAgICAgICAgIDogbmVlZEZpZWxkcy5wdXNoKFwiSVJSQW1vdW50XCIsIFwiSVJSRGF0ZVwiLCBcIklSUkFkalZhbHVlXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmNhbE1ldGhvZCA9PT0gXCJDYWxjdWxhdGVkRmllbGRcIikge1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNvbE5hbWUgPSB0aGlzLmdldEFnZ3JlZ2F0ZVR5cGUoaXRlbS5jYWxNZXRob2QpO1xyXG4gICAgICAgICAgICBpZiAoY29sTmFtZSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJGaWVsZCA9IGZpZWxkcy5maW5kKChmKSA9PiBmLmNvbE5hbWUgPT09IGNvbE5hbWUpO1xyXG4gICAgICAgICAgICAgIGlmIChjdXJGaWVsZCAmJiBjdXJGaWVsZC5mb3JtdWxhKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZnMgPSBjdXJGaWVsZC5mb3JtdWxhLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgICAgICAgIGZzICYmIGZzLm1hcCgoZikgPT4gbmVlZEZpZWxkcy5wdXNoKGYpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKGl0ZW0uY29sTmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSE55CGIHJvd3NcclxuICAgICAgbGV0IGdyb3VwcyA9IGNvbmZpZy54YXhpcy5ncm91cHM7XHJcbiAgICAgIGlmIChncm91cHMgJiYgZ3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGdpdGVtIG9mIGdyb3Vwcykge1xyXG4gICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKGdpdGVtLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpITnkIYgY29sdW5tc1xyXG4gICAgICBsZXQgY29sdW1uR3JvdXAgPSBjb25maWcuY29sdW1uR3JvdXA7XHJcbiAgICAgIGlmIChjb2x1bW5Hcm91cCAmJiBjb2x1bW5Hcm91cC5sZW5ndGgpIHtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGNvbHVtbkdyb3VwKSB7XHJcbiAgICAgICAgICBuZWVkRmllbGRzLnB1c2goaXRlbS5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSE55CGIGNhbGN1bGF0ZWRGaWVsZFxyXG4gICAgICBpZiAoY2FsY3VsYXRlZEZpZWxkcyAmJiBjYWxjdWxhdGVkRmllbGRzLmxlbmd0aCkge1xyXG4gICAgICAgIGNhbGN1bGF0ZWRGaWVsZHMubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc3RyaW5nID0gZi5mb3JtdWxhO1xyXG4gICAgICAgICAgY29uc3QgcmVnZXggPSAvXFwoKC4qPylcXCkvZztcclxuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBzdHJpbmdcclxuICAgICAgICAgICAgLm1hdGNoKHJlZ2V4KVxyXG4gICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2guc2xpY2UoMSwgLTEpKTtcclxuICAgICAgICAgIG5lZWRGaWVsZHMucHVzaCguLi5tYXRjaGVzKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyDlpITnkIYgb3JkZXJCeUNvbHVtbnNcclxuICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkQ29uZmlnICYmIHRoaXMuZGFzaGJvYXJkQ29uZmlnW2Rhc2hib2FyZC5pZF0pIHtcclxuICAgICAgICBwYXJhbXMuZGF0YW1hcnRWaWV3SWQgPVxyXG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRDb25maWdbZGFzaGJvYXJkLmlkXS5kYXRhbWFydFZpZXdJZDtcclxuICAgICAgICBwYXJhbXMuZGF0YW1hcnRJZCA9IHRoaXMuZGFzaGJvYXJkQ29uZmlnW2Rhc2hib2FyZC5pZF0uZGF0YW1hcnRJZDtcclxuICAgICAgICBwYXJhbXMuZGF0YW1hcnRDb2RlID0gcG9ydGxldC5maWd1cmVDb2RlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWkhOeQhmNvbmZpZy5maWVsZHPph4znmoRzb3J0Q29sdW1uXHJcbiAgICAgIGxldCBmaWVsZFNvcnRDb2x1bW5zID0gW107XHJcbiAgICAgIGZpZWxkcy5tYXAoKHgpID0+IHtcclxuICAgICAgICBpZiAoeC5zb3J0Q29sdW1uICYmICFmaWVsZFNvcnRDb2x1bW5zLmluY2x1ZGVzKHguc29ydENvbHVtbikpIHtcclxuICAgICAgICAgIGZpZWxkU29ydENvbHVtbnMucHVzaCh4LnNvcnRDb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmaWVsZFNvcnRDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgIG5lZWRGaWVsZHMucHVzaCguLi5maWVsZFNvcnRDb2x1bW5zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5lZWRGaWVsZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQobmVlZEZpZWxkcykpO1xyXG4gICAgLy8g5Y676Zmk6Z2e5rOV5a2X5q61XHJcbiAgICBsZXQgbGVnYWxGaWVsZHMgPSBmaWVsZHMubWFwKCh4KSA9PiB4LmNvbE5hbWUpO1xyXG4gICAgbmVlZEZpZWxkcy5tYXAoKHgsIGkpID0+IHtcclxuICAgICAgaWYgKCFsZWdhbEZpZWxkcy5pbmNsdWRlcyh4KSkge1xyXG4gICAgICAgIG5lZWRGaWVsZHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChuZWVkRmllbGRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBpZiAobGVnYWxGaWVsZHNbMF0pIHtcclxuICAgICAgICBuZWVkRmllbGRzLnB1c2gobGVnYWxGaWVsZHNbMF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyDpu5jorqTojrflj5ZTZXHlrZfmrrUgU01QMi00NTgyIEFHSUMgLSBEYXNoYm9hcmQgaXRlbSBzZXF1ZW5jZVxyXG4gICAgbmVlZEZpZWxkcy5wdXNoKFwiU2VxXCIpO1xyXG5cclxuICAgIC8vIFwibmV3Y29sdW1uXCIsIFwibmV3bGluZVwiLCBcIm5ld2NvbHVtbmxpbmVcIiDlpoLmnpzmmK/ov5nkuInnp43nsbvlnovpu5jorqTliqAgT3BlcmF0aW9uRGF0ZSDlrZfmrrVcclxuICAgIGlmIChbXCJuZXdjb2x1bW5cIiwgXCJuZXdsaW5lXCIsIFwibmV3Y29sdW1ubGluZVwiXS5pbmNsdWRlcyhwb3J0bGV0VHlwZSkpIHtcclxuICAgICAgbmVlZEZpZWxkcy5wdXNoKGNvbmZpZy5zZWxlY3RlZFgpO1xyXG4gICAgICBwYXJhbXNbXCJJc09ubHlTaG93RGlzcGxheUNvbHVtXCJdID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChjb25maWcucG9ydGxldFR5cGUgPT09IFwiaGlzdG9yaWNhbElSUlwiKSB7XHJcbiAgICAgIGlmICghcGFyYW1zLmNvbHVtbkZpbHRlcikge1xyXG4gICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXMuY29sdW1uRmlsdGVyLnB1c2goXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgRmllbGQ6IFwiRnJlcXVlbmN5c1wiLFxyXG4gICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgIFR5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICBWYWx1ZTogY29uZmlnLnNlbGVjdGVkTXVsdGlwbGVzLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgRmllbGQ6IFwiSW52ZXN0b3JUeXBlXCIsXHJcbiAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgVHlwZTogXCJzdHJpbmdcIixcclxuICAgICAgICAgIFZhbHVlOiBjb25maWcuc2VsZWN0ZWRJbnZlc3RvcixcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwYXJhbXMuZGFzaGJvYXJkRGF0YVRhYmxlSWQgPSBkYXNoYm9hcmREYXRhVGFibGVJZDtcclxuICAgIHBhcmFtcy5kaXNwbGF5Q29sdW1uRmlsdGVyID0gbmVlZEZpZWxkcy5qb2luKFwiLFwiKTtcclxuICAgIHBhcmFtcy5yZXNwb25zZVR5cGUgPSBcImpzb25cIjtcclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvLyDmmK/lkKbpnIDopoHph43mlrDlj5Hotbfor7fmsYJcclxuICBwdWJsaWMgbmVlZEdldFBvcnRsZXREYXRhKG9yaWdpbiA9IFtdLCBjb21wYXJlID0gW10pIHtcclxuICAgIHJldHVybiBjb21wYXJlLnNvbWUoKGMpID0+ICFvcmlnaW4uaW5jbHVkZXMoYykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERhdGFNYW5hZ2VyKFxyXG4gICAgZmlndXJlQ29kZXMsXHJcbiAgICBjYWxsYmFjayxcclxuICAgIHBvcnRsZXRUeXBlcyA9IFtdLFxyXG4gICAgZGFzaGJvYXJkSWQsXHJcbiAgICBwb3J0bGV0PzogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgbGVuZ3RoID0gMDtcclxuICAgIGlmICghdGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdKSB7XHJcbiAgICAgIHRoaXMuZmllbGRzQXJyW2Rhc2hib2FyZElkXSA9IHt9O1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmRhdGFNYXJ0VGFibGVzW2Rhc2hib2FyZElkXSAmJlxyXG4gICAgICB0aGlzLmRhdGFNYXJ0VGFibGVzW2Rhc2hib2FyZElkXS5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nXy5uZXh0KHRydWUpO1xyXG4gICAgICBsZXQgZGF0YU1hcnRUYWJsZXMgPSB0aGlzLmRhdGFNYXJ0VGFibGVzW2Rhc2hib2FyZElkXS5maWx0ZXIoKGVsKSA9PlxyXG4gICAgICAgIGZpZ3VyZUNvZGVzLmluY2x1ZGVzKGVsLmRhdGFtYXJ0Q29kZSlcclxuICAgICAgKTtcclxuICAgICAgaWYgKGRhdGFNYXJ0VGFibGVzLmxlbmd0aCkge1xyXG4gICAgICAgIGZvckVhY2goZGF0YU1hcnRUYWJsZXMsIChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGFsbEZpZWxkcztcclxuICAgICAgICAgIGxldCBjb25maWc7XHJcbiAgICAgICAgICBpZiAocG9ydGxldCkge1xyXG4gICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKHBvcnRsZXQuY29uZmlnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgW1wibmV3Y29sdW1uXCIsIFwibmV3bGluZVwiLCBcIm5ld2NvbHVtbmxpbmVcIl0uaW5jbHVkZXMocG9ydGxldFR5cGVzWzBdKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGFsbEZpZWxkcyA9IGNvbmZpZy5zZWxlY3RlZFlcclxuICAgICAgICAgICAgICAuY29uY2F0KGNvbmZpZy5zZWxlY3RlZFNlY29uZFkpXHJcbiAgICAgICAgICAgICAgLmNvbmNhdChbY29uZmlnLnNlbGVjdGVkWF0pXHJcbiAgICAgICAgICAgICAgLm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgY29sTmFtZTogZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbGxGaWVsZHMgPVxyXG4gICAgICAgICAgICAgIHRoaXMuZmllbGRzQXJyW2Rhc2hib2FyZElkXSAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuZmllbGRzQXJyW2Rhc2hib2FyZElkXVtpdGVtLmRhdGFtYXJ0Q29kZV1cclxuICAgICAgICAgICAgICAgID8gdGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdW2l0ZW0uZGF0YW1hcnRDb2RlXVxyXG4gICAgICAgICAgICAgICAgOiBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBkaXNwbGF5Q29sdW1uRmlsdGVyID1cclxuICAgICAgICAgICAgYWxsRmllbGRzICYmIGFsbEZpZWxkcy5tYXAoKHgpID0+IHguY29sTmFtZSkuam9pbihcIixcIik7XHJcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGRhc2hib2FyZERhdGFUYWJsZUlkOiBpdGVtLmlkLFxyXG4gICAgICAgICAgICBkaXNwbGF5Q29sdW1uRmlsdGVyOiBkaXNwbGF5Q29sdW1uRmlsdGVyLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICBkYXNoYm9hcmRWZXJzaW9uOiAyLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHBhcmFtcy5zdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgIHBhcmFtcy5wYWdlU2l6ZSA9IDEwO1xyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgcG9ydGxldFR5cGVzICYmXHJcbiAgICAgICAgICAgIHBvcnRsZXRUeXBlcy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIChwb3J0bGV0VHlwZXMuaW5jbHVkZXMoXCJuZXdjb2x1bW5cIikgfHxcclxuICAgICAgICAgICAgICBwb3J0bGV0VHlwZXMuaW5jbHVkZXMoXCJuZXdsaW5lXCIpIHx8XHJcbiAgICAgICAgICAgICAgcG9ydGxldFR5cGVzLmluY2x1ZGVzKFwibmV3Y29sdW1ubGluZVwiKSlcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBwYXJhbXMucGFnZVNpemUgPSAxMDAwMDAwO1xyXG4gICAgICAgICAgICBwYXJhbXNbXCJJc09ubHlTaG93RGlzcGxheUNvbHVtXCJdID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclNldHRpbmdzID0gY29uZmlnLmZpbHRlclNldHRpbmdzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZpbHRlclNldHRpbmdzICYmIGZpbHRlclNldHRpbmdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGlmICghcGFyYW1zLmNvbHVtbkZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IFtdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmaWx0ZXJTZXR0aW5ncy5mb3JFYWNoKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnBvcnRsZXRUeXBlID09PSBcInBpdm90XCIpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgX2ZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5jb2xOYW1lID09PSBzZXR0aW5nLm5hbWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBUeXBlID0gX2ZpZWxkICYmIF9maWVsZC5kYXRhVHlwZTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldHRpbmcuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICBGaWVsZDogc2V0dGluZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgIFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBWYWx1ZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChpdGVtKS5mb3JtYXQoXCJ5eXl5LU1NLUREXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUeXBlID09PSBcImRhdGV0aW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChpdGVtKS5mb3JtYXQoXCJ5eXl5LU1NLUREIGhoOm1tOnNzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy5vcGVyYXRvcikge1xyXG4gICAgICAgICAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkOiBzZXR0aW5nLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yOiBcImVxdWFsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogc2V0dGluZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbHVlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy50eXBlID09PSBcImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChzZXR0aW5nLnZhbHVlKS5mb3JtYXQoXCJ5eXl5LU1NLUREXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dGluZy50eXBlID09PSBcImRhdGV0aW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtb21lbnQoc2V0dGluZy52YWx1ZSkuZm9ybWF0KFwieXl5eS1NTS1ERCBoaDptbTpzc1wiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHNldHRpbmcudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb25maWcucG9ydGxldFR5cGUgPT09IFwiaGlzdG9yaWNhbElSUlwiKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuY29sdW1uRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgRmllbGQ6IFwiRnJlcXVlbmN5c1wiLFxyXG4gICAgICAgICAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgICAgICAgICBUeXBlOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICBWYWx1ZTogY29uZmlnLnNlbGVjdGVkTXVsdGlwbGVzLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgRmllbGQ6IFwiSW52ZXN0b3JUeXBlXCIsXHJcbiAgICAgICAgICAgICAgICAgIE9wZXJhdG9yOiBcImVxdWFsXCIsXHJcbiAgICAgICAgICAgICAgICAgIFR5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgIFZhbHVlOiBjb25maWcuc2VsZWN0ZWRJbnZlc3RvcixcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocGFyYW1zLmNvbHVtbkZpbHRlciBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIgPSBwYXJhbXMuY29sdW1uRmlsdGVyLmZpbHRlcihcclxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5GaWVsZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGpzb24gYnVmZmVyXHJcbiAgICAgICAgICB0aGlzLmh0dHBDbGllbnRcclxuICAgICAgICAgICAgLnBvc3QoXHJcbiAgICAgICAgICAgICAgdGhpcy5hcGkuYmFzZXVybCArIHRoaXMuYXBpLnVybExpc3QuR2V0UG9ydGxldERhdGFPckNyZWF0ZSxcclxuICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlcmAsXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9XHJcbiAgICAgICAgICAgICAgICAgIHBvcnRsZXQuaWQgPT09IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCJcclxuICAgICAgICAgICAgICAgICAgICA/IHBvcnRsZXQubmV3SWRcclxuICAgICAgICAgICAgICAgICAgICA6IHBvcnRsZXQuaWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnBvcnRsZXRSZXN1bHRzX05ld1tkYXNoYm9hcmRJZF1baXRlbS5kYXRhbWFydENvZGVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgIGlmIChwb3J0bGV0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0bGV0RGF0YV9OZXdbZGFzaGJvYXJkSWRdW2lkZW50aWZpZXJdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdG90YWw6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGlvbi5OT19EQVRBXHJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uLk5PX0RBVEFcclxuICAgICAgICAgICAgICAgICAgICA6IFwiLk5vIGRhdGEsIHBsZWFzZSBjaG9vc2UgYW5vdGhlciBkYXRhIHR5cGVcIjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dOb3RpZmljYXRpb24obWVzc2FnZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJFcnJvclwiLFxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChkYXRhTWFydFRhYmxlcy5sZW5ndGggPT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtcImRhdGFcIl0uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uU2VjdG9yID0gdGhpcy50cmFuc2xhdGlvbltpdGVtLlNlY3Rvcl0gfHwgaXRlbS5TZWN0b3I7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdKS5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0bGV0UmVzdWx0c19OZXdbZGFzaGJvYXJkSWRdW2l0ZW0uZGF0YW1hcnRDb2RlXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKHBvcnRsZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnRsZXREYXRhX05ld1tkYXNoYm9hcmRJZF1baWRlbnRpZmllcl0gPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChkYXRhTWFydFRhYmxlcy5sZW5ndGggPT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YU1hcnRUYWJsZXMubGVuZ3RoID09PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICgpID0+IHt9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEV4Y2VsRm9ybXVsYXMgPSB7XHJcbiAgICBEYXlzQmV0d2VlbjogZnVuY3Rpb24gKGRhdGUxLCBkYXRlMikge1xyXG4gICAgICB2YXIgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcclxuICAgICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5hYnMoKGRhdGUxLmdldFRpbWUoKSAtIGRhdGUyLmdldFRpbWUoKSkgLyBvbmVEYXkpKTtcclxuICAgIH0sXHJcbiAgICBYTlBWOiBmdW5jdGlvbiAocmF0ZSwgdmFsdWVzKSB7XHJcbiAgICAgIHZhciB4bnB2ID0gMC4wO1xyXG4gICAgICB2YXIgZmlyc3REYXRlID0gbmV3IERhdGUodmFsdWVzWzBdLmRhdGUpO1xyXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWVzKSB7XHJcbiAgICAgICAgdmFyIHRtcCA9IHZhbHVlc1trZXldO1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRtcC5hbW91bnQ7XHJcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0bXAuZGF0ZSk7XHJcbiAgICAgICAgeG5wdiArPVxyXG4gICAgICAgICAgdmFsdWUgLyBNYXRoLnBvdygxICsgcmF0ZSwgdGhpcy5EYXlzQmV0d2VlbihmaXJzdERhdGUsIGRhdGUpIC8gMzY1KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4geG5wdjtcclxuICAgIH0sXHJcbiAgICBYSVJSOiBmdW5jdGlvbiAodmFsdWVzLCBndWVzcykge1xyXG4gICAgICB2YXIgeDEgPSAwLjA7XHJcbiAgICAgIHZhciB4MjogbnVtYmVyID0gZ3Vlc3M7XHJcbiAgICAgIHZhciBmMSA9IHRoaXMuWE5QVih4MSwgdmFsdWVzKTtcclxuICAgICAgdmFyIGYyID0gdGhpcy5YTlBWKHgyLCB2YWx1ZXMpO1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwMDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGYxICogZjIgPCAwLjApIGJyZWFrO1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhmMSkgPCBNYXRoLmFicyhmMikpIHtcclxuICAgICAgICAgIGYxID0gdGhpcy5YTlBWKCh4MSArPSAxLjYgKiAoeDEgLSB4MikpLCB2YWx1ZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmMiA9IHRoaXMuWE5QVigoeDIgKz0gMS42ICogKHgyIC0geDEpKSwgdmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGYxICogZjIgPiAwLjApIHJldHVybiBudWxsO1xyXG4gICAgICB2YXIgZiA9IHRoaXMuWE5QVih4MSwgdmFsdWVzKTtcclxuICAgICAgaWYgKGYgPCAwLjApIHtcclxuICAgICAgICB2YXIgcnRiID0geDE7XHJcbiAgICAgICAgdmFyIGR4ID0geDIgLSB4MTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgcnRiID0geDI7XHJcbiAgICAgICAgdmFyIGR4ID0geDEgLSB4MjtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwMDsgaSsrKSB7XHJcbiAgICAgICAgZHggKj0gMC41O1xyXG4gICAgICAgIHZhciB4X21pZCA9IHJ0YiArIGR4O1xyXG4gICAgICAgIHZhciBmX21pZCA9IHRoaXMuWE5QVih4X21pZCwgdmFsdWVzKTtcclxuICAgICAgICBpZiAoZl9taWQgPD0gMC4wKSBydGIgPSB4X21pZDtcclxuICAgICAgICBpZiAoTWF0aC5hYnMoZl9taWQpIDwgMS4wZS02IHx8IE1hdGguYWJzKGR4KSA8IDEuMGUtNikgcmV0dXJuIHhfbWlkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuICAgIF9EYXlzQmV0d2VlbjogZnVuY3Rpb24gKGRhdGUxLCBkYXRlMikge1xyXG4gICAgICAvL2NvbnN0IHRpbWUxID1uZXcgRGF0ZShEYXRlLlVUQyhkYXRlMS5nZXRVVENGdWxsWWVhcigpLCBkYXRlMS5nZXRVVENNb250aCgpLCBkYXRlMS5nZXRVVENEYXRlKCksIGRhdGUxLmdldFVUQ0hvdXJzKCksIGRhdGUxLmdldFVUQ01pbnV0ZXMoKSwgZGF0ZTEuZ2V0VVRDU2Vjb25kcygpKSkuZ2V0VGltZSgpO1xyXG4gICAgICAvL2NvbnN0IHRpbWUyID1uZXcgRGF0ZShEYXRlLlVUQyhkYXRlMi5nZXRVVENGdWxsWWVhcigpLCBkYXRlMi5nZXRVVENNb250aCgpLCBkYXRlMi5nZXRVVENEYXRlKCksIGRhdGUyLmdldFVUQ0hvdXJzKCksIGRhdGUyLmdldFVUQ01pbnV0ZXMoKSwgZGF0ZTIuZ2V0VVRDU2Vjb25kcygpKSkuZ2V0VGltZSgpO1xyXG4gICAgICBjb25zdCBvbmVEYXkgPSAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyDkuIDlpKnnmoTmr6vnp5LmlbBcclxuICAgICAgLy9jb25zdCB0aW1lMSA9IGRhdGUxLmdldFRpbWUoKTsgLy8gZGF0ZTHnmoTmr6vnp5LooajnpLpcclxuICAgICAgLy9jb25zdCB0aW1lMiA9IGRhdGUyLmdldFRpbWUoKTsgLy8gZGF0ZTLnmoTmr6vnp5LooajnpLpcclxuICAgICAgY29uc3QgZmlyc3REYXRlID0gbmV3IERhdGUoZGF0ZTEpO1xyXG4gICAgICBjb25zdCBzZWNvbmREYXRlID0gbmV3IERhdGUoZGF0ZTIpO1xyXG4gICAgICBjb25zdCBkaWZmRGF5cyA9IE1hdGgucm91bmQoXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIE1hdGguYWJzKChmaXJzdERhdGUgLSBzZWNvbmREYXRlKSAvIG9uZURheSlcclxuICAgICAgKTsgLy8g6K6h566X5aSp5pWw5beu5bm25Y+W5pW0XHJcbiAgICAgIHJldHVybiBkaWZmRGF5cztcclxuICAgIH0sXHJcblxyXG4gICAgX2xjbF9zY2FfWGlyclJlc3VsdDogZnVuY3Rpb24gKHZhbHVlcywgZGF0ZXMsIGZSYXRlKSB7XHJcbiAgICAgIHZhciBEXzAgPSBkYXRlc1swXTtcclxuICAgICAgbGV0IHIgPSBmUmF0ZSArIDEuMDtcclxuICAgICAgdmFyIGZSZXN1bHQgPSB2YWx1ZXNbMF07XHJcbiAgICAgIGZvciAodmFyIGkgPSAxLCBuQ291bnQgPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbkNvdW50OyArK2kpIHtcclxuICAgICAgICB2YXIgdGVtcCA9IE1hdGgucG93KHIsIHRoaXMuX0RheXNCZXR3ZWVuKGRhdGVzW2ldLCBEXzApIC8gMzY1LjApO1xyXG4gICAgICAgIGZSZXN1bHQgKz0gdmFsdWVzW2ldIC8gdGVtcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZlJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgX2xjbF9zY2FfWGlyclJlc3VsdF9EZXJpdjE6IGZ1bmN0aW9uICh2YWx1ZXMsIGRhdGVzLCBmUmF0ZSkge1xyXG4gICAgICB2YXIgRF8wID0gZGF0ZXNbMF07XHJcbiAgICAgIHZhciByID0gZlJhdGUgKyAxLjA7XHJcbiAgICAgIHZhciBmUmVzdWx0ID0gMC4wO1xyXG4gICAgICBmb3IgKHZhciBpID0gMSwgbkNvdW50ID0gdmFsdWVzLmxlbmd0aDsgaSA8IG5Db3VudDsgKytpKSB7XHJcbiAgICAgICAgdmFyIEVfaSA9IHRoaXMuX0RheXNCZXR3ZWVuKGRhdGVzW2ldLCBEXzApIC8gMzY1LjA7XHJcbiAgICAgICAgZlJlc3VsdCAtPSAoRV9pICogdmFsdWVzW2ldKSAvIE1hdGgucG93KHIsIEVfaSArIDEuMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZSZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIF9DYWxjdWxhdGVYaXJyT3Blbk9mZmljZTogZnVuY3Rpb24gKHZhbHVlcywgZGF0ZXMsIGd1ZXNzKSB7XHJcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoIDwgMiB8fCB2YWx1ZXMubGVuZ3RoICE9IGRhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgZlJlc3VsdFJhdGUgPSBndWVzcztcclxuICAgICAgaWYgKGZSZXN1bHRSYXRlIDw9IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBmTWF4RXBzID0gMC4wMDAwMDAwMTtcclxuICAgICAgdmFyIG5NYXhJdGVyID0gNTA7XHJcblxyXG4gICAgICB2YXIgZk5ld1JhdGUsIGZSYXRlRXBzLCBmUmVzdWx0VmFsdWU7XHJcbiAgICAgIHZhciBuSXRlciA9IDA7XHJcbiAgICAgIHZhciBuSXRlclNjYW4gPSAwO1xyXG4gICAgICB2YXIgYkNvbnRMb29wID0gZmFsc2U7XHJcbiAgICAgIHZhciBiUmVzdWx0UmF0ZVNjYW5FbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGRvIHtcclxuICAgICAgICBpZiAobkl0ZXJTY2FuID49IDEpIHtcclxuICAgICAgICAgIGZSZXN1bHRSYXRlID0gLTAuOTkgKyAobkl0ZXJTY2FuIC0gMSkgKiAwLjAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICBmUmVzdWx0VmFsdWUgPSB0aGlzLl9sY2xfc2NhX1hpcnJSZXN1bHQodmFsdWVzLCBkYXRlcywgZlJlc3VsdFJhdGUpO1xyXG4gICAgICAgICAgZk5ld1JhdGUgPVxyXG4gICAgICAgICAgICBmUmVzdWx0UmF0ZSAtXHJcbiAgICAgICAgICAgIGZSZXN1bHRWYWx1ZSAvXHJcbiAgICAgICAgICAgICAgdGhpcy5fbGNsX3NjYV9YaXJyUmVzdWx0X0Rlcml2MSh2YWx1ZXMsIGRhdGVzLCBmUmVzdWx0UmF0ZSk7XHJcbiAgICAgICAgICBmUmF0ZUVwcyA9IE1hdGguYWJzKGZOZXdSYXRlIC0gZlJlc3VsdFJhdGUpO1xyXG4gICAgICAgICAgZlJlc3VsdFJhdGUgPSBmTmV3UmF0ZTtcclxuICAgICAgICAgIGJDb250TG9vcCA9IGZSYXRlRXBzID4gZk1heEVwcyAmJiBNYXRoLmFicyhmUmVzdWx0VmFsdWUpID4gZk1heEVwcztcclxuICAgICAgICB9IHdoaWxlIChiQ29udExvb3AgJiYgKytuSXRlciA8IG5NYXhJdGVyKTtcclxuICAgICAgICBuSXRlciA9IDA7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgaXNOYU4oZlJlc3VsdFJhdGUpIHx8XHJcbiAgICAgICAgICAhaXNGaW5pdGUoZlJlc3VsdFJhdGUpIHx8XHJcbiAgICAgICAgICBpc05hTihmUmVzdWx0VmFsdWUpIHx8XHJcbiAgICAgICAgICAhaXNGaW5pdGUoZlJlc3VsdFZhbHVlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgYkNvbnRMb29wID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICsrbkl0ZXJTY2FuO1xyXG4gICAgICAgIGJSZXN1bHRSYXRlU2NhbkVuZCA9IG5JdGVyU2NhbiA+PSAxMDA7XHJcbiAgICAgIH0gd2hpbGUgKGJDb250TG9vcCAmJiAhYlJlc3VsdFJhdGVTY2FuRW5kKTtcclxuXHJcbiAgICAgIGlmIChiQ29udExvb3ApIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZlJlc3VsdFJhdGU7XHJcbiAgICB9LFxyXG5cclxuICAgIF9DYWxjdWxhdGVYaXJyOiBmdW5jdGlvbiAodmFsdWVMaXN0LCBkYXRlTGlzdCwgbmF2QWRqdXN0LCBsYXRlc3REYXRlKSB7XHJcbiAgICAgIHZhciBwb3NpdGl2ZUNhc2hmbG93ID0gdmFsdWVMaXN0LnNvbWUoZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdiA+IDA7XHJcbiAgICAgIH0pXHJcbiAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgOiBuYXZBZGp1c3QgPiAwXHJcbiAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgOiBmYWxzZTtcclxuICAgICAgdmFyIG5lZ2F0aXZlQ2FzaGZsb3cgPSB2YWx1ZUxpc3Quc29tZShmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiB2IDwgMDtcclxuICAgICAgfSlcclxuICAgICAgICA/IHRydWVcclxuICAgICAgICA6IG5hdkFkanVzdCA8IDBcclxuICAgICAgICA/IHRydWVcclxuICAgICAgICA6IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKHBvc2l0aXZlQ2FzaGZsb3cgPT0gZmFsc2UgfHwgbmVnYXRpdmVDYXNoZmxvdyA9PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmF2QWRqdXN0ICE9IG51bGwpIHtcclxuICAgICAgICB2YWx1ZUxpc3QucHVzaChuYXZBZGp1c3QpO1xyXG4gICAgICAgIGRhdGVMaXN0LnB1c2gobGF0ZXN0RGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciB4aXJyUmVzdWx0ID0gbnVsbDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB2YXIgZXhjZWxHdWVzcyA9XHJcbiAgICAgICAgICB2YWx1ZUxpc3QucmVkdWNlKGZ1bmN0aW9uIChzdW0sIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdW0gKyB2YWx1ZTtcclxuICAgICAgICAgIH0sIDApIDwgMFxyXG4gICAgICAgICAgICA/IC0wLjFcclxuICAgICAgICAgICAgOiAwLjE7XHJcbiAgICAgICAgeGlyclJlc3VsdCA9IHRoaXMuX0NhbGN1bGF0ZVhpcnJPcGVuT2ZmaWNlKFxyXG4gICAgICAgICAgdmFsdWVMaXN0LFxyXG4gICAgICAgICAgZGF0ZUxpc3QsXHJcbiAgICAgICAgICBleGNlbEd1ZXNzXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHhpcnJSZXN1bHQ7XHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIC8vIOaLv+WIsOaVsOaNruWQju+8jOWFiOmBjeWOhmNvbmZpZy5maWx0ZXJTZXR0aW5ncyzlpoLmnpzlnKjmlbDmja7kuK3kuI3lrZjlnKjvvIzlsLHliKDpmaTov5nkuIDpoblcclxuICBjaGVja0ZpbHRlclNldHRpbmdzKGNvbmZpZywgZmllbGRzLCBkYXRhKSB7XHJcbiAgICBsZXQgZmlsdGVyU2V0dGluZ3MgPSBjb25maWcuZmlsdGVyU2V0dGluZ3M7XHJcbiAgICBpZiAoZmlsdGVyU2V0dGluZ3MgJiYgZmlsdGVyU2V0dGluZ3MubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyU2V0dGluZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZmlsdGVyU2V0dGluZ3NbaV07XHJcbiAgICAgICAgbGV0IF9fZmllbGQgPSBmaWVsZHMuZmlsdGVyKFxyXG4gICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5jb2xOYW1lID09IGVsZW1lbnQubmFtZVxyXG4gICAgICAgIClbMF07XHJcbiAgICAgICAgaWYgKCFfX2ZpZWxkKSB7XHJcbiAgICAgICAgICAvLyDlpITnkIboh6rlrprkuYkgR3JvdXDnmoRGaWx0ZXJcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IF9fZmllbGQuZGF0YVR5cGU7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaXRlbXMgJiYgZWxlbWVudC5pdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgZWxlbWVudC5pdGVtcy5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gZWxlbWVudC5pdGVtc1tyXTtcclxuICAgICAgICAgICAgbGV0IHJlcyA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZGF0YVR5cGUgIT09IFwiZGF0ZVwiICYmXHJcbiAgICAgICAgICAgICAgZGF0YVR5cGUgIT09IFwiZGF0ZXRpbWVcIiAmJlxyXG4gICAgICAgICAgICAgIGRhdGEgJiZcclxuICAgICAgICAgICAgICBkYXRhLmxlbmd0aFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgcmVzID0gZGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2VsZW1lbnQubmFtZV0gPT09IGl0ZW0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXMgPSBkYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKG9iaikgPT4gTnVtYmVyKG9ialtlbGVtZW50Lm5hbWVdKSA9PT0gTnVtYmVyKGl0ZW0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHwgZGF0YVR5cGUgPT0gXCJkYXRldGltZVwiKSB7XHJcbiAgICAgICAgICAgICAgcmVzID0gZGF0YS5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAob2JqKSA9PlxyXG4gICAgICAgICAgICAgICAgICBtb21lbnQob2JqW2VsZW1lbnQubmFtZV0pLmZvcm1hdChcIllZWVktTU0tRERcIikgPT1cclxuICAgICAgICAgICAgICAgICAgbW9tZW50KGl0ZW0pLmZvcm1hdChcIllZWVktTU0tRERcIilcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnQuaXRlbXMuc3BsaWNlKHIsIDEpO1xyXG4gICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFlbGVtZW50Lml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmaWx0ZXJTZXR0aW5ncy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZpbHRlclNldHRpbmdzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8gY2FsbGJhY2soZmlsdGVyU2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgc29ydERhdGFNYXJ0VGFibGVzKGRhdGEpIHtcclxuICAgIGRhdGEuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBsYW5nVmFsdWVBID0gYS5sYW5nVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgbGFuZ1ZhbHVlQiA9IGIubGFuZ1ZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBpZiAobGFuZ1ZhbHVlQSA8IGxhbmdWYWx1ZUIpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGxhbmdWYWx1ZUEgPiBsYW5nVmFsdWVCKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbmFtZURhdGFNYXJ0VGFibGVzKGRhdGEsIGlkLCBlbnRpdHlUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5zb3VyY2VzRGF0YVtpZF0pIHtcclxuICAgICAgdGhpcy5zb3VyY2VzRGF0YVtpZF0uZm9yRWFjaCgoc291cmNlcykgPT4ge1xyXG4gICAgICAgIGlmIChzb3VyY2VzLmVudGl0eVR5cGUgPT09IGVudGl0eVR5cGUpIHtcclxuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgc291cmNlcy52aWV3cy5mb3JFYWNoKCh2aWV3KSA9PiB7XHJcbiAgICAgICAgICAgICAgdmlldy50YWJsZXMuZm9yRWFjaCgodGFibGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZS5kYXRhbWFydENvZGUgPT09IF9kYXRhLmRhdGFtYXJ0Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgICBfZGF0YS5sYW5nVmFsdWUgPSB0YWJsZS5sYW5nVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIF9kYXRhLmxhbmdDb2RlID0gdGFibGUubGFuZ0NvZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgQUxMX0FHR1JFR0FURV9UWVBFUyA9IFtcclxuICBcIlN1bVwiLFxyXG4gIFwiRmlyc3RcIixcclxuICBcIkxhc3RcIixcclxuICBcIkNhbGN1bGF0ZUlSUlwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSSVJSRGF0ZVwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSQmVmb3JlQ2FycmllZFwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSQWN0dWFsQXVkaXRlZFwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSUmVwb3J0ZWRcIixcclxuICBcIkNhbGN1bGF0ZUlSUk1URFwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSUVREXCIsXHJcbiAgXCJDYWxjdWxhdGVJUlJZVERcIixcclxuICBcIkNhbGN1bGF0ZVRXUk1URFwiLFxyXG4gIFwiQ2FsY3VsYXRlVFdSUVREXCIsXHJcbiAgXCJDYWxjdWxhdGVUV1JZVERcIixcclxuICBcIkNhbGN1bGF0ZVZBUk1URF85OVwiLFxyXG4gIFwiQ2FsY3VsYXRlVkFSUVREXzk5XCIsXHJcbiAgXCJDYWxjdWxhdGVWQVJZVERfOTlcIixcclxuICBcIkNhbGN1bGF0ZVZBUk1URF85NVwiLFxyXG4gIFwiQ2FsY3VsYXRlVkFSUVREXzk1XCIsXHJcbiAgXCJDYWxjdWxhdGVWQVJZVERfOTVcIixcclxuICBcIkNhbGN1bGF0ZU11bHRpcGxlXCIsXHJcbiAgXCJDYWxjdWxhdGVQSUNcIixcclxuICBcIkNhbGN1bGF0ZURQSVwiLFxyXG4gIFwiQ2FsY3VsYXRlVFZQSVwiLFxyXG4gIFwiQ2FsY3VsYXRlUlZQSVwiLFxyXG4gIFwiQ2FsY3VsYXRlTUFjdHVhbEF1ZGl0ZWRcIixcclxuICBcIkNhbGN1bGF0ZU1SZXBvcnRlZFwiLFxyXG4gIFwiQ291bnRcIixcclxuICBcIkRpc3RpbmN0Q291bnRcIixcclxuICBcIlByb2R1Y3RcIixcclxuICBcIk1pblwiLFxyXG4gIFwiTWF4XCIsXHJcbiAgXCJBdmdcIixcclxuICBcIk1lZGlhblwiLFxyXG4gIFwiSW5kZXhcIixcclxuICBcIlBvcHVsYXRpb25WYXJcIixcclxuICBcIlNhbXBsZVZhclwiLFxyXG4gIFwiUG9wdWxhdGlvblN0RGV2XCIsXHJcbiAgXCJTYW1wbGVTdERldlwiLFxyXG4gIFwiUnVubmluZ1RvdGFsc1wiLFxyXG4gIFwiUGVyY2VudGFnZU9mR3JhbmRUb3RhbFwiLFxyXG4gIFwiUGVyY2VudGFnZU9mQ29sdW1uVG90YWxcIixcclxuICBcIlBlcmNlbnRhZ2VPZlJvd1RvdGFsXCIsXHJcbiAgXCJQZXJjZW50YWdlT2ZQYXJlbnRDb2x1bW5Ub3RhbFwiLFxyXG4gIFwiUGVyY2VudGFnZU9mUGFyZW50Um93VG90YWxcIixcclxuICBcIkRpZmZlcmVuY2VGcm9tXCIsXHJcbiAgXCJQZXJjZW50YWdlT2ZEaWZmZXJlbmNlRnJvbVwiLFxyXG4gIFwiUGVyY2VudGFnZU9mUGFyZW50VG90YWxcIixcclxuXTtcclxuXHJcbmxldCB0cmFuc2xhdGlvbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ0cmFuc2xhdGlvblwiKSB8fCBcInt9XCIpO1xyXG5leHBvcnQgY29uc3QgQUdHUkVHQVRFX1RZUEVTX1RFWFQgPSB7XHJcbiAgQ2FsY3VsYXRlSVJSOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfSVJSIHx8IFwiQ2FsY3VsYXRlIElSUlwiLFxyXG4gIENhbGN1bGF0ZUlSUklSUkRhdGU6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfSVJSX0lSUl9EQVRFIHx8IFwiQ2FsY3VsYXRlIElSUiAoSVJSIERhdGUpXCIsXHJcbiAgQ2FsY3VsYXRlSVJSQmVmb3JlQ2FycmllZDpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9JUlJfQkVGT1JFX0NBUlJZIHx8IFwiQ2FsY3VsYXRlIElSUiBCZWZvcmUgQ2FycmllZFwiLFxyXG4gIENhbGN1bGF0ZUlSUkFjdHVhbEF1ZGl0ZWQ6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfSVJSX0FDVFVBTF9BVURJVEVEIHx8IFwiQ2FsY3VsYXRlIElSUiBBY3R1YWwvQXVkaXRlZFwiLFxyXG4gIENhbGN1bGF0ZUlSUlJlcG9ydGVkOiB0cmFuc2xhdGlvbi5DSV9SRVBPUlRFRCB8fCBcIkNhbGN1bGF0ZSBJUlIgUmVwb3J0ZWRcIixcclxuICBDYWxjdWxhdGVJUlJNVEQ6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9JUlJfTVREIHx8IFwiQ2FsY3VsYXRlIElSUiAoTVREKVwiLFxyXG4gIENhbGN1bGF0ZUlSUlFURDogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX0lSUl9RVEQgfHwgXCJDYWxjdWxhdGUgSVJSIChRVEQpXCIsXHJcbiAgQ2FsY3VsYXRlSVJSWVREOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfSVJSX1lURCB8fCBcIkNhbGN1bGF0ZSBJUlIgKFlURClcIixcclxuICBDYWxjdWxhdGVUV1JNVEQ6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9UV1JfTVREIHx8IFwiQ2FsY3VsYXRlIFRXUiAoTSlcIixcclxuICBDYWxjdWxhdGVUV1JRVEQ6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9UV1JfUVREIHx8IFwiQ2FsY3VsYXRlIFRXUiAoUSlcIixcclxuICBDYWxjdWxhdGVUV1JZVEQ6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9UV1JfWVREIHx8IFwiQ2FsY3VsYXRlIFRXUiAoWSlcIixcclxuICBDYWxjdWxhdGVWQVJNVERfOTk6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfVkFSX01URF85OSB8fCBcIkNhbGN1bGF0ZSBWQVIgKE0gOTklKVwiLFxyXG4gIENhbGN1bGF0ZVZBUlFURF85OTpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9WQVJfUVREXzk5IHx8IFwiQ2FsY3VsYXRlIFZBUiAoUSA5OSUpXCIsXHJcbiAgQ2FsY3VsYXRlVkFSWVREXzk5OlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1ZBUl9ZVERfOTkgfHwgXCJDYWxjdWxhdGUgVkFSIChZIDk5JSlcIixcclxuICBDYWxjdWxhdGVWQVJNVERfOTU6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfVkFSX01URF85NSB8fCBcIkNhbGN1bGF0ZSBWQVIgKE0gOTUlKVwiLFxyXG4gIENhbGN1bGF0ZVZBUlFURF85NTpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9WQVJfUVREXzk1IHx8IFwiQ2FsY3VsYXRlIFZBUiAoUSA5NSUpXCIsXHJcbiAgQ2FsY3VsYXRlVkFSWVREXzk1OlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1ZBUl9ZVERfOTUgfHwgXCJDYWxjdWxhdGUgVkFSIChZIDk1JSlcIixcclxuICBDYWxjdWxhdGVNdWx0aXBsZTogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX01VTFRJUExFIHx8IFwiQ2FsY3VsYXRlIE11bHRpcGxlXCIsXHJcbiAgQ2FsY3VsYXRlUElDOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfUElDIHx8IFwiQ2FsY3VsYXRlIFBJQ1wiLFxyXG4gIENhbGN1bGF0ZURQSTogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX0RQSSB8fCBcIkNhbGN1bGF0ZSBEUElcIixcclxuICBDYWxjdWxhdGVUVlBJOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfVFZQSSB8fCBcIkNhbGN1bGF0ZSBUVlBJXCIsXHJcbiAgQ2FsY3VsYXRlUlZQSTogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1JWUEkgfHwgXCJDYWxjdWxhdGUgUlZQSVwiLFxyXG4gIENhbGN1bGF0ZU1BY3R1YWxBdWRpdGVkOlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX01VTFRJUExFX0FDVFVBTF9BVURJVEVEIHx8XHJcbiAgICBcIkNhbGN1bGF0ZSBNdWx0aXBsZSBBY3R1YWwvQXVkaXRlZFwiLFxyXG4gIENhbGN1bGF0ZU1SZXBvcnRlZDpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9NVUxUSVBMRV9SRVBPUlRFRCB8fCBcIkNhbGN1bGF0ZSBNdWx0aXBsZSBSZXBvcnRlZFwiLFxyXG4gIEZpcnN0OiB0cmFuc2xhdGlvbi5GSVJTVCB8fCBcIkZpcnN0XCIsXHJcbiAgTGFzdDogdHJhbnNsYXRpb24uTEFTVCB8fCBcIkxhc3RcIixcclxuICBNZWRpYW46IHRyYW5zbGF0aW9uLk1FRElBTiB8fCBcIk1lZGlhblwiLFxyXG59O1xyXG4iXX0=