barsa-novin-ray-core 2.2.72 → 2.2.74

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 (234) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +671 -660
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/lib/abstract-classes/field-base.d.ts +1 -1
  4. package/lib/abstract-classes/number-base.d.ts +1 -1
  5. package/lib/date-services/date.service.d.ts +1 -1
  6. package/lib/directives/base.directive.d.ts +1 -1
  7. package/lib/directives/splide-slider.directive.d.ts +1 -0
  8. package/lib/dynamic-component/base-view-item-props.d.ts +4 -4
  9. package/lib/resolvers/login-settings.resolver.d.ts +1 -1
  10. package/lib/resolvers/tile-group-breadcrumb.resolver.d.ts +1 -1
  11. package/lib/root-portal/root-portal.component.d.ts +2 -0
  12. package/lib/services/notification.service.d.ts +2 -2
  13. package/lib/services/portal.service.d.ts +4 -1
  14. package/package.json +3 -5
  15. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  16. package/esm2022/lib/abstract-classes/application-base.mjs +0 -25
  17. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  18. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -89
  19. package/esm2022/lib/abstract-classes/base.component.mjs +0 -60
  20. package/esm2022/lib/abstract-classes/field-base.mjs +0 -244
  21. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  22. package/esm2022/lib/abstract-classes/form-base.mjs +0 -164
  23. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  24. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -132
  25. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  26. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -100
  27. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -57
  28. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  29. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -49
  30. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -68
  31. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  32. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  33. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  34. package/esm2022/lib/abstract-classes/number-base.mjs +0 -201
  35. package/esm2022/lib/abstract-classes/page-base.mjs +0 -98
  36. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -41
  37. package/esm2022/lib/abstract-classes/report-base.mjs +0 -266
  38. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -54
  39. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -450
  40. package/esm2022/lib/abstract-classes/system-base.mjs +0 -25
  41. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -49
  42. package/esm2022/lib/auth-guard.mjs +0 -48
  43. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -311
  44. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -522
  45. package/esm2022/lib/base-ulv-setting.component.mjs +0 -46
  46. package/esm2022/lib/base.module.mjs +0 -28
  47. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -20
  48. package/esm2022/lib/constants.mjs +0 -963
  49. package/esm2022/lib/container.component.mjs +0 -100
  50. package/esm2022/lib/controllers/base-controller.mjs +0 -9
  51. package/esm2022/lib/controllers/base-view.mjs +0 -24
  52. package/esm2022/lib/controllers/index.mjs +0 -4
  53. package/esm2022/lib/controllers/models.mjs +0 -2
  54. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  55. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  56. package/esm2022/lib/date-services/date-info.mjs +0 -2
  57. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  58. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  59. package/esm2022/lib/date-services/date.service.mjs +0 -149
  60. package/esm2022/lib/date-services/index.mjs +0 -6
  61. package/esm2022/lib/device.mjs +0 -663
  62. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -46
  63. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -25
  64. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -36
  65. package/esm2022/lib/directives/base.directive.mjs +0 -55
  66. package/esm2022/lib/directives/body-click.directive.mjs +0 -36
  67. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -40
  68. package/esm2022/lib/directives/copy.directive.mjs +0 -60
  69. package/esm2022/lib/directives/count-down.directive.mjs +0 -109
  70. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -43
  71. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -66
  72. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -70
  73. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -73
  74. package/esm2022/lib/directives/field-binding.directive.mjs +0 -18
  75. package/esm2022/lib/directives/fill-empty-space.mjs +0 -89
  76. package/esm2022/lib/directives/form-close.directive.mjs +0 -33
  77. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -82
  78. package/esm2022/lib/directives/index.mjs +0 -42
  79. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -52
  80. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -60
  81. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -49
  82. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -38
  83. package/esm2022/lib/directives/mobile.directive.mjs +0 -30
  84. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -27
  85. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -27
  86. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -16
  87. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -21
  88. package/esm2022/lib/directives/print-files.directive.mjs +0 -39
  89. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -81
  90. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -76
  91. package/esm2022/lib/directives/render-ulv.directive.mjs +0 -52
  92. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -38
  93. package/esm2022/lib/directives/save-image.directive.mjs +0 -28
  94. package/esm2022/lib/directives/splide-slider.directive.mjs +0 -103
  95. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -21
  96. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -236
  97. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -43
  98. package/esm2022/lib/directives/until-inview.directive.mjs +0 -53
  99. package/esm2022/lib/directives/webotp.directive.mjs +0 -49
  100. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -61
  101. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -97
  102. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -53
  103. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -83
  104. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -27
  105. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -552
  106. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -163
  107. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  108. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -69
  109. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -78
  110. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -64
  111. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  112. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -49
  113. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  114. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -149
  115. package/esm2022/lib/form/form.component.mjs +0 -212
  116. package/esm2022/lib/form-new/form-new.component.mjs +0 -31
  117. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  118. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  119. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  120. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  121. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  122. package/esm2022/lib/global-error-handler.mjs +0 -26
  123. package/esm2022/lib/injdection-tokens.mjs +0 -8
  124. package/esm2022/lib/modal-root.component.mjs +0 -34
  125. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  126. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  127. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -20
  128. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -36
  129. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -27
  130. package/esm2022/lib/pipes/card-media-size.pipe.mjs +0 -21
  131. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -41
  132. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -33
  133. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -23
  134. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -35
  135. package/esm2022/lib/pipes/column-valueof-parameters.pipe.mjs +0 -34
  136. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -17
  137. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -41
  138. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -32
  139. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -33
  140. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -35
  141. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -21
  142. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -23
  143. package/esm2022/lib/pipes/filter-inline-action-list.pipe.mjs +0 -19
  144. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -45
  145. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -20
  146. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -17
  147. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -25
  148. package/esm2022/lib/pipes/filter.pipe.mjs +0 -34
  149. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -28
  150. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -20
  151. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -43
  152. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -64
  153. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -23
  154. package/esm2022/lib/pipes/hide-accept-cancel-buttons.pipe.mjs +0 -24
  155. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -23
  156. package/esm2022/lib/pipes/index.mjs +0 -55
  157. package/esm2022/lib/pipes/isimage.pipe.mjs +0 -20
  158. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -18
  159. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -43
  160. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -59
  161. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -17
  162. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -36
  163. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -18
  164. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -19
  165. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -91
  166. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -44
  167. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -23
  168. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -21
  169. package/esm2022/lib/pipes/replace.pipe.mjs +0 -18
  170. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -23
  171. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -26
  172. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -21
  173. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -24
  174. package/esm2022/lib/pipes/sort.pipe.mjs +0 -49
  175. package/esm2022/lib/pipes/string-to-number.pipe.mjs +0 -26
  176. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  177. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -60
  178. package/esm2022/lib/pipes/toolbar-settings.pipe.mjs +0 -27
  179. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -17
  180. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -26
  181. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -19
  182. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -24
  183. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -37
  184. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  185. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  186. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  187. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  188. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -42
  189. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  190. package/esm2022/lib/resolvers/index.mjs +0 -7
  191. package/esm2022/lib/resolvers/login-settings.resolver.mjs +0 -18
  192. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  193. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  194. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  195. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  196. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  197. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  198. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -218
  199. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  200. package/esm2022/lib/services/api.service.mjs +0 -63
  201. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  202. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  203. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  204. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  205. package/esm2022/lib/services/column.service.mjs +0 -20
  206. package/esm2022/lib/services/container.service.mjs +0 -69
  207. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  208. package/esm2022/lib/services/form-panel.service.mjs +0 -394
  209. package/esm2022/lib/services/form.service.mjs +0 -14
  210. package/esm2022/lib/services/groupby.service.mjs +0 -21
  211. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  212. package/esm2022/lib/services/index.mjs +0 -32
  213. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  214. package/esm2022/lib/services/layout-main-content.service.mjs +0 -19
  215. package/esm2022/lib/services/layout.service.mjs +0 -42
  216. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  217. package/esm2022/lib/services/log.service.mjs +0 -50
  218. package/esm2022/lib/services/network-status.service.mjs +0 -15
  219. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  220. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  221. package/esm2022/lib/services/notification.service.mjs +0 -189
  222. package/esm2022/lib/services/portal.service.mjs +0 -946
  223. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  224. package/esm2022/lib/services/routing.service.mjs +0 -60
  225. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  226. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  227. package/esm2022/lib/services/tabpage.service.mjs +0 -13
  228. package/esm2022/lib/services/toast.service.mjs +0 -2
  229. package/esm2022/lib/services/ui.service.mjs +0 -23
  230. package/esm2022/lib/services/ulvmain.service.mjs +0 -824
  231. package/esm2022/lib/services/upload.service.mjs +0 -166
  232. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  233. package/esm2022/lib/unlimit-session/unlimit-session.component.mjs +0 -40
  234. package/esm2022/public-api.mjs +0 -42
@@ -1,824 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, of, Subject } from 'rxjs';
3
- import { delay, distinctUntilChanged, filter, map, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';
4
- import { BarsaApi, MetaobjectDataModel } from '../abstract-classes';
5
- import { executeUlvCommandHandler, genrateInlineMoId, getControlList, GetDefaultMoObjectInfo, getNewMoGridEditor } from '../constants';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../pipes";
8
- import * as i2 from "./api.service";
9
- export class UlvMainService {
10
- constructor(_bbbPipe, _apiService) {
11
- this._bbbPipe = _bbbPipe;
12
- this._apiService = _apiService;
13
- this.moDataListSource = new BehaviorSubject([]);
14
- this._cartableTemplates$ = new BehaviorSubject({});
15
- this._cartableChildsMo$ = new BehaviorSubject({});
16
- this._setUiViewerSelector$ = new Subject();
17
- this._gridFreeColumnSizing$ = new BehaviorSubject(false);
18
- this._layoutInfoSource = new Subject();
19
- this._contextSource = new Subject();
20
- this._canSaveGridSetting$ = new BehaviorSubject(false);
21
- this._inDialog$ = new BehaviorSubject(false);
22
- this._isMultiSelect$ = new BehaviorSubject(false);
23
- this._fullscreen$ = new BehaviorSubject(false);
24
- this._conditionalFormatsSource = new BehaviorSubject([]);
25
- this._reportSource = new BehaviorSubject(null);
26
- this._viewerControlSource = new BehaviorSubject(null);
27
- this._hideToolbarSource = new BehaviorSubject(true);
28
- this._onDestroy$ = new Subject();
29
- this._maskSource = new BehaviorSubject(false);
30
- this._showContextMenuSource = new Subject();
31
- this._viewerMaskSource = new BehaviorSubject(false);
32
- this._visibleSource = new BehaviorSubject(true);
33
- this._enableSource = new BehaviorSubject(true);
34
- this._readonlySource = new BehaviorSubject(false);
35
- this._menuItemsSource = new BehaviorSubject([]);
36
- this._onlyInlineEditSource = new BehaviorSubject(false);
37
- this._inlineEditModeSource = new BehaviorSubject(false);
38
- this._allowInlineEditSource = new BehaviorSubject(false);
39
- this._cartableKeySeperator = '@';
40
- this._titleSource = new BehaviorSubject({
41
- text: '',
42
- image: ''
43
- });
44
- this._hideUlvPageTitle$ = new BehaviorSubject(false);
45
- this._searchPanelUiSource = new BehaviorSubject(null);
46
- this._pagingSettingSource = new BehaviorSubject(null);
47
- this._toolbarButtonsSource = new BehaviorSubject([]);
48
- this._toolbarButtonsWorkflowButtons = new BehaviorSubject([]);
49
- this._destroySource = new Subject();
50
- this._firstApplyAutomatically = true;
51
- this._controlInfosMetaobject = [];
52
- this._selectedSearchPanelSettingsIdSource = new BehaviorSubject('');
53
- this._defaultSearchPanelSettingsSource = new Subject();
54
- this._allSearchPanelSettingsSource = new BehaviorSubject([]);
55
- this._cssBackgroundSource = new BehaviorSubject(null);
56
- this._hidePagingSource = new BehaviorSubject(false);
57
- this._openSearchPanelHiddenSettingsSource = new Subject();
58
- this._openSearchFilesManageSource = new Subject();
59
- this._searchPanelMoChangedSource = new BehaviorSubject(false);
60
- this._newInlineEditMoSource = new BehaviorSubject(null);
61
- this._hideSearchapanelSource = new BehaviorSubject(false);
62
- this._workflowShareButtons = [];
63
- this.context$ = this._contextSource
64
- .asObservable()
65
- .pipe(takeUntil(this._onDestroy$), tap((context) => (this.context = context)), tap((context) => this._initialize(context)), tap((context) => this._addEventListener(context)))
66
- .subscribe();
67
- this.newInlineEditMo$ = this._newInlineEditMoSource.asObservable().pipe(takeUntil(this._onDestroy$));
68
- this.viewer$ = this._viewerControlSource.asObservable().pipe(takeUntil(this._onDestroy$));
69
- this.conditionalFormats$ = this._conditionalFormatsSource.asObservable().pipe(takeUntil(this._onDestroy$));
70
- this.hideToolbar$ = this._hideToolbarSource.asObservable().pipe(takeUntil(this._onDestroy$));
71
- this.mask$ = this._maskSource.asObservable().pipe(takeUntil(this._onDestroy$));
72
- this.viwerMask$ = this._viewerMaskSource.asObservable().pipe(takeUntil(this._onDestroy$));
73
- this.visible$ = this._visibleSource.asObservable().pipe(takeUntil(this._onDestroy$));
74
- this.enable$ = this._enableSource.asObservable().pipe(takeUntil(this._onDestroy$));
75
- this.readonly$ = this._readonlySource.asObservable().pipe(takeUntil(this._onDestroy$));
76
- this.hideUlvPageTitle$ = this._hideUlvPageTitle$.asObservable().pipe(takeUntil(this._onDestroy$));
77
- this.uiViewerSelector$ = this._setUiViewerSelector$.asObservable();
78
- this.menuItems$ = this._menuItemsSource.asObservable().pipe(takeUntil(this._onDestroy$), filter((items) => items?.length > 0), map((items) => items.filter((c) => c.itemId !== 'ExportToExcel' && c.itemId !== 'Delete')));
79
- this.title$ = this._titleSource.asObservable().pipe(takeUntil(this._onDestroy$));
80
- this.searchPanelUi$ = this._searchPanelUiSource.asObservable().pipe(takeUntil(this._onDestroy$), tap((searchPanel) => this._addDefaultSearchPanelSettings(searchPanel)));
81
- this.openSearchPanelHiddenSettings$ = this._openSearchPanelHiddenSettingsSource.asObservable();
82
- this.pagingSetting$ = this._pagingSettingSource.asObservable().pipe(takeUntil(this._onDestroy$));
83
- this.toolbarButtons$ = combineLatest([
84
- this._toolbarButtonsWorkflowButtons.asObservable(),
85
- this._toolbarButtonsSource.asObservable()
86
- ]).pipe(takeUntil(this._onDestroy$), map(([wfBtns, c]) => !c
87
- ? []
88
- : [
89
- ...wfBtns,
90
- ...c.map((d) => ({
91
- ...d,
92
- hideText: d.Command?.IsBuiltin && d.itemId !== 'New' ? true : false
93
- }))
94
- ]), map((c) => !c ? [] : [...c.filter((d) => !d.Command?.IsBuiltin), ...c.filter((d) => d.Command?.IsBuiltin)]), map((c) => c.reduce((acc, b) => (acc.length > 0 && acc[acc.length - 1]['0'] && b['0'] ? acc : [...acc, b]), [])));
95
- this.destroy$ = this._destroySource.asObservable().pipe(tap(() => this._unscubscribeContext()));
96
- this.moDataList$ = this.moDataListSource.asObservable().pipe();
97
- this.selectedCount$ = this.moDataList$.pipe(map((items) => items.filter((d) => d.$IsChecked).length));
98
- this.reportId$ = this._reportSource.asObservable().pipe(map((report) => report?.Id));
99
- this.allowInlineEdit$ = this._allowInlineEditSource.asObservable();
100
- this.inlineEditMode$ = this._inlineEditModeSource.asObservable();
101
- this.onlyInlineEdit$ = this._onlyInlineEditSource.asObservable();
102
- this.openSearchFilesManage$ = this._openSearchFilesManageSource.asObservable();
103
- this.searchPanelMoChanged$ = this._searchPanelMoChangedSource.asObservable().pipe(distinctUntilChanged());
104
- this.layoutInfo$ = this._layoutInfoSource.asObservable().pipe(shareReplay(1));
105
- this.allSearchPanelSettings$ = combineLatest([
106
- this._allSearchPanelSettingsSource.asObservable(),
107
- this._defaultSearchPanelSettingsSource.asObservable()
108
- ]).pipe(map(([allSettings, defaultSettings]) => {
109
- if (defaultSettings && allSettings) {
110
- defaultSettings.IsDefault = !allSettings.some((c) => c.IsDefault);
111
- allSettings = [defaultSettings, ...allSettings];
112
- }
113
- return allSettings;
114
- }), delay(0), shareReplay(1));
115
- this.selectedSearchPanelSettingsId$ = this._selectedSearchPanelSettingsIdSource
116
- .asObservable()
117
- .pipe(distinctUntilChanged());
118
- this.selectedSearchPanelSettings$ = combineLatest([
119
- this.selectedSearchPanelSettingsId$,
120
- this.allSearchPanelSettings$
121
- ]).pipe(map(([id, settings]) => settings?.find((c) => c.Id === id)), shareReplay(1));
122
- }
123
- get hidePaging$() {
124
- return this._hidePagingSource.asObservable();
125
- }
126
- get showContextMenu$() {
127
- return this._showContextMenuSource.asObservable();
128
- }
129
- get gridFreeColumnSizing$() {
130
- return this._gridFreeColumnSizing$.asObservable();
131
- }
132
- get canSaveGridSetting$() {
133
- return this._canSaveGridSetting$.asObservable();
134
- }
135
- get inDialog$() {
136
- return this._inDialog$.asObservable();
137
- }
138
- get isMultiSelect$() {
139
- return this._isMultiSelect$.asObservable();
140
- }
141
- get fullscreen$() {
142
- return this._fullscreen$.asObservable();
143
- }
144
- get cartableChildsMo$() {
145
- return this._cartableChildsMo$.asObservable();
146
- }
147
- get cartableTemplates$() {
148
- return this._cartableTemplates$.asObservable();
149
- }
150
- get searchPanelUi() {
151
- return this._searchPanelUiSource.getValue();
152
- }
153
- get reportId() {
154
- return this._reportSource.getValue()?.Id;
155
- }
156
- get allSearchPanelSettings() {
157
- return this._allSearchPanelSettingsSource.getValue();
158
- }
159
- get hideSearchpanel$() {
160
- return this._hideSearchapanelSource.asObservable().pipe(distinctUntilChanged());
161
- }
162
- get hideSearchpanel() {
163
- return this._hideSearchapanelSource.getValue();
164
- }
165
- get cssBackground$() {
166
- return this._cssBackgroundSource.asObservable();
167
- }
168
- setBackground(cssBackground) {
169
- return this._cssBackgroundSource.next(cssBackground);
170
- }
171
- hidePaging(hide) {
172
- this._hidePagingSource.next(hide);
173
- }
174
- setUiViewerClass(selector) {
175
- this._setUiViewerSelector$.next(selector);
176
- }
177
- hideUlvTitlePage() {
178
- this._hideUlvPageTitle$.next(true);
179
- }
180
- setCanSaveGridSettings(val) {
181
- this._canSaveGridSetting$.next(val);
182
- }
183
- executeToolbarButton(itemId, options) {
184
- const buttons = this._toolbarButtonsSource.getValue();
185
- if (!buttons.length) {
186
- return;
187
- }
188
- const btn = buttons.find((c) => c.itemId === itemId);
189
- if (btn) {
190
- executeUlvCommandHandler(btn, options);
191
- }
192
- }
193
- addWorkflowButtonsInToolbar(e) {
194
- const arrOfShareButtons = this._createWorkflowShareButtons(e);
195
- const value = arrOfShareButtons.map((c) => ({
196
- icon: '',
197
- text: c,
198
- itemId: c,
199
- Data: null,
200
- $ShareWorkflowButtons: true,
201
- Command: { _isVisible: true, _isEnable: true, JsonExtraProp: { Design: 'attention' } },
202
- handler: (d) => this.onWorkflowButtonInToolbarClick(d),
203
- IsBuiltin: false
204
- }));
205
- this._toolbarButtonsWorkflowButtons.next(value);
206
- }
207
- _excludeWrapperFromMo(mo) {
208
- /* eslint-disable no-unused-vars */
209
- const { $Wrapper, ...newMo } = mo;
210
- return newMo;
211
- }
212
- onWorkflowButtonInToolbarClick(shareButton) {
213
- BarsaApi.Bw.Msg.OKCancel('آیا از تایید موارد کارتابل مطمئن هستید؟', 'تایید', (res) => {
214
- if (res === 'ok') {
215
- this._workflowShareButtons.forEach((c) => {
216
- const choiceDef = c.choiceList.find((d) => d.Title === shareButton.text);
217
- if (choiceDef) {
218
- c.formPanelCtrlr.WorkflowTransition(choiceDef, () => {
219
- // this._setWorkflowState('Finish', [c.mo]);
220
- });
221
- }
222
- });
223
- // this._setWorkflowState(
224
- // 'Pending',
225
- // this._workflowShareButtons.map((c) => c.mo)
226
- // );
227
- // const params = this._workflowShareButtons.map((c) => ({
228
- // mo: this._excludeWrapperFromMo(c.mo.RelatedMo),
229
- // choiceDef: c.choiceList.find((d) => d.Title === shareButton.text)
230
- // }));
231
- // this._setWorkflowState('Pending', params);
232
- // BarsaApi.Common.Ajax.GetServerData(
233
- // 'Workflow94.OnGroupOfChoiceDefsSelect',
234
- // { parameter: { DataList: params } },
235
- // () => {
236
- // this._setWorkflowState('Success', params);
237
- // }, // success
238
- // () => {
239
- // this._setWorkflowState('Failed', params, 'متاسفانه عملیات ناموفق بود.');
240
- // }, // failure
241
- // null,
242
- // this
243
- // );
244
- }
245
- });
246
- }
247
- setTitle(title) {
248
- this._titleSource.next({ text: title, image: '' });
249
- }
250
- toggleHideSearchpanel(val) {
251
- this._hideSearchapanelSource.next(typeof val !== 'undefined' ? val : !this._hideSearchapanelSource.getValue());
252
- }
253
- setContext(context) {
254
- this._contextSource.next(context);
255
- }
256
- setInDialog(val) {
257
- this._inDialog$.next(val);
258
- }
259
- setIsMultiSelect(val) {
260
- this._isMultiSelect$.next(val);
261
- }
262
- setFullscreen(val) {
263
- this._fullscreen$.next(val);
264
- }
265
- createNewInlineMo(isChecked) {
266
- const context = this.context;
267
- const formSetting = context.Setting.FormTemplate;
268
- const typeDefId = context.Setting.Extra.Report.TypeDefId;
269
- const newMo = getNewMoGridEditor(formSetting, typeDefId);
270
- newMo.Id = genrateInlineMoId();
271
- newMo.$IsChecked = isChecked;
272
- newMo.$NewInlineMo = true;
273
- if (this._isComposite(context)) {
274
- const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
275
- newMo[relation.ParentFdName] = relation.ParentMoId;
276
- }
277
- // this._newInlineEditMoSource.next(newMo);
278
- return newMo;
279
- }
280
- setLayoutInfo(layoutInfo) {
281
- this._layoutInfoSource.next(layoutInfo);
282
- }
283
- destroy() {
284
- this._onDestroy$.next();
285
- this._unscubscribeContext();
286
- }
287
- pageSizeChanged(pageIndex) {
288
- this.context.fireEvent('PageChange', this.context, pageIndex);
289
- }
290
- pageChanged(pageIndex) {
291
- this.context.currentPage = pageIndex;
292
- this.context.fireEvent('PageChange', this.context, pageIndex);
293
- }
294
- reSetMoDataList(moDataList) {
295
- const newMoDataList = moDataList ?? this.moDataListSource.getValue();
296
- this._moDataListChanged([...newMoDataList]);
297
- if (!this.context.Setting?.IsCartableReport) {
298
- return;
299
- }
300
- const keyOfCatableTemplates = new Set();
301
- newMoDataList.forEach((c) => {
302
- const tpdfId = c.RelatedMo?.$TypeDefId;
303
- if (tpdfId) {
304
- const key = `${tpdfId}${this._cartableKeySeperator}${c.CartableSettings?.Id || '0'}`;
305
- keyOfCatableTemplates.add(key);
306
- }
307
- });
308
- if (keyOfCatableTemplates.size > 0) {
309
- this._loadCartableTemplate(keyOfCatableTemplates);
310
- }
311
- }
312
- // Search Setting Manager
313
- clearSearch() {
314
- const searchPanelUi = this.searchPanelUi;
315
- if (!searchPanelUi) {
316
- return;
317
- }
318
- const fieldUi = searchPanelUi._dictFieldUi.$Search ?? searchPanelUi._dictFieldUi.جستجو;
319
- fieldUi.fireEvent('ClearClick');
320
- }
321
- search() {
322
- const searchPanelUi = this.searchPanelUi;
323
- if (!searchPanelUi) {
324
- return;
325
- }
326
- let fieldUi = searchPanelUi._dictFieldUi.$Search ?? searchPanelUi._dictFieldUi.جستجو;
327
- if (!fieldUi) {
328
- Object.keys(searchPanelUi._dictFieldUi).forEach((c) => {
329
- const e = searchPanelUi._dictFieldUi[c];
330
- if (e.originalXtype === 'Ui.SearchCommandInfoUi') {
331
- fieldUi = e;
332
- }
333
- });
334
- }
335
- if (fieldUi) {
336
- fieldUi.fireEvent('SearchClick');
337
- }
338
- }
339
- getValueInlineEdit() {
340
- return this._inlineEditModeSource.getValue();
341
- }
342
- getAllowInlineEdit() {
343
- return this._allowInlineEditSource.getValue();
344
- }
345
- setInlineEdit(value) {
346
- this._inlineEditModeSource.next(value);
347
- }
348
- openSearchFieldsHiddenSettings() {
349
- this._openSearchPanelHiddenSettingsSource.next();
350
- }
351
- openSearchFilesManage() {
352
- this._openSearchFilesManageSource.next();
353
- }
354
- searchPanelMoChanged(change) {
355
- this._searchPanelMoChangedSource.next(change);
356
- }
357
- loadSearchPanelSettings() {
358
- if (this.context.FormPanelUi || !this._canSaveGridSetting$.getValue()) {
359
- return;
360
- }
361
- this.reportId$
362
- .pipe(takeUntil(this._onDestroy$), tap((reportId) => this._loadSearchPanelSettings(reportId)))
363
- .subscribe();
364
- }
365
- addSearchPanelSettings(searchPanelSettings) {
366
- const allSearchPanelSettings = this._allSearchPanelSettingsSource.getValue();
367
- allSearchPanelSettings.push(searchPanelSettings);
368
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
369
- }
370
- saveSearchPanelSetting(selectedSearchPanelSettings) {
371
- const searchMo = this.getSearchPanelMo();
372
- const fieldsSetting = this.getSearchPanelFieldsSetting();
373
- if (!selectedSearchPanelSettings) {
374
- return;
375
- }
376
- selectedSearchPanelSettings.SearchMo = JSON.stringify(searchMo);
377
- selectedSearchPanelSettings.FieldsSetting = JSON.stringify(fieldsSetting);
378
- BarsaApi.Bw.RunBlMethod('SaveSearchPanelSettings', new BarsaApi.Common.MetaObjectWeb({
379
- Id: selectedSearchPanelSettings.Id,
380
- $Caption: selectedSearchPanelSettings.Title,
381
- ReportId: selectedSearchPanelSettings.Report?.Id,
382
- Title: selectedSearchPanelSettings.Title,
383
- IsDefault: selectedSearchPanelSettings.IsDefault,
384
- IsPublic: selectedSearchPanelSettings.IsPublic,
385
- ApplyAutomatically: selectedSearchPanelSettings.ApplyAutomatically,
386
- HideSearchPanel: selectedSearchPanelSettings.HideSearchPanel,
387
- SearchMo: selectedSearchPanelSettings.SearchMo,
388
- FieldsSetting: selectedSearchPanelSettings.FieldsSetting
389
- }), true);
390
- this.searchPanelMoChanged(false);
391
- }
392
- applySearchPanelSettings(searchPanelSettings) {
393
- const searchPanelUi = this.searchPanelUi;
394
- if (!searchPanelSettings) {
395
- return;
396
- }
397
- if (this._firstApplyAutomatically && searchPanelSettings.IsPrimary) {
398
- this._firstApplyAutomatically = false;
399
- return;
400
- }
401
- this._firstApplyAutomatically = false;
402
- this.resetSearchPanelSettings(searchPanelUi);
403
- if (searchPanelSettings.SearchMo) {
404
- const searchMo = JSON.parse(searchPanelSettings.SearchMo);
405
- Object.keys(searchMo).forEach((c) => {
406
- const field = searchPanelUi._dictFieldUi[c];
407
- if (field && c.indexOf('$') === -1) {
408
- field.SetValue(searchMo[c]);
409
- searchPanelUi.Mo.SetFValue(c, searchMo[c]);
410
- }
411
- });
412
- if (searchPanelSettings.IsPrimary && !searchPanelUi.Setting.ImmediateExecute) {
413
- this.searchPanelMoChanged(false);
414
- return;
415
- }
416
- if (searchPanelSettings.ApplyAutomatically) {
417
- this.search();
418
- }
419
- }
420
- // TODO set hidden fields
421
- if (searchPanelSettings.FieldsSetting) {
422
- const settings = JSON.parse(searchPanelSettings.FieldsSetting);
423
- this.setAndApplySearchPanelSettingFieldsSetting(typeof settings === 'string' ? JSON.parse(settings) : settings);
424
- }
425
- this.searchPanelMoChanged(false);
426
- }
427
- getSearchPanelMo() {
428
- return this.searchPanelUi.Mo;
429
- }
430
- getSearchPanelFieldsSetting() {
431
- const searchPanelUi = this.searchPanelUi;
432
- const fields = searchPanelUi.Setting.View.ControlInfo.filter((c) => c.ControlName !== '$Search' && c.ControlName !== 'جستجو');
433
- const fieldsSetting = fields.map((c) => ({
434
- Name: c.ControlName,
435
- Caption: c.ControlFieldCaptionTranslated,
436
- Hidden: searchPanelUi._dictFieldUi[c.ControlName].Setting.IsVisible === false ? true : false,
437
- IsMandatory: c.IsMandatory
438
- }));
439
- return fieldsSetting;
440
- }
441
- setAndApplySearchPanelSettingFieldsSetting(fieldsSetting) {
442
- const searchPanelUi = this.searchPanelUi;
443
- fieldsSetting.forEach((c) => {
444
- const field = searchPanelUi._dictFieldUi[c.Name];
445
- if (field) {
446
- searchPanelUi.fireEvent('ChangeFieldVisible', field.Setting.ControlFieldCaption, !c.Hidden);
447
- }
448
- });
449
- }
450
- updateSearchPanelSettings(allSearchPanelSettings) {
451
- allSearchPanelSettings = allSearchPanelSettings.filter((c) => !c.IsPrimary && !c.IsDeleted);
452
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
453
- }
454
- removeSearchPanelSettings(searchPanelSettingsId) {
455
- const allSearchPanelSettings = this._allSearchPanelSettingsSource.getValue();
456
- allSearchPanelSettings.filter((c) => c.Id !== searchPanelSettingsId);
457
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
458
- }
459
- changeSelectedSearchPanel(selectedSearchPanelSettingsId) {
460
- this._selectedSearchPanelSettingsIdSource.next(selectedSearchPanelSettingsId);
461
- }
462
- loadMetaConditionsControlInfos(typeDefId, fieldDbNames) {
463
- const mo = GetDefaultMoObjectInfo(typeDefId);
464
- return of(this._controlInfosMetaobject).pipe(switchMap((controlsInfo) => {
465
- if (controlsInfo.length > 0) {
466
- return of(controlsInfo);
467
- }
468
- return getControlList(mo, fieldDbNames, true, false);
469
- }), tap((controlsInfo) => (this._controlInfosMetaobject = controlsInfo)));
470
- }
471
- _createWorkflowShareButtons(e) {
472
- let shareButtons = [];
473
- if (e.add) {
474
- this._workflowShareButtons.push(e);
475
- }
476
- else {
477
- this._workflowShareButtons = this._workflowShareButtons.filter((c) => c.mo.Id !== e.mo.Id);
478
- }
479
- if (!this._workflowShareButtons.length) {
480
- return [];
481
- }
482
- // this._workflowShareButtons = this._workflowShareButtons.filter((c) => c.mo?.$IsChecked);
483
- if (this._workflowShareButtons.length > 0) {
484
- shareButtons = this._workflowShareButtons[0].choiceList.map((d) => d.Title);
485
- const unShareButtons = [];
486
- for (let i = 1; i < this._workflowShareButtons.length; i++) {
487
- const item = this._workflowShareButtons[i];
488
- for (let j = 0; j < shareButtons.length; j++) {
489
- if (item.choiceList.map((d) => d.Title).indexOf(shareButtons[j]) < 0) {
490
- unShareButtons.push(shareButtons[j]);
491
- }
492
- }
493
- }
494
- shareButtons = shareButtons.filter((c) => unShareButtons.indexOf(c) === -1);
495
- }
496
- return shareButtons;
497
- }
498
- _initCreateNewInlineMo(context) {
499
- if (!context) {
500
- return;
501
- }
502
- const formSetting = context.Setting.FormTemplate;
503
- if (formSetting) {
504
- this.createNewInlineMo(false);
505
- }
506
- }
507
- _isComposite(context) {
508
- const relationType = BarsaApi.Common.Util.TryGetValue(context.Setting, 'Extra.Relation.RelationType');
509
- return relationType === BarsaApi.Common.Enums.RelationType.Composition;
510
- }
511
- _addEventListener(context) {
512
- context.on({
513
- scope: this,
514
- ShowContextMenu: this._showContextMenu,
515
- MaskChanged: this._maskChanged,
516
- ViewerMaskChanged: this._viewerMaskChanged,
517
- ViewerControlChanged: this._viewerControlChanged,
518
- VisibleChanged: this._visibleChanged,
519
- ReadonlyChanged: this._readonlyChanged,
520
- MenuItemsChanged: this._menuItemsChanged,
521
- TitleChanged: this._titleChanged,
522
- SearchPanelChanged: this._searchPanelChanged,
523
- PagingSettingChanged: this._pagingSettingChanged,
524
- ToolbarButtonsChanged: this._toolbarButtonsChanged,
525
- EnableChanged: this._enableChanged,
526
- Destroy: this._destroyChanged,
527
- ExitInlineEdit: this._existInlineEdit
528
- });
529
- }
530
- _initialize(context) {
531
- this._initCartablesFormTemplate(context);
532
- this._initConditionalFormats(context);
533
- this._initAllowInlineEdit(context);
534
- this._initOnlyInlineEdit(context);
535
- this._initInlineEditMode(context);
536
- this._initReport(context);
537
- this._initViewerControl(context);
538
- this._initHideToolbar(context);
539
- this._initToolbarButtons(context);
540
- this._initVisible(context);
541
- this._initEnable(context);
542
- this._initTitle(context);
543
- this._initReadonly(context);
544
- this._initMoDataList(context);
545
- this._initPagingSetting(context);
546
- this._initMenuItems(context);
547
- this._initSearchpanel(context);
548
- this._initCreateNewInlineMo(context);
549
- this._initGridFreeColumnSizing(context);
550
- }
551
- _initGridFreeColumnSizing(context) {
552
- if (context && context.Setting.View?.Grid_FreeColumnSizing) {
553
- this._gridFreeColumnSizing$.next(context.Setting.View?.Grid_FreeColumnSizing);
554
- }
555
- }
556
- _initCartablesFormTemplate(context) {
557
- const cartableTemplates = context.Setting.CartableTemplates;
558
- if (cartableTemplates) {
559
- const keys = Object.keys(cartableTemplates);
560
- keys.forEach((key) => {
561
- if (typeof cartableTemplates[key] === 'string') {
562
- cartableTemplates[key] = BarsaApi.Ext.decode(cartableTemplates[key]);
563
- }
564
- });
565
- this._cartableTemplates$.next(cartableTemplates);
566
- }
567
- this._cartableChildsMo(context);
568
- }
569
- _initSearchpanel(context) {
570
- if (context && context._searchPanelControl) {
571
- this._searchPanelChanged(context._searchPanelControl);
572
- }
573
- }
574
- _initConditionalFormats(context) {
575
- if (context && context.Setting.View?.ConditionalFormats) {
576
- this._conditionalFormatsChanged(context.Setting.View?.ConditionalFormats);
577
- }
578
- }
579
- _initMenuItems(context) {
580
- if (context && context.menuItems) {
581
- // const newItems = context.menuItems;
582
- this._menuItemsChanged(context.menuItems);
583
- }
584
- }
585
- _initReport(context) {
586
- const report = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report', []);
587
- this._reportSource.next(report);
588
- }
589
- _initMoDataList(context) {
590
- const moDataList = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Data.MoDataList', []);
591
- this._moDataListChanged(moDataList);
592
- }
593
- _cartableChildsMo(context) {
594
- if (context.Setting.CartableChildsMo) {
595
- this._cartableChildsMo$.next(context.Setting.CartableChildsMo);
596
- }
597
- }
598
- _initPagingSetting(context) {
599
- const pagingSetting = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Data.Paging', null);
600
- this._pagingSettingChanged(pagingSetting);
601
- }
602
- _initTitle(context) {
603
- let title = BarsaApi.Common.Util.TryGetValue(context, 'title', null);
604
- if (title === null) {
605
- title = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report.Caption', '');
606
- }
607
- this._titleChanged({ text: title, image: '' });
608
- }
609
- _initReadonly(context) {
610
- const readonly = context.readonly === true ? true : false;
611
- this._readonlyChanged(readonly);
612
- }
613
- _initEnable(context) {
614
- const enable = context.enable === false ? false : true;
615
- this._enableChanged(enable);
616
- }
617
- _initVisible(context) {
618
- const visible = context.Setting.IsVisible === false ? false : true;
619
- this._visibleChanged(visible);
620
- }
621
- _initToolbarButtons(context) {
622
- const buttons = context.tlbButtons;
623
- if (Array.isArray(buttons)) {
624
- this._toolbarButtonsChanged(buttons);
625
- }
626
- }
627
- _initInlineEditMode(context) {
628
- const inlineEditMode = context.Setting?.View?.AutoInlineEdit;
629
- this._inlineEditModeSource.next(inlineEditMode);
630
- }
631
- _initAllowInlineEdit(context) {
632
- const allowInlineEdit = context.Setting?.View?.AllowInlineEdit;
633
- const allowEdit = context.Setting.Extra?.DefaultCommandsAccess?.Edit;
634
- this._allowInlineEditSource.next(allowInlineEdit && allowEdit);
635
- }
636
- _initOnlyInlineEdit(context) {
637
- const onlyInlineEdit = context.Setting?.View?.OnlyInlineEdit;
638
- this._onlyInlineEditSource.next(onlyInlineEdit);
639
- }
640
- _initViewerControl(context) {
641
- const viewerControl = context.viewerControl;
642
- if (viewerControl) {
643
- this._viewerControlChanged(viewerControl);
644
- }
645
- }
646
- _initHideToolbar(context) {
647
- const hideToolbar = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report.HideToolbar', false);
648
- this._hideToolbarSource.next(hideToolbar);
649
- }
650
- _unscubscribeContext() {
651
- this.context.un('ShowContextMenu', this._showContextMenu);
652
- this.context.un('MaskChanged', this._maskChanged);
653
- this.context.un('ViewerControlChanged', this._viewerControlChanged);
654
- this.context.un('ViewerMaskChanged', this._viewerMaskChanged);
655
- this.context.un('VisibleChanged', this._visibleChanged);
656
- this.context.un('ReadonlyChanged', this._readonlyChanged);
657
- this.context.un('MenuItemsChanged', this._menuItemsChanged);
658
- this.context.un('TitleChanged', this._titleChanged);
659
- this.context.un('PagingSettingChanged', this._pagingSettingChanged);
660
- this.context.un('ToolbarButtonsChanged', this._toolbarButtonsChanged);
661
- this.context.un('EnableChanged', this._enableChanged);
662
- this.context.un('Destroy', this._destroyChanged);
663
- this.context.un('ExitInlineEdit', this._existInlineEdit);
664
- }
665
- _conditionalFormatsChanged(conditionalFormats) {
666
- this._conditionalFormatsSource.next(conditionalFormats);
667
- }
668
- _moDataListChanged(moDataList) {
669
- this.moDataListSource.next(moDataList);
670
- if (this.context) {
671
- this._cartableChildsMo(this.context);
672
- this._initCartablesFormTemplate(this.context);
673
- this._checkCartableWorkflowShareButtons(moDataList);
674
- }
675
- }
676
- _checkCartableWorkflowShareButtons(moDataList) {
677
- const hasSelected = moDataList.some((c) => c.$IsChecked);
678
- const moIds = moDataList.map((c) => c.Id);
679
- this._workflowShareButtons = this._workflowShareButtons.filter((c) => moIds.indexOf(c.mo.Id) > -1);
680
- if (!hasSelected) {
681
- this._toolbarButtonsWorkflowButtons.next([]);
682
- }
683
- }
684
- _viewerControlChanged(viewerControl) {
685
- this._viewerControlSource.next(viewerControl);
686
- this._initConditionalFormats(this.context);
687
- this._initInlineEditMode(this.context);
688
- this._initAllowInlineEdit(this.context);
689
- this._initOnlyInlineEdit(this.context);
690
- }
691
- _maskChanged(mask) {
692
- this._maskSource.next(mask);
693
- }
694
- _showContextMenu(xy) {
695
- this._showContextMenuSource.next(xy);
696
- }
697
- _viewerMaskChanged(viewerMask) {
698
- this._viewerMaskSource.next(viewerMask);
699
- }
700
- _readonlyChanged(readonly) {
701
- this._readonlySource.next(readonly);
702
- }
703
- _visibleChanged(viewerMask) {
704
- this._visibleSource.next(viewerMask);
705
- }
706
- _removeExtraMenuItems(menuItems) {
707
- if (!menuItems) {
708
- return [];
709
- }
710
- const newItems = menuItems.filter((c) => c.itemId !== 'Delete' && c.itemId !== 'AddToList' && c.itemId !== 'RemoveFromList');
711
- return newItems;
712
- }
713
- _menuItemsChanged(menuItems) {
714
- const newMenuItems = this._removeExtraMenuItems(menuItems);
715
- this._menuItemsSource.next(newMenuItems);
716
- }
717
- _titleChanged(titleObj) {
718
- this._titleSource.next(titleObj);
719
- }
720
- _searchPanelChanged(searchPanel) {
721
- this._searchPanelUiSource.next(searchPanel);
722
- }
723
- _pagingSettingChanged(pageingSetting) {
724
- this._pagingSettingSource.next(pageingSetting);
725
- }
726
- _toolbarButtonsChanged(buttons) {
727
- this._toolbarButtonsSource.next(buttons);
728
- }
729
- _enableChanged(enable) {
730
- this._enableSource.next(enable);
731
- }
732
- _destroyChanged() {
733
- this._destroySource.next();
734
- }
735
- _existInlineEdit() {
736
- this._inlineEditModeSource.next(false);
737
- }
738
- _addDefaultSearchPanelSettings(searchPanel) {
739
- const searchMo = JSON.stringify(searchPanel?.Mo ?? new MetaobjectDataModel());
740
- const StandardText = this._bbbPipe.transform('Standard');
741
- const standardSettings = {
742
- Id: '',
743
- $Caption: StandardText,
744
- IsStandard: true,
745
- IsDefault: true,
746
- IsPublic: true,
747
- IsPrimary: true,
748
- ApplyAutomatically: true,
749
- HideSearchPanel: false,
750
- Title: StandardText,
751
- SearchMo: searchMo,
752
- ReportId: ''
753
- };
754
- this._defaultSearchPanelSettingsSource.next(standardSettings);
755
- }
756
- _loadSearchPanelSettings(reportId) {
757
- BarsaApi.Bw.RunBlMethodAsync({
758
- Parameters: [reportId],
759
- Method: 'LoadAllUserSearchPanelSettings',
760
- SuccessFn: (allSearchPanelSettings) => {
761
- if (Array.isArray(allSearchPanelSettings)) {
762
- allSearchPanelSettings = BarsaApi.Bw._unwrap(allSearchPanelSettings);
763
- this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
764
- const defaultSearch = allSearchPanelSettings.find((c) => c.IsDefault);
765
- if (defaultSearch) {
766
- this._selectedSearchPanelSettingsIdSource.next(defaultSearch.Id);
767
- }
768
- }
769
- },
770
- FailFn: () => { }
771
- });
772
- }
773
- resetSearchPanelSettings(searchPanelUi) {
774
- this.clearSearch();
775
- const fieldUi = searchPanelUi._dictFieldUi;
776
- const changed = searchPanelUi.Mo.GetChangedObject();
777
- Object.keys(changed).forEach((c) => {
778
- const field = searchPanelUi._dictFieldUi[c];
779
- if (field) {
780
- field.SetValue(null);
781
- searchPanelUi.Mo.SetFValue(c, null);
782
- }
783
- searchPanelUi.Mo.SetState('New');
784
- });
785
- Object.keys(fieldUi).forEach((c) => {
786
- if (c !== '$Search' && fieldUi[c].LayoutControl) {
787
- searchPanelUi.fireEvent('ChangeFieldVisible', fieldUi[c].Setting.ControlFieldCaption, true);
788
- }
789
- });
790
- }
791
- _loadCartableTemplate(keyOfCartableTemplates) {
792
- let cartableTemplates = this._cartableTemplates$.getValue();
793
- if (!cartableTemplates) {
794
- return;
795
- }
796
- const keys = [];
797
- keyOfCartableTemplates.forEach((key) => {
798
- const values = key.split(this._cartableKeySeperator);
799
- if (!cartableTemplates[key]) {
800
- keys.push({ TypeDefId: values[0], SettingsId: values[1] });
801
- }
802
- });
803
- if (keys.length === 0) {
804
- return;
805
- }
806
- this._apiService.GetCartableTemplate(keys).subscribe((c) => {
807
- if (!c) {
808
- return;
809
- }
810
- const templates = {};
811
- Object.keys(c).forEach((cId) => {
812
- templates[cId] = BarsaApi.Ext.decode(c[cId]);
813
- });
814
- cartableTemplates = { ...cartableTemplates, ...templates };
815
- this._cartableTemplates$.next(cartableTemplates);
816
- });
817
- }
818
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UlvMainService, deps: [{ token: i1.BbbTranslatePipe }, { token: i2.ApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
819
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UlvMainService }); }
820
- }
821
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UlvMainService, decorators: [{
822
- type: Injectable
823
- }], ctorParameters: () => [{ type: i1.BbbTranslatePipe }, { type: i2.ApiService }] });
824
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWx2bWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etbm92aW4tcmF5LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy91bHZtYWluLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3RixPQUFPLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEgsT0FBTyxFQUNILFFBQVEsRUFFUixtQkFBbUIsRUFTdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0gsd0JBQXdCLEVBQ3hCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNyQixNQUFNLGNBQWMsQ0FBQzs7OztBQUl0QixNQUFNLE9BQU8sY0FBYztJQXdGdkIsWUFBb0IsUUFBMEIsRUFBVSxXQUF1QjtRQUEzRCxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBdkYvRSxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsRUFBRSxDQUFDLENBQUM7UUErQmxFLHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFpQyxFQUFFLENBQUMsQ0FBQztRQUM5RSx1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBZ0QsRUFBRSxDQUFDLENBQUM7UUFLcEYsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM5QywyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUM3RCxz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QUFDLENBQUM7WUFDL0QsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2RCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ0wsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBbUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztZQUNILGlCQUFpQixHQUFHLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7K0dBNTZCUSxjQUFjO21IQUFkLGNBQWM7OzRGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICAgIEJhcnNhQXBpLFxyXG4gICAgTWVudUl0ZW0sXHJcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgUGFnaW5nU2V0dGluZyxcclxuICAgIFNlYXJjaFBhbmVsU2V0dGluZ3MsXHJcbiAgICBHZW5lcmFsQ29udHJvbEluZm9Nb2RlbCxcclxuICAgIENvbHVtbkluZm9UeXBlLFxyXG4gICAgRm9ybVNldHRpbmcsXHJcbiAgICBTaGFyZUJ1dHRvbnNDaG9pY2VEZWYsXHJcbiAgICBDYXJ0YWJsZVRlbXBsYXRlS2V5LFxyXG4gICAgQ3NzQmFja2dyb3VuZFxyXG59IGZyb20gJy4uL2Fic3RyYWN0LWNsYXNzZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZXhlY3V0ZVVsdkNvbW1hbmRIYW5kbGVyLFxyXG4gICAgZ2VucmF0ZUlubGluZU1vSWQsXHJcbiAgICBnZXRDb250cm9sTGlzdCxcclxuICAgIEdldERlZmF1bHRNb09iamVjdEluZm8sXHJcbiAgICBnZXROZXdNb0dyaWRFZGl0b3JcclxufSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBCYmJUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vcGlwZXMnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9hcGkuc2VydmljZSc7XHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVsdk1haW5TZXJ2aWNlIHtcclxuICAgIG1vRGF0YUxpc3RTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWxbXT4oW10pO1xyXG4gICAgY29udGV4dCQ6IFN1YnNjcmlwdGlvbjtcclxuICAgIHZpZXdlciQ6IE9ic2VydmFibGU8YW55PjtcclxuICAgIGNvbmRpdGlvbmFsRm9ybWF0cyQ6IE9ic2VydmFibGU8YW55PjtcclxuICAgIGhpZGVUb29sYmFyJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIG1hc2skOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgdml3ZXJNYXNrJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHZpc2libGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgZW5hYmxlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHJlYWRvbmx5JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIG1lbnVJdGVtcyQ6IE9ic2VydmFibGU8TWVudUl0ZW1bXT47XHJcbiAgICB0aXRsZSQ6IE9ic2VydmFibGU8eyB0ZXh0OiBzdHJpbmc7IGltYWdlOiBzdHJpbmcgfT47XHJcblxyXG4gICAgc2VhcmNoUGFuZWxVaSQ6IE9ic2VydmFibGU8YW55PjtcclxuICAgIHBhZ2luZ1NldHRpbmckOiBPYnNlcnZhYmxlPFBhZ2luZ1NldHRpbmcgfCBudWxsPjtcclxuICAgIHRvb2xiYXJCdXR0b25zJDogT2JzZXJ2YWJsZTxhbnlbXT47XHJcbiAgICBkZXN0cm95JDogT2JzZXJ2YWJsZTx2b2lkPjtcclxuICAgIG1vRGF0YUxpc3QkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT47XHJcbiAgICByZXBvcnRJZCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuICAgIGFsbG93SW5saW5lRWRpdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBpbmxpbmVFZGl0TW9kZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBvbmx5SW5saW5lRWRpdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBjb250ZXh0OiBhbnk7XHJcbiAgICBvcGVuU2VhcmNoUGFuZWxIaWRkZW5TZXR0aW5ncyQ6IE9ic2VydmFibGU8dm9pZD47XHJcbiAgICBvcGVuU2VhcmNoRmlsZXNNYW5hZ2UkOiBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgc2VhcmNoUGFuZWxNb0NoYW5nZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8U2VhcmNoUGFuZWxTZXR0aW5nc1tdPjtcclxuICAgIGxheW91dEluZm8kOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8U2VhcmNoUGFuZWxTZXR0aW5ncyB8IHVuZGVmaW5lZD47XHJcbiAgICBuZXdJbmxpbmVFZGl0TW8kOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsPjtcclxuICAgIF9jYXJ0YWJsZVRlbXBsYXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgW2tleTogc3RyaW5nXTogRm9ybVNldHRpbmcgfT4oe30pO1xyXG4gICAgX2NhcnRhYmxlQ2hpbGRzTW8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtrZXk6IHN0cmluZ106IE1ldGFvYmplY3REYXRhTW9kZWwgfSB8IG51bGw+KHt9KTtcclxuICAgIHNlbGVjdGVkQ291bnQkOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgICBoaWRlVWx2UGFnZVRpdGxlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHVpVmlld2VyU2VsZWN0b3IkOiBPYnNlcnZhYmxlPHN0cmluZz47XHJcblxyXG4gICAgcHJpdmF0ZSBfc2V0VWlWaWV3ZXJTZWxlY3RvciQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgICBwcml2YXRlIF9ncmlkRnJlZUNvbHVtblNpemluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByaXZhdGUgX2xheW91dEluZm9Tb3VyY2UgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICBwcml2YXRlIF9jb250ZXh0U291cmNlID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgcHJpdmF0ZSBfY2FuU2F2ZUdyaWRTZXR0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfaW5EaWFsb2ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIF9pc011bHRpU2VsZWN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfZnVsbHNjcmVlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByaXZhdGUgX2NvbmRpdGlvbmFsRm9ybWF0c1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuICAgIHByaXZhdGUgX3ZpZXdlckNvbnRyb2xTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XHJcbiAgICBwcml2YXRlIF9oaWRlVG9vbGJhclNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgICBwcml2YXRlIF9vbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX21hc2tTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudVNvdXJjZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF92aWV3ZXJNYXNrU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIF92aXNpYmxlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcclxuICAgIHByaXZhdGUgX2VuYWJsZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgICBwcml2YXRlIF9yZWFkb25seVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfbWVudUl0ZW1zU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPihbXSk7XHJcbiAgICBwcml2YXRlIF9vbmx5SW5saW5lRWRpdFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfaW5saW5lRWRpdE1vZGVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByaXZhdGUgX2FsbG93SW5saW5lRWRpdFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfY2FydGFibGVLZXlTZXBlcmF0b3IgPSAnQCc7XHJcbiAgICBwcml2YXRlIF90aXRsZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyB0ZXh0OiBzdHJpbmc7IGltYWdlOiBzdHJpbmcgfT4oe1xyXG4gICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgIGltYWdlOiAnJ1xyXG4gICAgfSk7XHJcbiAgICBwcml2YXRlIF9oaWRlVWx2UGFnZVRpdGxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICAgIHByaXZhdGUgX3NlYXJjaFBhbmVsVWlTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfcGFnaW5nU2V0dGluZ1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFnaW5nU2V0dGluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfdG9vbGJhckJ1dHRvbnNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XHJcbiAgICBwcml2YXRlIF90b29sYmFyQnV0dG9uc1dvcmtmbG93QnV0dG9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcclxuICAgIHByaXZhdGUgX2Rlc3Ryb3lTb3VyY2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZmlyc3RBcHBseUF1dG9tYXRpY2FsbHkgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfY29udHJvbEluZm9zTWV0YW9iamVjdDogR2VuZXJhbENvbnRyb2xJbmZvTW9kZWxbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UgPSBuZXcgU3ViamVjdDxTZWFyY2hQYW5lbFNldHRpbmdzPigpO1xyXG4gICAgcHJpdmF0ZSBfYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VhcmNoUGFuZWxTZXR0aW5nc1tdPihbXSk7XHJcbiAgICBwcml2YXRlIF9jc3NCYWNrZ3JvdW5kU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDc3NCYWNrZ3JvdW5kIHwgbnVsbD4obnVsbCk7XHJcbiAgICBwcml2YXRlIF9oaWRlUGFnaW5nU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIF9vcGVuU2VhcmNoUGFuZWxIaWRkZW5TZXR0aW5nc1NvdXJjZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9vcGVuU2VhcmNoRmlsZXNNYW5hZ2VTb3VyY2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfc2VhcmNoUGFuZWxNb0NoYW5nZWRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHByaXZhdGUgX25ld0lubGluZUVkaXRNb1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfaGlkZVNlYXJjaGFwYW5lbFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfd29ya2Zsb3dTaGFyZUJ1dHRvbnM6IFNoYXJlQnV0dG9uc0Nob2ljZURlZltdID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmJiUGlwZTogQmJiVHJhbnNsYXRlUGlwZSwgcHJpdmF0ZSBfYXBpU2VydmljZTogQXBpU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMuY29udGV4dCQgPSB0aGlzLl9jb250ZXh0U291cmNlXHJcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoY29udGV4dCkgPT4gKHRoaXMuY29udGV4dCA9IGNvbnRleHQpKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoY29udGV4dCkgPT4gdGhpcy5faW5pdGlhbGl6ZShjb250ZXh0KSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKGNvbnRleHQpID0+IHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIoY29udGV4dCkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMubmV3SW5saW5lRWRpdE1vJCA9IHRoaXMuX25ld0lubGluZUVkaXRNb1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XHJcbiAgICAgICAgdGhpcy52aWV3ZXIkID0gdGhpcy5fdmlld2VyQ29udHJvbFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XHJcbiAgICAgICAgdGhpcy5jb25kaXRpb25hbEZvcm1hdHMkID0gdGhpcy5fY29uZGl0aW9uYWxGb3JtYXRzU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcclxuICAgICAgICB0aGlzLmhpZGVUb29sYmFyJCA9IHRoaXMuX2hpZGVUb29sYmFyU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcclxuICAgICAgICB0aGlzLm1hc2skID0gdGhpcy5fbWFza1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XHJcbiAgICAgICAgdGhpcy52aXdlck1hc2skID0gdGhpcy5fdmlld2VyTWFza1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlJCA9IHRoaXMuX3Zpc2libGVTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlJCA9IHRoaXMuX2VuYWJsZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XHJcbiAgICAgICAgdGhpcy5yZWFkb25seSQgPSB0aGlzLl9yZWFkb25seVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XHJcbiAgICAgICAgdGhpcy5oaWRlVWx2UGFnZVRpdGxlJCA9IHRoaXMuX2hpZGVVbHZQYWdlVGl0bGUkLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcclxuICAgICAgICB0aGlzLnVpVmlld2VyU2VsZWN0b3IkID0gdGhpcy5fc2V0VWlWaWV3ZXJTZWxlY3RvciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMkID0gdGhpcy5fbWVudUl0ZW1zU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgZmlsdGVyKChpdGVtcykgPT4gaXRlbXM/Lmxlbmd0aCA+IDApLFxyXG4gICAgICAgICAgICBtYXAoKGl0ZW1zKSA9PiBpdGVtcy5maWx0ZXIoKGMpID0+IGMuaXRlbUlkICE9PSAnRXhwb3J0VG9FeGNlbCcgJiYgYy5pdGVtSWQgIT09ICdEZWxldGUnKSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudGl0bGUkID0gdGhpcy5fdGl0bGVTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsVWkkID0gdGhpcy5fc2VhcmNoUGFuZWxVaVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXHJcbiAgICAgICAgICAgIHRhcCgoc2VhcmNoUGFuZWwpID0+IHRoaXMuX2FkZERlZmF1bHRTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsKSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMub3BlblNlYXJjaFBhbmVsSGlkZGVuU2V0dGluZ3MkID0gdGhpcy5fb3BlblNlYXJjaFBhbmVsSGlkZGVuU2V0dGluZ3NTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5wYWdpbmdTZXR0aW5nJCA9IHRoaXMuX3BhZ2luZ1NldHRpbmdTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xyXG4gICAgICAgIHRoaXMudG9vbGJhckJ1dHRvbnMkID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zV29ya2Zsb3dCdXR0b25zLmFzT2JzZXJ2YWJsZSgpLFxyXG4gICAgICAgICAgICB0aGlzLl90b29sYmFyQnV0dG9uc1NvdXJjZS5hc09ic2VydmFibGUoKVxyXG4gICAgICAgIF0pLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgbWFwKChbd2ZCdG5zLCBjXSkgPT5cclxuICAgICAgICAgICAgICAgICFjXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbXVxyXG4gICAgICAgICAgICAgICAgICAgIDogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLndmQnRucyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jLm1hcCgoZCkgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZVRleHQ6IGQuQ29tbWFuZD8uSXNCdWlsdGluICYmIGQuaXRlbUlkICE9PSAnTmV3JyA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBtYXAoKGMpID0+XHJcbiAgICAgICAgICAgICAgICAhYyA/IFtdIDogWy4uLmMuZmlsdGVyKChkKSA9PiAhZC5Db21tYW5kPy5Jc0J1aWx0aW4pLCAuLi5jLmZpbHRlcigoZCkgPT4gZC5Db21tYW5kPy5Jc0J1aWx0aW4pXVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBtYXAoKGMpID0+XHJcbiAgICAgICAgICAgICAgICBjLnJlZHVjZSgoYWNjLCBiKSA9PiAoYWNjLmxlbmd0aCA+IDAgJiYgYWNjW2FjYy5sZW5ndGggLSAxXVsnMCddICYmIGJbJzAnXSA/IGFjYyA6IFsuLi5hY2MsIGJdKSwgW10pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQgPSB0aGlzLl9kZXN0cm95U291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFwKCgpID0+IHRoaXMuX3Vuc2N1YnNjcmliZUNvbnRleHQoKSkpO1xyXG4gICAgICAgIHRoaXMubW9EYXRhTGlzdCQgPSB0aGlzLm1vRGF0YUxpc3RTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudCQgPSB0aGlzLm1vRGF0YUxpc3QkLnBpcGUobWFwKChpdGVtcykgPT4gaXRlbXMuZmlsdGVyKChkKSA9PiBkLiRJc0NoZWNrZWQpLmxlbmd0aCkpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0SWQkID0gdGhpcy5fcmVwb3J0U291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKChyZXBvcnQpID0+IHJlcG9ydD8uSWQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hbGxvd0lubGluZUVkaXQkID0gdGhpcy5fYWxsb3dJbmxpbmVFZGl0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUkID0gdGhpcy5faW5saW5lRWRpdE1vZGVTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5vbmx5SW5saW5lRWRpdCQgPSB0aGlzLl9vbmx5SW5saW5lRWRpdFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLm9wZW5TZWFyY2hGaWxlc01hbmFnZSQgPSB0aGlzLl9vcGVuU2VhcmNoRmlsZXNNYW5hZ2VTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hQYW5lbE1vQ2hhbmdlZCQgPSB0aGlzLl9zZWFyY2hQYW5lbE1vQ2hhbmdlZFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0SW5mbyQgPSB0aGlzLl9sYXlvdXRJbmZvU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xyXG4gICAgICAgIHRoaXMuYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyQgPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgICAgICAgdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5hc09ic2VydmFibGUoKSxcclxuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICBdKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKFthbGxTZXR0aW5ncywgZGVmYXVsdFNldHRpbmdzXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTZXR0aW5ncyAmJiBhbGxTZXR0aW5ncykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTZXR0aW5ncy5Jc0RlZmF1bHQgPSAhYWxsU2V0dGluZ3Muc29tZSgoYykgPT4gYy5Jc0RlZmF1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbFNldHRpbmdzID0gW2RlZmF1bHRTZXR0aW5ncywgLi4uYWxsU2V0dGluZ3NdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbFNldHRpbmdzO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgZGVsYXkoMCksXHJcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkJCA9IHRoaXMuX3NlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkU291cmNlXHJcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncyQgPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZCQsXHJcbiAgICAgICAgICAgIHRoaXMuYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyRcclxuICAgICAgICBdKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKFtpZCwgc2V0dGluZ3NdKSA9PiBzZXR0aW5ncz8uZmluZCgoYykgPT4gYy5JZCA9PT0gaWQpKSxcclxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZ2V0IGhpZGVQYWdpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlUGFnaW5nU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHNob3dDb250ZXh0TWVudSQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dDb250ZXh0TWVudVNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBncmlkRnJlZUNvbHVtblNpemluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyaWRGcmVlQ29sdW1uU2l6aW5nJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBjYW5TYXZlR3JpZFNldHRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5TYXZlR3JpZFNldHRpbmckLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGluRGlhbG9nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5EaWFsb2ckLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlzTXVsdGlTZWxlY3QkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc011bHRpU2VsZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICAgIGdldCBmdWxsc2NyZWVuJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZnVsbHNjcmVlbiQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgY2FydGFibGVDaGlsZHNNbyQoKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IE1ldGFvYmplY3REYXRhTW9kZWwgfSB8IG51bGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FydGFibGVDaGlsZHNNbyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgY2FydGFibGVUZW1wbGF0ZXMkKCk6IE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBGb3JtU2V0dGluZyB9IHwgbnVsbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYXJ0YWJsZVRlbXBsYXRlcyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgc2VhcmNoUGFuZWxVaSgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hQYW5lbFVpU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVwb3J0SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3J0U291cmNlLmdldFZhbHVlKCk/LklkO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MoKTogU2VhcmNoUGFuZWxTZXR0aW5nc1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGhpZGVTZWFyY2hwYW5lbCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgIH1cclxuICAgIGdldCBoaWRlU2VhcmNocGFuZWwoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIGdldCBjc3NCYWNrZ3JvdW5kJCgpOiBPYnNlcnZhYmxlPENzc0JhY2tncm91bmQgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc0JhY2tncm91bmRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBzZXRCYWNrZ3JvdW5kKGNzc0JhY2tncm91bmQ6IENzc0JhY2tncm91bmQpOiB2b2lkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3NzQmFja2dyb3VuZFNvdXJjZS5uZXh0KGNzc0JhY2tncm91bmQpO1xyXG4gICAgfVxyXG4gICAgaGlkZVBhZ2luZyhoaWRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGlkZVBhZ2luZ1NvdXJjZS5uZXh0KGhpZGUpO1xyXG4gICAgfVxyXG4gICAgc2V0VWlWaWV3ZXJDbGFzcyhzZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2V0VWlWaWV3ZXJTZWxlY3RvciQubmV4dChzZWxlY3Rvcik7XHJcbiAgICB9XHJcbiAgICBoaWRlVWx2VGl0bGVQYWdlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hpZGVVbHZQYWdlVGl0bGUkLm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBzZXRDYW5TYXZlR3JpZFNldHRpbmdzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NhblNhdmVHcmlkU2V0dGluZyQubmV4dCh2YWwpO1xyXG4gICAgfVxyXG4gICAgZXhlY3V0ZVRvb2xiYXJCdXR0b24oaXRlbUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBidXR0b25zID0gdGhpcy5fdG9vbGJhckJ1dHRvbnNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoIWJ1dHRvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYnRuID0gYnV0dG9ucy5maW5kKChjKSA9PiBjLml0ZW1JZCA9PT0gaXRlbUlkKTtcclxuICAgICAgICBpZiAoYnRuKSB7XHJcbiAgICAgICAgICAgIGV4ZWN1dGVVbHZDb21tYW5kSGFuZGxlcihidG4sIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZFdvcmtmbG93QnV0dG9uc0luVG9vbGJhcihlOiBTaGFyZUJ1dHRvbnNDaG9pY2VEZWYpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhcnJPZlNoYXJlQnV0dG9ucyA9IHRoaXMuX2NyZWF0ZVdvcmtmbG93U2hhcmVCdXR0b25zKGUpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXJyT2ZTaGFyZUJ1dHRvbnMubWFwKChjKSA9PiAoe1xyXG4gICAgICAgICAgICBpY29uOiAnJyxcclxuICAgICAgICAgICAgdGV4dDogYyxcclxuICAgICAgICAgICAgaXRlbUlkOiBjLFxyXG4gICAgICAgICAgICBEYXRhOiBudWxsLFxyXG4gICAgICAgICAgICAkU2hhcmVXb3JrZmxvd0J1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIENvbW1hbmQ6IHsgX2lzVmlzaWJsZTogdHJ1ZSwgX2lzRW5hYmxlOiB0cnVlLCBKc29uRXh0cmFQcm9wOiB7IERlc2lnbjogJ2F0dGVudGlvbicgfSB9LFxyXG4gICAgICAgICAgICBoYW5kbGVyOiAoZCkgPT4gdGhpcy5vbldvcmtmbG93QnV0dG9uSW5Ub29sYmFyQ2xpY2soZCksXHJcbiAgICAgICAgICAgIElzQnVpbHRpbjogZmFsc2VcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5fdG9vbGJhckJ1dHRvbnNXb3JrZmxvd0J1dHRvbnMubmV4dCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBfZXhjbHVkZVdyYXBwZXJGcm9tTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xyXG4gICAgICAgIGNvbnN0IHsgJFdyYXBwZXIsIC4uLm5ld01vIH0gPSBtbztcclxuICAgICAgICByZXR1cm4gbmV3TW87XHJcbiAgICB9XHJcbiAgICBvbldvcmtmbG93QnV0dG9uSW5Ub29sYmFyQ2xpY2soc2hhcmVCdXR0b246IHsgdGV4dDogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5Nc2cuT0tDYW5jZWwoJ9ii24zYpyDYp9iyINiq2KfbjNuM2K8g2YXZiNin2LHYryDaqdin2LHYqtin2KjZhCDZhdi32YXYptmGINmH2LPYqtuM2K/YnycsICfYqtin24zbjNivJywgKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzID09PSAnb2snKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hvaWNlRGVmID0gYy5jaG9pY2VMaXN0LmZpbmQoKGQpID0+IGQuVGl0bGUgPT09IHNoYXJlQnV0dG9uLnRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaG9pY2VEZWYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5mb3JtUGFuZWxDdHJsci5Xb3JrZmxvd1RyYW5zaXRpb24oY2hvaWNlRGVmLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXRXb3JrZmxvd1N0YXRlKCdGaW5pc2gnLCBbYy5tb10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuX3NldFdvcmtmbG93U3RhdGUoXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgJ1BlbmRpbmcnLFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLm1hcCgoYykgPT4gYy5tbylcclxuICAgICAgICAgICAgICAgIC8vICk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBwYXJhbXMgPSB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5tYXAoKGMpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgbW86IHRoaXMuX2V4Y2x1ZGVXcmFwcGVyRnJvbU1vKGMubW8uUmVsYXRlZE1vKSxcclxuICAgICAgICAgICAgICAgIC8vICAgICBjaG9pY2VEZWY6IGMuY2hvaWNlTGlzdC5maW5kKChkKSA9PiBkLlRpdGxlID09PSBzaGFyZUJ1dHRvbi50ZXh0KVxyXG4gICAgICAgICAgICAgICAgLy8gfSkpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fc2V0V29ya2Zsb3dTdGF0ZSgnUGVuZGluZycsIHBhcmFtcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQmFyc2FBcGkuQ29tbW9uLkFqYXguR2V0U2VydmVyRGF0YShcclxuICAgICAgICAgICAgICAgIC8vICAgICAnV29ya2Zsb3c5NC5Pbkdyb3VwT2ZDaG9pY2VEZWZzU2VsZWN0JyxcclxuICAgICAgICAgICAgICAgIC8vICAgICB7IHBhcmFtZXRlcjogeyBEYXRhTGlzdDogcGFyYW1zIH0gfSxcclxuICAgICAgICAgICAgICAgIC8vICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX3NldFdvcmtmbG93U3RhdGUoJ1N1Y2Nlc3MnLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIH0sIC8vIHN1Y2Nlc3NcclxuICAgICAgICAgICAgICAgIC8vICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX3NldFdvcmtmbG93U3RhdGUoJ0ZhaWxlZCcsIHBhcmFtcywgJ9mF2KrYp9iz2YHYp9mG2Ycg2LnZhdmE24zYp9iqINmG2KfZhdmI2YHZgiDYqNmI2K8uJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgfSwgLy8gZmFpbHVyZVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpc1xyXG4gICAgICAgICAgICAgICAgLy8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90aXRsZVNvdXJjZS5uZXh0KHsgdGV4dDogdGl0bGUsIGltYWdlOiAnJyB9KTtcclxuICAgIH1cclxuICAgIHRvZ2dsZUhpZGVTZWFyY2hwYW5lbCh2YWw/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGlkZVNlYXJjaGFwYW5lbFNvdXJjZS5uZXh0KHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnID8gdmFsIDogIXRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UuZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcbiAgICBzZXRDb250ZXh0KGNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250ZXh0U291cmNlLm5leHQoY29udGV4dCk7XHJcbiAgICB9XHJcbiAgICBzZXRJbkRpYWxvZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbkRpYWxvZyQubmV4dCh2YWwpO1xyXG4gICAgfVxyXG4gICAgc2V0SXNNdWx0aVNlbGVjdCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc011bHRpU2VsZWN0JC5uZXh0KHZhbCk7XHJcbiAgICB9XHJcbiAgICBzZXRGdWxsc2NyZWVuKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW4kLm5leHQodmFsKTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVOZXdJbmxpbmVNbyhpc0NoZWNrZWQ6IGJvb2xlYW4pOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgICAgIGNvbnN0IGZvcm1TZXR0aW5nID0gY29udGV4dC5TZXR0aW5nLkZvcm1UZW1wbGF0ZTtcclxuICAgICAgICBjb25zdCB0eXBlRGVmSWQgPSBjb250ZXh0LlNldHRpbmcuRXh0cmEuUmVwb3J0LlR5cGVEZWZJZDtcclxuICAgICAgICBjb25zdCBuZXdNbyA9IGdldE5ld01vR3JpZEVkaXRvcihmb3JtU2V0dGluZywgdHlwZURlZklkKSBhcyBNZXRhb2JqZWN0RGF0YU1vZGVsO1xyXG4gICAgICAgIG5ld01vLklkID0gZ2VucmF0ZUlubGluZU1vSWQoKTtcclxuICAgICAgICBuZXdNby4kSXNDaGVja2VkID0gaXNDaGVja2VkO1xyXG4gICAgICAgIG5ld01vLiROZXdJbmxpbmVNbyA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaXRlKGNvbnRleHQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUodGhpcy5jb250ZXh0LlNldHRpbmcsICdFeHRyYS5SZWxhdGlvbicpO1xyXG4gICAgICAgICAgICBuZXdNb1tyZWxhdGlvbi5QYXJlbnRGZE5hbWVdID0gcmVsYXRpb24uUGFyZW50TW9JZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gIHRoaXMuX25ld0lubGluZUVkaXRNb1NvdXJjZS5uZXh0KG5ld01vKTtcclxuICAgICAgICByZXR1cm4gbmV3TW87XHJcbiAgICB9XHJcbiAgICBzZXRMYXlvdXRJbmZvKGxheW91dEluZm8pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sYXlvdXRJbmZvU291cmNlLm5leHQobGF5b3V0SW5mbyk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLl91bnNjdWJzY3JpYmVDb250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGFnZVNpemVDaGFuZ2VkKHBhZ2VJbmRleCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1BhZ2VDaGFuZ2UnLCB0aGlzLmNvbnRleHQsIHBhZ2VJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGFnZUNoYW5nZWQocGFnZUluZGV4KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmN1cnJlbnRQYWdlID0gcGFnZUluZGV4O1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1BhZ2VDaGFuZ2UnLCB0aGlzLmNvbnRleHQsIHBhZ2VJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVTZXRNb0RhdGFMaXN0KG1vRGF0YUxpc3Q/OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gbW9EYXRhTGlzdCA/PyB0aGlzLm1vRGF0YUxpc3RTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl9tb0RhdGFMaXN0Q2hhbmdlZChbLi4ubmV3TW9EYXRhTGlzdF0pO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LlNldHRpbmc/LklzQ2FydGFibGVSZXBvcnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXlPZkNhdGFibGVUZW1wbGF0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICBuZXdNb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdHBkZklkID0gYy5SZWxhdGVkTW8/LiRUeXBlRGVmSWQ7XHJcbiAgICAgICAgICAgIGlmICh0cGRmSWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGAke3RwZGZJZH0ke3RoaXMuX2NhcnRhYmxlS2V5U2VwZXJhdG9yfSR7Yy5DYXJ0YWJsZVNldHRpbmdzPy5JZCB8fCAnMCd9YDtcclxuICAgICAgICAgICAgICAgIGtleU9mQ2F0YWJsZVRlbXBsYXRlcy5hZGQoa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChrZXlPZkNhdGFibGVUZW1wbGF0ZXMuc2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZENhcnRhYmxlVGVtcGxhdGUoa2V5T2ZDYXRhYmxlVGVtcGxhdGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBTZWFyY2ggU2V0dGluZyBNYW5hZ2VyXHJcbiAgICBjbGVhclNlYXJjaCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xyXG4gICAgICAgIGlmICghc2VhcmNoUGFuZWxVaSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpZWxkVWkgPSBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaS4kU2VhcmNoID8/IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpLtis2LPYqtis2Yg7XHJcbiAgICAgICAgZmllbGRVaS5maXJlRXZlbnQoJ0NsZWFyQ2xpY2snKTtcclxuICAgIH1cclxuICAgIHNlYXJjaCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xyXG4gICAgICAgIGlmICghc2VhcmNoUGFuZWxVaSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmaWVsZFVpID0gc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWkuJFNlYXJjaCA/PyBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaS7YrNiz2KrYrNmIO1xyXG4gICAgICAgIGlmICghZmllbGRVaSkge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2NdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGUub3JpZ2luYWxYdHlwZSA9PT0gJ1VpLlNlYXJjaENvbW1hbmRJbmZvVWknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGRVaSA9IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmllbGRVaSkge1xyXG4gICAgICAgICAgICBmaWVsZFVpLmZpcmVFdmVudCgnU2VhcmNoQ2xpY2snKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFsdWVJbmxpbmVFZGl0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmVFZGl0TW9kZVNvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbG93SW5saW5lRWRpdCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dJbmxpbmVFZGl0U291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBzZXRJbmxpbmVFZGl0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faW5saW5lRWRpdE1vZGVTb3VyY2UubmV4dCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3BlblNlYXJjaEZpZWxkc0hpZGRlblNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29wZW5TZWFyY2hQYW5lbEhpZGRlblNldHRpbmdzU291cmNlLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuU2VhcmNoRmlsZXNNYW5hZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb3BlblNlYXJjaEZpbGVzTWFuYWdlU291cmNlLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hQYW5lbE1vQ2hhbmdlZChjaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbE1vQ2hhbmdlZFNvdXJjZS5uZXh0KGNoYW5nZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFNlYXJjaFBhbmVsU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5Gb3JtUGFuZWxVaSB8fCAhdGhpcy5fY2FuU2F2ZUdyaWRTZXR0aW5nJC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXBvcnRJZCRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlcG9ydElkKSA9PiB0aGlzLl9sb2FkU2VhcmNoUGFuZWxTZXR0aW5ncyhyZXBvcnRJZCkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFNlYXJjaFBhbmVsU2V0dGluZ3Moc2VhcmNoUGFuZWxTZXR0aW5nczogU2VhcmNoUGFuZWxTZXR0aW5ncyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MgPSB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICAgICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncy5wdXNoKHNlYXJjaFBhbmVsU2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UubmV4dChhbGxTZWFyY2hQYW5lbFNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIHNhdmVTZWFyY2hQYW5lbFNldHRpbmcoc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzOiBTZWFyY2hQYW5lbFNldHRpbmdzKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoTW8gPSB0aGlzLmdldFNlYXJjaFBhbmVsTW8oKTtcclxuICAgICAgICBjb25zdCBmaWVsZHNTZXR0aW5nID0gdGhpcy5nZXRTZWFyY2hQYW5lbEZpZWxkc1NldHRpbmcoKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5TZWFyY2hNbyA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaE1vKTtcclxuICAgICAgICBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuRmllbGRzU2V0dGluZyA9IEpTT04uc3RyaW5naWZ5KGZpZWxkc1NldHRpbmcpO1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kKFxyXG4gICAgICAgICAgICAnU2F2ZVNlYXJjaFBhbmVsU2V0dGluZ3MnLFxyXG4gICAgICAgICAgICBuZXcgQmFyc2FBcGkuQ29tbW9uLk1ldGFPYmplY3RXZWIoe1xyXG4gICAgICAgICAgICAgICAgSWQ6IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5JZCxcclxuICAgICAgICAgICAgICAgICRDYXB0aW9uOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuVGl0bGUsXHJcbiAgICAgICAgICAgICAgICBSZXBvcnRJZDogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLlJlcG9ydD8uSWQsXHJcbiAgICAgICAgICAgICAgICBUaXRsZTogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLlRpdGxlLFxyXG4gICAgICAgICAgICAgICAgSXNEZWZhdWx0OiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuSXNEZWZhdWx0LFxyXG4gICAgICAgICAgICAgICAgSXNQdWJsaWM6IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5Jc1B1YmxpYyxcclxuICAgICAgICAgICAgICAgIEFwcGx5QXV0b21hdGljYWxseTogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLkFwcGx5QXV0b21hdGljYWxseSxcclxuICAgICAgICAgICAgICAgIEhpZGVTZWFyY2hQYW5lbDogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLkhpZGVTZWFyY2hQYW5lbCxcclxuICAgICAgICAgICAgICAgIFNlYXJjaE1vOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuU2VhcmNoTW8sXHJcbiAgICAgICAgICAgICAgICBGaWVsZHNTZXR0aW5nOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuRmllbGRzU2V0dGluZ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hQYW5lbE1vQ2hhbmdlZChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsU2V0dGluZ3M6IFNlYXJjaFBhbmVsU2V0dGluZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xyXG4gICAgICAgIGlmICghc2VhcmNoUGFuZWxTZXR0aW5ncykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdEFwcGx5QXV0b21hdGljYWxseSAmJiBzZWFyY2hQYW5lbFNldHRpbmdzLklzUHJpbWFyeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdEFwcGx5QXV0b21hdGljYWxseSA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2ZpcnN0QXBwbHlBdXRvbWF0aWNhbGx5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsVWkpO1xyXG4gICAgICAgIGlmIChzZWFyY2hQYW5lbFNldHRpbmdzLlNlYXJjaE1vKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaE1vID0gSlNPTi5wYXJzZShzZWFyY2hQYW5lbFNldHRpbmdzLlNlYXJjaE1vKTtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VhcmNoTW8pLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWlbY107XHJcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiYgYy5pbmRleE9mKCckJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuU2V0VmFsdWUoc2VhcmNoTW9bY10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhbmVsVWkuTW8uU2V0RlZhbHVlKGMsIHNlYXJjaE1vW2NdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hQYW5lbFNldHRpbmdzLklzUHJpbWFyeSAmJiAhc2VhcmNoUGFuZWxVaS5TZXR0aW5nLkltbWVkaWF0ZUV4ZWN1dGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUGFuZWxNb0NoYW5nZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hQYW5lbFNldHRpbmdzLkFwcGx5QXV0b21hdGljYWxseSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPIHNldCBoaWRkZW4gZmllbGRzXHJcbiAgICAgICAgaWYgKHNlYXJjaFBhbmVsU2V0dGluZ3MuRmllbGRzU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2Uoc2VhcmNoUGFuZWxTZXR0aW5ncy5GaWVsZHNTZXR0aW5nKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBbmRBcHBseVNlYXJjaFBhbmVsU2V0dGluZ0ZpZWxkc1NldHRpbmcoXHJcbiAgICAgICAgICAgICAgICB0eXBlb2Ygc2V0dGluZ3MgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShzZXR0aW5ncykgOiBzZXR0aW5nc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsTW9DaGFuZ2VkKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGdldFNlYXJjaFBhbmVsTW8oKTogTWV0YW9iamVjdERhdGFNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoUGFuZWxVaS5NbztcclxuICAgIH1cclxuICAgIGdldFNlYXJjaFBhbmVsRmllbGRzU2V0dGluZygpOiBBcnJheTxQYXJ0aWFsPEdlbmVyYWxDb250cm9sSW5mb01vZGVsPj4ge1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsVWkgPSB0aGlzLnNlYXJjaFBhbmVsVWk7XHJcbiAgICAgICAgY29uc3QgZmllbGRzOiBBcnJheTxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbD4gPSBzZWFyY2hQYW5lbFVpLlNldHRpbmcuVmlldy5Db250cm9sSW5mby5maWx0ZXIoXHJcbiAgICAgICAgICAgIChjKSA9PiBjLkNvbnRyb2xOYW1lICE9PSAnJFNlYXJjaCcgJiYgYy5Db250cm9sTmFtZSAhPT0gJ9is2LPYqtis2YgnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBmaWVsZHNTZXR0aW5nID0gZmllbGRzLm1hcCgoYykgPT4gKHtcclxuICAgICAgICAgICAgTmFtZTogYy5Db250cm9sTmFtZSxcclxuICAgICAgICAgICAgQ2FwdGlvbjogYy5Db250cm9sRmllbGRDYXB0aW9uVHJhbnNsYXRlZCxcclxuICAgICAgICAgICAgSGlkZGVuOiBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaVtjLkNvbnRyb2xOYW1lXS5TZXR0aW5nLklzVmlzaWJsZSA9PT0gZmFsc2UgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICAgIElzTWFuZGF0b3J5OiBjLklzTWFuZGF0b3J5XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiBmaWVsZHNTZXR0aW5nO1xyXG4gICAgfVxyXG4gICAgc2V0QW5kQXBwbHlTZWFyY2hQYW5lbFNldHRpbmdGaWVsZHNTZXR0aW5nKGZpZWxkc1NldHRpbmc6IENvbHVtbkluZm9UeXBlW10pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xyXG4gICAgICAgIGZpZWxkc1NldHRpbmcuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2MuTmFtZV07XHJcbiAgICAgICAgICAgIGlmIChmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5maXJlRXZlbnQoJ0NoYW5nZUZpZWxkVmlzaWJsZScsIGZpZWxkLlNldHRpbmcuQ29udHJvbEZpZWxkQ2FwdGlvbiwgIWMuSGlkZGVuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlU2VhcmNoUGFuZWxTZXR0aW5ncyhhbGxTZWFyY2hQYW5lbFNldHRpbmdzOiBTZWFyY2hQYW5lbFNldHRpbmdzW10pOiB2b2lkIHtcclxuICAgICAgICBhbGxTZWFyY2hQYW5lbFNldHRpbmdzID0gYWxsU2VhcmNoUGFuZWxTZXR0aW5ncy5maWx0ZXIoKGMpID0+ICFjLklzUHJpbWFyeSAmJiAhYy5Jc0RlbGV0ZWQpO1xyXG4gICAgICAgIHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UubmV4dChhbGxTZWFyY2hQYW5lbFNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsU2V0dGluZ3NJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyA9IHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBhbGxTZWFyY2hQYW5lbFNldHRpbmdzLmZpbHRlcigoYykgPT4gYy5JZCAhPT0gc2VhcmNoUGFuZWxTZXR0aW5nc0lkKTtcclxuICAgICAgICB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLm5leHQoYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlU2VsZWN0ZWRTZWFyY2hQYW5lbChzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWRTb3VyY2UubmV4dChzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE1ldGFDb25kaXRpb25zQ29udHJvbEluZm9zKHR5cGVEZWZJZDogc3RyaW5nLCBmaWVsZERiTmFtZXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdPiB7XHJcbiAgICAgICAgY29uc3QgbW8gPSBHZXREZWZhdWx0TW9PYmplY3RJbmZvKHR5cGVEZWZJZCk7XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMuX2NvbnRyb2xJbmZvc01ldGFvYmplY3QpLnBpcGUoXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoY29udHJvbHNJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbHNJbmZvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoY29udHJvbHNJbmZvKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb250cm9sTGlzdChtbywgZmllbGREYk5hbWVzLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0YXAoKGNvbnRyb2xzSW5mbzogR2VuZXJhbENvbnRyb2xJbmZvTW9kZWxbXSkgPT4gKHRoaXMuX2NvbnRyb2xJbmZvc01ldGFvYmplY3QgPSBjb250cm9sc0luZm8pKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZVdvcmtmbG93U2hhcmVCdXR0b25zKGU6IFNoYXJlQnV0dG9uc0Nob2ljZURlZik6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgc2hhcmVCdXR0b25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGlmIChlLmFkZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5wdXNoKGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zID0gdGhpcy5fd29ya2Zsb3dTaGFyZUJ1dHRvbnMuZmlsdGVyKChjKSA9PiBjLm1vLklkICE9PSBlLm1vLklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucyA9IHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLmZpbHRlcigoYykgPT4gYy5tbz8uJElzQ2hlY2tlZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2hhcmVCdXR0b25zID0gdGhpcy5fd29ya2Zsb3dTaGFyZUJ1dHRvbnNbMF0uY2hvaWNlTGlzdC5tYXAoKGQpID0+IGQuVGl0bGUpO1xyXG4gICAgICAgICAgICBjb25zdCB1blNoYXJlQnV0dG9uczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zW2ldO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzaGFyZUJ1dHRvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jaG9pY2VMaXN0Lm1hcCgoZCkgPT4gZC5UaXRsZSkuaW5kZXhPZihzaGFyZUJ1dHRvbnNbal0pIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1blNoYXJlQnV0dG9ucy5wdXNoKHNoYXJlQnV0dG9uc1tqXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNoYXJlQnV0dG9ucyA9IHNoYXJlQnV0dG9ucy5maWx0ZXIoKGMpID0+IHVuU2hhcmVCdXR0b25zLmluZGV4T2YoYykgPT09IC0xKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNoYXJlQnV0dG9ucztcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfaW5pdENyZWF0ZU5ld0lubGluZU1vKGNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmb3JtU2V0dGluZyA9IGNvbnRleHQuU2V0dGluZy5Gb3JtVGVtcGxhdGU7XHJcbiAgICAgICAgaWYgKGZvcm1TZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3SW5saW5lTW8oZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzQ29tcG9zaXRlKGNvbnRleHQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCByZWxhdGlvblR5cGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LlNldHRpbmcsICdFeHRyYS5SZWxhdGlvbi5SZWxhdGlvblR5cGUnKTtcclxuICAgICAgICByZXR1cm4gcmVsYXRpb25UeXBlID09PSBCYXJzYUFwaS5Db21tb24uRW51bXMuUmVsYXRpb25UeXBlLkNvbXBvc2l0aW9uO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9hZGRFdmVudExpc3RlbmVyKGNvbnRleHQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnRleHQub24oe1xyXG4gICAgICAgICAgICBzY29wZTogdGhpcyxcclxuICAgICAgICAgICAgU2hvd0NvbnRleHRNZW51OiB0aGlzLl9zaG93Q29udGV4dE1lbnUsXHJcbiAgICAgICAgICAgIE1hc2tDaGFuZ2VkOiB0aGlzLl9tYXNrQ2hhbmdlZCxcclxuICAgICAgICAgICAgVmlld2VyTWFza0NoYW5nZWQ6IHRoaXMuX3ZpZXdlck1hc2tDaGFuZ2VkLFxyXG4gICAgICAgICAgICBWaWV3ZXJDb250cm9sQ2hhbmdlZDogdGhpcy5fdmlld2VyQ29udHJvbENoYW5nZWQsXHJcbiAgICAgICAgICAgIFZpc2libGVDaGFuZ2VkOiB0aGlzLl92aXNpYmxlQ2hhbmdlZCxcclxuICAgICAgICAgICAgUmVhZG9ubHlDaGFuZ2VkOiB0aGlzLl9yZWFkb25seUNoYW5nZWQsXHJcbiAgICAgICAgICAgIE1lbnVJdGVtc0NoYW5nZWQ6IHRoaXMuX21lbnVJdGVtc0NoYW5nZWQsXHJcbiAgICAgICAgICAgIFRpdGxlQ2hhbmdlZDogdGhpcy5fdGl0bGVDaGFuZ2VkLFxyXG4gICAgICAgICAgICBTZWFyY2hQYW5lbENoYW5nZWQ6IHRoaXMuX3NlYXJjaFBhbmVsQ2hhbmdlZCxcclxuICAgICAgICAgICAgUGFnaW5nU2V0dGluZ0NoYW5nZWQ6IHRoaXMuX3BhZ2luZ1NldHRpbmdDaGFuZ2VkLFxyXG4gICAgICAgICAgICBUb29sYmFyQnV0dG9uc0NoYW5nZWQ6IHRoaXMuX3Rvb2xiYXJCdXR0b25zQ2hhbmdlZCxcclxuICAgICAgICAgICAgRW5hYmxlQ2hhbmdlZDogdGhpcy5fZW5hYmxlQ2hhbmdlZCxcclxuICAgICAgICAgICAgRGVzdHJveTogdGhpcy5fZGVzdHJveUNoYW5nZWQsXHJcbiAgICAgICAgICAgIEV4aXRJbmxpbmVFZGl0OiB0aGlzLl9leGlzdElubGluZUVkaXRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRpYWxpemUoY29udGV4dDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faW5pdENhcnRhYmxlc0Zvcm1UZW1wbGF0ZShjb250ZXh0KTtcclxuICAgICAgICB0aGlzLl9pbml0Q29uZGl0aW9uYWxGb3JtYXRzKGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRBbGxvd0lubGluZUVkaXQoY29udGV4dCk7XHJcbiAgICAgICAgdGhpcy5faW5pdE9ubHlJbmxpbmVFZGl0KGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRJbmxpbmVFZGl0TW9kZShjb250ZXh0KTtcclxuICAgICAgICB0aGlzLl9pbml0UmVwb3J0KGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRWaWV3ZXJDb250cm9sKGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRIaWRlVG9vbGJhcihjb250ZXh0KTtcclxuICAgICAgICB0aGlzLl9pbml0VG9vbGJhckJ1dHRvbnMoY29udGV4dCk7XHJcbiAgICAgICAgdGhpcy5faW5pdFZpc2libGUoY29udGV4dCk7XHJcbiAgICAgICAgdGhpcy5faW5pdEVuYWJsZShjb250ZXh0KTtcclxuICAgICAgICB0aGlzLl9pbml0VGl0bGUoY29udGV4dCk7XHJcbiAgICAgICAgdGhpcy5faW5pdFJlYWRvbmx5KGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRNb0RhdGFMaXN0KGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRQYWdpbmdTZXR0aW5nKGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRNZW51SXRlbXMoY29udGV4dCk7XHJcbiAgICAgICAgdGhpcy5faW5pdFNlYXJjaHBhbmVsKGNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRDcmVhdGVOZXdJbmxpbmVNbyhjb250ZXh0KTtcclxuICAgICAgICB0aGlzLl9pbml0R3JpZEZyZWVDb2x1bW5TaXppbmcoY29udGV4dCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2luaXRHcmlkRnJlZUNvbHVtblNpemluZyhjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5TZXR0aW5nLlZpZXc/LkdyaWRfRnJlZUNvbHVtblNpemluZykge1xyXG4gICAgICAgICAgICB0aGlzLl9ncmlkRnJlZUNvbHVtblNpemluZyQubmV4dChjb250ZXh0LlNldHRpbmcuVmlldz8uR3JpZF9GcmVlQ29sdW1uU2l6aW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2luaXRDYXJ0YWJsZXNGb3JtVGVtcGxhdGUoY29udGV4dCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNhcnRhYmxlVGVtcGxhdGVzID0gY29udGV4dC5TZXR0aW5nLkNhcnRhYmxlVGVtcGxhdGVzO1xyXG4gICAgICAgIGlmIChjYXJ0YWJsZVRlbXBsYXRlcykge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY2FydGFibGVUZW1wbGF0ZXMpO1xyXG4gICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXJ0YWJsZVRlbXBsYXRlc1trZXldID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcnRhYmxlVGVtcGxhdGVzW2tleV0gPSBCYXJzYUFwaS5FeHQuZGVjb2RlKGNhcnRhYmxlVGVtcGxhdGVzW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2FydGFibGVUZW1wbGF0ZXMkLm5leHQoY2FydGFibGVUZW1wbGF0ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jYXJ0YWJsZUNoaWxkc01vKGNvbnRleHQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbml0U2VhcmNocGFuZWwoY29udGV4dCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3NlYXJjaFBhbmVsQ29udHJvbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbENoYW5nZWQoY29udGV4dC5fc2VhcmNoUGFuZWxDb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbml0Q29uZGl0aW9uYWxGb3JtYXRzKGNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0LlNldHRpbmcuVmlldz8uQ29uZGl0aW9uYWxGb3JtYXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbmRpdGlvbmFsRm9ybWF0c0NoYW5nZWQoY29udGV4dC5TZXR0aW5nLlZpZXc/LkNvbmRpdGlvbmFsRm9ybWF0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5pdE1lbnVJdGVtcyhjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5tZW51SXRlbXMpIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgbmV3SXRlbXMgPSBjb250ZXh0Lm1lbnVJdGVtcztcclxuICAgICAgICAgICAgdGhpcy5fbWVudUl0ZW1zQ2hhbmdlZChjb250ZXh0Lm1lbnVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5pdFJlcG9ydChjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVwb3J0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRXh0cmEuUmVwb3J0JywgW10pO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydFNvdXJjZS5uZXh0KHJlcG9ydCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbml0TW9EYXRhTGlzdChjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbW9EYXRhTGlzdCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGNvbnRleHQsICdTZXR0aW5nLkRhdGEuTW9EYXRhTGlzdCcsIFtdKTtcclxuICAgICAgICB0aGlzLl9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0KTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfY2FydGFibGVDaGlsZHNNbyhjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNvbnRleHQuU2V0dGluZy5DYXJ0YWJsZUNoaWxkc01vKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhcnRhYmxlQ2hpbGRzTW8kLm5leHQoY29udGV4dC5TZXR0aW5nLkNhcnRhYmxlQ2hpbGRzTW8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRQYWdpbmdTZXR0aW5nKGNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYWdpbmdTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRGF0YS5QYWdpbmcnLCBudWxsKTtcclxuICAgICAgICB0aGlzLl9wYWdpbmdTZXR0aW5nQ2hhbmdlZChwYWdpbmdTZXR0aW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRUaXRsZShjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ3RpdGxlJywgbnVsbCk7XHJcbiAgICAgICAgaWYgKHRpdGxlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRXh0cmEuUmVwb3J0LkNhcHRpb24nLCAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3RpdGxlQ2hhbmdlZCh7IHRleHQ6IHRpdGxlLCBpbWFnZTogJycgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbml0UmVhZG9ubHkoY29udGV4dCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlYWRvbmx5ID0gY29udGV4dC5yZWFkb25seSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB0aGlzLl9yZWFkb25seUNoYW5nZWQocmVhZG9ubHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5pdEVuYWJsZShjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZW5hYmxlID0gY29udGV4dC5lbmFibGUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VuYWJsZUNoYW5nZWQoZW5hYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRWaXNpYmxlKGNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gY29udGV4dC5TZXR0aW5nLklzVmlzaWJsZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XHJcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNoYW5nZWQodmlzaWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbml0VG9vbGJhckJ1dHRvbnMoY29udGV4dCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBjb250ZXh0LnRsYkJ1dHRvbnM7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYnV0dG9ucykpIHtcclxuICAgICAgICAgICAgdGhpcy5fdG9vbGJhckJ1dHRvbnNDaGFuZ2VkKGJ1dHRvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRJbmxpbmVFZGl0TW9kZShjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5saW5lRWRpdE1vZGU6IGJvb2xlYW4gPSBjb250ZXh0LlNldHRpbmc/LlZpZXc/LkF1dG9JbmxpbmVFZGl0O1xyXG4gICAgICAgIHRoaXMuX2lubGluZUVkaXRNb2RlU291cmNlLm5leHQoaW5saW5lRWRpdE1vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5pdEFsbG93SW5saW5lRWRpdChjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsb3dJbmxpbmVFZGl0OiBib29sZWFuID0gY29udGV4dC5TZXR0aW5nPy5WaWV3Py5BbGxvd0lubGluZUVkaXQ7XHJcbiAgICAgICAgY29uc3QgYWxsb3dFZGl0ID0gY29udGV4dC5TZXR0aW5nLkV4dHJhPy5EZWZhdWx0Q29tbWFuZHNBY2Nlc3M/LkVkaXQ7XHJcbiAgICAgICAgdGhpcy5fYWxsb3dJbmxpbmVFZGl0U291cmNlLm5leHQoYWxsb3dJbmxpbmVFZGl0ICYmIGFsbG93RWRpdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pbml0T25seUlubGluZUVkaXQoY29udGV4dCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG9ubHlJbmxpbmVFZGl0OiBib29sZWFuID0gY29udGV4dC5TZXR0aW5nPy5WaWV3Py5Pbmx5SW5saW5lRWRpdDtcclxuICAgICAgICB0aGlzLl9vbmx5SW5saW5lRWRpdFNvdXJjZS5uZXh0KG9ubHlJbmxpbmVFZGl0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRWaWV3ZXJDb250cm9sKGNvbnRleHQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aWV3ZXJDb250cm9sID0gY29udGV4dC52aWV3ZXJDb250cm9sO1xyXG4gICAgICAgIGlmICh2aWV3ZXJDb250cm9sKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdlckNvbnRyb2xDaGFuZ2VkKHZpZXdlckNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXRIaWRlVG9vbGJhcihjb250ZXh0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaGlkZVRvb2xiYXIgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LCAnU2V0dGluZy5FeHRyYS5SZXBvcnQuSGlkZVRvb2xiYXInLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5faGlkZVRvb2xiYXJTb3VyY2UubmV4dChoaWRlVG9vbGJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91bnNjdWJzY3JpYmVDb250ZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51bignU2hvd0NvbnRleHRNZW51JywgdGhpcy5fc2hvd0NvbnRleHRNZW51KTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ01hc2tDaGFuZ2VkJywgdGhpcy5fbWFza0NoYW5nZWQpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51bignVmlld2VyQ29udHJvbENoYW5nZWQnLCB0aGlzLl92aWV3ZXJDb250cm9sQ2hhbmdlZCk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaWV3ZXJNYXNrQ2hhbmdlZCcsIHRoaXMuX3ZpZXdlck1hc2tDaGFuZ2VkKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ1Zpc2libGVDaGFuZ2VkJywgdGhpcy5fdmlzaWJsZUNoYW5nZWQpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51bignUmVhZG9ubHlDaGFuZ2VkJywgdGhpcy5fcmVhZG9ubHlDaGFuZ2VkKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ01lbnVJdGVtc0NoYW5nZWQnLCB0aGlzLl9tZW51SXRlbXNDaGFuZ2VkKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ1RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RpdGxlQ2hhbmdlZCk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdQYWdpbmdTZXR0aW5nQ2hhbmdlZCcsIHRoaXMuX3BhZ2luZ1NldHRpbmdDaGFuZ2VkKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ1Rvb2xiYXJCdXR0b25zQ2hhbmdlZCcsIHRoaXMuX3Rvb2xiYXJCdXR0b25zQ2hhbmdlZCk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdFbmFibGVDaGFuZ2VkJywgdGhpcy5fZW5hYmxlQ2hhbmdlZCk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdEZXN0cm95JywgdGhpcy5fZGVzdHJveUNoYW5nZWQpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51bignRXhpdElubGluZUVkaXQnLCB0aGlzLl9leGlzdElubGluZUVkaXQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9jb25kaXRpb25hbEZvcm1hdHNDaGFuZ2VkKGNvbmRpdGlvbmFsRm9ybWF0czogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uYWxGb3JtYXRzU291cmNlLm5leHQoY29uZGl0aW9uYWxGb3JtYXRzKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfbW9EYXRhTGlzdENoYW5nZWQobW9EYXRhTGlzdCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubW9EYXRhTGlzdFNvdXJjZS5uZXh0KG1vRGF0YUxpc3QpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FydGFibGVDaGlsZHNNbyh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0Q2FydGFibGVzRm9ybVRlbXBsYXRlKHRoaXMuY29udGV4dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrQ2FydGFibGVXb3JrZmxvd1NoYXJlQnV0dG9ucyhtb0RhdGFMaXN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2NoZWNrQ2FydGFibGVXb3JrZmxvd1NoYXJlQnV0dG9ucyhtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBoYXNTZWxlY3RlZCA9IG1vRGF0YUxpc3Quc29tZSgoYykgPT4gYy4kSXNDaGVja2VkKTtcclxuICAgICAgICBjb25zdCBtb0lkcyA9IG1vRGF0YUxpc3QubWFwKChjKSA9PiBjLklkKTtcclxuICAgICAgICB0aGlzLl93b3JrZmxvd1NoYXJlQnV0dG9ucyA9IHRoaXMuX3dvcmtmbG93U2hhcmVCdXR0b25zLmZpbHRlcigoYykgPT4gbW9JZHMuaW5kZXhPZihjLm1vLklkKSA+IC0xKTtcclxuICAgICAgICBpZiAoIWhhc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zV29ya2Zsb3dCdXR0b25zLm5leHQoW10pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ZpZXdlckNvbnRyb2xDaGFuZ2VkKHZpZXdlckNvbnRyb2wpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl92aWV3ZXJDb250cm9sU291cmNlLm5leHQodmlld2VyQ29udHJvbCk7XHJcbiAgICAgICAgdGhpcy5faW5pdENvbmRpdGlvbmFsRm9ybWF0cyh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRJbmxpbmVFZGl0TW9kZSh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIHRoaXMuX2luaXRBbGxvd0lubGluZUVkaXQodGhpcy5jb250ZXh0KTtcclxuICAgICAgICB0aGlzLl9pbml0T25seUlubGluZUVkaXQodGhpcy5jb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX21hc2tDaGFuZ2VkKG1hc2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXNrU291cmNlLm5leHQobWFzayk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX3Nob3dDb250ZXh0TWVudSh4eSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudVNvdXJjZS5uZXh0KHh5KTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfdmlld2VyTWFza0NoYW5nZWQodmlld2VyTWFzazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZpZXdlck1hc2tTb3VyY2UubmV4dCh2aWV3ZXJNYXNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3JlYWRvbmx5Q2hhbmdlZChyZWFkb25seTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3JlYWRvbmx5U291cmNlLm5leHQocmVhZG9ubHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdmlzaWJsZUNoYW5nZWQodmlld2VyTWFzazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Zpc2libGVTb3VyY2UubmV4dCh2aWV3ZXJNYXNrKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfcmVtb3ZlRXh0cmFNZW51SXRlbXMobWVudUl0ZW1zOiBNZW51SXRlbVtdKTogTWVudUl0ZW1bXSB7XHJcbiAgICAgICAgaWYgKCFtZW51SXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IG1lbnVJdGVtcy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChjKSA9PiBjLml0ZW1JZCAhPT0gJ0RlbGV0ZScgJiYgYy5pdGVtSWQgIT09ICdBZGRUb0xpc3QnICYmIGMuaXRlbUlkICE9PSAnUmVtb3ZlRnJvbUxpc3QnXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gbmV3SXRlbXM7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX21lbnVJdGVtc0NoYW5nZWQobWVudUl0ZW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5ld01lbnVJdGVtcyA9IHRoaXMuX3JlbW92ZUV4dHJhTWVudUl0ZW1zKG1lbnVJdGVtcyk7XHJcbiAgICAgICAgdGhpcy5fbWVudUl0ZW1zU291cmNlLm5leHQobmV3TWVudUl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3RpdGxlQ2hhbmdlZCh0aXRsZU9iajogeyB0ZXh0OiBzdHJpbmc7IGltYWdlOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlU291cmNlLm5leHQodGl0bGVPYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2VhcmNoUGFuZWxDaGFuZ2VkKHNlYXJjaFBhbmVsOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbFVpU291cmNlLm5leHQoc2VhcmNoUGFuZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcGFnaW5nU2V0dGluZ0NoYW5nZWQocGFnZWluZ1NldHRpbmc6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhZ2luZ1NldHRpbmdTb3VyY2UubmV4dChwYWdlaW5nU2V0dGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF90b29sYmFyQnV0dG9uc0NoYW5nZWQoYnV0dG9uczogYW55W10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90b29sYmFyQnV0dG9uc1NvdXJjZS5uZXh0KGJ1dHRvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZW5hYmxlQ2hhbmdlZChlbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbmFibGVTb3VyY2UubmV4dChlbmFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGVzdHJveUNoYW5nZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGVzdHJveVNvdXJjZS5uZXh0KCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2V4aXN0SW5saW5lRWRpdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbmxpbmVFZGl0TW9kZVNvdXJjZS5uZXh0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2FkZERlZmF1bHRTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWFyY2hNbyA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaFBhbmVsPy5NbyA/PyBuZXcgTWV0YW9iamVjdERhdGFNb2RlbCgpKTtcclxuICAgICAgICBjb25zdCBTdGFuZGFyZFRleHQgPSB0aGlzLl9iYmJQaXBlLnRyYW5zZm9ybSgnU3RhbmRhcmQnKTtcclxuICAgICAgICBjb25zdCBzdGFuZGFyZFNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICBJZDogJycsXHJcbiAgICAgICAgICAgICRDYXB0aW9uOiBTdGFuZGFyZFRleHQsXHJcbiAgICAgICAgICAgIElzU3RhbmRhcmQ6IHRydWUsXHJcbiAgICAgICAgICAgIElzRGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICAgICAgSXNQdWJsaWM6IHRydWUsXHJcbiAgICAgICAgICAgIElzUHJpbWFyeTogdHJ1ZSxcclxuICAgICAgICAgICAgQXBwbHlBdXRvbWF0aWNhbGx5OiB0cnVlLFxyXG4gICAgICAgICAgICBIaWRlU2VhcmNoUGFuZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBUaXRsZTogU3RhbmRhcmRUZXh0LFxyXG4gICAgICAgICAgICBTZWFyY2hNbzogc2VhcmNoTW8sXHJcbiAgICAgICAgICAgIFJlcG9ydElkOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fZGVmYXVsdFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UubmV4dChzdGFuZGFyZFNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2xvYWRTZWFyY2hQYW5lbFNldHRpbmdzKHJlcG9ydElkKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtyZXBvcnRJZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ0xvYWRBbGxVc2VyU2VhcmNoUGFuZWxTZXR0aW5ncycsXHJcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyA9IEJhcnNhQXBpLkJ3Ll91bndyYXAoYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTZWFyY2ggPSBhbGxTZWFyY2hQYW5lbFNldHRpbmdzLmZpbmQoKGMpID0+IGMuSXNEZWZhdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZFNvdXJjZS5uZXh0KGRlZmF1bHRTZWFyY2guSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7fVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlc2V0U2VhcmNoUGFuZWxTZXR0aW5ncyhzZWFyY2hQYW5lbFVpKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkVWkgPSBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaTtcclxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gc2VhcmNoUGFuZWxVaS5Nby5HZXRDaGFuZ2VkT2JqZWN0KCk7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlZCkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2NdO1xyXG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkLlNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5Nby5TZXRGVmFsdWUoYywgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5Nby5TZXRTdGF0ZSgnTmV3Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZmllbGRVaSkuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYyAhPT0gJyRTZWFyY2gnICYmIGZpZWxkVWlbY10uTGF5b3V0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5maXJlRXZlbnQoJ0NoYW5nZUZpZWxkVmlzaWJsZScsIGZpZWxkVWlbY10uU2V0dGluZy5Db250cm9sRmllbGRDYXB0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9sb2FkQ2FydGFibGVUZW1wbGF0ZShrZXlPZkNhcnRhYmxlVGVtcGxhdGVzOiBTZXQ8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIGxldCBjYXJ0YWJsZVRlbXBsYXRlcyA9IHRoaXMuX2NhcnRhYmxlVGVtcGxhdGVzJC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmICghY2FydGFibGVUZW1wbGF0ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXlzOiBDYXJ0YWJsZVRlbXBsYXRlS2V5W10gPSBbXTtcclxuXHJcbiAgICAgICAga2V5T2ZDYXJ0YWJsZVRlbXBsYXRlcy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0ga2V5LnNwbGl0KHRoaXMuX2NhcnRhYmxlS2V5U2VwZXJhdG9yKTtcclxuICAgICAgICAgICAgaWYgKCFjYXJ0YWJsZVRlbXBsYXRlc1trZXldKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goeyBUeXBlRGVmSWQ6IHZhbHVlc1swXSwgU2V0dGluZ3NJZDogdmFsdWVzWzFdIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYXBpU2VydmljZS5HZXRDYXJ0YWJsZVRlbXBsYXRlKGtleXMpLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXM6IHsgW2tleTogc3RyaW5nXTogRm9ybVNldHRpbmcgfSA9IHt9O1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjKS5mb3JFYWNoKChjSWQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlc1tjSWRdID0gQmFyc2FBcGkuRXh0LmRlY29kZShjW2NJZF0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FydGFibGVUZW1wbGF0ZXMgPSB7IC4uLmNhcnRhYmxlVGVtcGxhdGVzLCAuLi50ZW1wbGF0ZXMgfTtcclxuICAgICAgICAgICAgdGhpcy5fY2FydGFibGVUZW1wbGF0ZXMkLm5leHQoY2FydGFibGVUZW1wbGF0ZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==