raise-common-lib-new 0.0.63 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/actions/toolbar/index.component.mjs +4 -3
- package/esm2022/lib/actions/toolbar-item/index.component.mjs +2 -2
- package/esm2022/lib/common-grid/grid-action/grid-action-item/grid-action-item.component.mjs +1 -1
- package/esm2022/lib/common-grid/grid-action/grid-action.component.mjs +3 -2
- package/esm2022/lib/common-grid/index.component.mjs +6 -3
- package/esm2022/lib/dashboard/api.mjs +33 -0
- package/esm2022/lib/dashboard/bar-charts/bar-charts.component.mjs +430 -0
- package/esm2022/lib/dashboard/bar-charts/utils.mjs +18 -0
- package/esm2022/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.mjs +442 -0
- package/esm2022/lib/dashboard/dashboard.service.mjs +295 -0
- package/esm2022/lib/dashboard/dashboardPorlets.service.mjs +2169 -0
- package/esm2022/lib/dashboard/dialog-group/download/index.component.mjs +212 -0
- package/esm2022/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.mjs +36 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.mjs +3211 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.mjs +3117 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-table/gadget-table.component.mjs +1099 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.mjs +583 -0
- package/esm2022/lib/dashboard/pane-group-new.component.mjs +2031 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.mjs +637 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/field-format/field-format.component.mjs +753 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.mjs +216 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.mjs +1239 -0
- package/esm2022/lib/dialog/common-delete-dialog/index.component.mjs +1 -1
- package/esm2022/lib/dialog/common-dialog/index.component.mjs +16 -5
- package/esm2022/lib/float-box/index.component.mjs +18 -4
- package/esm2022/lib/form/checkbox-group/index.component.mjs +35 -5
- package/esm2022/lib/form/drawer-form/drawer-form.component.mjs +177 -76
- package/esm2022/lib/layout/drawer/index.component.mjs +2 -2
- package/esm2022/lib/layout/page-list/index.component.mjs +9 -3
- package/esm2022/lib/layout/page-tab/index.component.mjs +5 -3
- package/esm2022/lib/layout/rs-stepper/constants.mjs +2 -0
- package/esm2022/lib/layout/rs-stepper/index.component.mjs +148 -0
- package/esm2022/lib/raise-common-lib.module.mjs +114 -7
- package/esm2022/lib/service/InjectionToken.mjs +5 -0
- package/esm2022/lib/service/keep-alive.service.mjs +2 -2
- package/esm2022/lib/smart-popup/index.component.mjs +1084 -0
- package/esm2022/public-api.mjs +19 -1
- package/fesm2022/raise-common-lib-new.mjs +18037 -220
- package/fesm2022/raise-common-lib-new.mjs.map +1 -1
- package/lib/common-grid/index.component.d.ts +2 -1
- package/lib/dashboard/api.d.ts +24 -0
- package/lib/dashboard/bar-charts/bar-charts.component.d.ts +63 -0
- package/lib/dashboard/bar-charts/utils.d.ts +1 -0
- package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +52 -0
- package/lib/dashboard/dashboard.service.d.ts +152 -0
- package/lib/dashboard/dashboardPorlets.service.d.ts +214 -0
- package/lib/dashboard/dialog-group/download/index.component.d.ts +36 -0
- package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +15 -0
- package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +128 -0
- package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +131 -0
- package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +77 -0
- package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +47 -0
- package/lib/dashboard/pane-group-new.component.d.ts +169 -0
- package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +56 -0
- package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +62 -0
- package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +30 -0
- package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +150 -0
- package/lib/dialog/common-dialog/index.component.d.ts +3 -1
- package/lib/float-box/index.component.d.ts +4 -3
- package/lib/form/checkbox-group/index.component.d.ts +5 -0
- package/lib/form/drawer-form/drawer-form.component.d.ts +21 -8
- package/lib/layout/page-list/index.component.d.ts +3 -1
- package/lib/layout/page-tab/index.component.d.ts +1 -0
- package/lib/layout/rs-stepper/constants.d.ts +5 -0
- package/lib/layout/rs-stepper/index.component.d.ts +31 -0
- package/lib/raise-common-lib.module.d.ts +61 -40
- package/lib/service/InjectionToken.d.ts +4 -0
- package/lib/smart-popup/index.component.d.ts +60 -0
- package/package.json +1 -1
- package/public-api.d.ts +18 -0
- package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
- package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
- package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
- package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
- package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
- package/src/assets/img/dashboard_icon/Close.svg +4 -0
- package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
- package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
- package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
- package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
- package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
- package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
- package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
- package/src/assets/img/dashboard_icon/area-white.svg +3 -0
- package/src/assets/img/dashboard_icon/area.svg +3 -0
- package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
- package/src/assets/img/dashboard_icon/bar.svg +14 -0
- package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
- package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
- package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
- package/src/assets/img/dashboard_icon/column-white.svg +14 -0
- package/src/assets/img/dashboard_icon/column.svg +26 -0
- package/src/assets/img/dashboard_icon/customize.png +0 -0
- package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
- package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
- package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
- package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
- package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
- package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
- package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
- package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
- package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
- package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
- package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
- package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
- package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
- package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
- package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
- package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
- package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
- package/src/assets/img/dashboard_icon/ftable.svg +24 -0
- package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
- package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
- package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
- package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
- package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
- package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
- package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
- package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
- package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
- package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
- package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
- package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
- package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
- package/src/assets/img/dashboard_icon/geo.svg +14 -0
- package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
- package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
- package/src/assets/img/dashboard_icon/information-1.png +0 -0
- package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
- package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
- package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
- package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
- package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
- package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
- package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
- package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
- package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
- package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
- package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
- package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
- package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
- package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
- package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
- package/src/assets/img/dashboard_icon/more_View.svg +3 -0
- package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
- package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
- package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
- package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
- package/src/assets/img/dashboard_icon/pie.svg +16 -0
- package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
- package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
- package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
- package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
- package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
- package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
- package/src/assets/img/dashboard_icon/radar.svg +19 -0
- package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
- package/src/assets/img/dashboard_icon/search_input.svg +4 -0
- package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
- package/src/assets/img/dashboard_icon/table-3.svg +16 -0
- package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
- package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
- package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
- package/src/assets/img/dashboard_icon/tick.svg +26 -0
- package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
- package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
- package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
- package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
- package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
- package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
- package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
- package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
- package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
- package/src/assets/img/dashboard_icon/transpose.svg +16 -0
|
@@ -0,0 +1,2169 @@
|
|
|
1
|
+
import { Inject, Injectable, Optional } from "@angular/core";
|
|
2
|
+
import { forEach } from "lodash";
|
|
3
|
+
import moment from "moment";
|
|
4
|
+
import { HttpHeaders } from "@angular/common/http";
|
|
5
|
+
import { API_SERVICE_TOKEN, PBF_TOKEN } from "../service/InjectionToken";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./api";
|
|
8
|
+
import * as i2 from "@angular/material/dialog";
|
|
9
|
+
import * as i3 from "../service/dialog.service";
|
|
10
|
+
import * as i4 from "./dashboard.service";
|
|
11
|
+
import * as i5 from "@angular/common/http";
|
|
12
|
+
export class DashboardPorletsService {
|
|
13
|
+
api;
|
|
14
|
+
dialog;
|
|
15
|
+
dialogService;
|
|
16
|
+
DashboardService;
|
|
17
|
+
httpClient;
|
|
18
|
+
pbf;
|
|
19
|
+
http;
|
|
20
|
+
translation;
|
|
21
|
+
userInfo;
|
|
22
|
+
lang;
|
|
23
|
+
// public config;
|
|
24
|
+
companyDropdownList = [];
|
|
25
|
+
currencyDropdownList = [];
|
|
26
|
+
currencyList = [];
|
|
27
|
+
portlets = [];
|
|
28
|
+
portletsCopy = [];
|
|
29
|
+
columnCount;
|
|
30
|
+
rowCount;
|
|
31
|
+
companyCharts = [];
|
|
32
|
+
portletData;
|
|
33
|
+
fundDropdownList;
|
|
34
|
+
allInvesteeList;
|
|
35
|
+
fundInvesteeList;
|
|
36
|
+
seletedAllInvestee;
|
|
37
|
+
colorsTotal = [
|
|
38
|
+
"#0b5496",
|
|
39
|
+
"#0081ff",
|
|
40
|
+
"#22cce2",
|
|
41
|
+
"#606ede",
|
|
42
|
+
"#8598f7",
|
|
43
|
+
"#00a744",
|
|
44
|
+
"#12c177",
|
|
45
|
+
"#fdbf5e",
|
|
46
|
+
"#ff8a48",
|
|
47
|
+
"#ea4258",
|
|
48
|
+
];
|
|
49
|
+
fetch_disabled = true;
|
|
50
|
+
update_loading = false;
|
|
51
|
+
currencyCode;
|
|
52
|
+
update_config;
|
|
53
|
+
loading_show = false;
|
|
54
|
+
img;
|
|
55
|
+
sortingPortlet = [];
|
|
56
|
+
pagingChanging = [];
|
|
57
|
+
timeMeasure;
|
|
58
|
+
entityList;
|
|
59
|
+
entityType;
|
|
60
|
+
selected_enyity_fileds = [];
|
|
61
|
+
isEntitySelectAll;
|
|
62
|
+
checkedAll = false;
|
|
63
|
+
selectedNum;
|
|
64
|
+
updated = false;
|
|
65
|
+
dataMartTables = {};
|
|
66
|
+
length = 0;
|
|
67
|
+
GetSourcesRes;
|
|
68
|
+
ListEntitiesRes;
|
|
69
|
+
templateList = [];
|
|
70
|
+
fieldsArr = {};
|
|
71
|
+
sourcesData = {};
|
|
72
|
+
// newDashboard
|
|
73
|
+
portletResults_New = {}; // 以DataTable为单位 存储新数据
|
|
74
|
+
portletData_New = {}; // 以portlet为单位 存储新数据
|
|
75
|
+
portletFields_Temp = {}; // 存储当前portlet所用到的字段
|
|
76
|
+
dashboardConfig = {}; // 当前Dashboard的config, 用于获取orderByColumns
|
|
77
|
+
entityIds = [];
|
|
78
|
+
entityIdObj = {};
|
|
79
|
+
allFieldsObj = {};
|
|
80
|
+
constructor(api, dialog, dialogService, DashboardService, httpClient, pbf, http) {
|
|
81
|
+
this.api = api;
|
|
82
|
+
this.dialog = dialog;
|
|
83
|
+
this.dialogService = dialogService;
|
|
84
|
+
this.DashboardService = DashboardService;
|
|
85
|
+
this.httpClient = httpClient;
|
|
86
|
+
this.pbf = pbf;
|
|
87
|
+
this.http = http;
|
|
88
|
+
}
|
|
89
|
+
setEntityType(res) {
|
|
90
|
+
if (res && res.entityList && res.entityList.length) {
|
|
91
|
+
const entityData = res.entityList[0];
|
|
92
|
+
if (!entityData) {
|
|
93
|
+
return res;
|
|
94
|
+
}
|
|
95
|
+
const { linkedType = "" } = entityData;
|
|
96
|
+
if (!linkedType) {
|
|
97
|
+
return res;
|
|
98
|
+
}
|
|
99
|
+
this.entityType =
|
|
100
|
+
linkedType === "PropertyId"
|
|
101
|
+
? "Property"
|
|
102
|
+
: linkedType === "portfolioCompId" ||
|
|
103
|
+
linkedType === "assetCompId" ||
|
|
104
|
+
linkedType === "otherCompId"
|
|
105
|
+
? "Company"
|
|
106
|
+
: linkedType === "portfolioFundId" || linkedType === "assetFundId"
|
|
107
|
+
? "Fund"
|
|
108
|
+
: "AssetPortfolio";
|
|
109
|
+
res.entityType = this.entityType;
|
|
110
|
+
}
|
|
111
|
+
return res;
|
|
112
|
+
}
|
|
113
|
+
GetDashboardV1(dashboardId, roGet, callback, isRefresh = false, callbackForDashboard) {
|
|
114
|
+
if (!isRefresh) {
|
|
115
|
+
this.portlets = [];
|
|
116
|
+
}
|
|
117
|
+
this.getInfo();
|
|
118
|
+
const dataObj = { dashboardId, language: this.lang };
|
|
119
|
+
this.http.post(this.api.urlList.GetDashboardV2, dataObj, (res) => {
|
|
120
|
+
res = this.pbf.convertKeysToLowerCase(res);
|
|
121
|
+
if (!res) {
|
|
122
|
+
callback(null);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
res = this.setEntityType(res);
|
|
126
|
+
// 初始化fromDate
|
|
127
|
+
if (res.fromDate === "1900-01-01T00:00:00Z") {
|
|
128
|
+
res.fromDate = "";
|
|
129
|
+
}
|
|
130
|
+
if (callbackForDashboard) {
|
|
131
|
+
callbackForDashboard(res);
|
|
132
|
+
}
|
|
133
|
+
this.entityIds =
|
|
134
|
+
res.entityList && res.entityList.length > 0
|
|
135
|
+
? res.entityList.map((e) => {
|
|
136
|
+
return e["linkedGuid"];
|
|
137
|
+
})
|
|
138
|
+
: [];
|
|
139
|
+
if (res.entityList)
|
|
140
|
+
this.entityList = [...res.entityList];
|
|
141
|
+
this.entityIdObj = {
|
|
142
|
+
id: JSON.stringify(this.entityIds),
|
|
143
|
+
};
|
|
144
|
+
this.portletResults_New[res.id] = {};
|
|
145
|
+
this.portletData_New[res.id] = {};
|
|
146
|
+
this.DashboardService.dashboardGroupId[res.id] = res.dashboardGroupId;
|
|
147
|
+
this.DashboardService.dashboardGroupName[res.id] = res.dashboardGroupName;
|
|
148
|
+
this.DashboardService.RegionDataSetId[res.id] = res.RegionDataSetId;
|
|
149
|
+
this.DashboardService.dashboardName[res.id] = res.name;
|
|
150
|
+
this.DashboardService.shareUsers[res.id] = res.sharedUsers;
|
|
151
|
+
this.dashboardConfig[res.id] = res.config && JSON.parse(res.config);
|
|
152
|
+
if (res) {
|
|
153
|
+
// this.dataMartTables[res.id] = uniqBy(
|
|
154
|
+
// res.dataMartTables,
|
|
155
|
+
// "langCode"
|
|
156
|
+
// );
|
|
157
|
+
this.dataMartTables[res.id] = [...res.dataMartTables];
|
|
158
|
+
this.sortDataMartTables(this.dataMartTables[res.id]);
|
|
159
|
+
this.DashboardService.dashboardDescription = res.description;
|
|
160
|
+
this.img = res.img;
|
|
161
|
+
// 如果可选开始日期,屏蔽默认的1900-01-01
|
|
162
|
+
this.currencyCode = res.currencyCode;
|
|
163
|
+
//@ts-ignore
|
|
164
|
+
this.columnCount = res.columnCount ? res.columnCount : 4;
|
|
165
|
+
if (res.portlets) {
|
|
166
|
+
if (!isRefresh) {
|
|
167
|
+
this.portlets = JSON.parse(JSON.stringify(res.portlets));
|
|
168
|
+
}
|
|
169
|
+
this.rowCount =
|
|
170
|
+
res.portlets.length > 0
|
|
171
|
+
? Math.max.apply(Math, res.portlets.map(function (o) {
|
|
172
|
+
return o.posY;
|
|
173
|
+
})) + 2
|
|
174
|
+
: 2;
|
|
175
|
+
// new Dashboard
|
|
176
|
+
if (this.portlets && this.portlets.length) {
|
|
177
|
+
this.fieldsArr[res.id] = {};
|
|
178
|
+
this.portlets.forEach((el) => {
|
|
179
|
+
if (!Object.keys(this.fieldsArr[res.id]).includes(el.figureCode)) {
|
|
180
|
+
this.fieldsArr[res.id][el.figureCode] = JSON.parse(el.config).fields;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
this.portlets = this.portlets.filter((item) => item.figureCode);
|
|
184
|
+
this.getDataByPortletsNew(this.portlets, (_res) => {
|
|
185
|
+
callback(res, this.portlets);
|
|
186
|
+
}, null, isRefresh, res, roGet);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
callback(res, this.portlets);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.portlets = [];
|
|
194
|
+
this.columnCount = 4;
|
|
195
|
+
this.rowCount = 2;
|
|
196
|
+
callback(res, this.portlets);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
filterTriggerGetData(portlet, filterSettings, dashboard, callback) {
|
|
202
|
+
const config = portlet.config && JSON.parse(portlet.config);
|
|
203
|
+
let id = portlet.id === "00000000-0000-0000-0000-000000000000"
|
|
204
|
+
? portlet.newId
|
|
205
|
+
: portlet.id;
|
|
206
|
+
let params = this.getParamsByPortlet(portlet, null, null, dashboard);
|
|
207
|
+
let initFieldsArr;
|
|
208
|
+
let curFieldsArr;
|
|
209
|
+
if (!params.isTable) {
|
|
210
|
+
// 赋值portletFields_Temp
|
|
211
|
+
initFieldsArr = this.portletFields_Temp[id];
|
|
212
|
+
curFieldsArr = params.displayColumnFilter.split(",");
|
|
213
|
+
if (!initFieldsArr ||
|
|
214
|
+
this.needGetPortletData(initFieldsArr, curFieldsArr)) {
|
|
215
|
+
this.portletFields_Temp[id] = curFieldsArr;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (filterSettings && filterSettings.length) {
|
|
219
|
+
if (!params.columnFilter) {
|
|
220
|
+
params.columnFilter = [];
|
|
221
|
+
}
|
|
222
|
+
config.filterSettings = filterSettings;
|
|
223
|
+
filterSettings.forEach((setting) => {
|
|
224
|
+
if (config.portletType === "pivot") {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const _field = config.fields.find((item) => item.colName === setting.name);
|
|
228
|
+
const Type = _field && _field.dataType;
|
|
229
|
+
if (setting.items) {
|
|
230
|
+
setting.items.forEach((item) => {
|
|
231
|
+
params.columnFilter.push({
|
|
232
|
+
Field: setting.name,
|
|
233
|
+
Operator: "equal",
|
|
234
|
+
Type,
|
|
235
|
+
Value: Type === "date"
|
|
236
|
+
? moment(item).format("yyyy-MM-DD")
|
|
237
|
+
: Type === "datetime"
|
|
238
|
+
? moment(item).format("yyyy-MM-DD hh:mm:ss")
|
|
239
|
+
: item,
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
else if (setting.operator) {
|
|
244
|
+
params.columnFilter.push({
|
|
245
|
+
Field: setting.field,
|
|
246
|
+
Operator: "equal",
|
|
247
|
+
Type: setting.type,
|
|
248
|
+
Value: setting.type === "date"
|
|
249
|
+
? moment(setting.value).format("yyyy-MM-DD")
|
|
250
|
+
: setting.type === "datetime"
|
|
251
|
+
? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
|
|
252
|
+
: setting.value,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
config.filterSettings = [];
|
|
259
|
+
}
|
|
260
|
+
if (params.columnFilter instanceof Array) {
|
|
261
|
+
params.columnFilter = params.columnFilter.filter((item) => item.Field);
|
|
262
|
+
}
|
|
263
|
+
// json buffer
|
|
264
|
+
params["dashboardVersion"] = 2;
|
|
265
|
+
// json buffer
|
|
266
|
+
this.httpClient
|
|
267
|
+
.post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
|
|
268
|
+
headers: new HttpHeaders({
|
|
269
|
+
Authorization: `Bearer`,
|
|
270
|
+
}),
|
|
271
|
+
})
|
|
272
|
+
.subscribe((result) => {
|
|
273
|
+
result["data"].forEach((item) => {
|
|
274
|
+
item.Sector = this.translation[item.Sector] || item.Sector;
|
|
275
|
+
});
|
|
276
|
+
this.portletData_New[dashboard.id][id] = result;
|
|
277
|
+
this.pbf.triggerDashboardFilterChange.next({
|
|
278
|
+
id: dashboard.id,
|
|
279
|
+
newId: portlet.newId,
|
|
280
|
+
});
|
|
281
|
+
callback({ newId: portlet && portlet.newId, config });
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
removeParentheses(str) {
|
|
285
|
+
return str.split("(").join("").split(")").join("").split('"').join("");
|
|
286
|
+
}
|
|
287
|
+
getInfo() {
|
|
288
|
+
this.translation = JSON.parse(localStorage.getItem("translation"));
|
|
289
|
+
this.userInfo = JSON.parse(localStorage.getItem("userInfo"));
|
|
290
|
+
this.lang = this.pbf.getLanguageParams();
|
|
291
|
+
this.translation.DASHBOARD_ROLLING = this.translation.DASHBOARD_ROLLING
|
|
292
|
+
? this.translation.DASHBOARD_ROLLING
|
|
293
|
+
: "DASHBOARD_ROLLING";
|
|
294
|
+
}
|
|
295
|
+
/* Financial Analysis I get select Dropdown */
|
|
296
|
+
GetChartTypes() {
|
|
297
|
+
// Chart Type
|
|
298
|
+
return [
|
|
299
|
+
{
|
|
300
|
+
val: "mscombi2d",
|
|
301
|
+
displayVal: this.translation.SINGLEY2D,
|
|
302
|
+
hasSecondaryYAxis: false,
|
|
303
|
+
canSelectStyle: true,
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
val: "mscombi3d",
|
|
307
|
+
displayVal: this.translation.SINGLEY3D,
|
|
308
|
+
hasSecondaryYAxis: false,
|
|
309
|
+
canSelectStyle: true,
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
val: "mscombidy2d",
|
|
313
|
+
displayVal: this.translation.DUALY2D,
|
|
314
|
+
hasSecondaryYAxis: true,
|
|
315
|
+
canSelectStyle: true,
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
val: "msbar2d",
|
|
319
|
+
displayVal: this.translation.BAR2D,
|
|
320
|
+
hasSecondaryYAxis: false,
|
|
321
|
+
canSelectStyle: false,
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
val: "msbar3d",
|
|
325
|
+
displayVal: this.translation.BAR3D,
|
|
326
|
+
hasSecondaryYAxis: false,
|
|
327
|
+
canSelectStyle: false,
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
val: "stackedcolumn2dline",
|
|
331
|
+
displayVal: this.translation.STACKEDBAR2D,
|
|
332
|
+
hasSecondaryYAxis: false,
|
|
333
|
+
canSelectStyle: true,
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
val: "stackedcolumn3dline",
|
|
337
|
+
displayVal: this.translation.STACKEDBAR3D,
|
|
338
|
+
hasSecondaryYAxis: false,
|
|
339
|
+
canSelectStyle: true,
|
|
340
|
+
},
|
|
341
|
+
];
|
|
342
|
+
}
|
|
343
|
+
getCompanyDropdown() {
|
|
344
|
+
// company
|
|
345
|
+
let data = {
|
|
346
|
+
accountId: this.userInfo.accountId,
|
|
347
|
+
username: this.userInfo.username,
|
|
348
|
+
language: this.lang,
|
|
349
|
+
companyType: "portfolio",
|
|
350
|
+
};
|
|
351
|
+
this.http.post(this.api.urlList.GetAllCompanyByAccount, data, (res) => {
|
|
352
|
+
if (res) {
|
|
353
|
+
this.companyDropdownList = res;
|
|
354
|
+
// return res;
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
getCurrencyDropdown() {
|
|
359
|
+
// Currency
|
|
360
|
+
let data = {
|
|
361
|
+
accountId: this.userInfo.accountId,
|
|
362
|
+
username: this.userInfo.username,
|
|
363
|
+
language: this.lang,
|
|
364
|
+
alias: "Currency",
|
|
365
|
+
};
|
|
366
|
+
this.http.post(this.api.urlList.GetDropdown, data, (res) => {
|
|
367
|
+
if (res) {
|
|
368
|
+
this.currencyDropdownList = res;
|
|
369
|
+
// return res;
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
GetTimeMeasure() {
|
|
374
|
+
// Time Measure
|
|
375
|
+
return [
|
|
376
|
+
{
|
|
377
|
+
key: "MTD",
|
|
378
|
+
val: this.translation.MONTHLY,
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
key: "QTD",
|
|
382
|
+
val: this.translation.QUARTERLY,
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
key: "SYTD",
|
|
386
|
+
val: this.translation.SEMIANNUALLY,
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
key: "YTD",
|
|
390
|
+
val: this.translation.ANNUALLY,
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
key: "FYTD",
|
|
394
|
+
val: this.translation.ANNUALLYFY,
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
key: "LTM",
|
|
398
|
+
val: this.translation.LAST12MONTH,
|
|
399
|
+
},
|
|
400
|
+
];
|
|
401
|
+
}
|
|
402
|
+
GetPeriods() {
|
|
403
|
+
// Previous Period
|
|
404
|
+
return [
|
|
405
|
+
{
|
|
406
|
+
val: 2,
|
|
407
|
+
displayVal: this.translation.LAST2DATA,
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
val: 3,
|
|
411
|
+
displayVal: this.translation.LAST3DATA,
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
val: 4,
|
|
415
|
+
displayVal: this.translation.LAST4DATA,
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
val: 5,
|
|
419
|
+
displayVal: this.translation.LAST5DATA,
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
val: 6,
|
|
423
|
+
displayVal: this.translation.LAST6DATA,
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
val: 7,
|
|
427
|
+
displayVal: this.translation.LAST7DATA,
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
val: 8,
|
|
431
|
+
displayVal: this.translation.LAST8DATA,
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
val: 9,
|
|
435
|
+
displayVal: this.translation.LAST9DATA,
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
val: 10,
|
|
439
|
+
displayVal: this.translation.LAST10DATA,
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
val: 11,
|
|
443
|
+
displayVal: this.translation.LAST11DATA,
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
val: 12,
|
|
447
|
+
displayVal: this.translation.LAST12DATA,
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
val: 13,
|
|
451
|
+
displayVal: this.translation.LAST13DATA,
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
val: 14,
|
|
455
|
+
displayVal: this.translation.LAST14DATA,
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
val: 15,
|
|
459
|
+
displayVal: this.translation.LAST15DATA,
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
val: 16,
|
|
463
|
+
displayVal: this.translation.LAST16DATA,
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
val: 17,
|
|
467
|
+
displayVal: this.translation.LAST17DATA,
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
val: 18,
|
|
471
|
+
displayVal: this.translation.LAST18DATA,
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
val: 19,
|
|
475
|
+
displayVal: this.translation.LAST19DATA,
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
val: 20,
|
|
479
|
+
displayVal: this.translation.LAST20DATA,
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
val: 21,
|
|
483
|
+
displayVal: this.translation.LAST21DATA,
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
val: 22,
|
|
487
|
+
displayVal: this.translation.LAST22DATA,
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
val: 23,
|
|
491
|
+
displayVal: this.translation.LAST23DATA,
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
val: 24,
|
|
495
|
+
displayVal: this.translation.LAST24DATA,
|
|
496
|
+
},
|
|
497
|
+
];
|
|
498
|
+
}
|
|
499
|
+
GetFollowingPeriods() {
|
|
500
|
+
// Following Period
|
|
501
|
+
return [
|
|
502
|
+
{
|
|
503
|
+
val: 0,
|
|
504
|
+
displayVal: this.translation.NONEXTDATA,
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
val: 3,
|
|
508
|
+
displayVal: this.translation.NEXT3DATA,
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
val: 4,
|
|
512
|
+
displayVal: this.translation.NEXT4DATA,
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
val: 5,
|
|
516
|
+
displayVal: this.translation.NEXT5DATA,
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
val: 6,
|
|
520
|
+
displayVal: this.translation.NEXT6DATA,
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
val: 7,
|
|
524
|
+
displayVal: this.translation.NEXT7DATA,
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
val: 8,
|
|
528
|
+
displayVal: this.translation.NEXT8DATA,
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
val: 9,
|
|
532
|
+
displayVal: this.translation.NEXT9DATA,
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
val: 10,
|
|
536
|
+
displayVal: this.translation.NEXT10DATA,
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
val: 11,
|
|
540
|
+
displayVal: this.translation.NEXT11DATA,
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
val: 12,
|
|
544
|
+
displayVal: this.translation.NEXT12DATA,
|
|
545
|
+
},
|
|
546
|
+
];
|
|
547
|
+
}
|
|
548
|
+
GetFinancialFigureCodes() {
|
|
549
|
+
// Financial Type
|
|
550
|
+
return [
|
|
551
|
+
{
|
|
552
|
+
key: "accountAssetFigure",
|
|
553
|
+
val: this.translation.DASHD_ACCOUNTASSETFIGURE,
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
key: "accountEquityFigure",
|
|
557
|
+
val: this.translation.DASHD_ACCOUNTEQUITYFIGURE,
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
key: "accountLiabilityFigure",
|
|
561
|
+
val: this.translation.DASHD_ACCOUNTLIABILITYFIGURE,
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
key: "accountPLFigure",
|
|
565
|
+
val: this.translation.DASHD_ACCOUNTPLFIGURE,
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
key: "accountCashflowFigure",
|
|
569
|
+
val: this.translation.DASHD_ACCOUNTCASHFLOWFIGURE,
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
key: "accountOperationKPIFigure",
|
|
573
|
+
val: this.translation.DASHD_ACCOUNTOPERATIONKPIFIGURE,
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
key: "accountRATIOFigure",
|
|
577
|
+
val: this.translation.DASHD_ACCOUNTRATIOFIGURE,
|
|
578
|
+
},
|
|
579
|
+
];
|
|
580
|
+
}
|
|
581
|
+
GetFinancialSubType(financials) {
|
|
582
|
+
var financialTypes = [];
|
|
583
|
+
for (var item in financials) {
|
|
584
|
+
financialTypes.push({
|
|
585
|
+
subType: item["subType"],
|
|
586
|
+
subTypeCode: item["subTypeCode"],
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
return financialTypes;
|
|
590
|
+
}
|
|
591
|
+
GetFinancialItems(id, key) {
|
|
592
|
+
let data = {
|
|
593
|
+
username: this.userInfo.username,
|
|
594
|
+
accountId: this.userInfo.accountId,
|
|
595
|
+
investeeIds: [id],
|
|
596
|
+
figureCode: key,
|
|
597
|
+
language: this.lang,
|
|
598
|
+
};
|
|
599
|
+
this.http.post(this.api.urlList.GetFinancialItems, data, (res) => {
|
|
600
|
+
if (res) {
|
|
601
|
+
return res;
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
/* get toggle */
|
|
606
|
+
GetTheme() {
|
|
607
|
+
return [
|
|
608
|
+
{ key: "zune", val: this.translation.CHARTTHEME_ZUNE },
|
|
609
|
+
{ key: "ocean", val: this.translation.CHARTTHEME_OCEAN },
|
|
610
|
+
{ key: "carbon", val: this.translation.CHARTTHEME_CARBON },
|
|
611
|
+
];
|
|
612
|
+
}
|
|
613
|
+
GetFollowingDataType() {
|
|
614
|
+
return [
|
|
615
|
+
{ key: "budget", val: this.translation.BUDGET },
|
|
616
|
+
{ key: "forecast", val: this.translation.FORECAST },
|
|
617
|
+
// { key: 'rolling', val: this.translation.DASHBOARD_ROLLING },
|
|
618
|
+
{ key: "rolling", val: "Rolling" },
|
|
619
|
+
];
|
|
620
|
+
}
|
|
621
|
+
GetFormat() {
|
|
622
|
+
return [
|
|
623
|
+
{ key: "number", val: this.translation.NUMBER },
|
|
624
|
+
{ key: "percentage", val: this.translation.PERCENTAGE },
|
|
625
|
+
];
|
|
626
|
+
}
|
|
627
|
+
GetChartStyle() {
|
|
628
|
+
return [
|
|
629
|
+
{ key: "bar", val: this.translation.BAR },
|
|
630
|
+
{ key: "line", val: this.translation.LINE },
|
|
631
|
+
{ key: "area", val: this.translation.AREA },
|
|
632
|
+
];
|
|
633
|
+
}
|
|
634
|
+
GetDataTypes = function () {
|
|
635
|
+
return [
|
|
636
|
+
{ key: "budget", val: this.translation.BUDGET },
|
|
637
|
+
{ key: "actual", val: this.translation.ACTUAL },
|
|
638
|
+
{ key: "forecast", val: this.translation.FORECAST },
|
|
639
|
+
{ key: "rolling", val: "Rolling" },
|
|
640
|
+
];
|
|
641
|
+
};
|
|
642
|
+
/* Fund Operation Summary */
|
|
643
|
+
getFundDropdown() {
|
|
644
|
+
let data = {
|
|
645
|
+
username: this.userInfo.username,
|
|
646
|
+
accountId: this.userInfo.accountId,
|
|
647
|
+
investorId: this.userInfo.accountId,
|
|
648
|
+
language: this.lang,
|
|
649
|
+
};
|
|
650
|
+
this.http.post(this.api.urlList.GetFundListByInvestorId, data, (res) => {
|
|
651
|
+
if (res) {
|
|
652
|
+
this.fundDropdownList = res;
|
|
653
|
+
// return res;
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
/* Fund performance */
|
|
658
|
+
GetGrouping() {
|
|
659
|
+
return [
|
|
660
|
+
{ key: "null", val: "" },
|
|
661
|
+
{ key: "investor", val: this.translation.DASHD_GP_INVESTOR },
|
|
662
|
+
{ key: "fund", val: this.translation.DASHD_GP_FUND },
|
|
663
|
+
];
|
|
664
|
+
}
|
|
665
|
+
/* Fund Operation Summary */
|
|
666
|
+
getFundDropdown_(callbake) {
|
|
667
|
+
let data = {
|
|
668
|
+
username: this.userInfo.username,
|
|
669
|
+
accountId: this.userInfo.accountId,
|
|
670
|
+
investorId: this.userInfo.accountId,
|
|
671
|
+
language: this.lang,
|
|
672
|
+
};
|
|
673
|
+
this.http.post(this.api.urlList.GetFundListByInvestorId, data, (res) => {
|
|
674
|
+
if (res) {
|
|
675
|
+
this.fundDropdownList = res;
|
|
676
|
+
// this.GetAllInvestee(res => {
|
|
677
|
+
callbake();
|
|
678
|
+
// });
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
/* Investor position */
|
|
683
|
+
GetAllInvestee(callbake) {
|
|
684
|
+
let data = {
|
|
685
|
+
username: this.userInfo.username,
|
|
686
|
+
accountId: this.userInfo.accountId,
|
|
687
|
+
language: this.lang,
|
|
688
|
+
};
|
|
689
|
+
this.http.post(this.api.urlList.GetAllInvestee, data, (res) => {
|
|
690
|
+
if (res) {
|
|
691
|
+
this.allInvesteeList = res;
|
|
692
|
+
callbake();
|
|
693
|
+
}
|
|
694
|
+
});
|
|
695
|
+
}
|
|
696
|
+
pivotTableformatNumber(num) {
|
|
697
|
+
switch (num) {
|
|
698
|
+
case 1:
|
|
699
|
+
case 2:
|
|
700
|
+
case 3:
|
|
701
|
+
return "#,###;(#,###)";
|
|
702
|
+
case 4:
|
|
703
|
+
case 5:
|
|
704
|
+
case 6:
|
|
705
|
+
return "#,###.0;(#,###.0)";
|
|
706
|
+
case 7:
|
|
707
|
+
case 8:
|
|
708
|
+
case 9:
|
|
709
|
+
return "#,###.00;(#,###.00)";
|
|
710
|
+
case 10:
|
|
711
|
+
case 11:
|
|
712
|
+
case 12:
|
|
713
|
+
return "#,###,,;(#,###,,)";
|
|
714
|
+
case 13:
|
|
715
|
+
case 14:
|
|
716
|
+
case 15:
|
|
717
|
+
return "#,###,,.0;(#,###,,.0)";
|
|
718
|
+
case 16:
|
|
719
|
+
case 17:
|
|
720
|
+
case 18:
|
|
721
|
+
return "#,###,,.00;(#,###,,.00)";
|
|
722
|
+
default:
|
|
723
|
+
return "#,###.00;-#,###.00";
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
pivotTableformatInteger(num) {
|
|
727
|
+
switch (num) {
|
|
728
|
+
case 1:
|
|
729
|
+
case 3:
|
|
730
|
+
case 4:
|
|
731
|
+
return "#,###;(#,###)";
|
|
732
|
+
case 4:
|
|
733
|
+
case 5:
|
|
734
|
+
case 6:
|
|
735
|
+
return "#,###,,;(#,###,,)";
|
|
736
|
+
default:
|
|
737
|
+
return "#,###;(#,###)";
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
pivotTableformatPercent(num) {
|
|
741
|
+
switch (num) {
|
|
742
|
+
case 1:
|
|
743
|
+
case 2:
|
|
744
|
+
case 3:
|
|
745
|
+
return "P";
|
|
746
|
+
case 4:
|
|
747
|
+
case 5:
|
|
748
|
+
case 6:
|
|
749
|
+
return "P1";
|
|
750
|
+
case 7:
|
|
751
|
+
case 8:
|
|
752
|
+
case 9:
|
|
753
|
+
return "P2";
|
|
754
|
+
case 10:
|
|
755
|
+
case 11:
|
|
756
|
+
case 12:
|
|
757
|
+
return "#,###0.00'x';(#,###0.00'x')";
|
|
758
|
+
default:
|
|
759
|
+
return "P2";
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
pivotTableformatPercentNum(num) {
|
|
763
|
+
switch (num) {
|
|
764
|
+
case 1:
|
|
765
|
+
return "####'%'";
|
|
766
|
+
case 2:
|
|
767
|
+
return "####.0'%'";
|
|
768
|
+
case 3:
|
|
769
|
+
return "####.00'%'";
|
|
770
|
+
default:
|
|
771
|
+
return "####.00'%'";
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
pivotTableformatMultiple(num) {
|
|
775
|
+
switch (num) {
|
|
776
|
+
case 1:
|
|
777
|
+
return "####'x'";
|
|
778
|
+
case 2:
|
|
779
|
+
return "###0.0'x'";
|
|
780
|
+
case 3:
|
|
781
|
+
return "###0.00'x'";
|
|
782
|
+
default:
|
|
783
|
+
return "###0.00'x'";
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
formatNumber(num) {
|
|
787
|
+
switch (num) {
|
|
788
|
+
case 0:
|
|
789
|
+
return "N";
|
|
790
|
+
case 1:
|
|
791
|
+
return "N1";
|
|
792
|
+
case 2:
|
|
793
|
+
return "N2";
|
|
794
|
+
case 3:
|
|
795
|
+
return "N3";
|
|
796
|
+
case 4:
|
|
797
|
+
return "N4";
|
|
798
|
+
case 5:
|
|
799
|
+
return "N5";
|
|
800
|
+
case 6:
|
|
801
|
+
return "N6";
|
|
802
|
+
default:
|
|
803
|
+
return "N2";
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
formatPercent(num) {
|
|
807
|
+
switch (num) {
|
|
808
|
+
case 0:
|
|
809
|
+
return "P";
|
|
810
|
+
case 1:
|
|
811
|
+
return "P1";
|
|
812
|
+
case 2:
|
|
813
|
+
return "P2";
|
|
814
|
+
case 3:
|
|
815
|
+
return "P3";
|
|
816
|
+
case 4:
|
|
817
|
+
return "P4";
|
|
818
|
+
case 5:
|
|
819
|
+
return "P5";
|
|
820
|
+
case 6:
|
|
821
|
+
return "P6";
|
|
822
|
+
default:
|
|
823
|
+
return "P2";
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
formatPercentNum(num) {
|
|
827
|
+
switch (num) {
|
|
828
|
+
case 0:
|
|
829
|
+
return "####'%'";
|
|
830
|
+
case 1:
|
|
831
|
+
return "###0.0'%'";
|
|
832
|
+
case 2:
|
|
833
|
+
return "###0.00'%'";
|
|
834
|
+
default:
|
|
835
|
+
return "###0.00'%'";
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
formatMultiple(num) {
|
|
839
|
+
switch (num) {
|
|
840
|
+
case 0:
|
|
841
|
+
return "####'x'";
|
|
842
|
+
case 1:
|
|
843
|
+
return "###0.0'x'";
|
|
844
|
+
case 2:
|
|
845
|
+
return "###0.00'x'";
|
|
846
|
+
default:
|
|
847
|
+
return "###0.00'x'";
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
GetFigureFormat() {
|
|
851
|
+
// return [
|
|
852
|
+
// { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 1 }, //
|
|
853
|
+
// { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 2 }, //
|
|
854
|
+
// { key1: "1,234,567.00", key2: "(1,234,567.00)", key3: "-", val: 3 }, //
|
|
855
|
+
// { key1: "1,234,567.00", key2: "(1,234,567.00)", key3: "-", val: 4 }, //
|
|
856
|
+
// { key1: "1", key2: "(1)", key3: "-", val: 5 }, //
|
|
857
|
+
// { key1: "1", key2: "(1)", key3: "-", val: 6 }, //
|
|
858
|
+
// { key1: "1.2", key2: "(1.2)", key3: "0.0", val: 7 }, //
|
|
859
|
+
// { key1: "1.2", key2: "(1.2)", key3: "0.0", val: 8 }, //
|
|
860
|
+
// { key1: "1.23", key2: "(1.23)", key3: "0.00", val: 9 }, //
|
|
861
|
+
// { key1: "1.23", key2: "(1.23)", key3: "0.00", val: 10 }, //
|
|
862
|
+
// ];
|
|
863
|
+
return [
|
|
864
|
+
{ key: "1,234,567;(1,234,567);0", val: 1 },
|
|
865
|
+
{ key: "1,234,567;(1,234,567);-", val: 2 },
|
|
866
|
+
{ key: "1,234,567;(1,234,567);", val: 3 },
|
|
867
|
+
{ key: "1,234,567.0;(1,234,567.0);0.0", val: 4 },
|
|
868
|
+
{ key: "1,234,567.0;(1,234,567.0);-", val: 5 },
|
|
869
|
+
{ key: "1,234,567.0;(1,234,567.0);", val: 6 },
|
|
870
|
+
{ key: "1,234,567.00;(1,234,567.00);0.00", val: 7 },
|
|
871
|
+
{ key: "1,234,567.00;(1,234,567.00);-", val: 8 },
|
|
872
|
+
{ key: "1,234,567.00;(1,234,567.00);", val: 9 },
|
|
873
|
+
{ key: "1;(1);0", val: 10 },
|
|
874
|
+
{ key: "1;(1);-", val: 11 },
|
|
875
|
+
{ key: "1;(1);", val: 12 },
|
|
876
|
+
{ key: "1.2;(1.2);0.0", val: 13 },
|
|
877
|
+
{ key: "1.2;(1.2);-", val: 14 },
|
|
878
|
+
{ key: "1.2;(1.2);", val: 15 },
|
|
879
|
+
{ key: "1.23;(1.23);0.00", val: 16 },
|
|
880
|
+
{ key: "1.23;(1.23);-", val: 17 },
|
|
881
|
+
{ key: "1.23;(1.23);", val: 18 },
|
|
882
|
+
];
|
|
883
|
+
}
|
|
884
|
+
// public GetFigureFormat2() {
|
|
885
|
+
// return [
|
|
886
|
+
// // 1234567
|
|
887
|
+
// { key: "1,234,567", val: 11 },
|
|
888
|
+
// { key: "1,234,567.00", val: 12 },
|
|
889
|
+
// { key: "1", val: 13 },
|
|
890
|
+
// { key: "1.2", val: 14 },
|
|
891
|
+
// { key: "1.23", val: 15 },
|
|
892
|
+
// ];
|
|
893
|
+
// };
|
|
894
|
+
GetFigureFormat3() {
|
|
895
|
+
// return [
|
|
896
|
+
// { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 1 }, //
|
|
897
|
+
// { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 2 }, //
|
|
898
|
+
// { key1: "1", key2: "(1)", key3: "-", val: 3 }, //
|
|
899
|
+
// { key1: "1", key2: "(1)", key3: "-", val: 4 }, //
|
|
900
|
+
// { key: "1", val: 5 },
|
|
901
|
+
// ];
|
|
902
|
+
return [
|
|
903
|
+
{ key: "1,234,567;(1,234,567);0", val: 1 },
|
|
904
|
+
{ key: "1,234,567;(1,234,567);-", val: 2 },
|
|
905
|
+
{ key: "1,234,567;(1,234,567);", val: 3 },
|
|
906
|
+
{ key: "1;(1);0", val: 4 },
|
|
907
|
+
{ key: "1;(1);-", val: 5 },
|
|
908
|
+
{ key: "1;(1);", val: 6 },
|
|
909
|
+
];
|
|
910
|
+
}
|
|
911
|
+
GetPercentFormats() {
|
|
912
|
+
// return [
|
|
913
|
+
// { key1: "0%", key2: "0%", key3: "-", val: 1 },
|
|
914
|
+
// { key1: "0%", key2: "(0%)", key3: "-", val: 2 },
|
|
915
|
+
// { key1: "0.0%", key2: "0.0%", key3: "-", val: 3 },
|
|
916
|
+
// { key1: "0.0%", key2: "(0.0%)", key3: "-", val: 4 },
|
|
917
|
+
// { key1: "0.00%", key2: "0.00%", key3: "-", val: 5 },
|
|
918
|
+
// { key1: "0.00%", key2: "(0.00%)", key3: "-", val: 6 },
|
|
919
|
+
// ];
|
|
920
|
+
return [
|
|
921
|
+
{ key: "1%;(1%);0%", val: 1 },
|
|
922
|
+
{ key: "1%;(1%);-", val: 2 },
|
|
923
|
+
{ key: "1%;(1%);", val: 3 },
|
|
924
|
+
{ key: "1.2%;(1.2%);0.0%", val: 4 },
|
|
925
|
+
{ key: "1.2%;(1.2%);-", val: 5 },
|
|
926
|
+
{ key: "1.2%;(1.2%);", val: 6 },
|
|
927
|
+
{ key: "1.23%;(1.23%);0.00%", val: 7 },
|
|
928
|
+
{ key: "1.23%;(1.23%);-", val: 8 },
|
|
929
|
+
{ key: "1.23%;(1.23%);", val: 9 },
|
|
930
|
+
{ key: "1.23x;(1.23x);0.00x", val: 10 },
|
|
931
|
+
{ key: "1.23x;(1.23x);-", val: 11 },
|
|
932
|
+
{ key: "1.23x;(1.23x);", val: 12 },
|
|
933
|
+
];
|
|
934
|
+
}
|
|
935
|
+
GetMultipleFormats() {
|
|
936
|
+
return [
|
|
937
|
+
{ key: "0x", val: 1 },
|
|
938
|
+
{ key: "0.0x", val: 2 },
|
|
939
|
+
{ key: "0.00x", val: 3 },
|
|
940
|
+
];
|
|
941
|
+
}
|
|
942
|
+
getAggregateType(aggregateType) {
|
|
943
|
+
switch (aggregateType) {
|
|
944
|
+
case "CalculateIRR":
|
|
945
|
+
return "CI";
|
|
946
|
+
case "CalculateIRRIRRDate":
|
|
947
|
+
return "CI_IRR";
|
|
948
|
+
case "CalculateIRRBeforeCarried":
|
|
949
|
+
return "CI_BEFORE_CARRY";
|
|
950
|
+
case "CalculateIRRReported":
|
|
951
|
+
return "CI_REPORTED";
|
|
952
|
+
case "CalculateIRRActualAudited":
|
|
953
|
+
return "CI_ACTUAL_AUDITED";
|
|
954
|
+
case "CalculateIRRMTD":
|
|
955
|
+
return "CI_MTD";
|
|
956
|
+
case "CalculateIRRQTD":
|
|
957
|
+
return "CI_QTD";
|
|
958
|
+
case "CalculateIRRYTD":
|
|
959
|
+
return "CI_YTD";
|
|
960
|
+
case "CalculateTWRMTD":
|
|
961
|
+
return "CTWR_MTD";
|
|
962
|
+
case "CalculateTWRQTD":
|
|
963
|
+
return "CTWR_QTD";
|
|
964
|
+
case "CalculateTWRYTD":
|
|
965
|
+
return "CTWR_YTD";
|
|
966
|
+
case "CalculateVARMTD_99":
|
|
967
|
+
return "CVAR_MTD_99";
|
|
968
|
+
case "CalculateVARQTD_99":
|
|
969
|
+
return "CVAR_QTD_99";
|
|
970
|
+
case "CalculateVARYTD_99":
|
|
971
|
+
return "CVAR_YTD_99";
|
|
972
|
+
case "CalculateVARMTD_95":
|
|
973
|
+
return "CVAR_MTD_95";
|
|
974
|
+
case "CalculateVARQTD_95":
|
|
975
|
+
return "CVAR_QTD_95";
|
|
976
|
+
case "CalculateVARYTD_95":
|
|
977
|
+
return "CVAR_YTD_95";
|
|
978
|
+
case "CalculateMultiple":
|
|
979
|
+
return "CM";
|
|
980
|
+
case "CalculatePIC":
|
|
981
|
+
return "CP";
|
|
982
|
+
case "CalculateDPI":
|
|
983
|
+
return "CD";
|
|
984
|
+
case "CalculateTVPI":
|
|
985
|
+
return "CT";
|
|
986
|
+
case "CalculateRVPI":
|
|
987
|
+
return "CR";
|
|
988
|
+
case "CalculateMActualAudited":
|
|
989
|
+
return "CM_ACTUAL_AUDITED";
|
|
990
|
+
case "CalculateMReported":
|
|
991
|
+
return "CM_REPORTED";
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
getCalculateMethod(colName) {
|
|
995
|
+
switch (colName) {
|
|
996
|
+
case "CI":
|
|
997
|
+
return "CalculateIRR";
|
|
998
|
+
case "CI_IRR":
|
|
999
|
+
return "CalculateIRRIRRDate";
|
|
1000
|
+
case "CI_BEFORE_CARRY":
|
|
1001
|
+
return "CalculateIRRBeforeCarried";
|
|
1002
|
+
case "CI_REPORTED":
|
|
1003
|
+
return "CalculateIRRReported";
|
|
1004
|
+
case "CI_ACTUAL_AUDITED":
|
|
1005
|
+
return "CalculateIRRActualAudited";
|
|
1006
|
+
case "CI_MTD":
|
|
1007
|
+
return "CalculateIRRMTD";
|
|
1008
|
+
case "CI_QTD":
|
|
1009
|
+
return "CalculateIRRQTD";
|
|
1010
|
+
case "CI_YTD":
|
|
1011
|
+
return "CalculateIRRYTD";
|
|
1012
|
+
case "CTWR_MTD":
|
|
1013
|
+
return "CalculateTWRMTD";
|
|
1014
|
+
case "CTWR_QTD":
|
|
1015
|
+
return "CalculateTWRQTD";
|
|
1016
|
+
case "CTWR_YTD":
|
|
1017
|
+
return "CalculateTWRYTD";
|
|
1018
|
+
case "CVAR_MTD_99":
|
|
1019
|
+
return "CalculateVARMTD_99";
|
|
1020
|
+
case "CVAR_QTD_99":
|
|
1021
|
+
return "CalculateVARQTD_99";
|
|
1022
|
+
case "CVAR_YTD_99":
|
|
1023
|
+
return "CalculateVARYTD_99";
|
|
1024
|
+
case "CVAR_MTD_95":
|
|
1025
|
+
return "CalculateVARMTD_95";
|
|
1026
|
+
case "CVAR_QTD_95":
|
|
1027
|
+
return "CalculateVARQTD_95";
|
|
1028
|
+
case "CVAR_YTD_95":
|
|
1029
|
+
return "CalculateVARYTD_95";
|
|
1030
|
+
case "CM":
|
|
1031
|
+
return "CalculateMultiple";
|
|
1032
|
+
case "CP":
|
|
1033
|
+
return "CalculatePIC";
|
|
1034
|
+
case "CD":
|
|
1035
|
+
return "CalculateDPI";
|
|
1036
|
+
case "CT":
|
|
1037
|
+
return "CalculateTVPI";
|
|
1038
|
+
case "CR":
|
|
1039
|
+
return "CalculateRVPI";
|
|
1040
|
+
case "CM_ACTUAL_AUDITED":
|
|
1041
|
+
return "CalculateMActualAudited";
|
|
1042
|
+
case "CM_REPORTED":
|
|
1043
|
+
return "CalculateMReported";
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
// 格式化数字
|
|
1047
|
+
number_format(number, decimals, dec_point, thousands_sep, roundtag) {
|
|
1048
|
+
/*
|
|
1049
|
+
* 参数说明:
|
|
1050
|
+
* number:要格式化的数字
|
|
1051
|
+
* decimals:保留几位小数
|
|
1052
|
+
* dec_point:小数点符号
|
|
1053
|
+
* thousands_sep:千分位符号
|
|
1054
|
+
* roundtag:舍入参数,默认 "ceil" 向上取,"floor"向下取,"round" 四舍五入
|
|
1055
|
+
* */
|
|
1056
|
+
number = (number + "").replace(/[^0-9+-Ee.]/g, "");
|
|
1057
|
+
roundtag = roundtag || "ceil"; //"ceil","floor","round"
|
|
1058
|
+
let n = !isFinite(+number) ? 0 : +number;
|
|
1059
|
+
let prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
|
|
1060
|
+
let sep = typeof thousands_sep === "undefined" ? "," : thousands_sep;
|
|
1061
|
+
let dec = typeof dec_point === "undefined" ? "." : dec_point;
|
|
1062
|
+
// let s = '';
|
|
1063
|
+
let s = (prec
|
|
1064
|
+
? this.toFixedFix(n, prec, roundtag)
|
|
1065
|
+
: "" + this.pbf.tofixedNum(n, decimals)).split("."); //this.pbf.tofixedNum(Math.abs(value), decimal)
|
|
1066
|
+
var re = /(-?\d+)(\d{3})/;
|
|
1067
|
+
while (re.test(s[0])) {
|
|
1068
|
+
s[0] = s[0].replace(re, "$1" + sep + "$2");
|
|
1069
|
+
}
|
|
1070
|
+
if ((s[1] || "").length < prec) {
|
|
1071
|
+
s[1] = s[1] || "";
|
|
1072
|
+
s[1] += new Array(prec - s[1].length + 1).join("0");
|
|
1073
|
+
}
|
|
1074
|
+
return s.join(dec);
|
|
1075
|
+
}
|
|
1076
|
+
toFixedFix(n, prec, roundtag) {
|
|
1077
|
+
var k = Math.pow(10, prec);
|
|
1078
|
+
return ("" +
|
|
1079
|
+
parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)) /
|
|
1080
|
+
k);
|
|
1081
|
+
}
|
|
1082
|
+
getResultByDataTable(portlet, isGetTotal = false, copyId = false, id) {
|
|
1083
|
+
let result = [];
|
|
1084
|
+
let datamartCode = portlet.figureCode;
|
|
1085
|
+
let identifier = portlet.id === "00000000-0000-0000-0000-000000000000"
|
|
1086
|
+
? portlet.newId
|
|
1087
|
+
: portlet.id;
|
|
1088
|
+
if (portlet.copyId) {
|
|
1089
|
+
identifier = portlet.copyId;
|
|
1090
|
+
}
|
|
1091
|
+
if (this.portletData_New[id][identifier]) {
|
|
1092
|
+
result = isGetTotal
|
|
1093
|
+
? this.portletData_New[id][identifier] &&
|
|
1094
|
+
this.portletData_New[id][identifier].total
|
|
1095
|
+
: this.portletData_New[id][identifier] &&
|
|
1096
|
+
this.portletData_New[id][identifier].data;
|
|
1097
|
+
}
|
|
1098
|
+
else {
|
|
1099
|
+
result = isGetTotal
|
|
1100
|
+
? this.portletResults_New[id][datamartCode] &&
|
|
1101
|
+
this.portletResults_New[id][datamartCode].total
|
|
1102
|
+
: this.portletResults_New[id][datamartCode] &&
|
|
1103
|
+
this.portletResults_New[id][datamartCode].data;
|
|
1104
|
+
}
|
|
1105
|
+
return result;
|
|
1106
|
+
}
|
|
1107
|
+
// SMP2-3708 END
|
|
1108
|
+
getOrderByColumnsNew(datamartCode, dashboard) {
|
|
1109
|
+
return new Promise((resolve) => {
|
|
1110
|
+
if (this.sourcesData[dashboard.id] && dashboard) {
|
|
1111
|
+
const outputRes = [];
|
|
1112
|
+
if (this.sourcesData[dashboard.id].length) {
|
|
1113
|
+
let config = JSON.parse(dashboard.config);
|
|
1114
|
+
const dataViews = config.views;
|
|
1115
|
+
if (dashboard && dashboard.config) {
|
|
1116
|
+
const dataMart = this.sourcesData[dashboard.id].filter((item) => item.entityType === dashboard.entityType);
|
|
1117
|
+
dataMart.forEach((_data) => {
|
|
1118
|
+
_data.views.forEach((view) => {
|
|
1119
|
+
if (dataViews.find((item) => item.datamartViewId === view.id)) {
|
|
1120
|
+
view.tables.forEach((table) => {
|
|
1121
|
+
outputRes.push(table);
|
|
1122
|
+
});
|
|
1123
|
+
}
|
|
1124
|
+
});
|
|
1125
|
+
});
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
resolve(outputRes);
|
|
1129
|
+
}
|
|
1130
|
+
else {
|
|
1131
|
+
// 处理 this.sourcesData 没有值
|
|
1132
|
+
let data = {
|
|
1133
|
+
accountId: this.userInfo.accountId,
|
|
1134
|
+
language: this.lang,
|
|
1135
|
+
dashboardVersion: 2,
|
|
1136
|
+
};
|
|
1137
|
+
this.http.post(this.api.urlList.GetSources, data, (res) => {
|
|
1138
|
+
const outputRes = [];
|
|
1139
|
+
if (res && res.length) {
|
|
1140
|
+
this.sourcesData[dashboard.id] = res;
|
|
1141
|
+
let config = JSON.parse(dashboard.config);
|
|
1142
|
+
const dataViews = config.views;
|
|
1143
|
+
if (dashboard && dashboard.config) {
|
|
1144
|
+
const dataMart = res.filter((item) => item.entityType === dashboard.entityType);
|
|
1145
|
+
dataMart.forEach((_data) => {
|
|
1146
|
+
_data.views.forEach((view) => {
|
|
1147
|
+
if (dataViews.find((item) => item.datamartViewId === view.id)) {
|
|
1148
|
+
view.tables.forEach((table) => {
|
|
1149
|
+
outputRes.push(table);
|
|
1150
|
+
});
|
|
1151
|
+
}
|
|
1152
|
+
});
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
resolve(outputRes);
|
|
1157
|
+
});
|
|
1158
|
+
}
|
|
1159
|
+
});
|
|
1160
|
+
}
|
|
1161
|
+
async decompressArrayBuffer(input) {
|
|
1162
|
+
//create the stream
|
|
1163
|
+
const ds = new window.DecompressionStream("deflate-raw");
|
|
1164
|
+
//create the writer
|
|
1165
|
+
const writer = ds.writable.getWriter();
|
|
1166
|
+
//write the buffer to the writer thus decompressing it
|
|
1167
|
+
writer.write(input);
|
|
1168
|
+
writer.close();
|
|
1169
|
+
//create the output
|
|
1170
|
+
const output = [];
|
|
1171
|
+
//create the reader
|
|
1172
|
+
const reader = ds.readable.getReader();
|
|
1173
|
+
let totalSize = 0;
|
|
1174
|
+
//go through each chunk and add it to the output
|
|
1175
|
+
while (true) {
|
|
1176
|
+
const { value, done } = await reader.read();
|
|
1177
|
+
if (done)
|
|
1178
|
+
break;
|
|
1179
|
+
output.push(value);
|
|
1180
|
+
totalSize += value.byteLength;
|
|
1181
|
+
}
|
|
1182
|
+
const concatenated = new Uint8Array(totalSize);
|
|
1183
|
+
let offset = 0;
|
|
1184
|
+
//finally build the compressed array and return it
|
|
1185
|
+
for (const array of output) {
|
|
1186
|
+
concatenated.set(array, offset);
|
|
1187
|
+
offset += array.byteLength;
|
|
1188
|
+
}
|
|
1189
|
+
return concatenated;
|
|
1190
|
+
}
|
|
1191
|
+
getAllFields(item, dashboard) {
|
|
1192
|
+
const lang = this.pbf.getLanguageParams();
|
|
1193
|
+
return new Promise((resolve, reject) => {
|
|
1194
|
+
const dataMartCode = item.figureCode;
|
|
1195
|
+
const dataObj = {
|
|
1196
|
+
language: lang,
|
|
1197
|
+
dataMartCode,
|
|
1198
|
+
};
|
|
1199
|
+
this.setSchemaParams(dataObj, dataMartCode, dashboard);
|
|
1200
|
+
this.http.post(this.api.urlList.GetSchema, dataObj, (res) => {
|
|
1201
|
+
resolve(res);
|
|
1202
|
+
});
|
|
1203
|
+
});
|
|
1204
|
+
}
|
|
1205
|
+
setSchemaParams(dataObj, figureCode, dashboard) {
|
|
1206
|
+
if (this.checkIsQ2Q(dashboard.dataMartTables)) {
|
|
1207
|
+
dataObj["fromDate"] = dashboard.fromDate;
|
|
1208
|
+
dataObj["asOfDate"] = dashboard.asOfDate;
|
|
1209
|
+
}
|
|
1210
|
+
else if (figureCode.indexOf("FinancialFigure") !== -1) {
|
|
1211
|
+
dataObj["entityType"] = dashboard.entityList.map((item) => item.linkedType);
|
|
1212
|
+
dataObj["fromDate"] = dashboard.fromDate || "";
|
|
1213
|
+
dataObj["asOfDate"] = dashboard.asOfDate;
|
|
1214
|
+
}
|
|
1215
|
+
if (dashboard &&
|
|
1216
|
+
(figureCode === "FundOperations" ||
|
|
1217
|
+
figureCode === "FundOperationTableSequoia" ||
|
|
1218
|
+
figureCode.indexOf("FinancialFigure") !== -1)) {
|
|
1219
|
+
dataObj["entityIds"] = dashboard.entityList.map((item) => item.linkedGuid);
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
// 判断是否可选开始日期
|
|
1223
|
+
checkHasFromDate(dataMart) {
|
|
1224
|
+
const has = dataMart.find((item) => !item.isHide && item.datamartCode === "FundOperationTableSequoia");
|
|
1225
|
+
return !!has;
|
|
1226
|
+
}
|
|
1227
|
+
// 判断Q2Q,控制顶部日期选择类型
|
|
1228
|
+
checkIsQ2Q(dataMart) {
|
|
1229
|
+
return false;
|
|
1230
|
+
const Q2QPatchList = [
|
|
1231
|
+
"SeeThroughHisPosition",
|
|
1232
|
+
"SeeThroughHisPositionByInvestor",
|
|
1233
|
+
];
|
|
1234
|
+
const has = dataMart.find((it) => {
|
|
1235
|
+
return !it.isHide && Q2QPatchList.includes(it.datamartCode);
|
|
1236
|
+
});
|
|
1237
|
+
return !!has;
|
|
1238
|
+
}
|
|
1239
|
+
/**
|
|
1240
|
+
* 使用自定义保存的列数据,覆盖通用列配置数据
|
|
1241
|
+
* @param allFields 自定义数据
|
|
1242
|
+
* @param fields 通用列配置数据
|
|
1243
|
+
* @returns
|
|
1244
|
+
*/
|
|
1245
|
+
setConfigFields(allFields, fields) {
|
|
1246
|
+
allFields.forEach((_field) => {
|
|
1247
|
+
fields.forEach((field) => {
|
|
1248
|
+
if (_field.colName === field.colName) {
|
|
1249
|
+
_field.isHidden = field.isHidden;
|
|
1250
|
+
_field.visible = field.visible;
|
|
1251
|
+
_field.format = field.format;
|
|
1252
|
+
_field.formula = field.formula;
|
|
1253
|
+
if (field.showGrandTotals !== undefined) {
|
|
1254
|
+
_field.showGrandTotals = field.showGrandTotals;
|
|
1255
|
+
}
|
|
1256
|
+
if (field.showSubTotals !== undefined) {
|
|
1257
|
+
_field.showSubTotals = field.showSubTotals;
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
});
|
|
1261
|
+
});
|
|
1262
|
+
fields.forEach((field) => {
|
|
1263
|
+
if (field.isCalculatedField) {
|
|
1264
|
+
allFields.push(field);
|
|
1265
|
+
}
|
|
1266
|
+
});
|
|
1267
|
+
const fieldsName = [];
|
|
1268
|
+
const outputFields = [];
|
|
1269
|
+
allFields.forEach((field) => {
|
|
1270
|
+
// q2q当中langCode很多相同,去重要多判断一下addtionName
|
|
1271
|
+
// if (!fieldsName.includes(field.langCode) || !!field.addtionName) {
|
|
1272
|
+
if (!fieldsName.includes(field.langCode) &&
|
|
1273
|
+
!fieldsName.includes(field.langValue)) {
|
|
1274
|
+
const value = field.langCode || field.langValue;
|
|
1275
|
+
fieldsName.push(value);
|
|
1276
|
+
outputFields.push(field);
|
|
1277
|
+
}
|
|
1278
|
+
});
|
|
1279
|
+
return outputFields.sort((a, b) => (a.seq >= b.seq ? 1 : -1));
|
|
1280
|
+
}
|
|
1281
|
+
async getDataByPortletsNew(portlets, callback, pageSetting, isRefresh = false, dashboard, roGet = false) {
|
|
1282
|
+
let length = 0;
|
|
1283
|
+
if (portlets && portlets.length) {
|
|
1284
|
+
for (let portlet of portlets) {
|
|
1285
|
+
let id = portlet.id === "00000000-0000-0000-0000-000000000000"
|
|
1286
|
+
? portlet.newId
|
|
1287
|
+
: portlet.id;
|
|
1288
|
+
const allFields = await this.getAllFields(portlet, dashboard);
|
|
1289
|
+
let params = this.getParamsByPortlet(portlet, pageSetting, allFields, dashboard);
|
|
1290
|
+
let initFieldsArr;
|
|
1291
|
+
let curFieldsArr;
|
|
1292
|
+
if (!params.isTable && !roGet) {
|
|
1293
|
+
// 赋值portletFields_Temp
|
|
1294
|
+
initFieldsArr = this.portletFields_Temp[id];
|
|
1295
|
+
curFieldsArr = params.displayColumnFilter.split(",");
|
|
1296
|
+
if (!initFieldsArr ||
|
|
1297
|
+
this.needGetPortletData(initFieldsArr, curFieldsArr)) {
|
|
1298
|
+
this.portletFields_Temp[id] = curFieldsArr;
|
|
1299
|
+
}
|
|
1300
|
+
else {
|
|
1301
|
+
length++;
|
|
1302
|
+
if (portlets.length === length) {
|
|
1303
|
+
callback();
|
|
1304
|
+
}
|
|
1305
|
+
continue;
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
const config = portlet.config && JSON.parse(portlet.config);
|
|
1309
|
+
if (config.filterSettings && config.filterSettings.length) {
|
|
1310
|
+
if (!params.columnFilter) {
|
|
1311
|
+
params.columnFilter = [];
|
|
1312
|
+
}
|
|
1313
|
+
config.filterSettings.forEach((setting) => {
|
|
1314
|
+
if (config.portletType === "pivot") {
|
|
1315
|
+
return;
|
|
1316
|
+
}
|
|
1317
|
+
const _field = config.fields.find((item) => item.colName === setting.name);
|
|
1318
|
+
const Type = _field && _field.dataType;
|
|
1319
|
+
if (setting.items) {
|
|
1320
|
+
setting.items.forEach((item) => {
|
|
1321
|
+
params.columnFilter.push({
|
|
1322
|
+
Field: setting.name,
|
|
1323
|
+
Operator: "equal",
|
|
1324
|
+
Type,
|
|
1325
|
+
Value: Type === "date"
|
|
1326
|
+
? moment(item).format("yyyy-MM-DD")
|
|
1327
|
+
: Type === "datetime"
|
|
1328
|
+
? moment(item).format("yyyy-MM-DD hh:mm:ss")
|
|
1329
|
+
: item,
|
|
1330
|
+
});
|
|
1331
|
+
});
|
|
1332
|
+
}
|
|
1333
|
+
else if (setting.operator) {
|
|
1334
|
+
params.columnFilter.push({
|
|
1335
|
+
Field: setting.field,
|
|
1336
|
+
Operator: "equal",
|
|
1337
|
+
Type: setting.type,
|
|
1338
|
+
Value: setting.type === "date"
|
|
1339
|
+
? moment(setting.value).format("yyyy-MM-DD")
|
|
1340
|
+
: setting.type === "datetime"
|
|
1341
|
+
? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
|
|
1342
|
+
: setting.value,
|
|
1343
|
+
});
|
|
1344
|
+
}
|
|
1345
|
+
});
|
|
1346
|
+
}
|
|
1347
|
+
if (params.columnFilter instanceof Array) {
|
|
1348
|
+
params.columnFilter = params.columnFilter.filter((item) => item.Field);
|
|
1349
|
+
}
|
|
1350
|
+
// json buffer
|
|
1351
|
+
params["dashboardVersion"] = 2;
|
|
1352
|
+
this.httpClient
|
|
1353
|
+
.post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
|
|
1354
|
+
headers: new HttpHeaders({
|
|
1355
|
+
Authorization: `Bearer`,
|
|
1356
|
+
}),
|
|
1357
|
+
})
|
|
1358
|
+
.subscribe((result) => {
|
|
1359
|
+
if (!result) {
|
|
1360
|
+
this.portletData_New[dashboard.id][id] = {
|
|
1361
|
+
total: 0,
|
|
1362
|
+
data: [],
|
|
1363
|
+
};
|
|
1364
|
+
if (isRefresh) {
|
|
1365
|
+
this.DashboardService.refreshGadget.next({
|
|
1366
|
+
newId: id,
|
|
1367
|
+
});
|
|
1368
|
+
}
|
|
1369
|
+
length++;
|
|
1370
|
+
if (isRefresh) {
|
|
1371
|
+
this.DashboardService.refreshGadget.next({
|
|
1372
|
+
newId: id,
|
|
1373
|
+
});
|
|
1374
|
+
}
|
|
1375
|
+
if (portlets.length === length) {
|
|
1376
|
+
if (isRefresh) {
|
|
1377
|
+
this.DashboardService.startRefresh.next(false);
|
|
1378
|
+
}
|
|
1379
|
+
callback();
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
else {
|
|
1383
|
+
result["data"].forEach((item) => {
|
|
1384
|
+
item.Sector = this.translation[item.Sector] || item.Sector;
|
|
1385
|
+
});
|
|
1386
|
+
this.portletData_New[dashboard.id][id] = result;
|
|
1387
|
+
if (isRefresh) {
|
|
1388
|
+
this.DashboardService.refreshGadget.next({
|
|
1389
|
+
newId: id,
|
|
1390
|
+
});
|
|
1391
|
+
}
|
|
1392
|
+
length++;
|
|
1393
|
+
if (portlets.length === length) {
|
|
1394
|
+
if (isRefresh) {
|
|
1395
|
+
this.DashboardService.startRefresh.next(false);
|
|
1396
|
+
}
|
|
1397
|
+
callback();
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
}, (response) => {
|
|
1401
|
+
this.portletFields_Temp[id] = initFieldsArr;
|
|
1402
|
+
length++;
|
|
1403
|
+
if (portlets.length === length) {
|
|
1404
|
+
callback();
|
|
1405
|
+
}
|
|
1406
|
+
}, () => { });
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
else {
|
|
1410
|
+
callback();
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
clearFieldsObj(portlet) {
|
|
1414
|
+
Reflect.deleteProperty(this.allFieldsObj, portlet.id);
|
|
1415
|
+
}
|
|
1416
|
+
// 根据portlet 解析params
|
|
1417
|
+
getParamsByPortlet(portlet, pageSetting, allFields, dashboard) {
|
|
1418
|
+
let dashboardDataTableId = portlet.dashboardDataTableId;
|
|
1419
|
+
//SMP2-7731 get the dashboardDataTableid from dataMartTables arrary
|
|
1420
|
+
let curDataMart = this.dataMartTables[dashboard.id].find((d) => d.datamartCode === portlet.figureCode);
|
|
1421
|
+
if (curDataMart) {
|
|
1422
|
+
dashboardDataTableId = curDataMart.id;
|
|
1423
|
+
}
|
|
1424
|
+
let config = portlet.config && JSON.parse(portlet.config);
|
|
1425
|
+
if (portlet.id !== "00000000-0000-0000-0000-000000000000") {
|
|
1426
|
+
this.allFieldsObj[portlet.id] = allFields;
|
|
1427
|
+
}
|
|
1428
|
+
let fields = allFields
|
|
1429
|
+
? this.setConfigFields(allFields, config.fields)
|
|
1430
|
+
: config.fields;
|
|
1431
|
+
if (allFields) {
|
|
1432
|
+
config.fields = fields;
|
|
1433
|
+
portlet.config = JSON.stringify(config);
|
|
1434
|
+
}
|
|
1435
|
+
let calculatedFields = config.calculatedFieldSettings;
|
|
1436
|
+
let needFields = [];
|
|
1437
|
+
let params = {};
|
|
1438
|
+
const portletType = config.portletType === "historicalIRR"
|
|
1439
|
+
? config.selectedVisualType
|
|
1440
|
+
: config.portletType;
|
|
1441
|
+
if (portletType === "table") {
|
|
1442
|
+
fields &&
|
|
1443
|
+
fields.forEach((x) => {
|
|
1444
|
+
needFields.push(x.colName);
|
|
1445
|
+
});
|
|
1446
|
+
params.startIndex = 0;
|
|
1447
|
+
params.pageSize = 10;
|
|
1448
|
+
if (pageSetting && pageSetting.currentPage) {
|
|
1449
|
+
params.startIndex =
|
|
1450
|
+
(pageSetting.currentPage - 1) * pageSetting.pageSize;
|
|
1451
|
+
params.pageSize = pageSetting.pageSize;
|
|
1452
|
+
}
|
|
1453
|
+
// 处理 sort
|
|
1454
|
+
if (pageSetting && pageSetting.sortedColumn) {
|
|
1455
|
+
params.sortedColumn = pageSetting.sortedColumn;
|
|
1456
|
+
params.sort = pageSetting.sort;
|
|
1457
|
+
}
|
|
1458
|
+
// 处理 filter
|
|
1459
|
+
if (config.filterSettings.length) {
|
|
1460
|
+
let filterSettings = JSON.parse(JSON.stringify(config.filterSettings));
|
|
1461
|
+
params.columnFilter = filterSettings.map((x) => {
|
|
1462
|
+
if (x.type === "date") {
|
|
1463
|
+
const date = new Date(x.value);
|
|
1464
|
+
const year = date.getFullYear();
|
|
1465
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
1466
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
1467
|
+
const formattedDate = `${year}-${month}-${day}`;
|
|
1468
|
+
x.value = formattedDate;
|
|
1469
|
+
}
|
|
1470
|
+
return x;
|
|
1471
|
+
});
|
|
1472
|
+
}
|
|
1473
|
+
params.isTable = true;
|
|
1474
|
+
}
|
|
1475
|
+
else if (portletType === "transpose") {
|
|
1476
|
+
fields &&
|
|
1477
|
+
fields.forEach((x) => {
|
|
1478
|
+
if (!x.isHidden) {
|
|
1479
|
+
needFields.push(x.colName);
|
|
1480
|
+
}
|
|
1481
|
+
});
|
|
1482
|
+
}
|
|
1483
|
+
else if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
|
|
1484
|
+
if (config.selectedY && config.selectedY.length > 0) {
|
|
1485
|
+
config.selectedY.forEach((e) => {
|
|
1486
|
+
needFields.push(e);
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
if (config.selectedSecondY && config.selectedSecondY.length > 0) {
|
|
1490
|
+
config.selectedSecondY.forEach((e) => {
|
|
1491
|
+
needFields.push(e);
|
|
1492
|
+
});
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
else {
|
|
1496
|
+
// 处理 filters
|
|
1497
|
+
let filters = config.filters;
|
|
1498
|
+
if (filters && filters.length) {
|
|
1499
|
+
for (let item of filters) {
|
|
1500
|
+
needFields.push(item.name);
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
// 处理 values
|
|
1504
|
+
let series = config.yaxis.series;
|
|
1505
|
+
if (series && series.length) {
|
|
1506
|
+
for (let item of series) {
|
|
1507
|
+
if ([
|
|
1508
|
+
"CalculateIRR",
|
|
1509
|
+
"CalculateIRRMTD",
|
|
1510
|
+
"CalculateIRRQTD",
|
|
1511
|
+
"CalculateIRRYTD",
|
|
1512
|
+
"CalculateTWRMTD",
|
|
1513
|
+
"CalculateTWRQTD",
|
|
1514
|
+
"CalculateTWRYTD",
|
|
1515
|
+
"CalculateVARMTD_99",
|
|
1516
|
+
"CalculateVARQTD_99",
|
|
1517
|
+
"CalculateVARYTD_99",
|
|
1518
|
+
"CalculateVARMTD_95",
|
|
1519
|
+
"CalculateVARQTD_95",
|
|
1520
|
+
"CalculateVARYTD_95",
|
|
1521
|
+
].includes(item.calMethod)) {
|
|
1522
|
+
needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
|
|
1523
|
+
}
|
|
1524
|
+
else if (item.calMethod === "CalculateIRRBeforeCarried") {
|
|
1525
|
+
needFields.push("IRRAmount", "IRRDate", "IRRAdjValueBeforeCarry");
|
|
1526
|
+
}
|
|
1527
|
+
else if (item.calMethod === "CalculateIRRIRRDate") {
|
|
1528
|
+
needFields.push("IRRAmount", "CalculateIRRDate", "IRRAdjValue");
|
|
1529
|
+
}
|
|
1530
|
+
else if (item.calMethod === "CalculateIRRActualAudited") {
|
|
1531
|
+
portlet.figureCode === "GrossNet" ||
|
|
1532
|
+
portlet.figureCode === "CombinedInvestmentFundNCompanyCashflow"
|
|
1533
|
+
? needFields.push("IRRAmount", "IRRDate", "ActualAuditedNAV")
|
|
1534
|
+
: needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
|
|
1535
|
+
}
|
|
1536
|
+
else if (item.calMethod === "CalculateIRRReported") {
|
|
1537
|
+
portlet.figureCode === "GrossNet" ||
|
|
1538
|
+
portlet.figureCode === "CombinedInvestmentFundNCompanyCashflow"
|
|
1539
|
+
? needFields.push("IRRAmount", "IRRDate", "ReportedNAV")
|
|
1540
|
+
: needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
|
|
1541
|
+
}
|
|
1542
|
+
else if (item.calMethod === "CalculatedField") {
|
|
1543
|
+
}
|
|
1544
|
+
else {
|
|
1545
|
+
let colName = this.getAggregateType(item.calMethod);
|
|
1546
|
+
if (colName) {
|
|
1547
|
+
let curField = fields.find((f) => f.colName === colName);
|
|
1548
|
+
if (curField && curField.formula) {
|
|
1549
|
+
let fs = curField.formula.split("/");
|
|
1550
|
+
fs && fs.map((f) => needFields.push(f));
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
else {
|
|
1554
|
+
needFields.push(item.colName);
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
// 处理 rows
|
|
1560
|
+
let groups = config.xaxis.groups;
|
|
1561
|
+
if (groups && groups.length) {
|
|
1562
|
+
for (let gitem of groups) {
|
|
1563
|
+
needFields.push(gitem.name);
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
// 处理 colunms
|
|
1567
|
+
let columnGroup = config.columnGroup;
|
|
1568
|
+
if (columnGroup && columnGroup.length) {
|
|
1569
|
+
for (let item of columnGroup) {
|
|
1570
|
+
needFields.push(item.name);
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
// 处理 calculatedField
|
|
1574
|
+
if (calculatedFields && calculatedFields.length) {
|
|
1575
|
+
calculatedFields.map((f) => {
|
|
1576
|
+
let string = f.formula;
|
|
1577
|
+
const regex = /\((.*?)\)/g;
|
|
1578
|
+
const matches = string
|
|
1579
|
+
.match(regex)
|
|
1580
|
+
.map((match) => match.slice(1, -1));
|
|
1581
|
+
needFields.push(...matches);
|
|
1582
|
+
});
|
|
1583
|
+
}
|
|
1584
|
+
// 处理 orderByColumns
|
|
1585
|
+
if (this.dashboardConfig && this.dashboardConfig[dashboard.id]) {
|
|
1586
|
+
params.datamartViewId =
|
|
1587
|
+
this.dashboardConfig[dashboard.id].datamartViewId;
|
|
1588
|
+
params.datamartId = this.dashboardConfig[dashboard.id].datamartId;
|
|
1589
|
+
params.datamartCode = portlet.figureCode;
|
|
1590
|
+
}
|
|
1591
|
+
// 处理config.fields里的sortColumn
|
|
1592
|
+
let fieldSortColumns = [];
|
|
1593
|
+
fields.map((x) => {
|
|
1594
|
+
if (x.sortColumn && !fieldSortColumns.includes(x.sortColumn)) {
|
|
1595
|
+
fieldSortColumns.push(x.sortColumn);
|
|
1596
|
+
}
|
|
1597
|
+
});
|
|
1598
|
+
if (fieldSortColumns.length) {
|
|
1599
|
+
needFields.push(...fieldSortColumns);
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
needFields = Array.from(new Set(needFields));
|
|
1603
|
+
// 去除非法字段
|
|
1604
|
+
let legalFields = fields.map((x) => x.colName);
|
|
1605
|
+
needFields.map((x, i) => {
|
|
1606
|
+
if (!legalFields.includes(x)) {
|
|
1607
|
+
needFields.splice(i, 1);
|
|
1608
|
+
}
|
|
1609
|
+
});
|
|
1610
|
+
if (needFields.length === 0) {
|
|
1611
|
+
if (legalFields[0]) {
|
|
1612
|
+
needFields.push(legalFields[0]);
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
// 默认获取Seq字段 SMP2-4582 AGIC - Dashboard item sequence
|
|
1616
|
+
needFields.push("Seq");
|
|
1617
|
+
// "newcolumn", "newline", "newcolumnline" 如果是这三种类型默认加 OperationDate 字段
|
|
1618
|
+
if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
|
|
1619
|
+
needFields.push(config.selectedX);
|
|
1620
|
+
params["IsOnlyShowDisplayColum"] = true;
|
|
1621
|
+
}
|
|
1622
|
+
if (config.portletType === "historicalIRR") {
|
|
1623
|
+
if (!params.columnFilter) {
|
|
1624
|
+
params.columnFilter = [];
|
|
1625
|
+
}
|
|
1626
|
+
params.columnFilter.push({
|
|
1627
|
+
Field: "Frequencys",
|
|
1628
|
+
Operator: "equal",
|
|
1629
|
+
Type: "string",
|
|
1630
|
+
Value: config.selectedMultiples,
|
|
1631
|
+
}, {
|
|
1632
|
+
Field: "InvestorType",
|
|
1633
|
+
Operator: "equal",
|
|
1634
|
+
Type: "string",
|
|
1635
|
+
Value: config.selectedInvestor,
|
|
1636
|
+
});
|
|
1637
|
+
}
|
|
1638
|
+
params.dashboardDataTableId = dashboardDataTableId;
|
|
1639
|
+
params.displayColumnFilter = needFields.join(",");
|
|
1640
|
+
params.responseType = "json";
|
|
1641
|
+
return params;
|
|
1642
|
+
}
|
|
1643
|
+
// 是否需要重新发起请求
|
|
1644
|
+
needGetPortletData(origin = [], compare = []) {
|
|
1645
|
+
return compare.some((c) => !origin.includes(c));
|
|
1646
|
+
}
|
|
1647
|
+
setDataManager(figureCodes, callback, portletTypes = [], dashboardId, portlet) {
|
|
1648
|
+
let length = 0;
|
|
1649
|
+
if (!this.fieldsArr[dashboardId]) {
|
|
1650
|
+
this.fieldsArr[dashboardId] = {};
|
|
1651
|
+
}
|
|
1652
|
+
if (this.dataMartTables[dashboardId] &&
|
|
1653
|
+
this.dataMartTables[dashboardId].length) {
|
|
1654
|
+
this.pbf.pageLoading = true;
|
|
1655
|
+
this.pbf.pageLoading_.next(true);
|
|
1656
|
+
let dataMartTables = this.dataMartTables[dashboardId].filter((el) => figureCodes.includes(el.datamartCode));
|
|
1657
|
+
if (dataMartTables.length) {
|
|
1658
|
+
forEach(dataMartTables, (item, index) => {
|
|
1659
|
+
let allFields;
|
|
1660
|
+
let config;
|
|
1661
|
+
if (portlet) {
|
|
1662
|
+
config = JSON.parse(portlet.config);
|
|
1663
|
+
}
|
|
1664
|
+
if (["newcolumn", "newline", "newcolumnline"].includes(portletTypes[0])) {
|
|
1665
|
+
allFields = config.selectedY
|
|
1666
|
+
.concat(config.selectedSecondY)
|
|
1667
|
+
.concat([config.selectedX])
|
|
1668
|
+
.map((e) => {
|
|
1669
|
+
return {
|
|
1670
|
+
colName: e,
|
|
1671
|
+
};
|
|
1672
|
+
});
|
|
1673
|
+
}
|
|
1674
|
+
else {
|
|
1675
|
+
allFields =
|
|
1676
|
+
this.fieldsArr[dashboardId] &&
|
|
1677
|
+
this.fieldsArr[dashboardId][item.datamartCode]
|
|
1678
|
+
? this.fieldsArr[dashboardId][item.datamartCode]
|
|
1679
|
+
: [];
|
|
1680
|
+
}
|
|
1681
|
+
let displayColumnFilter = allFields && allFields.map((x) => x.colName).join(",");
|
|
1682
|
+
let params = {
|
|
1683
|
+
dashboardDataTableId: item.id,
|
|
1684
|
+
displayColumnFilter: displayColumnFilter,
|
|
1685
|
+
responseType: "json",
|
|
1686
|
+
dashboardVersion: 2,
|
|
1687
|
+
};
|
|
1688
|
+
params.startIndex = 0;
|
|
1689
|
+
params.pageSize = 10;
|
|
1690
|
+
if (portletTypes &&
|
|
1691
|
+
portletTypes.length > 0 &&
|
|
1692
|
+
(portletTypes.includes("newcolumn") ||
|
|
1693
|
+
portletTypes.includes("newline") ||
|
|
1694
|
+
portletTypes.includes("newcolumnline"))) {
|
|
1695
|
+
params.pageSize = 1000000;
|
|
1696
|
+
params["IsOnlyShowDisplayColum"] = true;
|
|
1697
|
+
}
|
|
1698
|
+
if (config) {
|
|
1699
|
+
const filterSettings = config.filterSettings;
|
|
1700
|
+
if (filterSettings && filterSettings.length) {
|
|
1701
|
+
if (!params.columnFilter) {
|
|
1702
|
+
params.columnFilter = [];
|
|
1703
|
+
}
|
|
1704
|
+
filterSettings.forEach((setting) => {
|
|
1705
|
+
if (config.portletType === "pivot") {
|
|
1706
|
+
return;
|
|
1707
|
+
}
|
|
1708
|
+
const _field = config.fields.find((item) => item.colName === setting.name);
|
|
1709
|
+
const Type = _field && _field.dataType;
|
|
1710
|
+
if (setting.items) {
|
|
1711
|
+
setting.items.forEach((item) => {
|
|
1712
|
+
params.columnFilter.push({
|
|
1713
|
+
Field: setting.name,
|
|
1714
|
+
Operator: "equal",
|
|
1715
|
+
Type,
|
|
1716
|
+
Value: Type === "date"
|
|
1717
|
+
? moment(item).format("yyyy-MM-DD")
|
|
1718
|
+
: Type === "datetime"
|
|
1719
|
+
? moment(item).format("yyyy-MM-DD hh:mm:ss")
|
|
1720
|
+
: item,
|
|
1721
|
+
});
|
|
1722
|
+
});
|
|
1723
|
+
}
|
|
1724
|
+
else if (setting.operator) {
|
|
1725
|
+
params.columnFilter.push({
|
|
1726
|
+
Field: setting.field,
|
|
1727
|
+
Operator: "equal",
|
|
1728
|
+
Type: setting.type,
|
|
1729
|
+
Value: setting.type === "date"
|
|
1730
|
+
? moment(setting.value).format("yyyy-MM-DD")
|
|
1731
|
+
: setting.type === "datetime"
|
|
1732
|
+
? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
|
|
1733
|
+
: setting.value,
|
|
1734
|
+
});
|
|
1735
|
+
}
|
|
1736
|
+
});
|
|
1737
|
+
}
|
|
1738
|
+
if (config.portletType === "historicalIRR") {
|
|
1739
|
+
if (!params.columnFilter) {
|
|
1740
|
+
params.columnFilter = [];
|
|
1741
|
+
}
|
|
1742
|
+
params.columnFilter.push({
|
|
1743
|
+
Field: "Frequencys",
|
|
1744
|
+
Operator: "equal",
|
|
1745
|
+
Type: "string",
|
|
1746
|
+
Value: config.selectedMultiples,
|
|
1747
|
+
}, {
|
|
1748
|
+
Field: "InvestorType",
|
|
1749
|
+
Operator: "equal",
|
|
1750
|
+
Type: "string",
|
|
1751
|
+
Value: config.selectedInvestor,
|
|
1752
|
+
});
|
|
1753
|
+
}
|
|
1754
|
+
}
|
|
1755
|
+
if (params.columnFilter instanceof Array) {
|
|
1756
|
+
params.columnFilter = params.columnFilter.filter((item) => item.Field);
|
|
1757
|
+
}
|
|
1758
|
+
// json buffer
|
|
1759
|
+
this.httpClient
|
|
1760
|
+
.post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
|
|
1761
|
+
headers: new HttpHeaders({
|
|
1762
|
+
Authorization: `Bearer`,
|
|
1763
|
+
}),
|
|
1764
|
+
})
|
|
1765
|
+
.subscribe((result) => {
|
|
1766
|
+
let identifier = portlet.id === "00000000-0000-0000-0000-000000000000"
|
|
1767
|
+
? portlet.newId
|
|
1768
|
+
: portlet.id;
|
|
1769
|
+
if (!result) {
|
|
1770
|
+
this.portletResults_New[dashboardId][item.datamartCode] = [];
|
|
1771
|
+
if (portlet) {
|
|
1772
|
+
this.portletData_New[dashboardId][identifier] = {
|
|
1773
|
+
total: 0,
|
|
1774
|
+
data: [],
|
|
1775
|
+
};
|
|
1776
|
+
}
|
|
1777
|
+
let message = this.translation.NO_DATA
|
|
1778
|
+
? this.translation.NO_DATA
|
|
1779
|
+
: ".No data, please choose another data type";
|
|
1780
|
+
this.dialogService.showNotification(message, {
|
|
1781
|
+
status: "Error",
|
|
1782
|
+
});
|
|
1783
|
+
length++;
|
|
1784
|
+
if (dataMartTables.length === length) {
|
|
1785
|
+
callback();
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
else {
|
|
1789
|
+
result["data"].forEach((item) => {
|
|
1790
|
+
item.Sector = this.translation[item.Sector] || item.Sector;
|
|
1791
|
+
});
|
|
1792
|
+
if (this.fieldsArr[dashboardId] &&
|
|
1793
|
+
Object.keys(this.fieldsArr[dashboardId]).length) {
|
|
1794
|
+
this.portletResults_New[dashboardId][item.datamartCode] =
|
|
1795
|
+
result;
|
|
1796
|
+
}
|
|
1797
|
+
if (portlet) {
|
|
1798
|
+
this.portletData_New[dashboardId][identifier] = result;
|
|
1799
|
+
}
|
|
1800
|
+
length++;
|
|
1801
|
+
if (dataMartTables.length === length) {
|
|
1802
|
+
callback();
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
}, (response) => {
|
|
1806
|
+
length++;
|
|
1807
|
+
if (dataMartTables.length === length) {
|
|
1808
|
+
callback();
|
|
1809
|
+
}
|
|
1810
|
+
}, () => { });
|
|
1811
|
+
});
|
|
1812
|
+
}
|
|
1813
|
+
else {
|
|
1814
|
+
callback();
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
ExcelFormulas = {
|
|
1819
|
+
DaysBetween: function (date1, date2) {
|
|
1820
|
+
var oneDay = 24 * 60 * 60 * 1000;
|
|
1821
|
+
return Math.round(Math.abs((date1.getTime() - date2.getTime()) / oneDay));
|
|
1822
|
+
},
|
|
1823
|
+
XNPV: function (rate, values) {
|
|
1824
|
+
var xnpv = 0.0;
|
|
1825
|
+
var firstDate = new Date(values[0].date);
|
|
1826
|
+
for (var key in values) {
|
|
1827
|
+
var tmp = values[key];
|
|
1828
|
+
var value = tmp.amount;
|
|
1829
|
+
var date = new Date(tmp.date);
|
|
1830
|
+
xnpv +=
|
|
1831
|
+
value / Math.pow(1 + rate, this.DaysBetween(firstDate, date) / 365);
|
|
1832
|
+
}
|
|
1833
|
+
return xnpv;
|
|
1834
|
+
},
|
|
1835
|
+
XIRR: function (values, guess) {
|
|
1836
|
+
var x1 = 0.0;
|
|
1837
|
+
var x2 = guess;
|
|
1838
|
+
var f1 = this.XNPV(x1, values);
|
|
1839
|
+
var f2 = this.XNPV(x2, values);
|
|
1840
|
+
for (var i = 0; i < 100; i++) {
|
|
1841
|
+
if (f1 * f2 < 0.0)
|
|
1842
|
+
break;
|
|
1843
|
+
if (Math.abs(f1) < Math.abs(f2)) {
|
|
1844
|
+
f1 = this.XNPV((x1 += 1.6 * (x1 - x2)), values);
|
|
1845
|
+
}
|
|
1846
|
+
else {
|
|
1847
|
+
f2 = this.XNPV((x2 += 1.6 * (x2 - x1)), values);
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
if (f1 * f2 > 0.0)
|
|
1851
|
+
return null;
|
|
1852
|
+
var f = this.XNPV(x1, values);
|
|
1853
|
+
if (f < 0.0) {
|
|
1854
|
+
var rtb = x1;
|
|
1855
|
+
var dx = x2 - x1;
|
|
1856
|
+
}
|
|
1857
|
+
else {
|
|
1858
|
+
var rtb = x2;
|
|
1859
|
+
var dx = x1 - x2;
|
|
1860
|
+
}
|
|
1861
|
+
for (var i = 0; i < 100; i++) {
|
|
1862
|
+
dx *= 0.5;
|
|
1863
|
+
var x_mid = rtb + dx;
|
|
1864
|
+
var f_mid = this.XNPV(x_mid, values);
|
|
1865
|
+
if (f_mid <= 0.0)
|
|
1866
|
+
rtb = x_mid;
|
|
1867
|
+
if (Math.abs(f_mid) < 1.0e-6 || Math.abs(dx) < 1.0e-6)
|
|
1868
|
+
return x_mid;
|
|
1869
|
+
}
|
|
1870
|
+
return null;
|
|
1871
|
+
},
|
|
1872
|
+
_DaysBetween: function (date1, date2) {
|
|
1873
|
+
//const time1 =new Date(Date.UTC(date1.getUTCFullYear(), date1.getUTCMonth(), date1.getUTCDate(), date1.getUTCHours(), date1.getUTCMinutes(), date1.getUTCSeconds())).getTime();
|
|
1874
|
+
//const time2 =new Date(Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate(), date2.getUTCHours(), date2.getUTCMinutes(), date2.getUTCSeconds())).getTime();
|
|
1875
|
+
const oneDay = 24 * 60 * 60 * 1000; // 一天的毫秒数
|
|
1876
|
+
//const time1 = date1.getTime(); // date1的毫秒表示
|
|
1877
|
+
//const time2 = date2.getTime(); // date2的毫秒表示
|
|
1878
|
+
const firstDate = new Date(date1);
|
|
1879
|
+
const secondDate = new Date(date2);
|
|
1880
|
+
const diffDays = Math.round(
|
|
1881
|
+
// @ts-ignore
|
|
1882
|
+
Math.abs((firstDate - secondDate) / oneDay)); // 计算天数差并取整
|
|
1883
|
+
return diffDays;
|
|
1884
|
+
},
|
|
1885
|
+
_lcl_sca_XirrResult: function (values, dates, fRate) {
|
|
1886
|
+
var D_0 = dates[0];
|
|
1887
|
+
let r = fRate + 1.0;
|
|
1888
|
+
var fResult = values[0];
|
|
1889
|
+
for (var i = 1, nCount = values.length; i < nCount; ++i) {
|
|
1890
|
+
var temp = Math.pow(r, this._DaysBetween(dates[i], D_0) / 365.0);
|
|
1891
|
+
fResult += values[i] / temp;
|
|
1892
|
+
}
|
|
1893
|
+
return fResult;
|
|
1894
|
+
},
|
|
1895
|
+
_lcl_sca_XirrResult_Deriv1: function (values, dates, fRate) {
|
|
1896
|
+
var D_0 = dates[0];
|
|
1897
|
+
var r = fRate + 1.0;
|
|
1898
|
+
var fResult = 0.0;
|
|
1899
|
+
for (var i = 1, nCount = values.length; i < nCount; ++i) {
|
|
1900
|
+
var E_i = this._DaysBetween(dates[i], D_0) / 365.0;
|
|
1901
|
+
fResult -= (E_i * values[i]) / Math.pow(r, E_i + 1.0);
|
|
1902
|
+
}
|
|
1903
|
+
return fResult;
|
|
1904
|
+
},
|
|
1905
|
+
_CalculateXirrOpenOffice: function (values, dates, guess) {
|
|
1906
|
+
if (values.length < 2 || values.length != dates.length) {
|
|
1907
|
+
return null;
|
|
1908
|
+
}
|
|
1909
|
+
var fResultRate = guess;
|
|
1910
|
+
if (fResultRate <= -1) {
|
|
1911
|
+
return null;
|
|
1912
|
+
}
|
|
1913
|
+
var fMaxEps = 0.00000001;
|
|
1914
|
+
var nMaxIter = 50;
|
|
1915
|
+
var fNewRate, fRateEps, fResultValue;
|
|
1916
|
+
var nIter = 0;
|
|
1917
|
+
var nIterScan = 0;
|
|
1918
|
+
var bContLoop = false;
|
|
1919
|
+
var bResultRateScanEnd = false;
|
|
1920
|
+
do {
|
|
1921
|
+
if (nIterScan >= 1) {
|
|
1922
|
+
fResultRate = -0.99 + (nIterScan - 1) * 0.01;
|
|
1923
|
+
}
|
|
1924
|
+
do {
|
|
1925
|
+
fResultValue = this._lcl_sca_XirrResult(values, dates, fResultRate);
|
|
1926
|
+
fNewRate =
|
|
1927
|
+
fResultRate -
|
|
1928
|
+
fResultValue /
|
|
1929
|
+
this._lcl_sca_XirrResult_Deriv1(values, dates, fResultRate);
|
|
1930
|
+
fRateEps = Math.abs(fNewRate - fResultRate);
|
|
1931
|
+
fResultRate = fNewRate;
|
|
1932
|
+
bContLoop = fRateEps > fMaxEps && Math.abs(fResultValue) > fMaxEps;
|
|
1933
|
+
} while (bContLoop && ++nIter < nMaxIter);
|
|
1934
|
+
nIter = 0;
|
|
1935
|
+
if (isNaN(fResultRate) ||
|
|
1936
|
+
!isFinite(fResultRate) ||
|
|
1937
|
+
isNaN(fResultValue) ||
|
|
1938
|
+
!isFinite(fResultValue)) {
|
|
1939
|
+
bContLoop = true;
|
|
1940
|
+
}
|
|
1941
|
+
++nIterScan;
|
|
1942
|
+
bResultRateScanEnd = nIterScan >= 100;
|
|
1943
|
+
} while (bContLoop && !bResultRateScanEnd);
|
|
1944
|
+
if (bContLoop) {
|
|
1945
|
+
return null;
|
|
1946
|
+
}
|
|
1947
|
+
return fResultRate;
|
|
1948
|
+
},
|
|
1949
|
+
_CalculateXirr: function (valueList, dateList, navAdjust, latestDate) {
|
|
1950
|
+
var positiveCashflow = valueList.some(function (v) {
|
|
1951
|
+
return v > 0;
|
|
1952
|
+
})
|
|
1953
|
+
? true
|
|
1954
|
+
: navAdjust > 0
|
|
1955
|
+
? true
|
|
1956
|
+
: false;
|
|
1957
|
+
var negativeCashflow = valueList.some(function (v) {
|
|
1958
|
+
return v < 0;
|
|
1959
|
+
})
|
|
1960
|
+
? true
|
|
1961
|
+
: navAdjust < 0
|
|
1962
|
+
? true
|
|
1963
|
+
: false;
|
|
1964
|
+
if (positiveCashflow == false || negativeCashflow == false) {
|
|
1965
|
+
return null;
|
|
1966
|
+
}
|
|
1967
|
+
if (navAdjust != null) {
|
|
1968
|
+
valueList.push(navAdjust);
|
|
1969
|
+
dateList.push(latestDate);
|
|
1970
|
+
}
|
|
1971
|
+
var xirrResult = null;
|
|
1972
|
+
try {
|
|
1973
|
+
var excelGuess = valueList.reduce(function (sum, value) {
|
|
1974
|
+
return sum + value;
|
|
1975
|
+
}, 0) < 0
|
|
1976
|
+
? -0.1
|
|
1977
|
+
: 0.1;
|
|
1978
|
+
xirrResult = this._CalculateXirrOpenOffice(valueList, dateList, excelGuess);
|
|
1979
|
+
}
|
|
1980
|
+
catch (error) {
|
|
1981
|
+
return null;
|
|
1982
|
+
}
|
|
1983
|
+
return xirrResult;
|
|
1984
|
+
},
|
|
1985
|
+
};
|
|
1986
|
+
// 拿到数据后,先遍历config.filterSettings,如果在数据中不存在,就删除这一项
|
|
1987
|
+
checkFilterSettings(config, fields, data) {
|
|
1988
|
+
let filterSettings = config.filterSettings;
|
|
1989
|
+
if (filterSettings && filterSettings.length) {
|
|
1990
|
+
for (let i = 0; i < filterSettings.length; i++) {
|
|
1991
|
+
const element = filterSettings[i];
|
|
1992
|
+
let __field = fields.filter((field) => field.colName == element.name)[0];
|
|
1993
|
+
if (!__field) {
|
|
1994
|
+
// 处理自定义 Group的Filter
|
|
1995
|
+
continue;
|
|
1996
|
+
}
|
|
1997
|
+
const dataType = __field.dataType;
|
|
1998
|
+
if (element.items && element.items.length) {
|
|
1999
|
+
for (let r = 0; r < element.items.length; r++) {
|
|
2000
|
+
const item = element.items[r];
|
|
2001
|
+
let res = [];
|
|
2002
|
+
if (dataType !== "date" &&
|
|
2003
|
+
dataType !== "datetime" &&
|
|
2004
|
+
data &&
|
|
2005
|
+
data.length) {
|
|
2006
|
+
if (dataType == "string") {
|
|
2007
|
+
res = data.filter((obj) => obj[element.name] === item);
|
|
2008
|
+
}
|
|
2009
|
+
else {
|
|
2010
|
+
res = data.filter((obj) => Number(obj[element.name]) === Number(item));
|
|
2011
|
+
}
|
|
2012
|
+
}
|
|
2013
|
+
if (dataType == "date" || dataType == "datetime") {
|
|
2014
|
+
res = data.filter((obj) => moment(obj[element.name]).format("YYYY-MM-DD") ==
|
|
2015
|
+
moment(item).format("YYYY-MM-DD"));
|
|
2016
|
+
}
|
|
2017
|
+
if (!res.length) {
|
|
2018
|
+
element.items.splice(r, 1);
|
|
2019
|
+
r--;
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
if (!element.items.length) {
|
|
2023
|
+
filterSettings.splice(i, 1);
|
|
2024
|
+
i--;
|
|
2025
|
+
}
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
return filterSettings;
|
|
2029
|
+
}
|
|
2030
|
+
else {
|
|
2031
|
+
return [];
|
|
2032
|
+
}
|
|
2033
|
+
// callback(filterSettings);
|
|
2034
|
+
}
|
|
2035
|
+
sortDataMartTables(data) {
|
|
2036
|
+
data.sort((a, b) => {
|
|
2037
|
+
const langValueA = a.langValue.toLowerCase();
|
|
2038
|
+
const langValueB = b.langValue.toLowerCase();
|
|
2039
|
+
if (langValueA < langValueB) {
|
|
2040
|
+
return -1;
|
|
2041
|
+
}
|
|
2042
|
+
if (langValueA > langValueB) {
|
|
2043
|
+
return 1;
|
|
2044
|
+
}
|
|
2045
|
+
return 0;
|
|
2046
|
+
});
|
|
2047
|
+
}
|
|
2048
|
+
renameDataMartTables(data, id, entityType) {
|
|
2049
|
+
if (this.sourcesData[id]) {
|
|
2050
|
+
this.sourcesData[id].forEach((sources) => {
|
|
2051
|
+
if (sources.entityType === entityType) {
|
|
2052
|
+
data.forEach((_data) => {
|
|
2053
|
+
sources.views.forEach((view) => {
|
|
2054
|
+
view.tables.forEach((table) => {
|
|
2055
|
+
if (table.datamartCode === _data.datamartCode) {
|
|
2056
|
+
_data.langValue = table.langValue;
|
|
2057
|
+
_data.langCode = table.langCode;
|
|
2058
|
+
}
|
|
2059
|
+
});
|
|
2060
|
+
});
|
|
2061
|
+
});
|
|
2062
|
+
}
|
|
2063
|
+
});
|
|
2064
|
+
}
|
|
2065
|
+
else {
|
|
2066
|
+
return data;
|
|
2067
|
+
}
|
|
2068
|
+
}
|
|
2069
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardPorletsService, deps: [{ token: i1.ApiList }, { token: i2.MatDialog }, { token: i3.DialogService }, { token: i4.DashboardService }, { token: i5.HttpClient }, { token: PBF_TOKEN, optional: true }, { token: API_SERVICE_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2070
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardPorletsService, providedIn: "root" });
|
|
2071
|
+
}
|
|
2072
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardPorletsService, decorators: [{
|
|
2073
|
+
type: Injectable,
|
|
2074
|
+
args: [{
|
|
2075
|
+
providedIn: "root",
|
|
2076
|
+
}]
|
|
2077
|
+
}], ctorParameters: function () { return [{ type: i1.ApiList }, { type: i2.MatDialog }, { type: i3.DialogService }, { type: i4.DashboardService }, { type: i5.HttpClient }, { type: undefined, decorators: [{
|
|
2078
|
+
type: Optional
|
|
2079
|
+
}, {
|
|
2080
|
+
type: Inject,
|
|
2081
|
+
args: [PBF_TOKEN]
|
|
2082
|
+
}] }, { type: undefined, decorators: [{
|
|
2083
|
+
type: Optional
|
|
2084
|
+
}, {
|
|
2085
|
+
type: Inject,
|
|
2086
|
+
args: [API_SERVICE_TOKEN]
|
|
2087
|
+
}] }]; } });
|
|
2088
|
+
export const ALL_AGGREGATE_TYPES = [
|
|
2089
|
+
"Sum",
|
|
2090
|
+
"First",
|
|
2091
|
+
"Last",
|
|
2092
|
+
"CalculateIRR",
|
|
2093
|
+
"CalculateIRRIRRDate",
|
|
2094
|
+
"CalculateIRRBeforeCarried",
|
|
2095
|
+
"CalculateIRRActualAudited",
|
|
2096
|
+
"CalculateIRRReported",
|
|
2097
|
+
"CalculateIRRMTD",
|
|
2098
|
+
"CalculateIRRQTD",
|
|
2099
|
+
"CalculateIRRYTD",
|
|
2100
|
+
"CalculateTWRMTD",
|
|
2101
|
+
"CalculateTWRQTD",
|
|
2102
|
+
"CalculateTWRYTD",
|
|
2103
|
+
"CalculateVARMTD_99",
|
|
2104
|
+
"CalculateVARQTD_99",
|
|
2105
|
+
"CalculateVARYTD_99",
|
|
2106
|
+
"CalculateVARMTD_95",
|
|
2107
|
+
"CalculateVARQTD_95",
|
|
2108
|
+
"CalculateVARYTD_95",
|
|
2109
|
+
"CalculateMultiple",
|
|
2110
|
+
"CalculatePIC",
|
|
2111
|
+
"CalculateDPI",
|
|
2112
|
+
"CalculateTVPI",
|
|
2113
|
+
"CalculateRVPI",
|
|
2114
|
+
"CalculateMActualAudited",
|
|
2115
|
+
"CalculateMReported",
|
|
2116
|
+
"Count",
|
|
2117
|
+
"DistinctCount",
|
|
2118
|
+
"Product",
|
|
2119
|
+
"Min",
|
|
2120
|
+
"Max",
|
|
2121
|
+
"Avg",
|
|
2122
|
+
"Median",
|
|
2123
|
+
"Index",
|
|
2124
|
+
"PopulationVar",
|
|
2125
|
+
"SampleVar",
|
|
2126
|
+
"PopulationStDev",
|
|
2127
|
+
"SampleStDev",
|
|
2128
|
+
"RunningTotals",
|
|
2129
|
+
"PercentageOfGrandTotal",
|
|
2130
|
+
"PercentageOfColumnTotal",
|
|
2131
|
+
"PercentageOfRowTotal",
|
|
2132
|
+
"PercentageOfParentColumnTotal",
|
|
2133
|
+
"PercentageOfParentRowTotal",
|
|
2134
|
+
"DifferenceFrom",
|
|
2135
|
+
"PercentageOfDifferenceFrom",
|
|
2136
|
+
"PercentageOfParentTotal",
|
|
2137
|
+
];
|
|
2138
|
+
let translation = JSON.parse(localStorage.getItem("translation") || "{}");
|
|
2139
|
+
export const AGGREGATE_TYPES_TEXT = {
|
|
2140
|
+
CalculateIRR: translation.CALCULATE_IRR || "Calculate IRR",
|
|
2141
|
+
CalculateIRRIRRDate: translation.CALCULATE_IRR_IRR_DATE || "Calculate IRR (IRR Date)",
|
|
2142
|
+
CalculateIRRBeforeCarried: translation.CALCULATE_IRR_BEFORE_CARRY || "Calculate IRR Before Carried",
|
|
2143
|
+
CalculateIRRActualAudited: translation.CALCULATE_IRR_ACTUAL_AUDITED || "Calculate IRR Actual/Audited",
|
|
2144
|
+
CalculateIRRReported: translation.CI_REPORTED || "Calculate IRR Reported",
|
|
2145
|
+
CalculateIRRMTD: translation.CALCULATE_IRR_MTD || "Calculate IRR (MTD)",
|
|
2146
|
+
CalculateIRRQTD: translation.CALCULATE_IRR_QTD || "Calculate IRR (QTD)",
|
|
2147
|
+
CalculateIRRYTD: translation.CALCULATE_IRR_YTD || "Calculate IRR (YTD)",
|
|
2148
|
+
CalculateTWRMTD: translation.CALCULATE_TWR_MTD || "Calculate TWR (M)",
|
|
2149
|
+
CalculateTWRQTD: translation.CALCULATE_TWR_QTD || "Calculate TWR (Q)",
|
|
2150
|
+
CalculateTWRYTD: translation.CALCULATE_TWR_YTD || "Calculate TWR (Y)",
|
|
2151
|
+
CalculateVARMTD_99: translation.CALCULATE_VAR_MTD_99 || "Calculate VAR (M 99%)",
|
|
2152
|
+
CalculateVARQTD_99: translation.CALCULATE_VAR_QTD_99 || "Calculate VAR (Q 99%)",
|
|
2153
|
+
CalculateVARYTD_99: translation.CALCULATE_VAR_YTD_99 || "Calculate VAR (Y 99%)",
|
|
2154
|
+
CalculateVARMTD_95: translation.CALCULATE_VAR_MTD_95 || "Calculate VAR (M 95%)",
|
|
2155
|
+
CalculateVARQTD_95: translation.CALCULATE_VAR_QTD_95 || "Calculate VAR (Q 95%)",
|
|
2156
|
+
CalculateVARYTD_95: translation.CALCULATE_VAR_YTD_95 || "Calculate VAR (Y 95%)",
|
|
2157
|
+
CalculateMultiple: translation.CALCULATE_MULTIPLE || "Calculate Multiple",
|
|
2158
|
+
CalculatePIC: translation.CALCULATE_PIC || "Calculate PIC",
|
|
2159
|
+
CalculateDPI: translation.CALCULATE_DPI || "Calculate DPI",
|
|
2160
|
+
CalculateTVPI: translation.CALCULATE_TVPI || "Calculate TVPI",
|
|
2161
|
+
CalculateRVPI: translation.CALCULATE_RVPI || "Calculate RVPI",
|
|
2162
|
+
CalculateMActualAudited: translation.CALCULATE_MULTIPLE_ACTUAL_AUDITED ||
|
|
2163
|
+
"Calculate Multiple Actual/Audited",
|
|
2164
|
+
CalculateMReported: translation.CALCULATE_MULTIPLE_REPORTED || "Calculate Multiple Reported",
|
|
2165
|
+
First: translation.FIRST || "First",
|
|
2166
|
+
Last: translation.LAST || "Last",
|
|
2167
|
+
Median: translation.MEDIAN || "Median",
|
|
2168
|
+
};
|
|
2169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFpc2UtY29tbW9uLWxpYi9zcmMvbGliL2Rhc2hib2FyZC9kYXNoYm9hcmRQb3JsZXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBYyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7QUFNekUsTUFBTSxPQUFPLHVCQUF1QjtJQStEeEI7SUFDRDtJQUNDO0lBQ0E7SUFDQTtJQUMrQjtJQUNRO0lBcEUxQyxXQUFXLENBQUM7SUFDWCxRQUFRLENBQUM7SUFDVCxJQUFJLENBQUM7SUFDYixpQkFBaUI7SUFDVixtQkFBbUIsR0FBRyxFQUFFLENBQUM7SUFDekIsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0lBQzFCLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDbEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNkLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDO0lBQ1osUUFBUSxDQUFDO0lBQ1QsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUNuQixXQUFXLENBQUM7SUFDWixnQkFBZ0IsQ0FBQztJQUNqQixlQUFlLENBQUM7SUFDaEIsZ0JBQWdCLENBQUM7SUFDakIsa0JBQWtCLENBQVU7SUFDNUIsV0FBVyxHQUFHO1FBQ25CLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNU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RCxrQkFBa0IsRUFDaEIsV0FBVyxDQUFDLG9CQUFvQixJQUFJLHVCQUF1QjtJQUM3RCxrQkFBa0IsRUFDaEIsV0FBVyxDQUFDLG9CQUFvQixJQUFJLHVCQUF1QjtJQUM3RCxpQkFBaUIsRUFBRSxXQUFXLENBQUMsa0JBQWtCLElBQUksb0JBQW9CO0lBQ3pFLFlBQVksRUFBRSxXQUFXLENBQUMsYUFBYSxJQUFJLGVBQWU7SUFDMUQsWUFBWSxFQUFFLFdBQVcsQ0FBQyxhQUFhLElBQUksZUFBZTtJQUMxRCxhQUFhLEVBQUUsV0FBVyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0I7SUFDN0QsYUFBYSxFQUFFLFdBQVcsQ0FBQyxjQUFjLElBQUksZ0JBQWdCO0lBQzdELHVCQUF1QixFQUNyQixXQUFXLENBQUMsaUNBQWlDO1FBQzdDLG1DQUFtQztJQUNyQyxrQkFBa0IsRUFDaEIsV0FBVyxDQUFDLDJCQUEyQixJQUFJLDZCQUE2QjtJQUMxRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssSUFBSSxPQUFPO0lBQ25DLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxJQUFJLE1BQU07SUFDaEMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLElBQUksUUFBUTtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFwaUxpc3QgfSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSBcIi4vZGFzaGJvYXJkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEFQSV9TRVJWSUNFX1RPS0VOLCBQQkZfVE9LRU4gfSBmcm9tIFwiLi4vc2VydmljZS9JbmplY3Rpb25Ub2tlblwiO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvZGlhbG9nLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIERhc2hib2FyZFBvcmxldHNTZXJ2aWNlIHtcclxuICBwdWJsaWMgdHJhbnNsYXRpb247XHJcbiAgcHJpdmF0ZSB1c2VySW5mbztcclxuICBwcml2YXRlIGxhbmc7XHJcbiAgLy8gcHVibGljIGNvbmZpZztcclxuICBwdWJsaWMgY29tcGFueURyb3Bkb3duTGlzdCA9IFtdO1xyXG4gIHB1YmxpYyBjdXJyZW5jeURyb3Bkb3duTGlzdCA9IFtdO1xyXG4gIHB1YmxpYyBjdXJyZW5jeUxpc3QgPSBbXTtcclxuICBwdWJsaWMgcG9ydGxldHMgPSBbXTtcclxuICBwdWJsaWMgcG9ydGxldHNDb3B5ID0gW107XHJcbiAgcHVibGljIGNvbHVtbkNvdW50O1xyXG4gIHB1YmxpYyByb3dDb3VudDtcclxuICBwdWJsaWMgY29tcGFueUNoYXJ0cyA9IFtdO1xyXG4gIHB1YmxpYyBwb3J0bGV0RGF0YTtcclxuICBwdWJsaWMgZnVuZERyb3Bkb3duTGlzdDtcclxuICBwdWJsaWMgYWxsSW52ZXN0ZWVMaXN0O1xyXG4gIHB1YmxpYyBmdW5kSW52ZXN0ZWVMaXN0O1xyXG4gIHB1YmxpYyBzZWxldGVkQWxsSW52ZXN0ZWU6IGJvb2xlYW47XHJcbiAgcHVibGljIGNvbG9yc1RvdGFsID0gW1xyXG4gICAgXCIjMGI1NDk2XCIsXHJcbiAgICBcIiMwMDgxZmZcIixcclxuICAgIFwiIzIyY2NlMlwiLFxyXG4gICAgXCIjNjA2ZWRlXCIsXHJcbiAgICBcIiM4NTk4ZjdcIixcclxuICAgIFwiIzAwYTc0NFwiLFxyXG4gICAgXCIjMTJjMTc3XCIsXHJcbiAgICBcIiNmZGJmNWVcIixcclxuICAgIFwiI2ZmOGE0OFwiLFxyXG4gICAgXCIjZWE0MjU4XCIsXHJcbiAgXTtcclxuICBwdWJsaWMgZmV0Y2hfZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyB1cGRhdGVfbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjdXJyZW5jeUNvZGU7XHJcbiAgcHVibGljIHVwZGF0ZV9jb25maWc7XHJcbiAgcHVibGljIGxvYWRpbmdfc2hvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpbWc7XHJcbiAgcHVibGljIHNvcnRpbmdQb3J0bGV0ID0gW107XHJcbiAgcHVibGljIHBhZ2luZ0NoYW5naW5nID0gW107XHJcbiAgcHVibGljIHRpbWVNZWFzdXJlO1xyXG4gIHB1YmxpYyBlbnRpdHlMaXN0O1xyXG4gIHB1YmxpYyBlbnRpdHlUeXBlO1xyXG4gIHB1YmxpYyBzZWxlY3RlZF9lbnlpdHlfZmlsZWRzID0gW107XHJcbiAgcHVibGljIGlzRW50aXR5U2VsZWN0QWxsO1xyXG4gIHB1YmxpYyBjaGVja2VkQWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkTnVtO1xyXG4gIHB1YmxpYyB1cGRhdGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGRhdGFNYXJ0VGFibGVzID0ge307XHJcbiAgcHVibGljIGxlbmd0aCA9IDA7XHJcbiAgcHVibGljIEdldFNvdXJjZXNSZXM7XHJcbiAgcHVibGljIExpc3RFbnRpdGllc1JlcztcclxuICBwdWJsaWMgdGVtcGxhdGVMaXN0ID0gW107XHJcbiAgcHVibGljIGZpZWxkc0FyciA9IHt9O1xyXG4gIHB1YmxpYyBzb3VyY2VzRGF0YSA9IHt9O1xyXG4gIC8vIG5ld0Rhc2hib2FyZFxyXG4gIHB1YmxpYyBwb3J0bGV0UmVzdWx0c19OZXcgPSB7fTsgLy8g5LulRGF0YVRhYmxl5Li65Y2V5L2NIOWtmOWCqOaWsOaVsOaNrlxyXG4gIHB1YmxpYyBwb3J0bGV0RGF0YV9OZXcgPSB7fTsgLy8g5LulcG9ydGxldOS4uuWNleS9jSDlrZjlgqjmlrDmlbDmja5cclxuICBwdWJsaWMgcG9ydGxldEZpZWxkc19UZW1wID0ge307IC8vIOWtmOWCqOW9k+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=
|