barsa-tiles 0.0.1
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/README.md +25 -0
- package/esm2020/barsa-tiles.mjs +5 -0
- package/esm2020/lib/action-item/action-item.component.mjs +17 -0
- package/esm2020/lib/action-links.pipe.mjs +16 -0
- package/esm2020/lib/actions-link/actions-link.component.mjs +19 -0
- package/esm2020/lib/app-finder/app-finder.component.mjs +53 -0
- package/esm2020/lib/app-finder-app-list/app-finder-app-list.component.mjs +40 -0
- package/esm2020/lib/app-finder-group/app-finder-group.component.mjs +42 -0
- package/esm2020/lib/app-finder.service.mjs +121 -0
- package/esm2020/lib/barsa-tiles.module.mjs +196 -0
- package/esm2020/lib/change-app-tile/change-app-tile.component.mjs +47 -0
- package/esm2020/lib/create-app-group/create-app-group.component.mjs +44 -0
- package/esm2020/lib/directives/emptylist.directive.mjs +36 -0
- package/esm2020/lib/feed-tile/feed-tile.component.mjs +31 -0
- package/esm2020/lib/footer-edit-tile/footer-edit-tile.component.mjs +13 -0
- package/esm2020/lib/footer-tile/footer-tile.component.mjs +28 -0
- package/esm2020/lib/form-app-finder/form-app-finder.component.mjs +94 -0
- package/esm2020/lib/form-tile/form-tile.component.mjs +34 -0
- package/esm2020/lib/logo-tile/logo-tile.component.mjs +22 -0
- package/esm2020/lib/micro-tile-chart-area/micro-tile-chart-area.component.mjs +39 -0
- package/esm2020/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.mjs +28 -0
- package/esm2020/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.mjs +26 -0
- package/esm2020/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.mjs +19 -0
- package/esm2020/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.mjs +30 -0
- package/esm2020/lib/micro-tile-chart-line/micro-tile-chart-line.component.mjs +31 -0
- package/esm2020/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.mjs +26 -0
- package/esm2020/lib/models/app-tile-footer-section.mjs +2 -0
- package/esm2020/lib/models/app-tile-footer.mjs +2 -0
- package/esm2020/lib/models/app-tile-group-pin.mjs +2 -0
- package/esm2020/lib/models/base-bt-tile-component.mjs +20 -0
- package/esm2020/lib/models/base-tile-component.mjs +57 -0
- package/esm2020/lib/models/base-tile-setting.mjs +2 -0
- package/esm2020/lib/models/feed-tile-setting.mjs +2 -0
- package/esm2020/lib/models/index.mjs +14 -0
- package/esm2020/lib/models/logo-tile-setting.mjs +2 -0
- package/esm2020/lib/models/micro-tile-chart-bullet-setting.mjs +2 -0
- package/esm2020/lib/models/news-tile-setting.mjs +2 -0
- package/esm2020/lib/models/numeric-tile-setting.mjs +2 -0
- package/esm2020/lib/models/profile-tile-setting.mjs +2 -0
- package/esm2020/lib/models/tile-setting.mjs +2 -0
- package/esm2020/lib/models/user-portal-settings.mjs +2 -0
- package/esm2020/lib/news-tile/news-tile.component.mjs +59 -0
- package/esm2020/lib/numeric-tile/numeric-tile.component.mjs +33 -0
- package/esm2020/lib/pin-tile/pin-tile.component.mjs +111 -0
- package/esm2020/lib/pipes/group-tiles.pipe.mjs +31 -0
- package/esm2020/lib/pipes/home-group.pipe.mjs +17 -0
- package/esm2020/lib/pipes/tile-home-filter.pipe.mjs +28 -0
- package/esm2020/lib/profile-tile/profile-tile.component.mjs +25 -0
- package/esm2020/lib/shellbar/shellbar.component.mjs +159 -0
- package/esm2020/lib/simple-tile/simple-tile.component.mjs +17 -0
- package/esm2020/lib/tile/tile.component.mjs +47 -0
- package/esm2020/lib/tile-renderer.directive.mjs +69 -0
- package/esm2020/lib/tiles-viewer/tiles-viewer.component.mjs +118 -0
- package/esm2020/lib/tiles-viewer-container/tiles-viewer-container.component.mjs +158 -0
- package/esm2020/lib/tiles-viewer-group/tiles-viewer-group.component.mjs +75 -0
- package/esm2020/lib/tiles-viewer.service.mjs +130 -0
- package/esm2020/lib/tiles.service.mjs +500 -0
- package/esm2020/public-api.mjs +43 -0
- package/fesm2015/barsa-tiles.mjs +2415 -0
- package/fesm2015/barsa-tiles.mjs.map +1 -0
- package/fesm2020/barsa-tiles.mjs +2386 -0
- package/fesm2020/barsa-tiles.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/action-item/action-item.component.d.ts +6 -0
- package/lib/action-links.pipe.d.ts +7 -0
- package/lib/actions-link/actions-link.component.d.ts +8 -0
- package/lib/app-finder/app-finder.component.d.ts +24 -0
- package/lib/app-finder-app-list/app-finder-app-list.component.d.ts +20 -0
- package/lib/app-finder-group/app-finder-group.component.d.ts +14 -0
- package/lib/app-finder.service.d.ts +33 -0
- package/lib/barsa-tiles.module.d.ts +65 -0
- package/lib/change-app-tile/change-app-tile.component.d.ts +20 -0
- package/lib/create-app-group/create-app-group.component.d.ts +19 -0
- package/lib/directives/emptylist.directive.d.ts +14 -0
- package/lib/feed-tile/feed-tile.component.d.ts +11 -0
- package/lib/footer-edit-tile/footer-edit-tile.component.d.ts +6 -0
- package/lib/footer-tile/footer-tile.component.d.ts +11 -0
- package/lib/form-app-finder/form-app-finder.component.d.ts +38 -0
- package/lib/form-tile/form-tile.component.d.ts +24 -0
- package/lib/logo-tile/logo-tile.component.d.ts +7 -0
- package/lib/micro-tile-chart-area/micro-tile-chart-area.component.d.ts +8 -0
- package/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.d.ts +12 -0
- package/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.d.ts +16 -0
- package/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.d.ts +7 -0
- package/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.d.ts +8 -0
- package/lib/micro-tile-chart-line/micro-tile-chart-line.component.d.ts +8 -0
- package/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.d.ts +8 -0
- package/lib/models/app-tile-footer-section.d.ts +6 -0
- package/lib/models/app-tile-footer.d.ts +8 -0
- package/lib/models/app-tile-group-pin.d.ts +5 -0
- package/lib/models/base-bt-tile-component.d.ts +9 -0
- package/lib/models/base-tile-component.d.ts +26 -0
- package/lib/models/base-tile-setting.d.ts +5 -0
- package/lib/models/feed-tile-setting.d.ts +7 -0
- package/lib/models/index.d.ts +13 -0
- package/lib/models/logo-tile-setting.d.ts +6 -0
- package/lib/models/micro-tile-chart-bullet-setting.d.ts +10 -0
- package/lib/models/news-tile-setting.d.ts +4 -0
- package/lib/models/numeric-tile-setting.d.ts +9 -0
- package/lib/models/profile-tile-setting.d.ts +7 -0
- package/lib/models/tile-setting.d.ts +9 -0
- package/lib/models/user-portal-settings.d.ts +9 -0
- package/lib/news-tile/news-tile.component.d.ts +24 -0
- package/lib/numeric-tile/numeric-tile.component.d.ts +12 -0
- package/lib/pin-tile/pin-tile.component.d.ts +30 -0
- package/lib/pipes/group-tiles.pipe.d.ts +14 -0
- package/lib/pipes/home-group.pipe.d.ts +9 -0
- package/lib/pipes/tile-home-filter.pipe.d.ts +8 -0
- package/lib/profile-tile/profile-tile.component.d.ts +7 -0
- package/lib/shellbar/shellbar.component.d.ts +64 -0
- package/lib/simple-tile/simple-tile.component.d.ts +6 -0
- package/lib/tile/tile.component.d.ts +12 -0
- package/lib/tile-renderer.directive.d.ts +27 -0
- package/lib/tiles-viewer/tiles-viewer.component.d.ts +51 -0
- package/lib/tiles-viewer-container/tiles-viewer-container.component.d.ts +55 -0
- package/lib/tiles-viewer-group/tiles-viewer-group.component.d.ts +34 -0
- package/lib/tiles-viewer.service.d.ts +42 -0
- package/lib/tiles.service.d.ts +68 -0
- package/package.json +31 -0
- package/public-api.d.ts +39 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject, BehaviorSubject, of, from } from 'rxjs';
|
|
3
|
+
import { concatMap, distinctUntilChanged, filter, shareReplay, startWith, takeUntil, tap } from 'rxjs/operators';
|
|
4
|
+
import { BarsaApi } from 'barsa-novin-ray-core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "barsa-novin-ray-core";
|
|
7
|
+
import * as i2 from "@fundamental-ngx/core";
|
|
8
|
+
export class TilesService {
|
|
9
|
+
constructor(_portalService, _rtlService, _bbbTranslatePipe) {
|
|
10
|
+
this._portalService = _portalService;
|
|
11
|
+
this._rtlService = _rtlService;
|
|
12
|
+
this._bbbTranslatePipe = _bbbTranslatePipe;
|
|
13
|
+
this.shellbarSource = new Subject();
|
|
14
|
+
this._OnDestroy$ = new Subject();
|
|
15
|
+
this._homeAppTileGroupsSource = new BehaviorSubject([]);
|
|
16
|
+
this.pinTilesSource = new Subject();
|
|
17
|
+
this._appTileGroupsSource = new BehaviorSubject(null);
|
|
18
|
+
this._edithomeSource = new BehaviorSubject(false);
|
|
19
|
+
BarsaApi.Bw.TilesService = this;
|
|
20
|
+
this.homeAppTileGroups$ = this._homeAppTileGroupsSource.asObservable();
|
|
21
|
+
this.pinTiles$ = this.pinTilesSource.asObservable().pipe(startWith(null));
|
|
22
|
+
this.shellbarSource = new Subject();
|
|
23
|
+
this.shellbar$ = this.shellbarSource.asObservable().pipe(shareReplay(1));
|
|
24
|
+
this.appTileGroups$ = this._appTileGroupsSource.pipe(shareReplay(1));
|
|
25
|
+
this.editHome$ = this._edithomeSource.asObservable().pipe(takeUntil(this._OnDestroy$), distinctUntilChanged());
|
|
26
|
+
this.deviceSize$ = this._portalService.deviceSize$;
|
|
27
|
+
this._rtlService.rtl.next(BarsaApi.LoginFormData.IsRtl);
|
|
28
|
+
this.loadAllAppTileGroups();
|
|
29
|
+
this.appTileGroups$
|
|
30
|
+
.pipe(filter((moForReportModel) => moForReportModel !== null), tap((moForReportModel) => {
|
|
31
|
+
if (moForReportModel) {
|
|
32
|
+
this._allAppsLoaded(moForReportModel);
|
|
33
|
+
}
|
|
34
|
+
}))
|
|
35
|
+
.subscribe();
|
|
36
|
+
}
|
|
37
|
+
get appTileGroups() {
|
|
38
|
+
return this._appTileGroupsSource.getValue();
|
|
39
|
+
}
|
|
40
|
+
ngOnDestroy() {
|
|
41
|
+
this._OnDestroy$.next();
|
|
42
|
+
}
|
|
43
|
+
loadAppTileGroups(appTileGroup) {
|
|
44
|
+
if (!appTileGroup || appTileGroup.$TilesLoaded) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const allApps = this._appTileGroupsSource.getValue();
|
|
48
|
+
if (allApps) {
|
|
49
|
+
const selectedAppTilegroup = allApps?.MoDataList.find((c) => c.Id === appTileGroup.Id);
|
|
50
|
+
if (selectedAppTilegroup) {
|
|
51
|
+
this._loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps);
|
|
52
|
+
selectedAppTilegroup.$Children?.forEach((subGroup) => {
|
|
53
|
+
this._loadAppTilesOfAppTileGroup(subGroup, allApps);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
saveTilesStackContent(tilesStackContent) {
|
|
59
|
+
const userPortalSettings = this._portalService.userPortalSettings;
|
|
60
|
+
if (userPortalSettings == null) {
|
|
61
|
+
return Promise.resolve();
|
|
62
|
+
}
|
|
63
|
+
userPortalSettings.TilesStackContent = tilesStackContent;
|
|
64
|
+
userPortalSettings.$State = 'Modified';
|
|
65
|
+
return this._saveUserPortalSettings(userPortalSettings).then(() => this._portalService.setUserPortalSettings(userPortalSettings));
|
|
66
|
+
}
|
|
67
|
+
loadUserPortalSettings() {
|
|
68
|
+
return this._portalService.getData('UserPortalSetting').pipe(concatMap((data) => {
|
|
69
|
+
if (data) {
|
|
70
|
+
return of(data);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return this.loadFromServerUserPortalSetting();
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
loadFromServerUserPortalSetting() {
|
|
78
|
+
return from(new Promise((resolve, reject) => {
|
|
79
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
80
|
+
Parameters: [],
|
|
81
|
+
Method: 'GetUserPortalSettings',
|
|
82
|
+
SuccessFn: (userPortalSetting) => {
|
|
83
|
+
this._portalService.setData('UserPortalSetting', userPortalSetting);
|
|
84
|
+
resolve(userPortalSetting);
|
|
85
|
+
},
|
|
86
|
+
FailFn: () => {
|
|
87
|
+
reject(null);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
toggleAppGroupSettingVisible(appGroup) {
|
|
93
|
+
return from(new Promise((resolve, reject) => {
|
|
94
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
95
|
+
Parameters: [appGroup.Id],
|
|
96
|
+
Method: 'ToggleAppTileGroupSettingVisible',
|
|
97
|
+
SuccessFn: (appGroupSetting) => {
|
|
98
|
+
this._updateAppTileGroupSettings(appGroup, appGroupSetting);
|
|
99
|
+
resolve(appGroupSetting);
|
|
100
|
+
},
|
|
101
|
+
FailFn: () => {
|
|
102
|
+
reject(null);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
})).pipe(tap((appGroupSetting) => {
|
|
106
|
+
this._updateAppGroupSetting(appGroup, appGroupSetting);
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
resetAppGroupSetting(appGroup) {
|
|
110
|
+
return from(new Promise((resolve, reject) => {
|
|
111
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
112
|
+
Parameters: [appGroup.Id],
|
|
113
|
+
Method: 'ResetAppTileGroupSettingVisible',
|
|
114
|
+
SuccessFn: (appGroupSetting) => {
|
|
115
|
+
this._updateAppTileGroupSettings(appGroup, appGroupSetting);
|
|
116
|
+
resolve(appGroupSetting);
|
|
117
|
+
},
|
|
118
|
+
FailFn: () => {
|
|
119
|
+
reject(null);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
})).pipe(tap((appGroupSetting) => {
|
|
123
|
+
this._updateAppGroupSetting(appGroup, appGroupSetting);
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
deleteAppGroup(appGroup) {
|
|
127
|
+
return from(new Promise((resolve, reject) => {
|
|
128
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
129
|
+
Parameters: [appGroup.Id],
|
|
130
|
+
Method: 'DeleteAppGroup',
|
|
131
|
+
SuccessFn: () => {
|
|
132
|
+
resolve(appGroup.Id);
|
|
133
|
+
},
|
|
134
|
+
FailFn: () => {
|
|
135
|
+
reject(null);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
})).pipe(tap((appGroupId) => {
|
|
139
|
+
const allApps = this.appTileGroups;
|
|
140
|
+
if (allApps) {
|
|
141
|
+
allApps.MoDataList = allApps.MoDataList.filter((c) => c.Id !== appGroupId);
|
|
142
|
+
this._appTileGroupsSource.next(allApps);
|
|
143
|
+
}
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
changeAppTileSetting(appTile) {
|
|
147
|
+
const allApps = this.appTileGroups;
|
|
148
|
+
const selectedGroup = this.findGroupWithAppTileId(allApps, appTile.Id);
|
|
149
|
+
if (selectedGroup === null) {
|
|
150
|
+
return of(null);
|
|
151
|
+
}
|
|
152
|
+
return from(new Promise((resolve, reject) => {
|
|
153
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
154
|
+
Parameters: [selectedGroup.Id, appTile.Id, appTile.Title, appTile.Subtitle],
|
|
155
|
+
Method: 'ChangeAppTileSetting',
|
|
156
|
+
SuccessFn: () => {
|
|
157
|
+
this._nextAllAppTileGroups(allApps);
|
|
158
|
+
resolve(selectedGroup);
|
|
159
|
+
},
|
|
160
|
+
FailFn: () => {
|
|
161
|
+
reject(null);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
})).pipe(tap((appGroupSetting) => this.updataAppTileSetting(selectedGroup, appGroupSetting)));
|
|
165
|
+
}
|
|
166
|
+
saveAppGroupOrders(appGroups) {
|
|
167
|
+
const groupOrders = appGroups.map((c) => c.Id);
|
|
168
|
+
return from(new Promise((resolve, reject) => {
|
|
169
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
170
|
+
Parameters: [groupOrders],
|
|
171
|
+
Method: 'ChangeOrderAppTileGroups',
|
|
172
|
+
SuccessFn: () => {
|
|
173
|
+
resolve();
|
|
174
|
+
},
|
|
175
|
+
FailFn: () => {
|
|
176
|
+
reject(null);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
})).pipe();
|
|
180
|
+
}
|
|
181
|
+
createAppGroup(title) {
|
|
182
|
+
return from(new Promise((resolve, reject) => {
|
|
183
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
184
|
+
Parameters: [title],
|
|
185
|
+
Method: 'CreateAppTileGroup',
|
|
186
|
+
SuccessFn: (mo) => {
|
|
187
|
+
resolve(mo);
|
|
188
|
+
},
|
|
189
|
+
FailFn: () => {
|
|
190
|
+
reject(null);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
})).pipe(tap((mo) => this.addAppGroup(mo)));
|
|
194
|
+
}
|
|
195
|
+
saveOrderAppTiles(appGroup, appTiles, isActionLink = false, appTileIdTransferedId = '0') {
|
|
196
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
197
|
+
Parameters: [appGroup.Id, appTiles, isActionLink, appTileIdTransferedId],
|
|
198
|
+
Method: 'ChangeOrderAppTiles',
|
|
199
|
+
SuccessFn: () => { },
|
|
200
|
+
FailFn: () => { }
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
updataAppTileSetting(selectedGroup, appGroupSetting) {
|
|
204
|
+
const allApps = this.appTileGroups;
|
|
205
|
+
allApps?.MoDataList.forEach((appGroup) => {
|
|
206
|
+
if (appGroup.Id === selectedGroup.Id) {
|
|
207
|
+
appGroup.UserAppTileGroupSetting = appGroupSetting;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
this._appTileGroupsSource.next(allApps);
|
|
211
|
+
}
|
|
212
|
+
addAppGroup(mo) {
|
|
213
|
+
const allApps = this.appTileGroups;
|
|
214
|
+
if (allApps) {
|
|
215
|
+
allApps.MoDataList.push(mo);
|
|
216
|
+
this._appTileGroupsSource.next(allApps);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
singlePinTileChanged(appTileId) {
|
|
220
|
+
const allApps = this.appTileGroups;
|
|
221
|
+
const group = this.findGroupWithAppTileId(allApps, appTileId);
|
|
222
|
+
if (group === null) {
|
|
223
|
+
return of(false);
|
|
224
|
+
}
|
|
225
|
+
return from(new Promise((resolve, reject) => {
|
|
226
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
227
|
+
Parameters: [group.Id, appTileId],
|
|
228
|
+
Method: 'RemoveAppTileFromTileGroup',
|
|
229
|
+
SuccessFn: (setting) => {
|
|
230
|
+
this._updateAppTileGroupSettings(group, setting);
|
|
231
|
+
this._nextAllAppTileGroups(allApps);
|
|
232
|
+
resolve(true);
|
|
233
|
+
},
|
|
234
|
+
FailFn: () => {
|
|
235
|
+
reject(false);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
pinTileChanged(appTileGroupsPin, app, callback) {
|
|
241
|
+
const allApps = this.appTileGroups;
|
|
242
|
+
const visible = appTileGroupsPin.map((c) => c.visible);
|
|
243
|
+
const groupChanges = appTileGroupsPin.map((c) => new BarsaApi.Common.MetaObjectWeb({
|
|
244
|
+
Id: c.appTileGroup.Id,
|
|
245
|
+
TypeDefId: allApps?.TypeDefId
|
|
246
|
+
}));
|
|
247
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
248
|
+
Parameters: [groupChanges, visible, app.Id],
|
|
249
|
+
Method: 'TilePinChanged',
|
|
250
|
+
SuccessFn: (settings) => {
|
|
251
|
+
this._tilePinChange(appTileGroupsPin, allApps);
|
|
252
|
+
callback(settings);
|
|
253
|
+
},
|
|
254
|
+
FailFn: () => {
|
|
255
|
+
// TODO show error
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
_tilePinChange(appTileGroupsPin, allApps) {
|
|
260
|
+
for (const appTileGroupPin of appTileGroupsPin) {
|
|
261
|
+
let selectedAppGroup;
|
|
262
|
+
const appGroupId = appTileGroupPin.appTileGroup.Id;
|
|
263
|
+
allApps?.MoDataList.forEach((c) => {
|
|
264
|
+
if (c.Id === appGroupId) {
|
|
265
|
+
selectedAppGroup = c;
|
|
266
|
+
}
|
|
267
|
+
else if (!selectedAppGroup) {
|
|
268
|
+
selectedAppGroup = c.$Children?.find((child) => child.Id === appGroupId);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
if (selectedAppGroup && selectedAppGroup.$TilesLoaded) {
|
|
272
|
+
// let moDataList = selectedAppGroup.AppTiles.MoDataList;
|
|
273
|
+
// if (appTileGroups[i].visible)
|
|
274
|
+
// selectedAppGroup.AppTiles.MoDataList = [...moDataList, settings[i]];
|
|
275
|
+
// else
|
|
276
|
+
// selectedAppGroup.AppTiles.MoDataList = moDataList.filter(
|
|
277
|
+
// (c) => c.App.Id !== app.Id
|
|
278
|
+
// );
|
|
279
|
+
this._loadAppTilesOfAppTileGroup(selectedAppGroup, allApps);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
this._nextAllAppTileGroups(allApps);
|
|
283
|
+
}
|
|
284
|
+
loadShellbar() {
|
|
285
|
+
this._portalService
|
|
286
|
+
.ReportExecutePromise('Shellbar')
|
|
287
|
+
.then((moForReportModel) => this.shellbarSource.next(moForReportModel.MoDataList[0]));
|
|
288
|
+
}
|
|
289
|
+
loadAllAppTileGroups() {
|
|
290
|
+
this._portalService
|
|
291
|
+
.ReportExecute('AllAppTileGroups')
|
|
292
|
+
.subscribe((allApps) => this._nextAllAppTileGroups(allApps));
|
|
293
|
+
}
|
|
294
|
+
_setTileInfo(appTile) {
|
|
295
|
+
{
|
|
296
|
+
const title = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Title', null);
|
|
297
|
+
appTile.TileTitle = !appTile.Title ? title : appTile.Title;
|
|
298
|
+
const subtitle = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Subtitle', null);
|
|
299
|
+
appTile.Subtitle = !appTile.Subtitle ? subtitle : appTile.Subtitle;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
getTileGroups() {
|
|
303
|
+
return this._appTileGroupsSource.getValue();
|
|
304
|
+
}
|
|
305
|
+
setEditHome(edit) {
|
|
306
|
+
this._edithomeSource.next(edit);
|
|
307
|
+
}
|
|
308
|
+
_allAppsLoaded(moForReportModel) {
|
|
309
|
+
moForReportModel.MoDataList.forEach((c) => {
|
|
310
|
+
this._prepareNavigator(c);
|
|
311
|
+
});
|
|
312
|
+
this._setHomeAppTileGroups(moForReportModel.MoDataList);
|
|
313
|
+
}
|
|
314
|
+
_loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps) {
|
|
315
|
+
const callback = () => {
|
|
316
|
+
this._nextAllAppTileGroups(allApps);
|
|
317
|
+
};
|
|
318
|
+
if (!selectedAppTilegroup.UserAppTileGroupSetting) {
|
|
319
|
+
this._loadAppTilesByAppTileGroup(selectedAppTilegroup, callback);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
this._loadAppTilesByAppTileGroupSetting(selectedAppTilegroup, callback);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
_loadAppTilesByAppTileGroup(appGroup, callback) {
|
|
326
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
327
|
+
Parameters: [appGroup.Id],
|
|
328
|
+
Method: 'LoadAllAppTilesByAppTileGroup',
|
|
329
|
+
SuccessFn: (appTiles) => {
|
|
330
|
+
this._updateAppTilesOfAppTileGroup(appGroup, appTiles);
|
|
331
|
+
callback();
|
|
332
|
+
},
|
|
333
|
+
FailFn: () => {
|
|
334
|
+
// TODO show error
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
_updateAppTilesOfAppTileGroup(selectedAppTilegroup, appTiles) {
|
|
339
|
+
if (this.appTileGroups) {
|
|
340
|
+
selectedAppTilegroup = { ...selectedAppTilegroup, $TilesLoaded: true };
|
|
341
|
+
appTiles.MoDataList.forEach((element) => {
|
|
342
|
+
element.Component = element.A_App_Component ?? element.A_AppTile_App_Component;
|
|
343
|
+
element.DynamicCommand = element.A_App_DynamicCommand ?? element.A_AppTile_App_DynamicCommand;
|
|
344
|
+
element.Predefined = element.Predefined ?? element.A_AppTile_Predefined;
|
|
345
|
+
});
|
|
346
|
+
const apptileGroupIndex = this.appTileGroups?.MoDataList.findIndex((c) => c.Id === selectedAppTilegroup.Id || c.Id === selectedAppTilegroup.$ParentId);
|
|
347
|
+
selectedAppTilegroup.AppTiles = appTiles;
|
|
348
|
+
const tileGroup = this.appTileGroups.MoDataList[apptileGroupIndex];
|
|
349
|
+
if (selectedAppTilegroup.$ParentId) {
|
|
350
|
+
if (tileGroup.$Children) {
|
|
351
|
+
const idOfSubGroup = tileGroup.$Children.findIndex((c) => c.Id === selectedAppTilegroup.Id);
|
|
352
|
+
tileGroup.$Children[idOfSubGroup] = selectedAppTilegroup;
|
|
353
|
+
}
|
|
354
|
+
this.appTileGroups.MoDataList[apptileGroupIndex] = { ...tileGroup };
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
this.appTileGroups.MoDataList[apptileGroupIndex] = selectedAppTilegroup;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
_loadAppTilesByAppTileGroupSetting(appTileGroup, callback) {
|
|
362
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
363
|
+
Parameters: [appTileGroup.Id],
|
|
364
|
+
Method: 'LoadAllAppTilesByUserAppTileGroupSettings',
|
|
365
|
+
SuccessFn: (appTiles) => {
|
|
366
|
+
this._updateAppTilesOfAppTileGroup(appTileGroup, appTiles);
|
|
367
|
+
callback();
|
|
368
|
+
},
|
|
369
|
+
FailFn: () => {
|
|
370
|
+
// TODO show error
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
_nextAllAppTileGroups(newAllApps = null) {
|
|
375
|
+
const allApps = newAllApps ?? this._appTileGroupsSource.getValue();
|
|
376
|
+
this._appTileGroupsSource.next(allApps ? { ...allApps } : null);
|
|
377
|
+
}
|
|
378
|
+
_setHomeAppTileGroups(appGroups) {
|
|
379
|
+
let newAppGroups = [...appGroups];
|
|
380
|
+
newAppGroups = newAppGroups
|
|
381
|
+
.filter((c) => c.Visible)
|
|
382
|
+
.sort((a, b) => Number(a.navigatorOrderItem) - Number(b.navigatorOrderItem));
|
|
383
|
+
this._homeAppTileGroupsSource.next(newAppGroups);
|
|
384
|
+
}
|
|
385
|
+
_saveUserPortalSettings(userPortalSettings) {
|
|
386
|
+
return new Promise((resolve, reject) => {
|
|
387
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
388
|
+
Parameters: [new BarsaApi.Common.MetaObjectWeb(userPortalSettings)],
|
|
389
|
+
Method: 'SaveUserPortalSettings',
|
|
390
|
+
SuccessFn: () => {
|
|
391
|
+
resolve();
|
|
392
|
+
},
|
|
393
|
+
FailFn: () => {
|
|
394
|
+
reject(null);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
_updateAppGroupSetting(appGroup, appGroupSetting) {
|
|
400
|
+
const allApps = this.appTileGroups;
|
|
401
|
+
const selectedAppGroup = allApps?.MoDataList.find((c) => c.Id === appGroup.Id);
|
|
402
|
+
if (selectedAppGroup && allApps) {
|
|
403
|
+
selectedAppGroup.UserAppTileGroupSetting = appGroupSetting;
|
|
404
|
+
this._nextAllAppTileGroups(allApps);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
findGroupWithAppTileId(allApps, appTileId) {
|
|
408
|
+
let selectedGroup;
|
|
409
|
+
if (!allApps) {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
allApps.MoDataList.forEach((appGroup) => {
|
|
413
|
+
if (selectedGroup) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
if (appGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
|
|
417
|
+
selectedGroup = appGroup;
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
appGroup.$Children?.forEach((subGroup) => {
|
|
421
|
+
if (subGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
|
|
422
|
+
selectedGroup = subGroup;
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
return selectedGroup;
|
|
428
|
+
}
|
|
429
|
+
_findGroupWithAppGroupId(allApps, appGroupId) {
|
|
430
|
+
let selectedGroup;
|
|
431
|
+
if (!allApps) {
|
|
432
|
+
return null;
|
|
433
|
+
}
|
|
434
|
+
allApps.MoDataList.forEach((appGroup) => {
|
|
435
|
+
if (selectedGroup) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (appGroup.Id === appGroupId) {
|
|
439
|
+
selectedGroup = appGroup;
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
appGroup.$Children?.forEach((subGroup) => {
|
|
443
|
+
if (subGroup.Id === appGroupId) {
|
|
444
|
+
selectedGroup = subGroup;
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
return selectedGroup;
|
|
450
|
+
}
|
|
451
|
+
_updateAppTileGroupSettings(appTileGroup, setting) {
|
|
452
|
+
appTileGroup.UserAppTileGroupSetting = setting;
|
|
453
|
+
appTileGroup = JSON.parse(JSON.stringify(appTileGroup));
|
|
454
|
+
this._nextAllAppTileGroups();
|
|
455
|
+
return appTileGroup;
|
|
456
|
+
}
|
|
457
|
+
_prepareNavigator(appTileGroup) {
|
|
458
|
+
appTileGroup.$TileSettingChanged = false;
|
|
459
|
+
appTileGroup.$Disabledpin = false;
|
|
460
|
+
appTileGroup.navigatorTitle = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Title', appTileGroup.Title);
|
|
461
|
+
appTileGroup.navigatorTitle = appTileGroup.navigatorTitle =
|
|
462
|
+
appTileGroup.navigatorTitle === '' ? appTileGroup.Title : appTileGroup.navigatorTitle;
|
|
463
|
+
appTileGroup.navigatorTitle = this._bbbTranslatePipe.transform(appTileGroup.navigatorTitle);
|
|
464
|
+
const orderItem = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.OrderItem', null);
|
|
465
|
+
if (orderItem !== null) {
|
|
466
|
+
appTileGroup.navigatorOrderItem = orderItem;
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
appTileGroup.navigatorOrderItem = appTileGroup.OrderItem;
|
|
470
|
+
}
|
|
471
|
+
const visible = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Visible', null);
|
|
472
|
+
if (visible !== null) {
|
|
473
|
+
appTileGroup.navigatorVisible = visible;
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
appTileGroup.navigatorVisible = appTileGroup.Visible;
|
|
477
|
+
}
|
|
478
|
+
const appTiles = appTileGroup.AppTiles?.MoDataList ?? [];
|
|
479
|
+
appTileGroup.navigatorTiles = appTiles
|
|
480
|
+
.filter((c) => c.Visible && !c.IsActionLink)
|
|
481
|
+
.sort((a, b) => Number(a.OrderItem) - Number(b.OrderItem));
|
|
482
|
+
appTileGroup.navigatorActionLinks = appTiles
|
|
483
|
+
.filter((c) => c.Visible && c.IsActionLink)
|
|
484
|
+
.sort((a, b) => Number(a.OrderItemActionLink) - Number(b.OrderItemActionLink));
|
|
485
|
+
appTileGroup.navigatorTiles.forEach((appTile) => this._setTileInfo(appTile));
|
|
486
|
+
appTileGroup.navigatorActionLinks.forEach((appTile) => this._setTileInfo(appTile));
|
|
487
|
+
appTileGroup.$Children?.forEach((subAppTileGroup) => {
|
|
488
|
+
this._prepareNavigator(subAppTileGroup);
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
TilesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, deps: [{ token: i1.PortalService }, { token: i2.RtlService }, { token: i1.BbbTranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
493
|
+
TilesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, providedIn: 'root' });
|
|
494
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, decorators: [{
|
|
495
|
+
type: Injectable,
|
|
496
|
+
args: [{
|
|
497
|
+
providedIn: 'root'
|
|
498
|
+
}]
|
|
499
|
+
}], ctorParameters: function () { return [{ type: i1.PortalService }, { type: i2.RtlService }, { type: i1.BbbTranslatePipe }]; } });
|
|
500
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXRpbGVzL3NyYy9saWIvdGlsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakgsT0FBTyxFQUFFLFFBQVEsRUFBMEUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQU14SCxNQUFNLE9BQU8sWUFBWTtJQWVyQixZQUNZLGNBQTZCLEVBQzdCLFdBQXVCLEVBQ3ZCLGlCQUFtQztRQUZuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBZC9DLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFLNUMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQUMxRSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDNUMseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBQzFFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFPMUQsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENB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QUFPLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQzthQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDbkYsWUFBWSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM3RSxZQUFZLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbkYsWUFBWSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzt5R0E5aUJRLFlBQVk7NkdBQVosWUFBWSxjQUZULE1BQU07MkZBRVQsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XHJcbmltcG9ydCB7IEJhcnNhQXBpLCBCYmJUcmFuc2xhdGVQaXBlLCBNZXRhb2JqZWN0RGF0YU1vZGVsLCBNb0ZvclJlcG9ydE1vZGVsLCBQb3J0YWxTZXJ2aWNlIH0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBBcHBUaWxlR3JvdXBQaW4sIFVzZXJQb3J0YWxTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWxzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGlsZXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICAgIGRldmljZVNpemUkOiBPYnNlcnZhYmxlPCdzJyB8ICdtJyB8ICdsJyB8ICd4bCc+O1xyXG4gICAgaG9tZUFwcFRpbGVHcm91cHMkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT47XHJcbiAgICBwaW5UaWxlcyQ6IE9ic2VydmFibGU8UGluVGlsZUluZm8gfCBudWxsPjtcclxuICAgIHNoZWxsYmFyU291cmNlID0gbmV3IFN1YmplY3Q8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcclxuICAgIHNoZWxsYmFyJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsPjtcclxuICAgIGFwcFRpbGVHcm91cHMkOiBPYnNlcnZhYmxlPE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsPjtcclxuICAgIGVkaXRIb21lJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgICBwcml2YXRlIF9PbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2hvbWVBcHBUaWxlR3JvdXBzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcclxuICAgIHByaXZhdGUgcGluVGlsZXNTb3VyY2UgPSBuZXcgU3ViamVjdDxQaW5UaWxlSW5mbz4oKTtcclxuICAgIHByaXZhdGUgX2FwcFRpbGVHcm91cHNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX2VkaXRob21lU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfcG9ydGFsU2VydmljZTogUG9ydGFsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ydGxTZXJ2aWNlOiBSdGxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2JiYlRyYW5zbGF0ZVBpcGU6IEJiYlRyYW5zbGF0ZVBpcGVcclxuICAgICkge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlRpbGVzU2VydmljZSA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5ob21lQXBwVGlsZUdyb3VwcyQgPSB0aGlzLl9ob21lQXBwVGlsZUdyb3Vwc1NvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnBpblRpbGVzJCA9IHRoaXMucGluVGlsZXNTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShzdGFydFdpdGgobnVsbCkpO1xyXG4gICAgICAgIHRoaXMuc2hlbGxiYXJTb3VyY2UgPSBuZXcgU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xyXG4gICAgICAgIHRoaXMuc2hlbGxiYXIkID0gdGhpcy5zaGVsbGJhclNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuICAgICAgICB0aGlzLmFwcFRpbGVHcm91cHMkID0gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0SG9tZSQgPSB0aGlzLl9lZGl0aG9tZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9PbkRlc3Ryb3kkKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VTaXplJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UuZGV2aWNlU2l6ZSQ7XHJcbiAgICAgICAgdGhpcy5fcnRsU2VydmljZS5ydGwubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzUnRsKTtcclxuICAgICAgICB0aGlzLmxvYWRBbGxBcHBUaWxlR3JvdXBzKCk7XHJcbiAgICAgICAgdGhpcy5hcHBUaWxlR3JvdXBzJFxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGZpbHRlcigobW9Gb3JSZXBvcnRNb2RlbCkgPT4gbW9Gb3JSZXBvcnRNb2RlbCAhPT0gbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0YXAoKG1vRm9yUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9Gb3JSZXBvcnRNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxBcHBzTG9hZGVkKG1vRm9yUmVwb3J0TW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFwcFRpbGVHcm91cHMoKTogTW9Gb3JSZXBvcnRNb2RlbCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9PbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQXBwVGlsZUdyb3VwcyhhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWFwcFRpbGVHcm91cCB8fCBhcHBUaWxlR3JvdXAuJFRpbGVzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoYWxsQXBwcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFwcFRpbGVncm91cCA9IGFsbEFwcHM/Lk1vRGF0YUxpc3QuZmluZCgoYykgPT4gYy5JZCA9PT0gYXBwVGlsZUdyb3VwLklkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQXBwVGlsZWdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcFRpbGVncm91cCwgYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEFwcFRpbGVncm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZEFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc3ViR3JvdXAsIGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzYXZlVGlsZXNTdGFja0NvbnRlbnQodGlsZXNTdGFja0NvbnRlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB1c2VyUG9ydGFsU2V0dGluZ3MgPSB0aGlzLl9wb3J0YWxTZXJ2aWNlLnVzZXJQb3J0YWxTZXR0aW5ncztcclxuICAgICAgICBpZiAodXNlclBvcnRhbFNldHRpbmdzID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ3MuVGlsZXNTdGFja0NvbnRlbnQgPSB0aWxlc1N0YWNrQ29udGVudDtcclxuICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ3MuJFN0YXRlID0gJ01vZGlmaWVkJztcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZVVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3MpLnRoZW4oKCkgPT5cclxuICAgICAgICAgICAgdGhpcy5fcG9ydGFsU2VydmljZS5zZXRVc2VyUG9ydGFsU2V0dGluZ3ModXNlclBvcnRhbFNldHRpbmdzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFVzZXJQb3J0YWxTZXR0aW5ncygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3J0YWxTZXJ2aWNlLmdldERhdGEoJ1VzZXJQb3J0YWxTZXR0aW5nJykucGlwZShcclxuICAgICAgICAgICAgY29uY2F0TWFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZyb21TZXJ2ZXJVc2VyUG9ydGFsU2V0dGluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZEZyb21TZXJ2ZXJVc2VyUG9ydGFsU2V0dGluZygpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8VXNlclBvcnRhbFNldHRpbmdzPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdHZXRVc2VyUG9ydGFsU2V0dGluZ3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKHVzZXJQb3J0YWxTZXR0aW5nOiBNZXRhb2JqZWN0RGF0YU1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcnRhbFNlcnZpY2Uuc2V0RGF0YSgnVXNlclBvcnRhbFNldHRpbmcnLCB1c2VyUG9ydGFsU2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodXNlclBvcnRhbFNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgdG9nZ2xlQXBwR3JvdXBTZXR0aW5nVmlzaWJsZShhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWRdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ1RvZ2dsZUFwcFRpbGVHcm91cFNldHRpbmdWaXNpYmxlJyxcclxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChhcHBHcm91cFNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwVGlsZUdyb3VwU2V0dGluZ3MoYXBwR3JvdXAsIGFwcEdyb3VwU2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXBTZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKGFwcEdyb3VwU2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwR3JvdXBTZXR0aW5nKGFwcEdyb3VwLCBhcHBHcm91cFNldHRpbmcpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXNldEFwcEdyb3VwU2V0dGluZyhhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWRdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ1Jlc2V0QXBwVGlsZUdyb3VwU2V0dGluZ1Zpc2libGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGFwcEdyb3VwU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhhcHBHcm91cCwgYXBwR3JvdXBTZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcHBHcm91cFNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCgoYXBwR3JvdXBTZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBHcm91cFNldHRpbmcoYXBwR3JvdXAsIGFwcEdyb3VwU2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVBcHBHcm91cChhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdEZWxldGVBcHBHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXAuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCgoYXBwR3JvdXBJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcclxuICAgICAgICAgICAgICAgIGlmIChhbGxBcHBzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0ID0gYWxsQXBwcy5Nb0RhdGFMaXN0LmZpbHRlcigoYykgPT4gYy5JZCAhPT0gYXBwR3JvdXBJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5uZXh0KGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjaGFuZ2VBcHBUaWxlU2V0dGluZyhhcHBUaWxlOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbD4ge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuZmluZEdyb3VwV2l0aEFwcFRpbGVJZChhbGxBcHBzLCBhcHBUaWxlLklkKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRHcm91cCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbc2VsZWN0ZWRHcm91cC5JZCwgYXBwVGlsZS5JZCwgYXBwVGlsZS5UaXRsZSwgYXBwVGlsZS5TdWJ0aXRsZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnQ2hhbmdlQXBwVGlsZVNldHRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxlY3RlZEdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKHRhcCgoYXBwR3JvdXBTZXR0aW5nKSA9PiB0aGlzLnVwZGF0YUFwcFRpbGVTZXR0aW5nKHNlbGVjdGVkR3JvdXAsIGFwcEdyb3VwU2V0dGluZykpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQXBwR3JvdXBPcmRlcnMoYXBwR3JvdXBzOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBncm91cE9yZGVycyA9IGFwcEdyb3Vwcy5tYXAoKGMpID0+IGMuSWQpO1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbZ3JvdXBPcmRlcnNdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0NoYW5nZU9yZGVyQXBwVGlsZUdyb3VwcycsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlQXBwR3JvdXAodGl0bGU6IHN0cmluZyk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbdGl0bGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0NyZWF0ZUFwcFRpbGVHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAobW86IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICkucGlwZSh0YXAoKG1vKSA9PiB0aGlzLmFkZEFwcEdyb3VwKG1vKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVPcmRlckFwcFRpbGVzKFxyXG4gICAgICAgIGFwcEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgICAgIGFwcFRpbGVzOiBudW1iZXJbXSxcclxuICAgICAgICBpc0FjdGlvbkxpbmsgPSBmYWxzZSxcclxuICAgICAgICBhcHBUaWxlSWRUcmFuc2ZlcmVkSWQ6IHN0cmluZyA9ICcwJ1xyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBHcm91cC5JZCwgYXBwVGlsZXMsIGlzQWN0aW9uTGluaywgYXBwVGlsZUlkVHJhbnNmZXJlZElkXSxcclxuICAgICAgICAgICAgTWV0aG9kOiAnQ2hhbmdlT3JkZXJBcHBUaWxlcycsXHJcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge30sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge31cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGFBcHBUaWxlU2V0dGluZyhzZWxlY3RlZEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xyXG4gICAgICAgIGFsbEFwcHM/Lk1vRGF0YUxpc3QuZm9yRWFjaCgoYXBwR3JvdXApID0+IHtcclxuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLklkID09PSBzZWxlY3RlZEdyb3VwLklkKSB7XHJcbiAgICAgICAgICAgICAgICBhcHBHcm91cC5Vc2VyQXBwVGlsZUdyb3VwU2V0dGluZyA9IGFwcEdyb3VwU2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBcHBHcm91cChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgaWYgKGFsbEFwcHMpIHtcclxuICAgICAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LnB1c2gobW8pO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNpbmdsZVBpblRpbGVDaGFuZ2VkKGFwcFRpbGVJZCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZUlkKTtcclxuICAgICAgICBpZiAoZ3JvdXAgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cC5JZCwgYXBwVGlsZUlkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdSZW1vdmVBcHBUaWxlRnJvbVRpbGVHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhncm91cCwgc2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHBpblRpbGVDaGFuZ2VkKGFwcFRpbGVHcm91cHNQaW46IEFwcFRpbGVHcm91cFBpbltdLCBhcHA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gYXBwVGlsZUdyb3Vwc1Bpbi5tYXAoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBDaGFuZ2VzID0gYXBwVGlsZUdyb3Vwc1Bpbi5tYXAoXHJcbiAgICAgICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgICAgICAgbmV3IEJhcnNhQXBpLkNvbW1vbi5NZXRhT2JqZWN0V2ViKHtcclxuICAgICAgICAgICAgICAgICAgICBJZDogYy5hcHBUaWxlR3JvdXAuSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgVHlwZURlZklkOiBhbGxBcHBzPy5UeXBlRGVmSWRcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cENoYW5nZXMsIHZpc2libGUsIGFwcC5JZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ1RpbGVQaW5DaGFuZ2VkJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoc2V0dGluZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbGVQaW5DaGFuZ2UoYXBwVGlsZUdyb3Vwc1BpbiwgYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF90aWxlUGluQ2hhbmdlKGFwcFRpbGVHcm91cHNQaW4sIGFsbEFwcHMpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGFwcFRpbGVHcm91cFBpbiBvZiBhcHBUaWxlR3JvdXBzUGluKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZEFwcEdyb3VwO1xyXG4gICAgICAgICAgICBjb25zdCBhcHBHcm91cElkID0gYXBwVGlsZUdyb3VwUGluLmFwcFRpbGVHcm91cC5JZDtcclxuICAgICAgICAgICAgYWxsQXBwcz8uTW9EYXRhTGlzdC5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYy5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc2VsZWN0ZWRBcHBHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjLiRDaGlsZHJlbj8uZmluZCgoY2hpbGQpID0+IGNoaWxkLklkID09PSBhcHBHcm91cElkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFwcEdyb3VwICYmIHNlbGVjdGVkQXBwR3JvdXAuJFRpbGVzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgbW9EYXRhTGlzdCA9IHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdDtcclxuICAgICAgICAgICAgICAgIC8vIGlmIChhcHBUaWxlR3JvdXBzW2ldLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IFsuLi5tb0RhdGFMaXN0LCBzZXR0aW5nc1tpXV07XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IG1vRGF0YUxpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIChjKSA9PiBjLkFwcC5JZCAhPT0gYXBwLklkXHJcbiAgICAgICAgICAgICAgICAvLyAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcEdyb3VwLCBhbGxBcHBzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2hlbGxiYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcG9ydGFsU2VydmljZVxyXG4gICAgICAgICAgICAuUmVwb3J0RXhlY3V0ZVByb21pc2UoJ1NoZWxsYmFyJylcclxuICAgICAgICAgICAgLnRoZW4oKG1vRm9yUmVwb3J0TW9kZWwpID0+IHRoaXMuc2hlbGxiYXJTb3VyY2UubmV4dChtb0ZvclJlcG9ydE1vZGVsLk1vRGF0YUxpc3RbMF0pKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQWxsQXBwVGlsZUdyb3VwcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wb3J0YWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5SZXBvcnRFeGVjdXRlKCdBbGxBcHBUaWxlR3JvdXBzJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoYWxsQXBwcykgPT4gdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoYWxsQXBwcykpO1xyXG4gICAgfVxyXG4gICAgX3NldFRpbGVJbmZvKGFwcFRpbGUpOiB2b2lkIHtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZSwgJ0NvbXBvbmVudC5TZXR0aW5ncy5UaWxlU2V0dGluZy5UaXRsZScsIG51bGwpO1xyXG4gICAgICAgICAgICBhcHBUaWxlLlRpbGVUaXRsZSA9ICFhcHBUaWxlLlRpdGxlID8gdGl0bGUgOiBhcHBUaWxlLlRpdGxlO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJ0aXRsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGFwcFRpbGUsICdDb21wb25lbnQuU2V0dGluZ3MuVGlsZVNldHRpbmcuU3VidGl0bGUnLCBudWxsKTtcclxuICAgICAgICAgICAgYXBwVGlsZS5TdWJ0aXRsZSA9ICFhcHBUaWxlLlN1YnRpdGxlID8gc3VidGl0bGUgOiBhcHBUaWxlLlN1YnRpdGxlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWxlR3JvdXBzKCk6IE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEVkaXRIb21lKGVkaXQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lZGl0aG9tZVNvdXJjZS5uZXh0KGVkaXQpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfYWxsQXBwc0xvYWRlZChtb0ZvclJlcG9ydE1vZGVsOiBNb0ZvclJlcG9ydE1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgbW9Gb3JSZXBvcnRNb2RlbC5Nb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZU5hdmlnYXRvcihjKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9zZXRIb21lQXBwVGlsZUdyb3Vwcyhtb0ZvclJlcG9ydE1vZGVsLk1vRGF0YUxpc3QpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfbG9hZEFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGFsbEFwcHM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZEFwcFRpbGVzQnlBcHBUaWxlR3JvdXAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXAsIGNhbGxiYWNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNCeUFwcFRpbGVHcm91cFNldHRpbmcoc2VsZWN0ZWRBcHBUaWxlZ3JvdXAsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9sb2FkQXBwVGlsZXNCeUFwcFRpbGVHcm91cChhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcclxuICAgICAgICAgICAgTWV0aG9kOiAnTG9hZEFsbEFwcFRpbGVzQnlBcHBUaWxlR3JvdXAnLFxyXG4gICAgICAgICAgICBTdWNjZXNzRm46IChhcHBUaWxlczogTW9Gb3JSZXBvcnRNb2RlbCk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwVGlsZXNPZkFwcFRpbGVHcm91cChhcHBHcm91cCwgYXBwVGlsZXMpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRmFpbEZuOiAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcFRpbGVncm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgYXBwVGlsZXM6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hcHBUaWxlR3JvdXBzKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZWdyb3VwID0geyAuLi5zZWxlY3RlZEFwcFRpbGVncm91cCwgJFRpbGVzTG9hZGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIGFwcFRpbGVzLk1vRGF0YUxpc3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5Db21wb25lbnQgPSBlbGVtZW50LkFfQXBwX0NvbXBvbmVudCA/PyBlbGVtZW50LkFfQXBwVGlsZV9BcHBfQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5EeW5hbWljQ29tbWFuZCA9IGVsZW1lbnQuQV9BcHBfRHluYW1pY0NvbW1hbmQgPz8gZWxlbWVudC5BX0FwcFRpbGVfQXBwX0R5bmFtaWNDb21tYW5kO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5QcmVkZWZpbmVkID0gZWxlbWVudC5QcmVkZWZpbmVkID8/IGVsZW1lbnQuQV9BcHBUaWxlX1ByZWRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBhcHB0aWxlR3JvdXBJbmRleCA9IHRoaXMuYXBwVGlsZUdyb3Vwcz8uTW9EYXRhTGlzdC5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAoYykgPT4gYy5JZCA9PT0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuSWQgfHwgYy5JZCA9PT0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuJFBhcmVudElkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZWdyb3VwLkFwcFRpbGVzID0gYXBwVGlsZXM7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGVHcm91cCA9IHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQXBwVGlsZWdyb3VwLiRQYXJlbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGVHcm91cC4kQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZE9mU3ViR3JvdXAgPSB0aWxlR3JvdXAuJENoaWxkcmVuLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbGVHcm91cC4kQ2hpbGRyZW5baWRPZlN1Ykdyb3VwXSA9IHNlbGVjdGVkQXBwVGlsZWdyb3VwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBUaWxlR3JvdXBzLk1vRGF0YUxpc3RbYXBwdGlsZUdyb3VwSW5kZXhdID0geyAuLi50aWxlR3JvdXAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XSA9IHNlbGVjdGVkQXBwVGlsZWdyb3VwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfbG9hZEFwcFRpbGVzQnlBcHBUaWxlR3JvdXBTZXR0aW5nKGFwcFRpbGVHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcFRpbGVHcm91cC5JZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ0xvYWRBbGxBcHBUaWxlc0J5VXNlckFwcFRpbGVHcm91cFNldHRpbmdzJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoYXBwVGlsZXM6IE1vRm9yUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoYXBwVGlsZUdyb3VwLCBhcHBUaWxlcyk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdyBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbmV4dEFsbEFwcFRpbGVHcm91cHMobmV3QWxsQXBwczogTW9Gb3JSZXBvcnRNb2RlbCB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IG5ld0FsbEFwcHMgPz8gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzID8geyAuLi5hbGxBcHBzIH0gOiBudWxsKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX3NldEhvbWVBcHBUaWxlR3JvdXBzKGFwcEdyb3VwczogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG5ld0FwcEdyb3VwcyA9IFsuLi5hcHBHcm91cHNdO1xyXG4gICAgICAgIG5ld0FwcEdyb3VwcyA9IG5ld0FwcEdyb3Vwc1xyXG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLlZpc2libGUpXHJcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYS5uYXZpZ2F0b3JPcmRlckl0ZW0pIC0gTnVtYmVyKGIubmF2aWdhdG9yT3JkZXJJdGVtKSk7XHJcbiAgICAgICAgdGhpcy5faG9tZUFwcFRpbGVHcm91cHNTb3VyY2UubmV4dChuZXdBcHBHcm91cHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfc2F2ZVVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IFVzZXJQb3J0YWxTZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW25ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYih1c2VyUG9ydGFsU2V0dGluZ3MpXSxcclxuICAgICAgICAgICAgICAgIE1ldGhvZDogJ1NhdmVVc2VyUG9ydGFsU2V0dGluZ3MnLFxyXG4gICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXBwR3JvdXBTZXR0aW5nKGFwcEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQXBwR3JvdXAgPSBhbGxBcHBzPy5Nb0RhdGFMaXN0LmZpbmQoKGMpID0+IGMuSWQgPT09IGFwcEdyb3VwLklkKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRBcHBHcm91cCAmJiBhbGxBcHBzKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcgPSBhcHBHcm91cFNldHRpbmc7XHJcbiAgICAgICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZUlkOiBzdHJpbmcpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkR3JvdXA7XHJcblxyXG4gICAgICAgIGlmICghYWxsQXBwcykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LmZvckVhY2goKGFwcEdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLm5hdmlnYXRvclRpbGVzLnNvbWUoKGFwcFRpbGUpID0+IGFwcFRpbGUuSWQgPT09IGFwcFRpbGVJZCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBhcHBHcm91cDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhcHBHcm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViR3JvdXAubmF2aWdhdG9yVGlsZXMuc29tZSgoYXBwVGlsZSkgPT4gYXBwVGlsZS5JZCA9PT0gYXBwVGlsZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBzdWJHcm91cDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZEdyb3VwO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfZmluZEdyb3VwV2l0aEFwcEdyb3VwSWQoYWxsQXBwcywgYXBwR3JvdXBJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEdyb3VwO1xyXG5cclxuICAgICAgICBpZiAoIWFsbEFwcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFsbEFwcHMuTW9EYXRhTGlzdC5mb3JFYWNoKChhcHBHcm91cCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhcHBHcm91cC5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IGFwcEdyb3VwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFwcEdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViR3JvdXApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJHcm91cC5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBzdWJHcm91cDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZEdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUFwcFRpbGVHcm91cFNldHRpbmdzKFxyXG4gICAgICAgIGFwcFRpbGVHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCxcclxuICAgICAgICBzZXR0aW5nOiBNZXRhb2JqZWN0RGF0YU1vZGVsXHJcbiAgICApOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgICAgICBhcHBUaWxlR3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcgPSBzZXR0aW5nO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXBwVGlsZUdyb3VwKSk7XHJcbiAgICAgICAgdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoKTtcclxuICAgICAgICByZXR1cm4gYXBwVGlsZUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVOYXZpZ2F0b3IoYXBwVGlsZUdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLiRUaWxlU2V0dGluZ0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICBhcHBUaWxlR3JvdXAuJERpc2FibGVkcGluID0gZmFsc2U7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cCxcclxuICAgICAgICAgICAgJ1VzZXJBcHBUaWxlR3JvdXBTZXR0aW5nLlRpdGxlJyxcclxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLlRpdGxlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPSBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPVxyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPT09ICcnID8gYXBwVGlsZUdyb3VwLlRpdGxlIDogYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSA9IHRoaXMuX2JiYlRyYW5zbGF0ZVBpcGUudHJhbnNmb3JtKGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSk7XHJcbiAgICAgICAgY29uc3Qgb3JkZXJJdGVtID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZUdyb3VwLCAnVXNlckFwcFRpbGVHcm91cFNldHRpbmcuT3JkZXJJdGVtJywgbnVsbCk7XHJcbiAgICAgICAgaWYgKG9yZGVySXRlbSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yT3JkZXJJdGVtID0gb3JkZXJJdGVtO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JPcmRlckl0ZW0gPSBhcHBUaWxlR3JvdXAuT3JkZXJJdGVtO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGFwcFRpbGVHcm91cCwgJ1VzZXJBcHBUaWxlR3JvdXBTZXR0aW5nLlZpc2libGUnLCBudWxsKTtcclxuICAgICAgICBpZiAodmlzaWJsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclZpc2libGUgPSBhcHBUaWxlR3JvdXAuVmlzaWJsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFwcFRpbGVzID0gYXBwVGlsZUdyb3VwLkFwcFRpbGVzPy5Nb0RhdGFMaXN0ID8/IFtdO1xyXG5cclxuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGlsZXMgPSBhcHBUaWxlc1xyXG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLlZpc2libGUgJiYgIWMuSXNBY3Rpb25MaW5rKVxyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gTnVtYmVyKGEuT3JkZXJJdGVtKSAtIE51bWJlcihiLk9yZGVySXRlbSkpO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JBY3Rpb25MaW5rcyA9IGFwcFRpbGVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMuVmlzaWJsZSAmJiBjLklzQWN0aW9uTGluaylcclxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IE51bWJlcihhLk9yZGVySXRlbUFjdGlvbkxpbmspIC0gTnVtYmVyKGIuT3JkZXJJdGVtQWN0aW9uTGluaykpO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaWxlcy5mb3JFYWNoKChhcHBUaWxlKSA9PiB0aGlzLl9zZXRUaWxlSW5mbyhhcHBUaWxlKSk7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvckFjdGlvbkxpbmtzLmZvckVhY2goKGFwcFRpbGUpID0+IHRoaXMuX3NldFRpbGVJbmZvKGFwcFRpbGUpKTtcclxuXHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViQXBwVGlsZUdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVOYXZpZ2F0b3Ioc3ViQXBwVGlsZUdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5pbnRlcmZhY2UgUGluVGlsZUluZm8ge1xyXG4gICAgZ3JvdXBzOiBNZXRhb2JqZWN0RGF0YU1vZGVsW107XHJcbiAgICB2aXNpYmxlOiBib29sZWFuW107XHJcbiAgICB0aWxlSWQ6IHN0cmluZztcclxufVxyXG4iXX0=
|