barsa-tiles 1.0.456 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/{esm2020 → esm2022}/barsa-tiles.mjs +4 -4
  2. package/esm2022/lib/action-item/action-item.component.mjs +17 -0
  3. package/{esm2020 → esm2022}/lib/action-links.pipe.mjs +16 -16
  4. package/esm2022/lib/actions-link/actions-link.component.mjs +41 -0
  5. package/esm2022/lib/app-finder/app-finder.component.mjs +52 -0
  6. package/esm2022/lib/app-finder-app-list/app-finder-app-list.component.mjs +39 -0
  7. package/esm2022/lib/app-finder-group/app-finder-group.component.mjs +41 -0
  8. package/esm2022/lib/app-finder.service.mjs +121 -0
  9. package/esm2022/lib/barsa-shellbar/barsa-shellbar.component.mjs +183 -0
  10. package/esm2022/lib/barsa-tiles.module.mjs +225 -0
  11. package/esm2022/lib/change-app-tile/change-app-tile.component.mjs +46 -0
  12. package/esm2022/lib/create-app-group/create-app-group.component.mjs +43 -0
  13. package/esm2022/lib/directives/emptylist.directive.mjs +36 -0
  14. package/esm2022/lib/feed-tile/feed-tile.component.mjs +31 -0
  15. package/{esm2020 → esm2022}/lib/footer-edit-tile/footer-edit-tile.component.mjs +13 -13
  16. package/esm2022/lib/footer-tile/footer-tile.component.mjs +27 -0
  17. package/esm2022/lib/form-app-finder/form-app-finder.component.mjs +95 -0
  18. package/esm2022/lib/form-tile/form-tile.component.mjs +34 -0
  19. package/esm2022/lib/logo-tile/logo-tile.component.mjs +23 -0
  20. package/{esm2020 → esm2022}/lib/micro-tile-chart-area/micro-tile-chart-area.component.mjs +40 -40
  21. package/{esm2020 → esm2022}/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.mjs +29 -29
  22. package/esm2022/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.mjs +26 -0
  23. package/{esm2020 → esm2022}/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.mjs +20 -20
  24. package/{esm2020 → esm2022}/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.mjs +31 -31
  25. package/{esm2020 → esm2022}/lib/micro-tile-chart-line/micro-tile-chart-line.component.mjs +32 -32
  26. package/{esm2020 → esm2022}/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.mjs +27 -27
  27. package/{esm2020 → esm2022}/lib/models/app-tile-footer-section.mjs +1 -1
  28. package/{esm2020 → esm2022}/lib/models/app-tile-footer.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/models/app-tile-group-pin.mjs +1 -1
  30. package/esm2022/lib/models/base-bt-tile-component.mjs +26 -0
  31. package/{esm2020 → esm2022}/lib/models/base-tile-component.mjs +58 -58
  32. package/{esm2020 → esm2022}/lib/models/base-tile-setting.mjs +1 -1
  33. package/{esm2020 → esm2022}/lib/models/feed-tile-setting.mjs +1 -1
  34. package/{esm2020 → esm2022}/lib/models/index.mjs +13 -13
  35. package/{esm2020 → esm2022}/lib/models/logo-tile-setting.mjs +1 -1
  36. package/{esm2020 → esm2022}/lib/models/micro-tile-chart-bullet-setting.mjs +1 -1
  37. package/{esm2020 → esm2022}/lib/models/news-tile-setting.mjs +1 -1
  38. package/{esm2020 → esm2022}/lib/models/numeric-tile-setting.mjs +1 -1
  39. package/{esm2020 → esm2022}/lib/models/profile-tile-setting.mjs +1 -1
  40. package/esm2022/lib/models/tile-setting.mjs +2 -0
  41. package/{esm2020 → esm2022}/lib/models/user-portal-settings.mjs +1 -1
  42. package/esm2022/lib/news-tile/news-tile.component.mjs +53 -0
  43. package/esm2022/lib/notification-group/notification-group.component.mjs +116 -0
  44. package/esm2022/lib/notification-group-header/notification-group-header.component.mjs +38 -0
  45. package/esm2022/lib/numeric-tile/numeric-tile.component.mjs +64 -0
  46. package/esm2022/lib/pin-tile/pin-tile.component.mjs +110 -0
  47. package/esm2022/lib/pipes/group-tiles.pipe.mjs +31 -0
  48. package/{esm2020 → esm2022}/lib/pipes/home-group.pipe.mjs +17 -17
  49. package/esm2022/lib/pipes/tile-home-filter.pipe.mjs +28 -0
  50. package/esm2022/lib/pipes/tile-prop.pipe.mjs +32 -0
  51. package/esm2022/lib/popover-app-finder/filter-apps-grouped.pipe.mjs +36 -0
  52. package/esm2022/lib/popover-app-finder/popover-app-finder.component.mjs +112 -0
  53. package/esm2022/lib/profile-tile/profile-tile.component.mjs +25 -0
  54. package/esm2022/lib/shellbar/shellbar.component.mjs +201 -0
  55. package/esm2022/lib/simple-tile/simple-tile.component.mjs +22 -0
  56. package/esm2022/lib/tile/tile.component.mjs +70 -0
  57. package/esm2022/lib/tile-renderer.directive.mjs +70 -0
  58. package/esm2022/lib/tile-style.directive.mjs +29 -0
  59. package/esm2022/lib/tiles-viewer/tiles-viewer.component.mjs +167 -0
  60. package/esm2022/lib/tiles-viewer-container/tiles-viewer-container.component.mjs +164 -0
  61. package/esm2022/lib/tiles-viewer-group/tiles-viewer-group.component.mjs +88 -0
  62. package/esm2022/lib/tiles-viewer.service.mjs +130 -0
  63. package/esm2022/lib/tiles.service.mjs +589 -0
  64. package/{esm2020 → esm2022}/public-api.mjs +46 -45
  65. package/fesm2022/barsa-tiles.mjs +3179 -0
  66. package/fesm2022/barsa-tiles.mjs.map +1 -0
  67. package/index.d.ts +5 -5
  68. package/lib/action-item/action-item.component.d.ts +6 -6
  69. package/lib/action-links.pipe.d.ts +7 -7
  70. package/lib/actions-link/actions-link.component.d.ts +17 -17
  71. package/lib/app-finder/app-finder.component.d.ts +24 -24
  72. package/lib/app-finder-app-list/app-finder-app-list.component.d.ts +20 -20
  73. package/lib/app-finder-group/app-finder-group.component.d.ts +14 -14
  74. package/lib/app-finder.service.d.ts +33 -33
  75. package/lib/barsa-shellbar/barsa-shellbar.component.d.ts +104 -97
  76. package/lib/barsa-tiles.module.d.ts +91 -86
  77. package/lib/change-app-tile/change-app-tile.component.d.ts +20 -20
  78. package/lib/create-app-group/create-app-group.component.d.ts +19 -19
  79. package/lib/directives/emptylist.directive.d.ts +14 -14
  80. package/lib/feed-tile/feed-tile.component.d.ts +11 -11
  81. package/lib/footer-edit-tile/footer-edit-tile.component.d.ts +6 -6
  82. package/lib/footer-tile/footer-tile.component.d.ts +11 -11
  83. package/lib/form-app-finder/form-app-finder.component.d.ts +38 -38
  84. package/lib/form-tile/form-tile.component.d.ts +24 -24
  85. package/lib/logo-tile/logo-tile.component.d.ts +7 -7
  86. package/lib/micro-tile-chart-area/micro-tile-chart-area.component.d.ts +8 -8
  87. package/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.d.ts +12 -12
  88. package/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.d.ts +16 -16
  89. package/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.d.ts +7 -7
  90. package/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.d.ts +8 -8
  91. package/lib/micro-tile-chart-line/micro-tile-chart-line.component.d.ts +8 -8
  92. package/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.d.ts +8 -8
  93. package/lib/models/app-tile-footer-section.d.ts +6 -6
  94. package/lib/models/app-tile-footer.d.ts +8 -8
  95. package/lib/models/app-tile-group-pin.d.ts +5 -5
  96. package/lib/models/base-bt-tile-component.d.ts +9 -9
  97. package/lib/models/base-tile-component.d.ts +26 -26
  98. package/lib/models/base-tile-setting.d.ts +5 -5
  99. package/lib/models/feed-tile-setting.d.ts +7 -7
  100. package/lib/models/index.d.ts +13 -13
  101. package/lib/models/logo-tile-setting.d.ts +6 -6
  102. package/lib/models/micro-tile-chart-bullet-setting.d.ts +10 -10
  103. package/lib/models/news-tile-setting.d.ts +4 -4
  104. package/lib/models/numeric-tile-setting.d.ts +9 -9
  105. package/lib/models/profile-tile-setting.d.ts +7 -7
  106. package/lib/models/tile-setting.d.ts +10 -10
  107. package/lib/models/user-portal-settings.d.ts +9 -9
  108. package/lib/news-tile/news-tile.component.d.ts +19 -19
  109. package/lib/notification-group/notification-group.component.d.ts +54 -55
  110. package/lib/notification-group-header/notification-group-header.component.d.ts +15 -15
  111. package/lib/numeric-tile/numeric-tile.component.d.ts +16 -12
  112. package/lib/pin-tile/pin-tile.component.d.ts +30 -30
  113. package/lib/pipes/group-tiles.pipe.d.ts +14 -14
  114. package/lib/pipes/home-group.pipe.d.ts +9 -9
  115. package/lib/pipes/tile-home-filter.pipe.d.ts +8 -8
  116. package/lib/pipes/tile-prop.pipe.d.ts +8 -8
  117. package/lib/popover-app-finder/filter-apps-grouped.pipe.d.ts +13 -0
  118. package/lib/popover-app-finder/popover-app-finder.component.d.ts +39 -0
  119. package/lib/profile-tile/profile-tile.component.d.ts +7 -7
  120. package/lib/shellbar/shellbar.component.d.ts +94 -94
  121. package/lib/simple-tile/simple-tile.component.d.ts +10 -10
  122. package/lib/tile/tile.component.d.ts +22 -20
  123. package/lib/tile-renderer.directive.d.ts +28 -28
  124. package/lib/tile-style.directive.d.ts +12 -0
  125. package/lib/tiles-viewer/tiles-viewer.component.d.ts +65 -63
  126. package/lib/tiles-viewer-container/tiles-viewer-container.component.d.ts +59 -57
  127. package/lib/tiles-viewer-group/tiles-viewer-group.component.d.ts +39 -39
  128. package/lib/tiles-viewer.service.d.ts +42 -42
  129. package/lib/tiles.service.d.ts +75 -75
  130. package/package.json +7 -13
  131. package/public-api.d.ts +42 -41
  132. package/esm2020/lib/action-item/action-item.component.mjs +0 -18
  133. package/esm2020/lib/actions-link/actions-link.component.mjs +0 -42
  134. package/esm2020/lib/app-finder/app-finder.component.mjs +0 -53
  135. package/esm2020/lib/app-finder-app-list/app-finder-app-list.component.mjs +0 -40
  136. package/esm2020/lib/app-finder-group/app-finder-group.component.mjs +0 -42
  137. package/esm2020/lib/app-finder.service.mjs +0 -121
  138. package/esm2020/lib/barsa-shellbar/barsa-shellbar.component.mjs +0 -166
  139. package/esm2020/lib/barsa-tiles.module.mjs +0 -206
  140. package/esm2020/lib/change-app-tile/change-app-tile.component.mjs +0 -47
  141. package/esm2020/lib/create-app-group/create-app-group.component.mjs +0 -44
  142. package/esm2020/lib/directives/emptylist.directive.mjs +0 -36
  143. package/esm2020/lib/feed-tile/feed-tile.component.mjs +0 -32
  144. package/esm2020/lib/footer-tile/footer-tile.component.mjs +0 -28
  145. package/esm2020/lib/form-app-finder/form-app-finder.component.mjs +0 -95
  146. package/esm2020/lib/form-tile/form-tile.component.mjs +0 -35
  147. package/esm2020/lib/logo-tile/logo-tile.component.mjs +0 -23
  148. package/esm2020/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.mjs +0 -27
  149. package/esm2020/lib/models/base-bt-tile-component.mjs +0 -30
  150. package/esm2020/lib/models/tile-setting.mjs +0 -2
  151. package/esm2020/lib/news-tile/news-tile.component.mjs +0 -54
  152. package/esm2020/lib/notification-group/notification-group.component.mjs +0 -116
  153. package/esm2020/lib/notification-group-header/notification-group-header.component.mjs +0 -39
  154. package/esm2020/lib/numeric-tile/numeric-tile.component.mjs +0 -34
  155. package/esm2020/lib/pin-tile/pin-tile.component.mjs +0 -111
  156. package/esm2020/lib/pipes/group-tiles.pipe.mjs +0 -31
  157. package/esm2020/lib/pipes/tile-home-filter.pipe.mjs +0 -28
  158. package/esm2020/lib/pipes/tile-prop.pipe.mjs +0 -32
  159. package/esm2020/lib/profile-tile/profile-tile.component.mjs +0 -26
  160. package/esm2020/lib/shellbar/shellbar.component.mjs +0 -200
  161. package/esm2020/lib/simple-tile/simple-tile.component.mjs +0 -23
  162. package/esm2020/lib/tile/tile.component.mjs +0 -61
  163. package/esm2020/lib/tile-renderer.directive.mjs +0 -70
  164. package/esm2020/lib/tiles-viewer/tiles-viewer.component.mjs +0 -157
  165. package/esm2020/lib/tiles-viewer-container/tiles-viewer-container.component.mjs +0 -158
  166. package/esm2020/lib/tiles-viewer-group/tiles-viewer-group.component.mjs +0 -88
  167. package/esm2020/lib/tiles-viewer.service.mjs +0 -130
  168. package/esm2020/lib/tiles.service.mjs +0 -589
  169. package/fesm2015/barsa-tiles.mjs +0 -2977
  170. package/fesm2015/barsa-tiles.mjs.map +0 -1
  171. package/fesm2020/barsa-tiles.mjs +0 -2941
  172. package/fesm2020/barsa-tiles.mjs.map +0 -1
@@ -1,589 +0,0 @@
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
- this._componentSettings$ = new Subject();
20
- BarsaApi.Bw.TilesService = this;
21
- this.homeAppTileGroups$ = this._homeAppTileGroupsSource.asObservable();
22
- this.pinTiles$ = this.pinTilesSource.asObservable().pipe(startWith(null));
23
- this.shellbarSource = new Subject();
24
- this.shellbar$ = this.shellbarSource.asObservable().pipe(shareReplay(1));
25
- this.appTileGroups$ = this._appTileGroupsSource.pipe(shareReplay(1));
26
- this.edit$ = this._edithomeSource.asObservable().pipe(takeUntil(this._OnDestroy$), distinctUntilChanged());
27
- this.deviceSize$ = this._portalService.deviceSize$;
28
- this._rtlService.rtl.next(BarsaApi.LoginFormData.IsRtl);
29
- this.loadAllAppTileGroups();
30
- this.appTileGroups$
31
- .pipe(filter((moForReportModel) => moForReportModel !== null), tap((moForReportModel) => {
32
- if (moForReportModel) {
33
- this._allAppsLoaded(moForReportModel);
34
- }
35
- }))
36
- .subscribe();
37
- BarsaApi.Ul.ApplicationCtrlr.on('GlobalRefreshTile', this._onApplication_GlobalRefreshTile.bind(this));
38
- }
39
- get componentSettings$() {
40
- return this._componentSettings$.asObservable();
41
- }
42
- get appTileGroups() {
43
- return this._appTileGroupsSource.getValue();
44
- }
45
- ngOnDestroy() {
46
- this._OnDestroy$.next();
47
- }
48
- _onApplication_GlobalRefreshTile(sender, appTilesTitle) {
49
- const allApps = this._appTileGroupsSource.getValue();
50
- const appTiles = [];
51
- if (allApps) {
52
- appTilesTitle.forEach((c) => {
53
- const selectedTile = this.findAppTileWithKey(allApps, 'A_App_AppKey', c);
54
- if (selectedTile) {
55
- appTiles.push(selectedTile);
56
- }
57
- });
58
- this._updateAppTileFromNotification(allApps, appTiles);
59
- this._appTileGroupsSource.next(allApps);
60
- }
61
- }
62
- _updateAppTileFromNotification(allApps, appTiles) {
63
- if (!appTiles?.length) {
64
- return;
65
- }
66
- BarsaApi.Bw.RunBlMethodAsync({
67
- Parameters: [appTiles.map((c) => (c.AppTile?.Id ? c.AppTile?.Id : c.Id))],
68
- Method: 'RefreshAppTiles',
69
- SuccessFn: (result) => {
70
- result.MoDataList.forEach((c) => this.updateAppTile(allApps, c));
71
- this._appTileGroupsSource.next({ ...allApps });
72
- },
73
- FailFn: () => { }
74
- });
75
- }
76
- loadAppTileGroups(appTileGroup) {
77
- if (!appTileGroup || appTileGroup.$TilesLoaded) {
78
- return;
79
- }
80
- const allApps = this._appTileGroupsSource.getValue();
81
- if (allApps) {
82
- const selectedAppTilegroup = allApps?.MoDataList.find((c) => c.Id === appTileGroup.Id);
83
- if (selectedAppTilegroup) {
84
- this._loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps);
85
- selectedAppTilegroup.$Children?.forEach((subGroup) => {
86
- this._loadAppTilesOfAppTileGroup(subGroup, allApps);
87
- });
88
- }
89
- }
90
- }
91
- saveTilesStackContent(tilesStackContent) {
92
- const userPortalSettings = this._portalService.userPortalSettings['UserPortalSettings'];
93
- if (userPortalSettings == null) {
94
- return Promise.resolve();
95
- }
96
- userPortalSettings.TilesStackContent = tilesStackContent;
97
- userPortalSettings.$State = 'Modified';
98
- return this._saveUserPortalSettings(userPortalSettings).then(() => this._portalService.setUserPortalSettings(userPortalSettings));
99
- }
100
- loadUserPortalSettings() {
101
- return this._portalService.getData('UserPortalSetting').pipe(concatMap((data) => {
102
- if (data) {
103
- return of(data);
104
- }
105
- else {
106
- return this.loadFromServerUserPortalSetting();
107
- }
108
- }));
109
- }
110
- refreshTile(appTile) {
111
- return new Promise((resolve, reject) => {
112
- BarsaApi.Bw.RunBlMethodAsync({
113
- Parameters: [appTile.Id],
114
- Method: 'RefreshTile',
115
- SuccessFn: (newAppTile) => {
116
- if (newAppTile.MoDataList?.length) {
117
- resolve(newAppTile.MoDataList[0]);
118
- }
119
- reject(`refresh tile not found apptile width title: ${appTile.Title}`);
120
- },
121
- FailFn: () => {
122
- reject(null);
123
- }
124
- });
125
- });
126
- }
127
- loadFromServerUserPortalSetting() {
128
- return from(new Promise((resolve, reject) => {
129
- BarsaApi.Bw.RunBlMethodAsync({
130
- Parameters: [],
131
- Method: 'GetUserPortalSettings',
132
- SuccessFn: (userPortalSetting) => {
133
- this._portalService.setData('UserPortalSetting', userPortalSetting);
134
- resolve(userPortalSetting);
135
- },
136
- FailFn: () => {
137
- reject(null);
138
- }
139
- });
140
- }));
141
- }
142
- toggleAppGroupSettingVisible(appGroup) {
143
- return from(new Promise((resolve, reject) => {
144
- BarsaApi.Bw.RunBlMethodAsync({
145
- Parameters: [appGroup.Id],
146
- Method: 'ToggleAppTileGroupSettingVisible',
147
- SuccessFn: (appGroupSetting) => {
148
- this._updateAppTileGroupSettings(appGroup, appGroupSetting);
149
- resolve(appGroupSetting);
150
- },
151
- FailFn: () => {
152
- reject(null);
153
- }
154
- });
155
- })).pipe(tap((appGroupSetting) => {
156
- this._updateAppGroupSetting(appGroup, appGroupSetting);
157
- }));
158
- }
159
- resetAppGroupSetting(appGroup) {
160
- return from(new Promise((resolve, reject) => {
161
- BarsaApi.Bw.RunBlMethodAsync({
162
- Parameters: [appGroup.Id],
163
- Method: 'ResetAppTileGroupSettingVisible',
164
- SuccessFn: (appGroupSetting) => {
165
- this._updateAppTileGroupSettings(appGroup, appGroupSetting);
166
- resolve(appGroupSetting);
167
- },
168
- FailFn: () => {
169
- reject(null);
170
- }
171
- });
172
- })).pipe(tap((appGroupSetting) => {
173
- this._updateAppGroupSetting(appGroup, appGroupSetting);
174
- }));
175
- }
176
- deleteAppGroup(appGroup) {
177
- return from(new Promise((resolve, reject) => {
178
- BarsaApi.Bw.RunBlMethodAsync({
179
- Parameters: [appGroup.Id],
180
- Method: 'DeleteAppGroup',
181
- SuccessFn: () => {
182
- resolve(appGroup.Id);
183
- },
184
- FailFn: () => {
185
- reject(null);
186
- }
187
- });
188
- })).pipe(tap((appGroupId) => {
189
- const allApps = this.appTileGroups;
190
- if (allApps) {
191
- allApps.MoDataList = allApps.MoDataList.filter((c) => c.Id !== appGroupId);
192
- this._appTileGroupsSource.next(allApps);
193
- }
194
- }));
195
- }
196
- changeAppTileSetting(appTile) {
197
- const allApps = this.appTileGroups;
198
- const selectedGroup = this.findGroupWithAppTileId(allApps, appTile.Id);
199
- if (selectedGroup === null) {
200
- return of(null);
201
- }
202
- return from(new Promise((resolve, reject) => {
203
- BarsaApi.Bw.RunBlMethodAsync({
204
- Parameters: [selectedGroup.Id, appTile.Id, appTile.Title, appTile.Subtitle],
205
- Method: 'ChangeAppTileSetting',
206
- SuccessFn: () => {
207
- this._nextAllAppTileGroups(allApps);
208
- resolve(selectedGroup);
209
- },
210
- FailFn: () => {
211
- reject(null);
212
- }
213
- });
214
- })).pipe(tap((appGroupSetting) => this.updataAppTileSetting(selectedGroup, appGroupSetting)));
215
- }
216
- saveAppGroupOrders(appGroups) {
217
- const groupOrders = appGroups.map((c) => c.Id);
218
- return from(new Promise((resolve, reject) => {
219
- BarsaApi.Bw.RunBlMethodAsync({
220
- Parameters: [groupOrders],
221
- Method: 'ChangeOrderAppTileGroups',
222
- SuccessFn: () => {
223
- resolve();
224
- },
225
- FailFn: () => {
226
- reject(null);
227
- }
228
- });
229
- })).pipe();
230
- }
231
- createAppGroup(title) {
232
- return from(new Promise((resolve, reject) => {
233
- BarsaApi.Bw.RunBlMethodAsync({
234
- Parameters: [title],
235
- Method: 'CreateAppTileGroup',
236
- SuccessFn: (mo) => {
237
- resolve(mo);
238
- },
239
- FailFn: () => {
240
- reject(null);
241
- }
242
- });
243
- })).pipe(tap((mo) => this.addAppGroup(mo)));
244
- }
245
- saveOrderAppTiles(appGroup, appTiles, isActionLink = false, appTileIdTransferedId = '0') {
246
- BarsaApi.Bw.RunBlMethodAsync({
247
- Parameters: [appGroup.Id, appTiles, isActionLink, appTileIdTransferedId],
248
- Method: 'ChangeOrderAppTiles',
249
- SuccessFn: () => { },
250
- FailFn: () => { }
251
- });
252
- }
253
- updateAppTile(allApps, appTile) {
254
- const selectedAppTile = this.findAppTileWithKey(allApps, 'A_App_Component.Settings.Id', appTile.A_App_Component.Settings.Id);
255
- if (selectedAppTile) {
256
- BarsaApi.Common.Merger.FastMerge(selectedAppTile.A_App_Component.Settings, appTile.A_App_Component.Settings);
257
- this._componentSettings$.next(selectedAppTile.A_App_Component.Settings);
258
- }
259
- }
260
- updataAppTileSetting(selectedGroup, appGroupSetting) {
261
- const allApps = this.appTileGroups;
262
- allApps?.MoDataList.forEach((appGroup) => {
263
- if (appGroup.Id === selectedGroup.Id) {
264
- appGroup.UserAppTileGroupSetting = appGroupSetting;
265
- }
266
- });
267
- this._appTileGroupsSource.next(allApps);
268
- }
269
- addAppGroup(mo) {
270
- const allApps = this.appTileGroups;
271
- if (allApps) {
272
- allApps.MoDataList.push(mo);
273
- this._appTileGroupsSource.next(allApps);
274
- }
275
- }
276
- singlePinTileChanged(appTileId) {
277
- const allApps = this.appTileGroups;
278
- const group = this.findGroupWithAppTileId(allApps, appTileId);
279
- if (group === null) {
280
- return of(false);
281
- }
282
- return from(new Promise((resolve, reject) => {
283
- BarsaApi.Bw.RunBlMethodAsync({
284
- Parameters: [group.Id, appTileId],
285
- Method: 'RemoveAppTileFromTileGroup',
286
- SuccessFn: (setting) => {
287
- this._updateAppTileGroupSettings(group, setting);
288
- this._nextAllAppTileGroups(allApps);
289
- resolve(true);
290
- },
291
- FailFn: () => {
292
- reject(false);
293
- }
294
- });
295
- }));
296
- }
297
- pinTileChanged(appTileGroupsPin, app, callback) {
298
- const allApps = this.appTileGroups;
299
- const visible = appTileGroupsPin.map((c) => c.visible);
300
- const groupChanges = appTileGroupsPin.map((c) => new BarsaApi.Common.MetaObjectWeb({
301
- Id: c.appTileGroup.Id,
302
- TypeDefId: allApps?.TypeDefId
303
- }));
304
- BarsaApi.Bw.RunBlMethodAsync({
305
- Parameters: [groupChanges, visible, app.Id],
306
- Method: 'TilePinChanged',
307
- SuccessFn: (settings) => {
308
- this._tilePinChange(appTileGroupsPin, allApps);
309
- callback(settings);
310
- },
311
- FailFn: () => {
312
- // TODO show error
313
- }
314
- });
315
- }
316
- _tilePinChange(appTileGroupsPin, allApps) {
317
- for (const appTileGroupPin of appTileGroupsPin) {
318
- let selectedAppGroup;
319
- const appGroupId = appTileGroupPin.appTileGroup.Id;
320
- allApps?.MoDataList.forEach((c) => {
321
- if (c.Id === appGroupId) {
322
- selectedAppGroup = c;
323
- }
324
- else if (!selectedAppGroup) {
325
- selectedAppGroup = c.$Children?.find((child) => child.Id === appGroupId);
326
- }
327
- });
328
- if (selectedAppGroup && selectedAppGroup.$TilesLoaded) {
329
- // let moDataList = selectedAppGroup.AppTiles.MoDataList;
330
- // if (appTileGroups[i].visible)
331
- // selectedAppGroup.AppTiles.MoDataList = [...moDataList, settings[i]];
332
- // else
333
- // selectedAppGroup.AppTiles.MoDataList = moDataList.filter(
334
- // (c) => c.App.Id !== app.Id
335
- // );
336
- this._loadAppTilesOfAppTileGroup(selectedAppGroup, allApps);
337
- }
338
- }
339
- this._nextAllAppTileGroups(allApps);
340
- }
341
- loadShellbar() {
342
- BarsaApi.Bw.RunBlMethodAsync({
343
- Parameters: [BarsaApi.LoginFormData.PortalId],
344
- Method: 'LoadShellbarByPortalId',
345
- SuccessFn: (shellbar) => {
346
- this.shellbarSource.next(shellbar);
347
- },
348
- FailFn: () => {
349
- // TODO show error
350
- }
351
- });
352
- // this._portalService
353
- // .ReportExecutePromise('Shellbar')
354
- // .then((moForReportModel) => this.shellbarSource.next(moForReportModel.MoDataList[0]));
355
- }
356
- loadAllAppTileGroups() {
357
- this._portalService
358
- .ReportExecute('AllAppTileGroups')
359
- .subscribe((allApps) => this._nextAllAppTileGroups(allApps));
360
- }
361
- _setTileInfo(appTile) {
362
- {
363
- const title = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Title', null);
364
- appTile.TileTitle = !appTile.Title ? title : appTile.Title;
365
- const subtitle = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Subtitle', null);
366
- appTile.Subtitle = !appTile.Subtitle ? subtitle : appTile.Subtitle;
367
- }
368
- }
369
- getTileGroups() {
370
- return this._appTileGroupsSource.getValue();
371
- }
372
- setEditHome(edit) {
373
- this._edithomeSource.next(edit);
374
- }
375
- _allAppsLoaded(moForReportModel) {
376
- moForReportModel.MoDataList.forEach((c) => {
377
- this._prepareNavigator(c);
378
- });
379
- this._setHomeAppTileGroups(moForReportModel.MoDataList);
380
- }
381
- _loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps) {
382
- const callback = () => {
383
- this._nextAllAppTileGroups(allApps);
384
- };
385
- if (!selectedAppTilegroup.UserAppTileGroupSetting) {
386
- this._loadAppTilesByAppTileGroup(selectedAppTilegroup, callback);
387
- }
388
- else {
389
- this._loadAppTilesByAppTileGroupSetting(selectedAppTilegroup, callback);
390
- }
391
- }
392
- _loadAppTilesByAppTileGroup(appGroup, callback) {
393
- BarsaApi.Bw.RunBlMethodAsync({
394
- Parameters: [appGroup.Id],
395
- Method: 'LoadAllAppTilesByAppTileGroup',
396
- SuccessFn: (appTiles) => {
397
- this._updateAppTilesOfAppTileGroup(appGroup, appTiles);
398
- callback();
399
- },
400
- FailFn: () => {
401
- // TODO show error
402
- }
403
- });
404
- }
405
- _updateAppTilesOfAppTileGroup(selectedAppTilegroup, appTiles) {
406
- if (this.appTileGroups) {
407
- selectedAppTilegroup = { ...selectedAppTilegroup, $TilesLoaded: true };
408
- appTiles.MoDataList.forEach((element) => {
409
- element.Component = element.A_App_Component ?? element.A_AppTile_App_Component;
410
- element.DynamicCommand = element.A_App_DynamicCommand ?? element.A_AppTile_App_DynamicCommand;
411
- element.Predefined = element.Predefined ?? element.A_AppTile_Predefined;
412
- });
413
- const apptileGroupIndex = this.appTileGroups?.MoDataList.findIndex((c) => c.Id === selectedAppTilegroup.Id || c.Id === selectedAppTilegroup.$ParentId);
414
- selectedAppTilegroup.AppTiles = appTiles;
415
- const tileGroup = this.appTileGroups.MoDataList[apptileGroupIndex];
416
- if (selectedAppTilegroup.$ParentId) {
417
- if (tileGroup.$Children) {
418
- const idOfSubGroup = tileGroup.$Children.findIndex((c) => c.Id === selectedAppTilegroup.Id);
419
- tileGroup.$Children[idOfSubGroup] = selectedAppTilegroup;
420
- }
421
- this.appTileGroups.MoDataList[apptileGroupIndex] = { ...tileGroup };
422
- }
423
- else {
424
- this.appTileGroups.MoDataList[apptileGroupIndex] = selectedAppTilegroup;
425
- }
426
- }
427
- }
428
- _loadAppTilesByAppTileGroupSetting(appTileGroup, callback) {
429
- BarsaApi.Bw.RunBlMethodAsync({
430
- Parameters: [appTileGroup.Id],
431
- Method: 'LoadAllAppTilesByUserAppTileGroupSettings',
432
- SuccessFn: (appTiles) => {
433
- this._updateAppTilesOfAppTileGroup(appTileGroup, appTiles);
434
- callback();
435
- },
436
- FailFn: () => {
437
- // TODO show error
438
- }
439
- });
440
- }
441
- _nextAllAppTileGroups(newAllApps = null) {
442
- const allApps = newAllApps ?? this._appTileGroupsSource.getValue();
443
- this._appTileGroupsSource.next(allApps ? { ...allApps } : null);
444
- }
445
- _setHomeAppTileGroups(appGroups) {
446
- let newAppGroups = [...appGroups];
447
- newAppGroups = newAppGroups
448
- .filter((c) => c.Visible)
449
- .sort((a, b) => Number(a.navigatorOrderItem) - Number(b.navigatorOrderItem));
450
- this._homeAppTileGroupsSource.next(newAppGroups);
451
- }
452
- _saveUserPortalSettings(userPortalSettings) {
453
- return new Promise((resolve, reject) => {
454
- BarsaApi.Bw.RunBlMethodAsync({
455
- Parameters: [new BarsaApi.Common.MetaObjectWeb(userPortalSettings)],
456
- Method: 'SaveUserPortalSettings',
457
- SuccessFn: () => {
458
- resolve();
459
- },
460
- FailFn: () => {
461
- reject(null);
462
- }
463
- });
464
- });
465
- }
466
- _updateAppGroupSetting(appGroup, appGroupSetting) {
467
- const allApps = this.appTileGroups;
468
- const selectedAppGroup = allApps?.MoDataList.find((c) => c.Id === appGroup.Id);
469
- if (selectedAppGroup && allApps) {
470
- selectedAppGroup.UserAppTileGroupSetting = appGroupSetting;
471
- this._nextAllAppTileGroups(allApps);
472
- }
473
- }
474
- findAppTileWithKey(allApps, key, value) {
475
- let selectedTile;
476
- if (typeof value === 'string') {
477
- value = BarsaApi.Common.Util.ReplaceArabicCharchter(value);
478
- }
479
- if (!allApps) {
480
- return null;
481
- }
482
- allApps.MoDataList.forEach((appGroup) => {
483
- if (selectedTile) {
484
- return;
485
- }
486
- selectedTile = appGroup.navigatorTiles.find((c) => BarsaApi.Common.Util.TryGetValue(c, key, null) === value);
487
- appGroup.$Children?.forEach((subGroup) => {
488
- if (selectedTile) {
489
- return;
490
- }
491
- selectedTile = subGroup.navigatorTiles.find((c) => BarsaApi.Common.Util.TryGetValue(c, key, null) === value);
492
- });
493
- });
494
- return selectedTile;
495
- }
496
- findGroupWithAppTileId(allApps, appTileId) {
497
- let selectedGroup;
498
- if (!allApps) {
499
- return null;
500
- }
501
- allApps.MoDataList.forEach((appGroup) => {
502
- if (selectedGroup) {
503
- return;
504
- }
505
- if (appGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
506
- selectedGroup = appGroup;
507
- return;
508
- }
509
- appGroup.$Children?.forEach((subGroup) => {
510
- if (subGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
511
- selectedGroup = subGroup;
512
- return;
513
- }
514
- });
515
- });
516
- return selectedGroup;
517
- }
518
- _findGroupWithAppGroupId(allApps, appGroupId) {
519
- let selectedGroup;
520
- if (!allApps) {
521
- return null;
522
- }
523
- allApps.MoDataList.forEach((appGroup) => {
524
- if (selectedGroup) {
525
- return;
526
- }
527
- if (appGroup.Id === appGroupId) {
528
- selectedGroup = appGroup;
529
- return;
530
- }
531
- appGroup.$Children?.forEach((subGroup) => {
532
- if (subGroup.Id === appGroupId) {
533
- selectedGroup = subGroup;
534
- return;
535
- }
536
- });
537
- });
538
- return selectedGroup;
539
- }
540
- _updateAppTileGroupSettings(appTileGroup, setting) {
541
- appTileGroup.UserAppTileGroupSetting = setting;
542
- appTileGroup = JSON.parse(JSON.stringify(appTileGroup));
543
- this._nextAllAppTileGroups();
544
- return appTileGroup;
545
- }
546
- _prepareNavigator(appTileGroup) {
547
- appTileGroup.$TileSettingChanged = false;
548
- appTileGroup.$Disabledpin = false;
549
- appTileGroup.navigatorTitle = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Title', appTileGroup.Title);
550
- appTileGroup.navigatorTitle = appTileGroup.navigatorTitle =
551
- appTileGroup.navigatorTitle === '' ? appTileGroup.Title : appTileGroup.navigatorTitle;
552
- appTileGroup.navigatorTitle = this._bbbTranslatePipe.transform(appTileGroup.navigatorTitle);
553
- const orderItem = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.OrderItem', null);
554
- if (orderItem !== null) {
555
- appTileGroup.navigatorOrderItem = orderItem;
556
- }
557
- else {
558
- appTileGroup.navigatorOrderItem = appTileGroup.OrderItem;
559
- }
560
- const visible = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Visible', null);
561
- if (visible !== null) {
562
- appTileGroup.navigatorVisible = visible;
563
- }
564
- else {
565
- appTileGroup.navigatorVisible = appTileGroup.Visible;
566
- }
567
- const appTiles = appTileGroup.AppTiles?.MoDataList ?? [];
568
- appTileGroup.navigatorTiles = appTiles
569
- .filter((c) => c.Visible && !c.IsActionLink)
570
- .sort((a, b) => Number(a.OrderItem) - Number(b.OrderItem));
571
- appTileGroup.navigatorActionLinks = appTiles
572
- .filter((c) => c.Visible && c.IsActionLink)
573
- .sort((a, b) => Number(a.OrderItemActionLink) - Number(b.OrderItemActionLink));
574
- appTileGroup.navigatorTiles.forEach((appTile) => this._setTileInfo(appTile));
575
- appTileGroup.navigatorActionLinks.forEach((appTile) => this._setTileInfo(appTile));
576
- appTileGroup.$Children?.forEach((subAppTileGroup) => {
577
- this._prepareNavigator(subAppTileGroup);
578
- });
579
- }
580
- }
581
- 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 });
582
- TilesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, providedIn: 'root' });
583
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, decorators: [{
584
- type: Injectable,
585
- args: [{
586
- providedIn: 'root'
587
- }]
588
- }], ctorParameters: function () { return [{ type: i1.PortalService }, { type: i2.RtlService }, { type: i1.BbbTranslatePipe }]; } });
589
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXRpbGVzL3NyYy9saWIvdGlsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakgsT0FBTyxFQUFFLFFBQVEsRUFBMEUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQU14SCxNQUFNLE9BQU8sWUFBWTtJQWVyQixZQUNZLGNBQTZCLEVBQzdCLFdBQXVCLEVBQ3ZCLGlCQUFtQztRQUZuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBZC9DLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFLNUMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQUMxRSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDNUMseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBQzFFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFNN0QsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxD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QyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O3lHQWhwQlEsWUFBWTs2R0FBWixZQUFZLGNBRlQsTUFBTTsyRkFFVCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29uY2F0TWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XG5pbXBvcnQgeyBCYXJzYUFwaSwgQmJiVHJhbnNsYXRlUGlwZSwgTWV0YW9iamVjdERhdGFNb2RlbCwgTW9Gb3JSZXBvcnRNb2RlbCwgUG9ydGFsU2VydmljZSB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IEFwcFRpbGVHcm91cFBpbiwgVXNlclBvcnRhbFNldHRpbmdzIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRpbGVzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgZGV2aWNlU2l6ZSQ6IE9ic2VydmFibGU8J3MnIHwgJ20nIHwgJ2wnIHwgJ3hsJz47XG4gICAgaG9tZUFwcFRpbGVHcm91cHMkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT47XG4gICAgcGluVGlsZXMkOiBPYnNlcnZhYmxlPFBpblRpbGVJbmZvIHwgbnVsbD47XG4gICAgc2hlbGxiYXJTb3VyY2UgPSBuZXcgU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xuICAgIHNoZWxsYmFyJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsPjtcbiAgICBhcHBUaWxlR3JvdXBzJDogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsIHwgbnVsbD47XG4gICAgZWRpdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcml2YXRlIF9PbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIF9ob21lQXBwVGlsZUdyb3Vwc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWV0YW9iamVjdERhdGFNb2RlbFtdPihbXSk7XG4gICAgcHJpdmF0ZSBwaW5UaWxlc1NvdXJjZSA9IG5ldyBTdWJqZWN0PFBpblRpbGVJbmZvPigpO1xuICAgIHByaXZhdGUgX2FwcFRpbGVHcm91cHNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9lZGl0aG9tZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgX2NvbXBvbmVudFNldHRpbmdzJCA9IG5ldyBTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX3BvcnRhbFNlcnZpY2U6IFBvcnRhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX3J0bFNlcnZpY2U6IFJ0bFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2JiYlRyYW5zbGF0ZVBpcGU6IEJiYlRyYW5zbGF0ZVBpcGVcbiAgICApIHtcbiAgICAgICAgQmFyc2FBcGkuQncuVGlsZXNTZXJ2aWNlID0gdGhpcztcbiAgICAgICAgdGhpcy5ob21lQXBwVGlsZUdyb3VwcyQgPSB0aGlzLl9ob21lQXBwVGlsZUdyb3Vwc1NvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5waW5UaWxlcyQgPSB0aGlzLnBpblRpbGVzU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoc3RhcnRXaXRoKG51bGwpKTtcbiAgICAgICAgdGhpcy5zaGVsbGJhclNvdXJjZSA9IG5ldyBTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG4gICAgICAgIHRoaXMuc2hlbGxiYXIkID0gdGhpcy5zaGVsbGJhclNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgICAgICAgdGhpcy5hcHBUaWxlR3JvdXBzJCA9IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICAgICAgdGhpcy5lZGl0JCA9IHRoaXMuX2VkaXRob21lU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX09uRGVzdHJveSQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICAgICAgdGhpcy5kZXZpY2VTaXplJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UuZGV2aWNlU2l6ZSQ7XG4gICAgICAgIHRoaXMuX3J0bFNlcnZpY2UucnRsLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc1J0bCk7XG4gICAgICAgIHRoaXMubG9hZEFsbEFwcFRpbGVHcm91cHMoKTtcbiAgICAgICAgdGhpcy5hcHBUaWxlR3JvdXBzJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChtb0ZvclJlcG9ydE1vZGVsKSA9PiBtb0ZvclJlcG9ydE1vZGVsICE9PSBudWxsKSxcbiAgICAgICAgICAgICAgICB0YXAoKG1vRm9yUmVwb3J0TW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vRm9yUmVwb3J0TW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FsbEFwcHNMb2FkZWQobW9Gb3JSZXBvcnRNb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLm9uKCdHbG9iYWxSZWZyZXNoVGlsZScsIHRoaXMuX29uQXBwbGljYXRpb25fR2xvYmFsUmVmcmVzaFRpbGUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGdldCBjb21wb25lbnRTZXR0aW5ncyQoKTogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRTZXR0aW5ncyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBhcHBUaWxlR3JvdXBzKCk6IE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX09uRGVzdHJveSQubmV4dCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX29uQXBwbGljYXRpb25fR2xvYmFsUmVmcmVzaFRpbGUoc2VuZGVyLCBhcHBUaWxlc1RpdGxlOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBhcHBUaWxlczogTWV0YW9iamVjdERhdGFNb2RlbFtdID0gW107XG4gICAgICAgIGlmIChhbGxBcHBzKSB7XG4gICAgICAgICAgICBhcHBUaWxlc1RpdGxlLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRpbGUgPSB0aGlzLmZpbmRBcHBUaWxlV2l0aEtleShhbGxBcHBzLCAnQV9BcHBfQXBwS2V5JywgYyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGlsZSkge1xuICAgICAgICAgICAgICAgICAgICBhcHBUaWxlcy5wdXNoKHNlbGVjdGVkVGlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlRnJvbU5vdGlmaWNhdGlvbihhbGxBcHBzLCBhcHBUaWxlcyk7XG4gICAgICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZUFwcFRpbGVGcm9tTm90aWZpY2F0aW9uKGFsbEFwcHM6IE1vRm9yUmVwb3J0TW9kZWwsIGFwcFRpbGVzOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFhcHBUaWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwVGlsZXMubWFwKChjKSA9PiAoYy5BcHBUaWxlPy5JZCA/IGMuQXBwVGlsZT8uSWQgOiBjLklkKSldLFxuICAgICAgICAgICAgTWV0aG9kOiAnUmVmcmVzaEFwcFRpbGVzJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKHJlc3VsdDogTW9Gb3JSZXBvcnRNb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5Nb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHRoaXMudXBkYXRlQXBwVGlsZShhbGxBcHBzLCBjKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5uZXh0KHsgLi4uYWxsQXBwcyB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHt9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkQXBwVGlsZUdyb3VwcyhhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFhcHBUaWxlR3JvdXAgfHwgYXBwVGlsZUdyb3VwLiRUaWxlc0xvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLmdldFZhbHVlKCk7XG4gICAgICAgIGlmIChhbGxBcHBzKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFwcFRpbGVncm91cCA9IGFsbEFwcHM/Lk1vRGF0YUxpc3QuZmluZCgoYykgPT4gYy5JZCA9PT0gYXBwVGlsZUdyb3VwLklkKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFwcFRpbGVncm91cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRBcHBUaWxlc09mQXBwVGlsZUdyb3VwKHNlbGVjdGVkQXBwVGlsZWdyb3VwLCBhbGxBcHBzKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEFwcFRpbGVncm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRBcHBUaWxlc09mQXBwVGlsZUdyb3VwKHN1Ykdyb3VwLCBhbGxBcHBzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzYXZlVGlsZXNTdGFja0NvbnRlbnQodGlsZXNTdGFja0NvbnRlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXNlclBvcnRhbFNldHRpbmdzID0gdGhpcy5fcG9ydGFsU2VydmljZS51c2VyUG9ydGFsU2V0dGluZ3NbJ1VzZXJQb3J0YWxTZXR0aW5ncyddO1xuICAgICAgICBpZiAodXNlclBvcnRhbFNldHRpbmdzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ3MuVGlsZXNTdGFja0NvbnRlbnQgPSB0aWxlc1N0YWNrQ29udGVudDtcbiAgICAgICAgdXNlclBvcnRhbFNldHRpbmdzLiRTdGF0ZSA9ICdNb2RpZmllZCc7XG4gICAgICAgIHJldHVybiB0aGlzLl9zYXZlVXNlclBvcnRhbFNldHRpbmdzKHVzZXJQb3J0YWxTZXR0aW5ncykudGhlbigoKSA9PlxuICAgICAgICAgICAgdGhpcy5fcG9ydGFsU2VydmljZS5zZXRVc2VyUG9ydGFsU2V0dGluZ3ModXNlclBvcnRhbFNldHRpbmdzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxvYWRVc2VyUG9ydGFsU2V0dGluZ3MoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnRhbFNlcnZpY2UuZ2V0RGF0YSgnVXNlclBvcnRhbFNldHRpbmcnKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRGcm9tU2VydmVyVXNlclBvcnRhbFNldHRpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICByZWZyZXNoVGlsZShhcHBUaWxlOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcbiAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwVGlsZS5JZF0sXG4gICAgICAgICAgICAgICAgTWV0aG9kOiAnUmVmcmVzaFRpbGUnLFxuICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKG5ld0FwcFRpbGU6IE1vRm9yUmVwb3J0TW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FwcFRpbGUuTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ld0FwcFRpbGUuTW9EYXRhTGlzdFswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGByZWZyZXNoIHRpbGUgbm90IGZvdW5kIGFwcHRpbGUgd2lkdGggdGl0bGU6ICR7YXBwVGlsZS5UaXRsZX1gKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb2FkRnJvbVNlcnZlclVzZXJQb3J0YWxTZXR0aW5nKCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xuICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPFVzZXJQb3J0YWxTZXR0aW5ncz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnR2V0VXNlclBvcnRhbFNldHRpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAodXNlclBvcnRhbFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcnRhbFNlcnZpY2Uuc2V0RGF0YSgnVXNlclBvcnRhbFNldHRpbmcnLCB1c2VyUG9ydGFsU2V0dGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVzZXJQb3J0YWxTZXR0aW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRvZ2dsZUFwcEdyb3VwU2V0dGluZ1Zpc2libGUoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBHcm91cC5JZF0sXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ1RvZ2dsZUFwcFRpbGVHcm91cFNldHRpbmdWaXNpYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoYXBwR3JvdXBTZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhhcHBHcm91cCwgYXBwR3JvdXBTZXR0aW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXBTZXR0aW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcCgoYXBwR3JvdXBTZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwR3JvdXBTZXR0aW5nKGFwcEdyb3VwLCBhcHBHcm91cFNldHRpbmcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmVzZXRBcHBHcm91cFNldHRpbmcoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBHcm91cC5JZF0sXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ1Jlc2V0QXBwVGlsZUdyb3VwU2V0dGluZ1Zpc2libGUnLFxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcFRpbGVHcm91cFNldHRpbmdzKGFwcEdyb3VwLCBhcHBHcm91cFNldHRpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcHBHcm91cFNldHRpbmcpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgdGFwKChhcHBHcm91cFNldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBHcm91cFNldHRpbmcoYXBwR3JvdXAsIGFwcEdyb3VwU2V0dGluZyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRlbGV0ZUFwcEdyb3VwKGFwcEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnRGVsZXRlQXBwR3JvdXAnLFxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXAuSWQpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgdGFwKChhcHBHcm91cElkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcbiAgICAgICAgICAgICAgICBpZiAoYWxsQXBwcykge1xuICAgICAgICAgICAgICAgICAgICBhbGxBcHBzLk1vRGF0YUxpc3QgPSBhbGxBcHBzLk1vRGF0YUxpc3QuZmlsdGVyKChjKSA9PiBjLklkICE9PSBhcHBHcm91cElkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5uZXh0KGFsbEFwcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIGNoYW5nZUFwcFRpbGVTZXR0aW5nKGFwcFRpbGU6IE1ldGFvYmplY3REYXRhTW9kZWwpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXAgPSB0aGlzLmZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZS5JZCk7XG4gICAgICAgIGlmIChzZWxlY3RlZEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtzZWxlY3RlZEdyb3VwLklkLCBhcHBUaWxlLklkLCBhcHBUaWxlLlRpdGxlLCBhcHBUaWxlLlN1YnRpdGxlXSxcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnQ2hhbmdlQXBwVGlsZVNldHRpbmcnLFxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkucGlwZSh0YXAoKGFwcEdyb3VwU2V0dGluZykgPT4gdGhpcy51cGRhdGFBcHBUaWxlU2V0dGluZyhzZWxlY3RlZEdyb3VwLCBhcHBHcm91cFNldHRpbmcpKSk7XG4gICAgfVxuXG4gICAgc2F2ZUFwcEdyb3VwT3JkZXJzKGFwcEdyb3VwczogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGdyb3VwT3JkZXJzID0gYXBwR3JvdXBzLm1hcCgoYykgPT4gYy5JZCk7XG4gICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbZ3JvdXBPcmRlcnNdLFxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdDaGFuZ2VPcmRlckFwcFRpbGVHcm91cHMnLFxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkucGlwZSgpO1xuICAgIH1cblxuICAgIGNyZWF0ZUFwcEdyb3VwKHRpdGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFt0aXRsZV0sXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0NyZWF0ZUFwcFRpbGVHcm91cCcsXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1vKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkucGlwZSh0YXAoKG1vKSA9PiB0aGlzLmFkZEFwcEdyb3VwKG1vKSkpO1xuICAgIH1cblxuICAgIHNhdmVPcmRlckFwcFRpbGVzKFxuICAgICAgICBhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICAgICAgYXBwVGlsZXM6IG51bWJlcltdLFxuICAgICAgICBpc0FjdGlvbkxpbmsgPSBmYWxzZSxcbiAgICAgICAgYXBwVGlsZUlkVHJhbnNmZXJlZElkOiBzdHJpbmcgPSAnMCdcbiAgICApOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWQsIGFwcFRpbGVzLCBpc0FjdGlvbkxpbmssIGFwcFRpbGVJZFRyYW5zZmVyZWRJZF0sXG4gICAgICAgICAgICBNZXRob2Q6ICdDaGFuZ2VPcmRlckFwcFRpbGVzJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge30sXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHt9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZUFwcFRpbGUoYWxsQXBwczogTW9Gb3JSZXBvcnRNb2RlbCwgYXBwVGlsZTogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFwcFRpbGUgPSB0aGlzLmZpbmRBcHBUaWxlV2l0aEtleShcbiAgICAgICAgICAgIGFsbEFwcHMsXG4gICAgICAgICAgICAnQV9BcHBfQ29tcG9uZW50LlNldHRpbmdzLklkJyxcbiAgICAgICAgICAgIGFwcFRpbGUuQV9BcHBfQ29tcG9uZW50LlNldHRpbmdzLklkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEFwcFRpbGUpIHtcbiAgICAgICAgICAgIEJhcnNhQXBpLkNvbW1vbi5NZXJnZXIuRmFzdE1lcmdlKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZS5BX0FwcF9Db21wb25lbnQuU2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgYXBwVGlsZS5BX0FwcF9Db21wb25lbnQuU2V0dGluZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRTZXR0aW5ncyQubmV4dChzZWxlY3RlZEFwcFRpbGUuQV9BcHBfQ29tcG9uZW50LlNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGFBcHBUaWxlU2V0dGluZyhzZWxlY3RlZEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcbiAgICAgICAgYWxsQXBwcz8uTW9EYXRhTGlzdC5mb3JFYWNoKChhcHBHcm91cCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLklkID09PSBzZWxlY3RlZEdyb3VwLklkKSB7XG4gICAgICAgICAgICAgICAgYXBwR3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcgPSBhcHBHcm91cFNldHRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyk7XG4gICAgfVxuXG4gICAgYWRkQXBwR3JvdXAobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcbiAgICAgICAgaWYgKGFsbEFwcHMpIHtcbiAgICAgICAgICAgIGFsbEFwcHMuTW9EYXRhTGlzdC5wdXNoKG1vKTtcbiAgICAgICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNpbmdsZVBpblRpbGVDaGFuZ2VkKGFwcFRpbGVJZCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZmluZEdyb3VwV2l0aEFwcFRpbGVJZChhbGxBcHBzLCBhcHBUaWxlSWQpO1xuICAgICAgICBpZiAoZ3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cC5JZCwgYXBwVGlsZUlkXSxcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnUmVtb3ZlQXBwVGlsZUZyb21UaWxlR3JvdXAnLFxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChzZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhncm91cCwgc2V0dGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcGluVGlsZUNoYW5nZWQoYXBwVGlsZUdyb3Vwc1BpbjogQXBwVGlsZUdyb3VwUGluW10sIGFwcDogTWV0YW9iamVjdERhdGFNb2RlbCwgY2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IGFwcFRpbGVHcm91cHNQaW4ubWFwKChjKSA9PiBjLnZpc2libGUpO1xuICAgICAgICBjb25zdCBncm91cENoYW5nZXMgPSBhcHBUaWxlR3JvdXBzUGluLm1hcChcbiAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgIG5ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYih7XG4gICAgICAgICAgICAgICAgICAgIElkOiBjLmFwcFRpbGVHcm91cC5JZCxcbiAgICAgICAgICAgICAgICAgICAgVHlwZURlZklkOiBhbGxBcHBzPy5UeXBlRGVmSWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW2dyb3VwQ2hhbmdlcywgdmlzaWJsZSwgYXBwLklkXSxcbiAgICAgICAgICAgIE1ldGhvZDogJ1RpbGVQaW5DaGFuZ2VkJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKHNldHRpbmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZVBpbkNoYW5nZShhcHBUaWxlR3JvdXBzUGluLCBhbGxBcHBzKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZXR0aW5ncyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfdGlsZVBpbkNoYW5nZShhcHBUaWxlR3JvdXBzUGluLCBhbGxBcHBzKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgYXBwVGlsZUdyb3VwUGluIG9mIGFwcFRpbGVHcm91cHNQaW4pIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZEFwcEdyb3VwO1xuICAgICAgICAgICAgY29uc3QgYXBwR3JvdXBJZCA9IGFwcFRpbGVHcm91cFBpbi5hcHBUaWxlR3JvdXAuSWQ7XG4gICAgICAgICAgICBhbGxBcHBzPy5Nb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYy5JZCA9PT0gYXBwR3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEFwcEdyb3VwID0gYztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzZWxlY3RlZEFwcEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjLiRDaGlsZHJlbj8uZmluZCgoY2hpbGQpID0+IGNoaWxkLklkID09PSBhcHBHcm91cElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFwcEdyb3VwICYmIHNlbGVjdGVkQXBwR3JvdXAuJFRpbGVzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gbGV0IG1vRGF0YUxpc3QgPSBzZWxlY3RlZEFwcEdyb3VwLkFwcFRpbGVzLk1vRGF0YUxpc3Q7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGFwcFRpbGVHcm91cHNbaV0udmlzaWJsZSlcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IFsuLi5tb0RhdGFMaXN0LCBzZXR0aW5nc1tpXV07XG4gICAgICAgICAgICAgICAgLy8gZWxzZVxuICAgICAgICAgICAgICAgIC8vICAgc2VsZWN0ZWRBcHBHcm91cC5BcHBUaWxlcy5Nb0RhdGFMaXN0ID0gbW9EYXRhTGlzdC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgLy8gICAgIChjKSA9PiBjLkFwcC5JZCAhPT0gYXBwLklkXG4gICAgICAgICAgICAgICAgLy8gICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRBcHBUaWxlc09mQXBwVGlsZUdyb3VwKHNlbGVjdGVkQXBwR3JvdXAsIGFsbEFwcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xuICAgIH1cblxuICAgIGxvYWRTaGVsbGJhcigpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxJZF0sXG4gICAgICAgICAgICBNZXRob2Q6ICdMb2FkU2hlbGxiYXJCeVBvcnRhbElkJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKHNoZWxsYmFyOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGVsbGJhclNvdXJjZS5uZXh0KHNoZWxsYmFyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGhpcy5fcG9ydGFsU2VydmljZVxuICAgICAgICAvLyAgICAgLlJlcG9ydEV4ZWN1dGVQcm9taXNlKCdTaGVsbGJhcicpXG4gICAgICAgIC8vICAgICAudGhlbigobW9Gb3JSZXBvcnRNb2RlbCkgPT4gdGhpcy5zaGVsbGJhclNvdXJjZS5uZXh0KG1vRm9yUmVwb3J0TW9kZWwuTW9EYXRhTGlzdFswXSkpO1xuICAgIH1cblxuICAgIGxvYWRBbGxBcHBUaWxlR3JvdXBzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wb3J0YWxTZXJ2aWNlXG4gICAgICAgICAgICAuUmVwb3J0RXhlY3V0ZSgnQWxsQXBwVGlsZUdyb3VwcycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChhbGxBcHBzKSA9PiB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKSk7XG4gICAgfVxuICAgIF9zZXRUaWxlSW5mbyhhcHBUaWxlKTogdm9pZCB7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZSwgJ0NvbXBvbmVudC5TZXR0aW5ncy5UaWxlU2V0dGluZy5UaXRsZScsIG51bGwpO1xuICAgICAgICAgICAgYXBwVGlsZS5UaWxlVGl0bGUgPSAhYXBwVGlsZS5UaXRsZSA/IHRpdGxlIDogYXBwVGlsZS5UaXRsZTtcbiAgICAgICAgICAgIGNvbnN0IHN1YnRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZSwgJ0NvbXBvbmVudC5TZXR0aW5ncy5UaWxlU2V0dGluZy5TdWJ0aXRsZScsIG51bGwpO1xuICAgICAgICAgICAgYXBwVGlsZS5TdWJ0aXRsZSA9ICFhcHBUaWxlLlN1YnRpdGxlID8gc3VidGl0bGUgOiBhcHBUaWxlLlN1YnRpdGxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VGlsZUdyb3VwcygpOiBNb0ZvclJlcG9ydE1vZGVsIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgc2V0RWRpdEhvbWUoZWRpdDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9lZGl0aG9tZVNvdXJjZS5uZXh0KGVkaXQpO1xuICAgIH1cbiAgICBwcml2YXRlIF9hbGxBcHBzTG9hZGVkKG1vRm9yUmVwb3J0TW9kZWw6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgbW9Gb3JSZXBvcnRNb2RlbC5Nb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVOYXZpZ2F0b3IoYyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zZXRIb21lQXBwVGlsZUdyb3Vwcyhtb0ZvclJlcG9ydE1vZGVsLk1vRGF0YUxpc3QpO1xuICAgIH1cbiAgICBwcml2YXRlIF9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcFRpbGVncm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgYWxsQXBwczogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoYWxsQXBwcyk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRBcHBUaWxlc0J5QXBwVGlsZUdyb3VwKHNlbGVjdGVkQXBwVGlsZWdyb3VwLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNCeUFwcFRpbGVHcm91cFNldHRpbmcoc2VsZWN0ZWRBcHBUaWxlZ3JvdXAsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9sb2FkQXBwVGlsZXNCeUFwcFRpbGVHcm91cChhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWRdLFxuICAgICAgICAgICAgTWV0aG9kOiAnTG9hZEFsbEFwcFRpbGVzQnlBcHBUaWxlR3JvdXAnLFxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoYXBwVGlsZXM6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlc09mQXBwVGlsZUdyb3VwKGFwcEdyb3VwLCBhcHBUaWxlcyk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgX3VwZGF0ZUFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGFwcFRpbGVzOiBNb0ZvclJlcG9ydE1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFwcFRpbGVHcm91cHMpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZWdyb3VwID0geyAuLi5zZWxlY3RlZEFwcFRpbGVncm91cCwgJFRpbGVzTG9hZGVkOiB0cnVlIH07XG4gICAgICAgICAgICBhcHBUaWxlcy5Nb0RhdGFMaXN0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LkNvbXBvbmVudCA9IGVsZW1lbnQuQV9BcHBfQ29tcG9uZW50ID8/IGVsZW1lbnQuQV9BcHBUaWxlX0FwcF9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5EeW5hbWljQ29tbWFuZCA9IGVsZW1lbnQuQV9BcHBfRHluYW1pY0NvbW1hbmQgPz8gZWxlbWVudC5BX0FwcFRpbGVfQXBwX0R5bmFtaWNDb21tYW5kO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuUHJlZGVmaW5lZCA9IGVsZW1lbnQuUHJlZGVmaW5lZCA/PyBlbGVtZW50LkFfQXBwVGlsZV9QcmVkZWZpbmVkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhcHB0aWxlR3JvdXBJbmRleCA9IHRoaXMuYXBwVGlsZUdyb3Vwcz8uTW9EYXRhTGlzdC5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgKGMpID0+IGMuSWQgPT09IHNlbGVjdGVkQXBwVGlsZWdyb3VwLklkIHx8IGMuSWQgPT09IHNlbGVjdGVkQXBwVGlsZWdyb3VwLiRQYXJlbnRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZWdyb3VwLkFwcFRpbGVzID0gYXBwVGlsZXM7XG4gICAgICAgICAgICBjb25zdCB0aWxlR3JvdXAgPSB0aGlzLmFwcFRpbGVHcm91cHMuTW9EYXRhTGlzdFthcHB0aWxlR3JvdXBJbmRleF07XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuJFBhcmVudElkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGVHcm91cC4kQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRPZlN1Ykdyb3VwID0gdGlsZUdyb3VwLiRDaGlsZHJlbi5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IHNlbGVjdGVkQXBwVGlsZWdyb3VwLklkKTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZUdyb3VwLiRDaGlsZHJlbltpZE9mU3ViR3JvdXBdID0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XSA9IHsgLi4udGlsZUdyb3VwIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XSA9IHNlbGVjdGVkQXBwVGlsZWdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2xvYWRBcHBUaWxlc0J5QXBwVGlsZUdyb3VwU2V0dGluZyhhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcFRpbGVHcm91cC5JZF0sXG4gICAgICAgICAgICBNZXRob2Q6ICdMb2FkQWxsQXBwVGlsZXNCeVVzZXJBcHBUaWxlR3JvdXBTZXR0aW5ncycsXG4gICAgICAgICAgICBTdWNjZXNzRm46IChhcHBUaWxlczogTW9Gb3JSZXBvcnRNb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoYXBwVGlsZUdyb3VwLCBhcHBUaWxlcyk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbmV4dEFsbEFwcFRpbGVHcm91cHMobmV3QWxsQXBwczogTW9Gb3JSZXBvcnRNb2RlbCB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSBuZXdBbGxBcHBzID8/IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5uZXh0KGFsbEFwcHMgPyB7IC4uLmFsbEFwcHMgfSA6IG51bGwpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRIb21lQXBwVGlsZUdyb3VwcyhhcHBHcm91cHM6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBsZXQgbmV3QXBwR3JvdXBzID0gWy4uLmFwcEdyb3Vwc107XG4gICAgICAgIG5ld0FwcEdyb3VwcyA9IG5ld0FwcEdyb3Vwc1xuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5WaXNpYmxlKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IE51bWJlcihhLm5hdmlnYXRvck9yZGVySXRlbSkgLSBOdW1iZXIoYi5uYXZpZ2F0b3JPcmRlckl0ZW0pKTtcbiAgICAgICAgdGhpcy5faG9tZUFwcFRpbGVHcm91cHNTb3VyY2UubmV4dChuZXdBcHBHcm91cHMpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zYXZlVXNlclBvcnRhbFNldHRpbmdzKHVzZXJQb3J0YWxTZXR0aW5nczogVXNlclBvcnRhbFNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcbiAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbbmV3IEJhcnNhQXBpLkNvbW1vbi5NZXRhT2JqZWN0V2ViKHVzZXJQb3J0YWxTZXR0aW5ncyldLFxuICAgICAgICAgICAgICAgIE1ldGhvZDogJ1NhdmVVc2VyUG9ydGFsU2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91cGRhdGVBcHBHcm91cFNldHRpbmcoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGFwcEdyb3VwU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFwcEdyb3VwID0gYWxsQXBwcz8uTW9EYXRhTGlzdC5maW5kKChjKSA9PiBjLklkID09PSBhcHBHcm91cC5JZCk7XG4gICAgICAgIGlmIChzZWxlY3RlZEFwcEdyb3VwICYmIGFsbEFwcHMpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcgPSBhcHBHcm91cFNldHRpbmc7XG4gICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGZpbmRBcHBUaWxlV2l0aEtleShhbGxBcHBzOiBNb0ZvclJlcG9ydE1vZGVsLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkVGlsZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUFyYWJpY0NoYXJjaHRlcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxBcHBzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBhbGxBcHBzLk1vRGF0YUxpc3QuZm9yRWFjaCgoYXBwR3JvdXApID0+IHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3RlZFRpbGUgPSBhcHBHcm91cC5uYXZpZ2F0b3JUaWxlcy5maW5kKFxuICAgICAgICAgICAgICAgIChjKSA9PiBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjLCBrZXksIG51bGwpID09PSB2YWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFwcEdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViR3JvdXApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUaWxlID0gc3ViR3JvdXAubmF2aWdhdG9yVGlsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGMpID0+IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGMsIGtleSwgbnVsbCkgPT09IHZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkVGlsZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBmaW5kR3JvdXBXaXRoQXBwVGlsZUlkKGFsbEFwcHMsIGFwcFRpbGVJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwge1xuICAgICAgICBsZXQgc2VsZWN0ZWRHcm91cDtcblxuICAgICAgICBpZiAoIWFsbEFwcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGFsbEFwcHMuTW9EYXRhTGlzdC5mb3JFYWNoKChhcHBHcm91cCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXBwR3JvdXAubmF2aWdhdG9yVGlsZXMuc29tZSgoYXBwVGlsZSkgPT4gYXBwVGlsZS5JZCA9PT0gYXBwVGlsZUlkKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBhcHBHcm91cDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBHcm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN1Ykdyb3VwLm5hdmlnYXRvclRpbGVzLnNvbWUoKGFwcFRpbGUpID0+IGFwcFRpbGUuSWQgPT09IGFwcFRpbGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IHN1Ykdyb3VwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWRHcm91cDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZmluZEdyb3VwV2l0aEFwcEdyb3VwSWQoYWxsQXBwcywgYXBwR3JvdXBJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwge1xuICAgICAgICBsZXQgc2VsZWN0ZWRHcm91cDtcblxuICAgICAgICBpZiAoIWFsbEFwcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGFsbEFwcHMuTW9EYXRhTGlzdC5mb3JFYWNoKChhcHBHcm91cCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXBwR3JvdXAuSWQgPT09IGFwcEdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwID0gYXBwR3JvdXA7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwR3JvdXAuJENoaWxkcmVuPy5mb3JFYWNoKChzdWJHcm91cCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWJHcm91cC5JZCA9PT0gYXBwR3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwID0gc3ViR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZEdyb3VwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZUFwcFRpbGVHcm91cFNldHRpbmdzKFxuICAgICAgICBhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgICAgIHNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWxcbiAgICApOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcbiAgICAgICAgYXBwVGlsZUdyb3VwLlVzZXJBcHBUaWxlR3JvdXBTZXR0aW5nID0gc2V0dGluZztcbiAgICAgICAgYXBwVGlsZUdyb3VwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcHBUaWxlR3JvdXApKTtcbiAgICAgICAgdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoKTtcbiAgICAgICAgcmV0dXJuIGFwcFRpbGVHcm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlTmF2aWdhdG9yKGFwcFRpbGVHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBhcHBUaWxlR3JvdXAuJFRpbGVTZXR0aW5nQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBhcHBUaWxlR3JvdXAuJERpc2FibGVkcGluID0gZmFsc2U7XG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLFxuICAgICAgICAgICAgJ1VzZXJBcHBUaWxlR3JvdXBTZXR0aW5nLlRpdGxlJyxcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5UaXRsZVxuICAgICAgICApO1xuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPSBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPVxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlID09PSAnJyA/IGFwcFRpbGVHcm91cC5UaXRsZSA6IGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZTtcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlID0gdGhpcy5fYmJiVHJhbnNsYXRlUGlwZS50cmFuc2Zvcm0oYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlKTtcbiAgICAgICAgY29uc3Qgb3JkZXJJdGVtID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZUdyb3VwLCAnVXNlckFwcFRpbGVHcm91cFNldHRpbmcuT3JkZXJJdGVtJywgbnVsbCk7XG4gICAgICAgIGlmIChvcmRlckl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JPcmRlckl0ZW0gPSBvcmRlckl0ZW07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yT3JkZXJJdGVtID0gYXBwVGlsZUdyb3VwLk9yZGVySXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc2libGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShhcHBUaWxlR3JvdXAsICdVc2VyQXBwVGlsZUdyb3VwU2V0dGluZy5WaXNpYmxlJywgbnVsbCk7XG4gICAgICAgIGlmICh2aXNpYmxlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVmlzaWJsZSA9IGFwcFRpbGVHcm91cC5WaXNpYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXBwVGlsZXMgPSBhcHBUaWxlR3JvdXAuQXBwVGlsZXM/Lk1vRGF0YUxpc3QgPz8gW107XG5cbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpbGVzID0gYXBwVGlsZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMuVmlzaWJsZSAmJiAhYy5Jc0FjdGlvbkxpbmspXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gTnVtYmVyKGEuT3JkZXJJdGVtKSAtIE51bWJlcihiLk9yZGVySXRlbSkpO1xuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yQWN0aW9uTGlua3MgPSBhcHBUaWxlc1xuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5WaXNpYmxlICYmIGMuSXNBY3Rpb25MaW5rKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IE51bWJlcihhLk9yZGVySXRlbUFjdGlvbkxpbmspIC0gTnVtYmVyKGIuT3JkZXJJdGVtQWN0aW9uTGluaykpO1xuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGlsZXMuZm9yRWFjaCgoYXBwVGlsZSkgPT4gdGhpcy5fc2V0VGlsZUluZm8oYXBwVGlsZSkpO1xuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yQWN0aW9uTGlua3MuZm9yRWFjaCgoYXBwVGlsZSkgPT4gdGhpcy5fc2V0VGlsZUluZm8oYXBwVGlsZSkpO1xuXG4gICAgICAgIGFwcFRpbGVHcm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1YkFwcFRpbGVHcm91cCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZU5hdmlnYXRvcihzdWJBcHBUaWxlR3JvdXApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5pbnRlcmZhY2UgUGluVGlsZUluZm8ge1xuICAgIGdyb3VwczogTWV0YW9iamVjdERhdGFNb2RlbFtdO1xuICAgIHZpc2libGU6IGJvb2xlYW5bXTtcbiAgICB0aWxlSWQ6IHN0cmluZztcbn1cbiJdfQ==