barsa-novin-ray-core 2.2.73 → 2.2.75

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 (233) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +630 -651
  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-hijri.service.d.ts +1 -1
  6. package/lib/date-services/date.service.d.ts +1 -1
  7. package/lib/directives/base.directive.d.ts +1 -1
  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/services/notification.service.d.ts +2 -2
  12. package/lib/services/portal.service.d.ts +1 -1
  13. package/package.json +3 -5
  14. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  15. package/esm2022/lib/abstract-classes/application-base.mjs +0 -25
  16. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  17. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -89
  18. package/esm2022/lib/abstract-classes/base.component.mjs +0 -60
  19. package/esm2022/lib/abstract-classes/field-base.mjs +0 -244
  20. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  21. package/esm2022/lib/abstract-classes/form-base.mjs +0 -164
  22. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  23. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -132
  24. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  25. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -100
  26. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -57
  27. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  28. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -49
  29. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -68
  30. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  31. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  32. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  33. package/esm2022/lib/abstract-classes/number-base.mjs +0 -201
  34. package/esm2022/lib/abstract-classes/page-base.mjs +0 -98
  35. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -41
  36. package/esm2022/lib/abstract-classes/report-base.mjs +0 -266
  37. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -54
  38. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -450
  39. package/esm2022/lib/abstract-classes/system-base.mjs +0 -25
  40. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -49
  41. package/esm2022/lib/auth-guard.mjs +0 -48
  42. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -311
  43. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -522
  44. package/esm2022/lib/base-ulv-setting.component.mjs +0 -46
  45. package/esm2022/lib/base.module.mjs +0 -28
  46. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -20
  47. package/esm2022/lib/constants.mjs +0 -963
  48. package/esm2022/lib/container.component.mjs +0 -100
  49. package/esm2022/lib/controllers/base-controller.mjs +0 -9
  50. package/esm2022/lib/controllers/base-view.mjs +0 -24
  51. package/esm2022/lib/controllers/index.mjs +0 -4
  52. package/esm2022/lib/controllers/models.mjs +0 -2
  53. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  54. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  55. package/esm2022/lib/date-services/date-info.mjs +0 -2
  56. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  57. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  58. package/esm2022/lib/date-services/date.service.mjs +0 -149
  59. package/esm2022/lib/date-services/index.mjs +0 -6
  60. package/esm2022/lib/device.mjs +0 -663
  61. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -46
  62. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -25
  63. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -36
  64. package/esm2022/lib/directives/base.directive.mjs +0 -55
  65. package/esm2022/lib/directives/body-click.directive.mjs +0 -36
  66. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -40
  67. package/esm2022/lib/directives/copy.directive.mjs +0 -60
  68. package/esm2022/lib/directives/count-down.directive.mjs +0 -109
  69. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -43
  70. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -66
  71. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -70
  72. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -73
  73. package/esm2022/lib/directives/field-binding.directive.mjs +0 -18
  74. package/esm2022/lib/directives/fill-empty-space.mjs +0 -89
  75. package/esm2022/lib/directives/form-close.directive.mjs +0 -33
  76. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -82
  77. package/esm2022/lib/directives/index.mjs +0 -42
  78. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -52
  79. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -60
  80. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -49
  81. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -38
  82. package/esm2022/lib/directives/mobile.directive.mjs +0 -30
  83. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -27
  84. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -27
  85. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -16
  86. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -21
  87. package/esm2022/lib/directives/print-files.directive.mjs +0 -39
  88. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -81
  89. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -76
  90. package/esm2022/lib/directives/render-ulv.directive.mjs +0 -52
  91. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -38
  92. package/esm2022/lib/directives/save-image.directive.mjs +0 -28
  93. package/esm2022/lib/directives/splide-slider.directive.mjs +0 -113
  94. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -21
  95. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -236
  96. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -43
  97. package/esm2022/lib/directives/until-inview.directive.mjs +0 -53
  98. package/esm2022/lib/directives/webotp.directive.mjs +0 -49
  99. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -61
  100. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -97
  101. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -53
  102. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -83
  103. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -27
  104. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -552
  105. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -163
  106. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  107. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -69
  108. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -78
  109. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -64
  110. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  111. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -49
  112. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  113. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -149
  114. package/esm2022/lib/form/form.component.mjs +0 -212
  115. package/esm2022/lib/form-new/form-new.component.mjs +0 -31
  116. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  117. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  118. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  119. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  120. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  121. package/esm2022/lib/global-error-handler.mjs +0 -26
  122. package/esm2022/lib/injdection-tokens.mjs +0 -8
  123. package/esm2022/lib/modal-root.component.mjs +0 -34
  124. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  125. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  126. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -20
  127. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -36
  128. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -27
  129. package/esm2022/lib/pipes/card-media-size.pipe.mjs +0 -21
  130. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -41
  131. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -33
  132. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -23
  133. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -35
  134. package/esm2022/lib/pipes/column-valueof-parameters.pipe.mjs +0 -34
  135. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -17
  136. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -41
  137. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -32
  138. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -33
  139. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -35
  140. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -21
  141. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -23
  142. package/esm2022/lib/pipes/filter-inline-action-list.pipe.mjs +0 -19
  143. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -45
  144. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -20
  145. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -17
  146. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -25
  147. package/esm2022/lib/pipes/filter.pipe.mjs +0 -34
  148. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -28
  149. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -20
  150. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -43
  151. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -64
  152. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -23
  153. package/esm2022/lib/pipes/hide-accept-cancel-buttons.pipe.mjs +0 -24
  154. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -23
  155. package/esm2022/lib/pipes/index.mjs +0 -55
  156. package/esm2022/lib/pipes/isimage.pipe.mjs +0 -20
  157. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -18
  158. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -43
  159. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -59
  160. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -17
  161. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -36
  162. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -18
  163. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -19
  164. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -91
  165. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -44
  166. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -23
  167. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -21
  168. package/esm2022/lib/pipes/replace.pipe.mjs +0 -18
  169. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -23
  170. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -26
  171. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -21
  172. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -24
  173. package/esm2022/lib/pipes/sort.pipe.mjs +0 -49
  174. package/esm2022/lib/pipes/string-to-number.pipe.mjs +0 -26
  175. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  176. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -60
  177. package/esm2022/lib/pipes/toolbar-settings.pipe.mjs +0 -27
  178. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -17
  179. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -26
  180. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -19
  181. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -24
  182. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -37
  183. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  184. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  185. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  186. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  187. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -42
  188. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  189. package/esm2022/lib/resolvers/index.mjs +0 -7
  190. package/esm2022/lib/resolvers/login-settings.resolver.mjs +0 -18
  191. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  192. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  193. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  194. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  195. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  196. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  197. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -236
  198. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  199. package/esm2022/lib/services/api.service.mjs +0 -63
  200. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  201. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  202. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  203. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  204. package/esm2022/lib/services/column.service.mjs +0 -20
  205. package/esm2022/lib/services/container.service.mjs +0 -69
  206. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  207. package/esm2022/lib/services/form-panel.service.mjs +0 -394
  208. package/esm2022/lib/services/form.service.mjs +0 -14
  209. package/esm2022/lib/services/groupby.service.mjs +0 -21
  210. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  211. package/esm2022/lib/services/index.mjs +0 -32
  212. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  213. package/esm2022/lib/services/layout-main-content.service.mjs +0 -19
  214. package/esm2022/lib/services/layout.service.mjs +0 -42
  215. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  216. package/esm2022/lib/services/log.service.mjs +0 -50
  217. package/esm2022/lib/services/network-status.service.mjs +0 -15
  218. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  219. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  220. package/esm2022/lib/services/notification.service.mjs +0 -189
  221. package/esm2022/lib/services/portal.service.mjs +0 -950
  222. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  223. package/esm2022/lib/services/routing.service.mjs +0 -60
  224. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  225. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  226. package/esm2022/lib/services/tabpage.service.mjs +0 -13
  227. package/esm2022/lib/services/toast.service.mjs +0 -2
  228. package/esm2022/lib/services/ui.service.mjs +0 -23
  229. package/esm2022/lib/services/ulvmain.service.mjs +0 -824
  230. package/esm2022/lib/services/upload.service.mjs +0 -166
  231. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  232. package/esm2022/lib/unlimit-session/unlimit-session.component.mjs +0 -40
  233. package/esm2022/public-api.mjs +0 -42
@@ -1,963 +0,0 @@
1
- /* eslint-disable */
2
- import { _isNumberValue } from '@angular/cdk/coercion';
3
- import { BarsaApi } from './abstract-classes/barsa-api';
4
- import { DateHijriService, DateMiladiService, DateShamsiService } from './date-services';
5
- import * as Device from './device';
6
- import { FormControl, FormGroup } from '@angular/forms';
7
- export var TableHeaderWidthMode;
8
- (function (TableHeaderWidthMode) {
9
- TableHeaderWidthMode[TableHeaderWidthMode["FitToRowContent"] = 1] = "FitToRowContent";
10
- TableHeaderWidthMode[TableHeaderWidthMode["FitToContainer"] = 2] = "FitToContainer";
11
- TableHeaderWidthMode[TableHeaderWidthMode["FreeColumnSize"] = 3] = "FreeColumnSize";
12
- TableHeaderWidthMode[TableHeaderWidthMode["ColumnWidth"] = 4] = "ColumnWidth";
13
- })(TableHeaderWidthMode || (TableHeaderWidthMode = {}));
14
- export function setTableThWidth(tableHeaderMode, columns, thList, renderer2) {
15
- let propName = '';
16
- switch (tableHeaderMode) {
17
- case TableHeaderWidthMode.FitToRowContent:
18
- propName = '$FitToContent';
19
- break;
20
- case TableHeaderWidthMode.FitToContainer:
21
- propName = '$FitContainerWidth';
22
- break;
23
- case TableHeaderWidthMode.FreeColumnSize:
24
- propName = '$Width';
25
- break;
26
- case TableHeaderWidthMode.ColumnWidth:
27
- propName = '$ColumnWidth';
28
- break;
29
- }
30
- thList.forEach((c, i) => {
31
- const wx = _calcWidthOfTh(columns[i], i, propName, thList);
32
- wx && renderer2.setStyle(c, 'width', wx);
33
- });
34
- }
35
- function _calcWidthOfTh(column, i, propName, thList) {
36
- if (!column) {
37
- return '';
38
- }
39
- if (column.$IsImageOricon && i < thList.length - 1) {
40
- const fieldTypeId = +column.FieldTypeId;
41
- if (fieldTypeId === 6 || fieldTypeId === 5 || fieldTypeId === 42) {
42
- return '24px';
43
- }
44
- debugger;
45
- }
46
- return column.$IsImageOricon && i < thList.length - 1 ? '42px' : column[propName];
47
- }
48
- export function calculateColumnContent(columns, moDataList) {
49
- columns.forEach((column) => {
50
- setColumnWidthByMaxMoContentWidth(moDataList, column);
51
- });
52
- }
53
- export function calculateColumnWidth(container, columns, moDataList, disableContextMenuOverflow, contextMenuItems) {
54
- columns
55
- .filter((c) => !c.Hidden)
56
- .forEach((column) => {
57
- setColumnCaptionWidth(column);
58
- });
59
- const contextMenuWidth = calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow);
60
- return { columns: [...columns], contextMenuWidth };
61
- }
62
- function setColumnCaptionWidth(column) {
63
- if (column.$ColumnWidthNum) {
64
- return column.$ColumnWidthNum;
65
- }
66
- const colCaptionWidth = measureText(column.Alias) + 16 + 10;
67
- column.$ColumnWidthNum = Math.ceil(colCaptionWidth);
68
- column.$ColumnWidth = `${column.$ColumnWidthNum}px`;
69
- return colCaptionWidth;
70
- }
71
- export function setColumnWidthByMaxMoContentWidth(moDataList, column) {
72
- const width = calculateMoDataListContentWidthByColumnName(moDataList, column);
73
- column.$ContentWidth = `${Math.ceil(width)}px`;
74
- }
75
- export function calculateMoDataListContentWidthByColumnName(moDataList, column) {
76
- let maxWidth = 0;
77
- moDataList.forEach((c, index) => {
78
- const caption = getColumnValueOfMoDataList(column.Name, c, undefined, true);
79
- const captionWidth = measureText(caption) + 16;
80
- if (maxWidth < captionWidth) {
81
- maxWidth = captionWidth;
82
- }
83
- });
84
- return Math.ceil(maxWidth);
85
- }
86
- export function calculateFreeColumnSize(columns) {
87
- let allColWidth = 0;
88
- const visibleColumns = columns.filter((c) => !c.Hidden);
89
- visibleColumns.forEach((col, index) => {
90
- const x = setColumnCaptionWidth(col);
91
- const w = col.Width && col.Width > 0 ? col.Width : x;
92
- allColWidth += w;
93
- col.$Width = index === visibleColumns.length - 1 ? '100%' : `${w}px`;
94
- });
95
- return [...columns];
96
- }
97
- export function calculateColumnWidthFitToContainer(container, canView, disableContextMenuOverflow, contextMenuItems, columns) {
98
- let hasDefinedWidth = true;
99
- let containerWidth = columns.map((c) => c.Width).reduce((a, b) => a + b, 0);
100
- if (containerWidth === 0) {
101
- containerWidth = container.clientWidth;
102
- hasDefinedWidth = false;
103
- }
104
- let allColWidth = 0;
105
- const isMobile = getDeviceIsMobile();
106
- let remainPercent = 0;
107
- const lCols = columns.filter((c, i) => !c.Hidden && !(i === 0 && c.FieldTypeId === 41));
108
- lCols.forEach((col, index) => {
109
- // اگر فیلد از نوع رنگ نبود و ستون اول هم نبود
110
- const x = setColumnCaptionWidth(col);
111
- const w = col.Width && col.Width > 0 ? col.Width : x;
112
- allColWidth += w;
113
- const percent = (w / containerWidth) * 100;
114
- col.$FitContainerWidth = isMobile || col.Width === 0 ? '100%' : `${percent}%`;
115
- if (index === lCols.length - 1 && !hasDefinedWidth) {
116
- col.$FitContainerWidth = 100 - remainPercent + '%';
117
- }
118
- else {
119
- remainPercent += percent;
120
- }
121
- });
122
- // const canViewButtonWidth = canView ? 40 : 0;
123
- // const selectionWidth = 30;
124
- const contextMenuWidth = calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow);
125
- // const containerWidthAllColumns = containerWidth - selectionWidth - canViewButtonWidth - contextMenuWidth - 12;
126
- // allColWidth += containerWidthAllColumns - allColWidth;// محاسبه آخرین ستون.چون width مشخصی ندارد
127
- // columns
128
- // .filter((c) => !c.Hidden)
129
- // .forEach((col) => {
130
- // const newWidth = Math.ceil((containerWidthAllColumns * col.Width) / allColWidth);
131
- // col.Width = newWidth;
132
- // col.$FitContainerWidth = `${newWidth}px`;
133
- // });
134
- return { columns: [...columns], contextMenuWidth };
135
- }
136
- export function calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow) {
137
- let contextMenuWidth = contextMenuItems.length > 1 ? 40 : 0;
138
- const btnPadding = 14 + 2 + 10; // padding + border + if text is overflowed then add 5 pixel.so we always 5 px to it.
139
- const tdPadding = 15 + 1; // padding + border
140
- const buttonIconWidth = 16 + 6; // size + margin
141
- if (disableContextMenuOverflow || contextMenuItems.length === 1) {
142
- contextMenuWidth = 0;
143
- contextMenuItems.forEach((c) => {
144
- contextMenuWidth += measureText(c.text) + btnPadding + tdPadding;
145
- contextMenuWidth += c.icon ? buttonIconWidth : 0;
146
- });
147
- }
148
- return contextMenuWidth;
149
- }
150
- export function isInLocalMode() {
151
- const offlinceActive = BarsaApi.Common.Util.TryGetValue(BarsaApi.Offline, 'Settings.IsActive', false);
152
- const offlineTrue = BarsaApi.Common.Util.TryGetValue(BarsaApi.Offline, 'Settings.IsOffline', false);
153
- return offlinceActive && offlineTrue;
154
- }
155
- export function getLabelWidth(item) {
156
- const fieldXtype = item.FieldUi?.originalXtype;
157
- if (fieldXtype === 'Ui.Button' ||
158
- fieldXtype === 'Ui.CheckBox' ||
159
- !item.TextVisible ||
160
- item.CaptionSetting?.AlignMode === 'AutoSize') {
161
- return;
162
- }
163
- let labelCaption = item.Caption;
164
- if (labelCaption === '&zwnj;') {
165
- labelCaption = '';
166
- }
167
- labelCaption = labelCaption + ' * ';
168
- // if (item.FieldUi?.Setting?.IsMandatory) {
169
- // if (labelCaption.indexOf('*') < 0) {
170
- // }
171
- // } else {
172
- // labelCaption = labelCaption.replace('*', '');
173
- // }
174
- labelCaption += ':';
175
- const labelWidth = measureText(labelCaption);
176
- let labelWithPadding = labelWidth + 10;
177
- if (item.FieldUi?.Setting?.FieldIcon) {
178
- labelWithPadding += 24;
179
- }
180
- if (item.FieldUi?.Setting?.HelpDescription) {
181
- labelWithPadding += 24;
182
- }
183
- const controlWidth = Math.ceil(labelWithPadding);
184
- return controlWidth;
185
- }
186
- export function getColumnValueOfMoDataList(name, mo, Columns, caption) {
187
- let fieldName = Columns ? Columns.find((c) => c.Name === name || c.Alias === name)?.Name : name;
188
- if (!fieldName) {
189
- fieldName = name;
190
- }
191
- let val = fieldName ? mo[fieldName] : undefined;
192
- if (caption) {
193
- let captionVal = fieldName ? mo[fieldName]?.$Caption : undefined;
194
- if (typeof captionVal === 'undefined') {
195
- captionVal = mo[fieldName + '$Caption'];
196
- }
197
- if (typeof captionVal === 'undefined') {
198
- captionVal = val;
199
- }
200
- val = captionVal;
201
- }
202
- return val;
203
- }
204
- export function throwIfAlreadyLoaded(parentModule, moduleName) {
205
- if (parentModule) {
206
- throw new Error(`${moduleName} has already been loaded. Import ${moduleName} in the AppModule only.`);
207
- }
208
- }
209
- const measureTextValues = {};
210
- export function measureText(text, fontSize) {
211
- if (measureTextValues[text]) {
212
- return measureTextValues[text];
213
- }
214
- const measureTextDom = document.getElementById('measureText');
215
- if (!measureTextDom) {
216
- return -1;
217
- }
218
- const ctx = measureTextDom.getContext('2d');
219
- fontSize = fontSize ? fontSize : '0.885rem';
220
- ctx.font = `normal ${fontSize} IRANYekanDigits`;
221
- const x = ctx.measureText(text).width;
222
- measureTextValues[text] = x;
223
- return x;
224
- }
225
- export function genrateInlineMoId() {
226
- return (BarsaApi.idGenerator--).toString();
227
- }
228
- export function enumValueToStringSize(value, defaultValue) {
229
- switch (value) {
230
- case '1':
231
- return 's';
232
- case '2':
233
- return 'm';
234
- case '3':
235
- return 'l';
236
- default:
237
- return defaultValue;
238
- }
239
- }
240
- export function executeUlvCommandHandler(button, options) {
241
- if (button.Command && button.Command.Handler) {
242
- button.Command.Handler(button, options);
243
- }
244
- else if (button.handler) {
245
- button.handler.bind(button.scope)(button, options);
246
- }
247
- }
248
- export function getUniqueId(parts) {
249
- const stringArr = [];
250
- for (let i = 0; i < parts; i++) {
251
- // eslint-disable-next-line no-bitwise
252
- const S4 = (((1 + Math.random()) * 0x10000) | 0).toString(16);
253
- const S4_ = S4.length > 0 ? S4.substring(1) : '';
254
- stringArr.push(S4_);
255
- }
256
- return stringArr.join('-');
257
- }
258
- export function getDateService(logService, culture) {
259
- const defaultCulture = culture ?? BarsaApi.LoginFormData.Culture;
260
- switch (defaultCulture) {
261
- case 'fa-IR':
262
- return new DateShamsiService(logService);
263
- case 'ar-AE':
264
- return new DateHijriService(logService);
265
- default:
266
- return new DateMiladiService(logService);
267
- }
268
- }
269
- export function getAllItemsPerChildren(item, level, array, parentNode, autoOpenLevels) {
270
- let newItem = item;
271
- if (level > 0) {
272
- item.parentNode = parentNode;
273
- item.level = level;
274
- item.isExpand = item.isExpand ?? autoOpenLevels > level;
275
- item.visibility = item.parentNode.isExpand;
276
- array.push(newItem);
277
- }
278
- else {
279
- newItem = item;
280
- newItem.isExpand = true;
281
- }
282
- if (item.children) {
283
- item.children.forEach((child) => setOneDepthLevel(child));
284
- return item.children.map((i) => getAllItemsPerChildren(i, level + 1, array, newItem, autoOpenLevels));
285
- }
286
- }
287
- export function setOneDepthLevel(node) {
288
- let hasOneDepth = true;
289
- node.children?.forEach((child) => {
290
- if (child.Data?.$HasChildren) {
291
- hasOneDepth = false;
292
- return;
293
- }
294
- });
295
- node.hasOneDepthLevel = hasOneDepth;
296
- }
297
- export function isFirefox() {
298
- return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
299
- }
300
- export function getImagePath(type, moId, fileId, fieldDefId, size, sizeH) {
301
- moId = moId == null ? '' : encodeURIComponent(moId);
302
- fileId = fileId == null ? '' : encodeURIComponent(fileId);
303
- fieldDefId = fieldDefId == null ? '' : encodeURIComponent(fieldDefId);
304
- size = size === null ? 128 : size;
305
- sizeH = sizeH === null ? size : sizeH;
306
- const url = `/IH.ashx?ty=${type}&moId=${moId}&id=${fileId}&fdId=${fieldDefId}&si=${size}&siH=${sizeH}`;
307
- return url;
308
- }
309
- export function isFunction(functionToCheck) {
310
- return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
311
- }
312
- export function DeviceWidth() {
313
- return window.innerWidth > 0 ? window.innerWidth : screen.width;
314
- }
315
- export function getHeaderValue(fieldValue, returnValue) {
316
- if (typeof fieldValue !== 'object') {
317
- return fieldValue;
318
- }
319
- const value = fieldValue.Value;
320
- const valueCaption = fieldValue.Value$Caption;
321
- let valueObjectCaption = null;
322
- if (typeof value === 'object') {
323
- valueObjectCaption = fieldValue.Value.$Caption;
324
- }
325
- if (valueObjectCaption && !returnValue) {
326
- return valueObjectCaption;
327
- }
328
- if (valueCaption && !valueCaption.startsWith('tmp') && !returnValue) {
329
- return valueCaption;
330
- }
331
- return value;
332
- }
333
- export function elementInViewport2(el) {
334
- let top = el.offsetTop;
335
- let left = el.offsetLeft;
336
- const width = el.offsetWidth;
337
- const height = el.offsetHeight;
338
- while (el.offsetParent) {
339
- el = el.offsetParent;
340
- top += el.offsetTop;
341
- left += el.offsetLeft;
342
- }
343
- return (top < window.pageYOffset + window.innerHeight &&
344
- left < window.pageXOffset + window.innerWidth &&
345
- top + height > window.pageYOffset &&
346
- left + width > window.pageXOffset);
347
- }
348
- export function PreventDefaulEvent(e, propagationDisable = true) {
349
- if (propagationDisable) {
350
- stopPropagation(e);
351
- }
352
- e.preventDefault();
353
- }
354
- export function stopPropagation(e) {
355
- e.stopPropagation();
356
- }
357
- export function getParentHeight(elDom) {
358
- let parentDom = elDom.parentElement;
359
- let parentHeight = parentDom?.clientHeight ?? 0;
360
- while (parentDom != null && parentHeight < 40) {
361
- parentDom = parentDom.parentElement;
362
- parentHeight = parentDom?.clientHeight ?? 0;
363
- }
364
- return parentHeight;
365
- }
366
- export function getComponentDefined(controlUi, customUiSetting) {
367
- let moduleName = BarsaApi.LoginFormData.DefaultUiModule;
368
- let moduleKebabName = BarsaApi.Common.Util.GetKebabCase(moduleName);
369
- let componentName = controlUi.originalXtype.replace('.', '').replace('_', '');
370
- let selector = BarsaApi.Common.Util.GetKebabCase(componentName);
371
- selector = selector.substring(1, selector.length);
372
- selector = BarsaApi.LoginFormData.CustomUiPrefix + '-' + selector;
373
- if (customUiSetting && customUiSetting.Module) {
374
- moduleName = customUiSetting.Module;
375
- moduleKebabName = BarsaApi.Common.Util.GetKebabCase(moduleName);
376
- componentName = customUiSetting.Name;
377
- selector = customUiSetting.Selector;
378
- }
379
- const modulePath = moduleKebabName.slice(1, moduleKebabName.length);
380
- return { moduleName, modulePath, componentName, selector };
381
- }
382
- export function isSafari() {
383
- return Device.isSafari();
384
- }
385
- export function isFF() {
386
- return Device.isFF();
387
- }
388
- export function getDeviceIsPhone() {
389
- return Device.isPhone();
390
- }
391
- export function getDeviceIsDesktop() {
392
- return Device.isDesktop();
393
- }
394
- export function getDeviceIsTablet() {
395
- return Device.isTablet();
396
- }
397
- export function getDeviceIsMobile() {
398
- return navigator.userAgent.indexOf('mobi') > 0 || getDeviceIsPhone();
399
- }
400
- export function getControlSizeMode(el, deviceSize = 'l') {
401
- const containerWidth = el.offsetWidth;
402
- if (containerWidth === 0) {
403
- return deviceSize;
404
- }
405
- if (deviceSize === 's' || containerWidth < 600) {
406
- deviceSize = 's';
407
- }
408
- else if (deviceSize === 'm' || (containerWidth > 600 && containerWidth < 1200)) {
409
- deviceSize = 'm';
410
- }
411
- return deviceSize;
412
- }
413
- export function formatBytes(bytes, decimals = 2, size) {
414
- if (bytes === 0) {
415
- return '0 Bytes';
416
- }
417
- const k = 1024;
418
- const dm = decimals < 0 ? 0 : decimals;
419
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
420
- const i = sizes.findIndex((c) => c === size);
421
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
422
- }
423
- export function getValidExtension(validExtensions) {
424
- let _validExtensions = '';
425
- if (Array.isArray(validExtensions)) {
426
- _validExtensions = validExtensions.map((c) => '.' + c.Extension).join(',');
427
- }
428
- return _validExtensions;
429
- }
430
- export function getIcon(type) {
431
- return BarsaApi.Common.File.FileIconDict128[type];
432
- }
433
- export function isImage(type) {
434
- if (!type) {
435
- return false;
436
- }
437
- type = type.toLowerCase();
438
- return ['img', 'png', 'jpeg', 'jpg', 'gif', 'bmp', 'tiff', 'image', 'jfif'].indexOf(type) > -1;
439
- }
440
- export function GetAllColumnsSorted(context) {
441
- const allColumns = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.Columns', []).filter((c) => c.Name !== 'Id' && c.Name !== '$StyleIndex' && !c.Hidden);
442
- const colList = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.GridSetting.ColSettingList', []);
443
- const columns = new Array();
444
- colList.forEach((colS) => {
445
- const columnOfColList = allColumns.find((c) => c.Name === colS.Name);
446
- if (columnOfColList) {
447
- columns.push({ ...columnOfColList, Hidden: colS.IsHidden, Width: colS.Width });
448
- }
449
- });
450
- allColumns.forEach((column, index) => {
451
- const colSetting = colList.find((c) => c.Name === column.Name);
452
- if (!colSetting) {
453
- columns.splice(index, 0, { ...column, Hidden: colList.length > 0 ? true : false });
454
- }
455
- });
456
- return columns;
457
- }
458
- export function GetVisibleValue(object, field) {
459
- let outputValue;
460
- if (object[field]?.$Caption !== undefined) {
461
- outputValue = object[field].$Caption;
462
- }
463
- else {
464
- outputValue = object[field + '$Caption'] !== undefined ? object[field + '$Caption'] : object[field];
465
- }
466
- return outputValue;
467
- }
468
- export function GroupBy(collection, sortSettings) {
469
- const grouped = {};
470
- const groups = sortSettings.map((c) => c.Name);
471
- const getTitle = (mo, fieldName) => GetVisibleValue(mo, fieldName);
472
- collection.forEach((a) => {
473
- groups
474
- .reduce((o, g, i) => {
475
- const groupTitle = getTitle(a, g);
476
- o[groupTitle] = o[groupTitle] || (i + 1 === groups.length ? [] : {});
477
- if (Array.isArray(o[groupTitle])) {
478
- a.$Level = groups.length;
479
- let title = getTitle(a, groups[0]);
480
- let parent = grouped[title];
481
- parent.$Count = (parent.$Count ?? 0) + 1;
482
- for (let j = 1; j < groups.length - 1; j++) {
483
- title = getTitle(a, groups[j]);
484
- parent = parent[title];
485
- parent.$Count = o[groupTitle].length + 1;
486
- }
487
- }
488
- else {
489
- const a2 = FindGroup(groupTitle, a);
490
- o[groupTitle].$Expanded = a2?.$Expanded;
491
- o[groupTitle].$Visibility = a2?.$Visibility;
492
- }
493
- return o[groupTitle];
494
- }, grouped)
495
- .push(a);
496
- });
497
- return { grouped, groups };
498
- }
499
- export function FindGroup(groupTitle, a) {
500
- if (a.$Group === groupTitle) {
501
- return a;
502
- }
503
- if (a.$Parent) {
504
- return FindGroup(groupTitle, a.$Parent);
505
- }
506
- }
507
- export function FillAllLayoutControls(item, layoutControls) {
508
- if (item.xtype === 'Ly.LayoutControl') {
509
- layoutControls.push(item);
510
- return;
511
- }
512
- if (!item.items?.length) {
513
- return;
514
- }
515
- item.items.forEach((c) => FillAllLayoutControls(c, layoutControls));
516
- }
517
- export function FindToolbarItem(toolbarItems, value, prop = 'text') {
518
- if (!toolbarItems?.length) {
519
- return null;
520
- }
521
- const findInArray = (toolbarItems, value) => {
522
- let item = null;
523
- toolbarItems.forEach((c) => {
524
- if (typeof c === 'object' && !item) {
525
- if (c[prop] === value) {
526
- item = c;
527
- return;
528
- }
529
- else if (c.menu?.items?.length) {
530
- item = findInArray(c.menu.items, value);
531
- }
532
- }
533
- });
534
- return item;
535
- };
536
- return findInArray(toolbarItems, value);
537
- }
538
- export function FindLayoutSettingFromLayout94(layout94, layoutTitle) {
539
- if (!layoutTitle) {
540
- return null;
541
- }
542
- if (layout94.Caption === layoutTitle || layout94.Title === layoutTitle || layout94.ControlId === layoutTitle) {
543
- return layout94;
544
- }
545
- let tempLayout94 = null;
546
- if (layout94.items?.length) {
547
- for (let i = 0; i < layout94.items.length; i++) {
548
- if (!tempLayout94) {
549
- tempLayout94 = FindLayoutSettingFromLayout94(layout94.items[i], layoutTitle);
550
- }
551
- }
552
- }
553
- return tempLayout94;
554
- }
555
- export function getGridSettings(context) {
556
- const gridSetting = BarsaApi.Common.Util.TryGetValue(context, 'Setting.View.GridSetting', null);
557
- return {
558
- ColSettingList: gridSetting?.ColSettingList ?? null,
559
- SortSettingList: gridSetting?.SortSettingList ?? [],
560
- AutoSizeColumns: gridSetting?.AutoSizeColumns ?? false
561
- };
562
- }
563
- export function getResetGridSettings(columns, context) {
564
- const colList = columns;
565
- const settings = getGridSettings(context);
566
- settings.ColSettingList = colList.map((c) => ({
567
- IsHidden: c.Hidden,
568
- Name: c.Name,
569
- Width: c.Width,
570
- Caption: c.Caption
571
- }));
572
- return settings;
573
- }
574
- export function GetDefaultMoObjectInfo(typeDefId) {
575
- return {
576
- Id: '0',
577
- $Caption: '',
578
- $TypeDefId: typeDefId,
579
- $State: 'New',
580
- $Type: 'Common.MetaObjectWeb',
581
- $FieldDict: {}
582
- };
583
- }
584
- export function getLayout94ObjectInfo() {
585
- return {
586
- Type: 'Root',
587
- ControlId: 'ریشه',
588
- xtype: 'Ly.LayoutContainer',
589
- Bounds: { x: 0, y: 0, width: 432, height: 24 },
590
- items: [
591
- {
592
- Type: 'VerticalJoin',
593
- xtype: 'Ly.LayoutJoin',
594
- IsVertical: true,
595
- Bounds: { x: 0, y: 0, width: 432, height: 82 },
596
- items: []
597
- }
598
- ]
599
- };
600
- }
601
- export function getFormSettings(typeDefId) {
602
- const mo = GetDefaultMoObjectInfo(typeDefId);
603
- const formPanelSettings = {
604
- View: {
605
- Layout94: getLayout94ObjectInfo,
606
- ControlInfo: [],
607
- TypeDefId: typeDefId
608
- },
609
- IsSearchPanel: true,
610
- Data: {
611
- Mo: mo
612
- }
613
- };
614
- return formPanelSettings;
615
- }
616
- export function createFormPanelMetaConditions(typeDefId, controlsInfo, controlName, value) {
617
- const formSettings = getFormSettings(typeDefId);
618
- formSettings.View.ControlInfo = JSON.parse(JSON.stringify(controlsInfo));
619
- formSettings.View.Layout94.items[0].items.push(...controlsInfo.map((c) => getLayoutControl(c.ControlName)));
620
- formSettings.Data.Mo[controlName] = value;
621
- const formPanelCtrlr = new BarsaApi.Ul.FormPanelCtrlr({
622
- Setting: formSettings,
623
- Features: {
624
- Workflow: false,
625
- Toolbar: false,
626
- InfoBar: false
627
- }
628
- });
629
- return formPanelCtrlr;
630
- }
631
- export function getNewMoGridEditor(formSettings, typedefId) {
632
- const newFormSettings = JSON.parse(JSON.stringify(formSettings));
633
- return { ...newFormSettings.Data.Mo, $TypeDefId: typedefId };
634
- }
635
- export function createGridEditorFormPanel(formSettings, mo, typedef, relation, rewriteLayout = true, UlvMainCtrlr = null) {
636
- const newFormSettings = JSON.parse(JSON.stringify(formSettings));
637
- newFormSettings.Data.Mo = { ...mo, $TypeDefId: typedef };
638
- if (rewriteLayout) {
639
- newFormSettings.View.Layout94 = getLayout94ObjectInfo();
640
- newFormSettings.View.Layout94.items[0].items.push(...newFormSettings.View.ControlInfo.map((c) => getLayoutControl(c.ControlName, c.ControlFieldCaptionTranslated, false)));
641
- }
642
- const formRequestParams = new BarsaApi.Ul.FormRequestParams({
643
- MoId: newFormSettings.Data.Mo.Id,
644
- TypeDefId: typedef,
645
- Relation: relation
646
- // MoContext: {
647
- // ReportId: '',
648
- // ViewId: '',
649
- // ViewName: '',
650
- // CondFormating: '',
651
- // IncludeInReport: ''
652
- // }
653
- });
654
- const formPanelCtrlr = new BarsaApi.Ul.FormPanelCtrlr({
655
- Setting: newFormSettings,
656
- Relation: relation,
657
- UlvMainCtrlr: UlvMainCtrlr,
658
- Features: {
659
- Workflow: false,
660
- Toolbar: false,
661
- InfoBar: false
662
- },
663
- FormRequestParams: formRequestParams
664
- });
665
- return formPanelCtrlr;
666
- }
667
- export function getLayoutControl(controlName, controlCaption = '', hide = true) {
668
- return {
669
- xtype: 'Ly.LayoutControl',
670
- Type: 'LayoutControlItem',
671
- ControlId: controlName,
672
- IsVertical: false,
673
- TextLocation: 'Right',
674
- TextVisible: false,
675
- Visible: !hide,
676
- hide,
677
- UseLayoutItemTextForControl: false,
678
- Caption: controlCaption,
679
- AccessibleName: '',
680
- Bounds: { x: 0, y: 0, width: 432, height: 24 },
681
- MinSize: { width: 89, height: 24 },
682
- MaxSize: { width: 0, height: 24 },
683
- ControlBounds: { width: 388, height: 20 },
684
- ControlMinSize: { width: 45, height: 20 },
685
- ControlMaxSize: { width: 0, height: 20 },
686
- Padding: [2, 2, 2, 2],
687
- LabelSize: { width: 35, height: 13 },
688
- originalXtype: ''
689
- };
690
- }
691
- export function getControlList(mo, controlDbNames, isSearchPanel, isGridEditor) {
692
- return new Promise((resolve, reject) => {
693
- BarsaApi.Common.Ajax.GetServerData('Form94.GetControlInfos', {
694
- controlInfoParameter: {
695
- FieldDbNames: controlDbNames,
696
- Mo: new BarsaApi.Common.MetaObjectWeb(mo),
697
- IsSearchPanel: isSearchPanel,
698
- IsGridEditor: isGridEditor
699
- }
700
- }, (m) => {
701
- resolve(m);
702
- }, (err) => {
703
- reject(err);
704
- });
705
- });
706
- }
707
- export function shallowEqual(objA, objB) {
708
- if (objA === objB) {
709
- return true;
710
- }
711
- if (typeof objA !== 'object' || !objA || typeof objB !== 'object' || !objB) {
712
- return false;
713
- }
714
- const keysA = Object.keys(objA);
715
- const keysB = Object.keys(objB);
716
- if (keysA.length !== keysB.length) {
717
- return false;
718
- }
719
- const bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
720
- // eslint-disable-next-line @typescript-eslint/prefer-for-of
721
- for (let idx = 0; idx < keysA.length; idx++) {
722
- const key = keysA[idx];
723
- if (!bHasOwnProperty(key)) {
724
- return false;
725
- }
726
- if (objA[key] !== objB[key]) {
727
- return false;
728
- }
729
- }
730
- return true;
731
- }
732
- export function toNumber(value, fallbackValue = 0) {
733
- return _isNumberValue(value) ? Number(value) : fallbackValue;
734
- }
735
- function propDecoratorFactory(name, fallback) {
736
- function propDecorator(target, propName, originalDescriptor) {
737
- const privatePropName = `$$__zorroPropDecorator__${propName}`;
738
- if (Object.prototype.hasOwnProperty.call(target, privatePropName)) {
739
- // warn(`The prop "${privatePropName}" is already exist, it will be overrided by ${name} decorator.`);
740
- }
741
- Object.defineProperty(target, privatePropName, {
742
- configurable: true,
743
- writable: true
744
- });
745
- return {
746
- get() {
747
- return originalDescriptor && originalDescriptor.get
748
- ? originalDescriptor.get.bind(this)()
749
- : this[privatePropName];
750
- },
751
- set(value) {
752
- if (originalDescriptor && originalDescriptor.set) {
753
- originalDescriptor.set.bind(this)(fallback(value));
754
- }
755
- this[privatePropName] = fallback(value);
756
- }
757
- };
758
- }
759
- return propDecorator;
760
- }
761
- export function InputNumber(fallbackValue) {
762
- return propDecoratorFactory('InputNumber', (value) => toNumber(value, fallbackValue));
763
- }
764
- export var AffixRespondEvents;
765
- (function (AffixRespondEvents) {
766
- AffixRespondEvents["resize"] = "resize";
767
- AffixRespondEvents["scroll"] = "scroll";
768
- AffixRespondEvents["touchstart"] = "touchstart";
769
- AffixRespondEvents["touchmove"] = "touchmove";
770
- AffixRespondEvents["touchend"] = "touchend";
771
- AffixRespondEvents["pageshow"] = "pageshow";
772
- AffixRespondEvents["load"] = "LOAD";
773
- })(AffixRespondEvents || (AffixRespondEvents = {}));
774
- export function isTargetWindow(target) {
775
- return typeof window !== 'undefined' && target === window;
776
- }
777
- export function getTargetRect(target) {
778
- return !isTargetWindow(target)
779
- ? target.getBoundingClientRect()
780
- : {
781
- top: 0,
782
- left: 0,
783
- bottom: 0
784
- };
785
- }
786
- export function getFieldValue(name, mo, caption) {
787
- if (mo.GetFValueByCaption) {
788
- let result = mo.GetFValue(name);
789
- if (caption) {
790
- result = mo.GetFCaption(name);
791
- }
792
- if (typeof caption === 'undefined' && mo.InheritanceInfo && !(mo.$FieldDict && mo.$FieldDict[name])) {
793
- const { ParentFieldName } = mo.InheritanceInfo;
794
- const moParent = mo.GetFValue(ParentFieldName);
795
- let result = moParent.GetFValue(name);
796
- if (caption) {
797
- result = moParent.GetFCaption(name);
798
- }
799
- }
800
- return result;
801
- }
802
- const fieldName = mo.$FieldDict && mo.$FieldDict[name] ? mo.$FieldDict[name] : name;
803
- let val = mo[fieldName];
804
- if (caption) {
805
- let captionVal = mo[fieldName]?.$Caption;
806
- if (typeof captionVal !== 'string') {
807
- if (!captionVal) {
808
- captionVal = mo[fieldName + '$Caption'];
809
- }
810
- if (!captionVal) {
811
- captionVal = val;
812
- }
813
- }
814
- val = captionVal;
815
- }
816
- return val;
817
- }
818
- /* eslint-disable no-invalid-this */
819
- export const availablePrefixes = ['moz', 'ms', 'webkit'];
820
- export function requestAnimationFramePolyfill() {
821
- let lastTime = 0;
822
- return function (callback) {
823
- const currTime = new Date().getTime();
824
- const timeToCall = Math.max(0, 16 - (currTime - lastTime));
825
- const id = setTimeout(() => {
826
- callback(currTime + timeToCall);
827
- }, timeToCall);
828
- lastTime = currTime + timeToCall;
829
- return id;
830
- };
831
- }
832
- export function ExecuteDynamicCommand(command, mo = null) {
833
- const e = { command, DynamicSetting: mo, Mo: mo };
834
- BarsaApi.Common.CustomCodeManager.RunDynamicCommand(command.Id, e);
835
- }
836
- export function ExecuteWorkflowChoiceDef(scope, param, success, failed) {
837
- BarsaApi.Common.Ajax.GetServerData('Workflow94.ChoiceSelect', param, (result) => {
838
- success(result);
839
- }, // success
840
- (error) => {
841
- failed(error);
842
- }, // error
843
- () => { }, // doReturn
844
- scope, true);
845
- }
846
- export function getRequestAnimationFrame() {
847
- if (typeof window === 'undefined') {
848
- return () => 0;
849
- }
850
- if (window.requestAnimationFrame) {
851
- // https://github.com/vuejs/vue/issues/4465
852
- return window.requestAnimationFrame.bind(window);
853
- }
854
- const prefix = availablePrefixes.filter((key) => `${key}RequestAnimationFrame` in window)[0];
855
- return prefix ? window[`${prefix}RequestAnimationFrame`] : requestAnimationFramePolyfill();
856
- }
857
- export function cancelRequestAnimationFrame(id) {
858
- if (typeof window === 'undefined') {
859
- return null;
860
- }
861
- if (window.cancelAnimationFrame) {
862
- return window.cancelAnimationFrame(id);
863
- }
864
- const prefix = availablePrefixes.filter((key) => `${key}CancelAnimationFrame` in window || `${key}CancelRequestAnimationFrame` in window)[0];
865
- return prefix
866
- ? (window[`${prefix}CancelAnimationFrame`] ||
867
- window[`${prefix}CancelRequestAnimationFrame`])
868
- // @ts-ignore
869
- .call(this, id)
870
- : clearTimeout(id);
871
- }
872
- export function easeInOutCubic(t, b, c, d) {
873
- const cc = c - b;
874
- let tt = t / (d / 2);
875
- if (tt < 1) {
876
- return (cc / 2) * tt * tt * tt + b;
877
- }
878
- else {
879
- return (cc / 2) * ((tt -= 2) * tt * tt + 2) + b;
880
- }
881
- }
882
- export const WordMimeType = '.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document';
883
- export const ImageMimeType = '.jpeg,.jpg,.gif,.png,.bmp,.tif,image/*';
884
- export const PdfMimeType = '.pdf';
885
- export const AllFilesMimeType = '.txt,.ppt,.pdf,.*';
886
- export const VideoMimeType = 'video/*';
887
- export const AudioMimeType = 'audio/*';
888
- export function ChangeLayoutInfoCustomUi(layoutInfo, componentUi) {
889
- layoutInfo.FieldUi.Setting.CustomUi = componentUi;
890
- }
891
- export const mobile_regex = new RegExp('^(\\+98|0)?9\\d{9}$');
892
- export const number_only = new RegExp('^[0-9]+$');
893
- export function forbiddenValidator(nameRe) {
894
- return (control) => {
895
- const forbidden = nameRe.test(control.value);
896
- return !forbidden ? { forbiddenName: { value: control.value } } : null;
897
- };
898
- }
899
- export function GetImgTags(setting) {
900
- let str = '';
901
- for (let i = 0; i < setting.sources.length; i++) {
902
- str +=
903
- "<img src='" +
904
- setting.sources[i] +
905
- "' class='" +
906
- getCenter(setting.isCenter) +
907
- "' style='" +
908
- setting.customCss +
909
- "' /> ";
910
- }
911
- return str;
912
- }
913
- export function ImagetoPrint(setting) {
914
- return ('<html><head>' +
915
- '<script src="/Lib/scripts/jquery-x.min.js"></script><script src="Lib/ImagePrint/ImagePrintInternal.js"></script>' +
916
- '</head><body style="margin : 0 1 0 1">' +
917
- GetImgTags(setting) +
918
- '</body></html>');
919
- }
920
- export function PrintImage(setting) {
921
- let pageLink = 'about:blank';
922
- let pwa = window.open(pageLink, '_new');
923
- pwa?.document.open();
924
- let imageToPrint = ImagetoPrint(setting);
925
- pwa?.document.write(imageToPrint);
926
- pwa?.document.close();
927
- }
928
- function getCenter(isCenter) {
929
- if (isCenter)
930
- return 'center';
931
- return '';
932
- }
933
- export function SaveImageToFile(name, src) {
934
- const t = getUniqueId(4);
935
- var link = document.createElement('a');
936
- link.href = src;
937
- link.download = name;
938
- document.body.appendChild(link);
939
- link.click();
940
- setTimeout(function () {
941
- link.parentNode?.removeChild(link);
942
- }, 10);
943
- }
944
- export function validateAllFormFields(formGroup) {
945
- //{1}
946
- Object.keys(formGroup.controls).forEach((field) => {
947
- //{2}
948
- const control = formGroup.get(field); //{3}
949
- if (control instanceof FormControl) {
950
- //{4}
951
- control.markAsTouched({ onlySelf: true });
952
- }
953
- else if (control instanceof FormGroup) {
954
- //{5}
955
- validateAllFormFields(control); //{6}
956
- }
957
- });
958
- }
959
- export function getFocusableTagNames() {
960
- return `button,button:not([disabled]),[href],input:not([disabled]),input,
961
- select,select:not([disabled]),textarea,textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`;
962
- }
963
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etbm92aW4tcmF5LWNvcmUvc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFleEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFlLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEcsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFHbkMsT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFpQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhHLE1BQU0sQ0FBTixJQUFZLG9CQUtYO0FBTEQsV0FBWSxvQkFBb0I7SUFDNUIscUZBQW1CLENBQUE7SUFDbkIsbUZBQWtCLENBQUE7SUFDbEIsbUZBQWtCLENBQUE7SUFDbEIsNkVBQWUsQ0FBQTtBQUNuQixDQUFDLEVBTFcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUsvQjtBQUNELE1BQU0sVUFBVSxlQUFlLENBQzNCLGVBQXFDLEVBQ3JDLE9BQTJCLEVBQzNCLE1BQThCLEVBQzlCLFNBQW9CO0lBRXBCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNsQixRQUFRLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLEtBQUssb0JBQW9CLENBQUMsZUFBZTtZQUNyQyxRQUFRLEdBQUcsZUFBZSxDQUFDO1lBQzNCLE1BQU07UUFDVixLQUFLLG9CQUFvQixDQUFDLGNBQWM7WUFDcEMsUUFBUSxHQUFHLG9CQUFvQixDQUFDO1lBQ2hDLE1BQU07UUFDVixLQUFLLG9CQUFvQixDQUFDLGNBQWM7WUFDcEMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUNwQixNQUFNO1FBQ1YsS0FBSyxvQkFB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QUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzlDLEtBQUs7UUFDTCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSztRQUMzQyxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUUsQ0FBQztZQUNqQyxLQUFLO1lBQ0wsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxLQUFLO1lBQ0wscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLO1FBQ3pDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFDRCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2hDLE9BQU87Z0hBQ3FHLENBQUM7QUFDakgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXHJcbmltcG9ydCB7IF9pc051bWJlclZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQmFyc2FBcGkgfSBmcm9tICcuL2Fic3RyYWN0LWNsYXNzZXMvYmFyc2EtYXBpJztcclxuaW1wb3J0IHtcclxuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZSxcclxuICAgIENvbFNldHRpbmcsXHJcbiAgICBFanJheU9sZ28sXHJcbiAgICBGb3JtU2V0dGluZyxcclxuICAgIEdlbmVyYWxDb250cm9sSW5mb01vZGVsLFxyXG4gICAgR3JpZFNldHRpbmcsXHJcbiAgICBMYXlvdXRTZXR0aW5nLFxyXG4gICAgTWVudUl0ZW0sXHJcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgUmVwb3J0Vmlld0NvbHVtbixcclxuICAgIFNvcnRTZXR0aW5nLFxyXG4gICAgVHJlZU5vZGVPYmpcclxufSBmcm9tICcuL2Fic3RyYWN0LWNsYXNzZXMvbW9kZWxzJztcclxuaW1wb3J0IHsgRGF0ZUhpanJpU2VydmljZSwgRGF0ZU1pbGFkaVNlcnZpY2UsIERhdGVTZXJ2aWNlLCBEYXRlU2hhbXNpU2VydmljZSB9IGZyb20gJy4vZGF0ZS1zZXJ2aWNlcyc7XHJcbmltcG9ydCAqIGFzIERldmljZSBmcm9tICcuL2RldmljZSc7XHJcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5leHBvcnQgZW51bSBUYWJsZUhlYWRlcldpZHRoTW9kZSB7XHJcbiAgICBGaXRUb1Jvd0NvbnRlbnQgPSAxLFxyXG4gICAgRml0VG9Db250YWluZXIgPSAyLFxyXG4gICAgRnJlZUNvbHVtblNpemUgPSAzLFxyXG4gICAgQ29sdW1uV2lkdGggPSA0XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFRhYmxlVGhXaWR0aChcclxuICAgIHRhYmxlSGVhZGVyTW9kZTogVGFibGVIZWFkZXJXaWR0aE1vZGUsXHJcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sXHJcbiAgICB0aExpc3Q6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10sXHJcbiAgICByZW5kZXJlcjI6IFJlbmRlcmVyMlxyXG4pOiB2b2lkIHtcclxuICAgIGxldCBwcm9wTmFtZSA9ICcnO1xyXG4gICAgc3dpdGNoICh0YWJsZUhlYWRlck1vZGUpIHtcclxuICAgICAgICBjYXNlIFRhYmxlSGVhZGVyV2lkdGhNb2RlLkZpdFRvUm93Q29udGVudDpcclxuICAgICAgICAgICAgcHJvcE5hbWUgPSAnJEZpdFRvQ29udGVudCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuRml0VG9Db250YWluZXI6XHJcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRGaXRDb250YWluZXJXaWR0aCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuRnJlZUNvbHVtblNpemU6XHJcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRXaWR0aCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVGFibGVIZWFkZXJXaWR0aE1vZGUuQ29sdW1uV2lkdGg6XHJcbiAgICAgICAgICAgIHByb3BOYW1lID0gJyRDb2x1bW5XaWR0aCc7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgdGhMaXN0LmZvckVhY2goKGMsIGkpID0+IHtcclxuICAgICAgICBjb25zdCB3eCA9IF9jYWxjV2lkdGhPZlRoKGNvbHVtbnNbaV0sIGksIHByb3BOYW1lLCB0aExpc3QpO1xyXG4gICAgICAgIHd4ICYmIHJlbmRlcmVyMi5zZXRTdHlsZShjLCAnd2lkdGgnLCB3eCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfY2FsY1dpZHRoT2ZUaChjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4sIGk6IG51bWJlciwgcHJvcE5hbWU6IHN0cmluZywgdGhMaXN0KTogc3RyaW5nIHtcclxuICAgIGlmICghY29sdW1uKSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbHVtbi4kSXNJbWFnZU9yaWNvbiAmJiBpIDwgdGhMaXN0Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBjb25zdCBmaWVsZFR5cGVJZCA9ICtjb2x1bW4uRmllbGRUeXBlSWQ7XHJcbiAgICAgICAgaWYgKGZpZWxkVHlwZUlkID09PSA2IHx8IGZpZWxkVHlwZUlkID09PSA1IHx8IGZpZWxkVHlwZUlkID09PSA0Mikge1xyXG4gICAgICAgICAgICByZXR1cm4gJzI0cHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW4uJElzSW1hZ2VPcmljb24gJiYgaSA8IHRoTGlzdC5sZW5ndGggLSAxID8gJzQycHgnIDogY29sdW1uW3Byb3BOYW1lXTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQ29sdW1uQ29udGVudChjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBzZXRDb2x1bW5XaWR0aEJ5TWF4TW9Db250ZW50V2lkdGgobW9EYXRhTGlzdCwgY29sdW1uKTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aChcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10sXHJcbiAgICBtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sXHJcbiAgICBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdzogYm9vbGVhbixcclxuICAgIGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW11cclxuKTogeyBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW107IGNvbnRleHRNZW51V2lkdGg6IG51bWJlciB9IHtcclxuICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiAhYy5IaWRkZW4pXHJcbiAgICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBzZXRDb2x1bW5DYXB0aW9uV2lkdGgoY29sdW1uKTtcclxuICAgICAgICB9KTtcclxuICAgIGNvbnN0IGNvbnRleHRNZW51V2lkdGggPSBjYWxjQ29udGV4dE1lbnVXaWR0aChjb250ZXh0TWVudUl0ZW1zLCBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdyk7XHJcbiAgICByZXR1cm4geyBjb2x1bW5zOiBbLi4uY29sdW1uc10sIGNvbnRleHRNZW51V2lkdGggfTtcclxufVxyXG5mdW5jdGlvbiBzZXRDb2x1bW5DYXB0aW9uV2lkdGgoY29sdW1uOiBSZXBvcnRWaWV3Q29sdW1uKTogbnVtYmVyIHtcclxuICAgIGlmIChjb2x1bW4uJENvbHVtbldpZHRoTnVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbi4kQ29sdW1uV2lkdGhOdW07XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb2xDYXB0aW9uV2lkdGggPSBtZWFzdXJlVGV4dChjb2x1bW4uQWxpYXMpICsgMTYgKyAxMDtcclxuICAgIGNvbHVtbi4kQ29sdW1uV2lkdGhOdW0gPSBNYXRoLmNlaWwoY29sQ2FwdGlvbldpZHRoKTtcclxuICAgIGNvbHVtbi4kQ29sdW1uV2lkdGggPSBgJHtjb2x1bW4uJENvbHVtbldpZHRoTnVtfXB4YDtcclxuICAgIHJldHVybiBjb2xDYXB0aW9uV2lkdGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbHVtbldpZHRoQnlNYXhNb0NvbnRlbnRXaWR0aChtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbikge1xyXG4gICAgY29uc3Qgd2lkdGggPSBjYWxjdWxhdGVNb0RhdGFMaXN0Q29udGVudFdpZHRoQnlDb2x1bW5OYW1lKG1vRGF0YUxpc3QsIGNvbHVtbik7XHJcbiAgICBjb2x1bW4uJENvbnRlbnRXaWR0aCA9IGAke01hdGguY2VpbCh3aWR0aCl9cHhgO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTW9EYXRhTGlzdENvbnRlbnRXaWR0aEJ5Q29sdW1uTmFtZShcclxuICAgIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSxcclxuICAgIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtblxyXG4pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heFdpZHRoID0gMDtcclxuICAgIG1vRGF0YUxpc3QuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBjYXB0aW9uID0gZ2V0Q29sdW1uVmFsdWVPZk1vRGF0YUxpc3QoY29sdW1uLk5hbWUsIGMsIHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgY2FwdGlvbldpZHRoID0gbWVhc3VyZVRleHQoY2FwdGlvbikgKyAxNjtcclxuICAgICAgICBpZiAobWF4V2lkdGggPCBjYXB0aW9uV2lkdGgpIHtcclxuICAgICAgICAgICAgbWF4V2lkdGggPSBjYXB0aW9uV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKG1heFdpZHRoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRnJlZUNvbHVtblNpemUoY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdKTogUmVwb3J0Vmlld0NvbHVtbltdIHtcclxuICAgIGxldCBhbGxDb2xXaWR0aCA9IDA7XHJcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5IaWRkZW4pO1xyXG5cclxuICAgIHZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCB4ID0gc2V0Q29sdW1uQ2FwdGlvbldpZHRoKGNvbCk7XHJcbiAgICAgICAgY29uc3QgdyA9IGNvbC5XaWR0aCAmJiBjb2wuV2lkdGggPiAwID8gY29sLldpZHRoIDogeDtcclxuICAgICAgICBhbGxDb2xXaWR0aCArPSB3O1xyXG4gICAgICAgIGNvbC4kV2lkdGggPSBpbmRleCA9PT0gdmlzaWJsZUNvbHVtbnMubGVuZ3RoIC0gMSA/ICcxMDAlJyA6IGAke3d9cHhgO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gWy4uLmNvbHVtbnNdO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aEZpdFRvQ29udGFpbmVyKFxyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcclxuICAgIGNhblZpZXc6IGJvb2xlYW4sXHJcbiAgICBkaXNhYmxlQ29udGV4dE1lbnVPdmVyZmxvdzogYm9vbGVhbixcclxuICAgIGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10sXHJcbiAgICBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW11cclxuKTogeyBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW107IGNvbnRleHRNZW51V2lkdGg6IG51bWJlciB9IHtcclxuICAgIGxldCBoYXNEZWZpbmVkV2lkdGggPSB0cnVlO1xyXG4gICAgbGV0IGNvbnRhaW5lcldpZHRoID0gY29sdW1ucy5tYXAoKGMpID0+IGMuV2lkdGgpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xyXG4gICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSAwKSB7XHJcbiAgICAgICAgY29udGFpbmVyV2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgaGFzRGVmaW5lZFdpZHRoID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgYWxsQ29sV2lkdGggPSAwO1xyXG4gICAgY29uc3QgaXNNb2JpbGUgPSBnZXREZXZpY2VJc01vYmlsZSgpO1xyXG4gICAgbGV0IHJlbWFpblBlcmNlbnQgPSAwO1xyXG4gICAgY29uc3QgbENvbHMgPSBjb2x1bW5zLmZpbHRlcigoYywgaSkgPT4gIWMuSGlkZGVuICYmICEoaSA9PT0gMCAmJiBjLkZpZWxkVHlwZUlkID09PSA0MSkpO1xyXG4gICAgbENvbHMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIC8vINin2q/YsSDZgduM2YTYryDYp9iyINmG2YjYuSDYsdmG2q8g2YbYqNmI2K8g2Ygg2LPYqtmI2YYg2KfZiNmEINmH2YUg2YbYqNmI2K9cclxuICAgICAgICBjb25zdCB4ID0gc2V0Q29sdW1uQ2FwdGlvbldpZHRoKGNvbCk7XHJcbiAgICAgICAgY29uc3QgdyA9IGNvbC5XaWR0aCAmJiBjb2wuV2lkdGggPiAwID8gY29sLldpZHRoIDogeDtcclxuICAgICAgICBhbGxDb2xXaWR0aCArPSB3O1xyXG4gICAgICAgIGNvbnN0IHBlcmNlbnQgPSAodyAvIGNvbnRhaW5lcldpZHRoKSAqIDEwMDtcclxuICAgICAgICBjb2wuJEZpdENvbnRhaW5lcldpZHRoID0gaXNNb2JpbGUgfHwgY29sLldpZHRoID09PSAwID8gJzEwMCUnIDogYCR7cGVyY2VudH0lYDtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSBsQ29scy5sZW5ndGggLSAxICYmICFoYXNEZWZpbmVkV2lkdGgpIHtcclxuICAgICAgICAgICAgY29sLiRGaXRDb250YWluZXJXaWR0aCA9IDEwMCAtIHJlbWFpblBlcmNlbnQgKyAnJSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtYWluUGVyY2VudCArPSBwZXJjZW50O1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gY29uc3QgY2FuVmlld0J1dHRvbldpZHRoID0gY2FuVmlldyA/IDQwIDogMDtcclxuICAgIC8vIGNvbnN0IHNlbGVjdGlvbldpZHRoID0gMzA7XHJcblxyXG4gICAgY29uc3QgY29udGV4dE1lbnVXaWR0aCA9IGNhbGNDb250ZXh0TWVudVdpZHRoKGNvbnRleHRNZW51SXRlbXMsIGRpc2FibGVDb250ZXh0TWVudU92ZXJmbG93KTtcclxuICAgIC8vIGNvbnN0IGNvbnRhaW5lcldpZHRoQWxsQ29sdW1ucyA9IGNvbnRhaW5lcldpZHRoIC0gc2VsZWN0aW9uV2lkdGggLSBjYW5WaWV3QnV0dG9uV2lkdGggLSBjb250ZXh0TWVudVdpZHRoIC0gMTI7XHJcbiAgICAvLyBhbGxDb2xXaWR0aCArPSBjb250YWluZXJXaWR0aEFsbENvbHVtbnMgLSBhbGxDb2xXaWR0aDsvLyDZhdit2KfYs9io2Ycg2KLYrtix24zZhiDYs9iq2YjZhi7ahtmI2YYgd2lkdGgg2YXYtNiu2LXbjCDZhtiv2KfYsdivXHJcbiAgICAvLyBjb2x1bW5zXHJcbiAgICAvLyAgICAgLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKVxyXG4gICAgLy8gICAgIC5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgIC8vICAgICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLmNlaWwoKGNvbnRhaW5lcldpZHRoQWxsQ29sdW1ucyAqIGNvbC5XaWR0aCkgLyBhbGxDb2xXaWR0aCk7XHJcbiAgICAvLyAgICAgICAgIGNvbC5XaWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgLy8gICAgICAgICBjb2wuJEZpdENvbnRhaW5lcldpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgY29sdW1uczogWy4uLmNvbHVtbnNdLCBjb250ZXh0TWVudVdpZHRoIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNDb250ZXh0TWVudVdpZHRoKGNvbnRleHRNZW51SXRlbXM6IE1lbnVJdGVtW10sIGRpc2FibGVDb250ZXh0TWVudU92ZXJmbG93OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBjb250ZXh0TWVudVdpZHRoID0gY29udGV4dE1lbnVJdGVtcy5sZW5ndGggPiAxID8gNDAgOiAwO1xyXG4gICAgY29uc3QgYnRuUGFkZGluZyA9IDE0ICsgMiArIDEwOyAvLyBwYWRkaW5nICsgYm9yZGVyICsgaWYgdGV4dCBpcyBvdmVyZmxvd2VkIHRoZW4gYWRkIDUgcGl4ZWwuc28gd2UgYWx3YXlzIDUgcHggdG8gaXQuXHJcbiAgICBjb25zdCB0ZFBhZGRpbmcgPSAxNSArIDE7IC8vIHBhZGRpbmcgKyBib3JkZXJcclxuICAgIGNvbnN0IGJ1dHRvbkljb25XaWR0aCA9IDE2ICsgNjsgLy8gc2l6ZSArIG1hcmdpblxyXG4gICAgaWYgKGRpc2FibGVDb250ZXh0TWVudU92ZXJmbG93IHx8IGNvbnRleHRNZW51SXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgY29udGV4dE1lbnVXaWR0aCA9IDA7XHJcbiAgICAgICAgY29udGV4dE1lbnVJdGVtcy5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRleHRNZW51V2lkdGggKz0gbWVhc3VyZVRleHQoYy50ZXh0KSArIGJ0blBhZGRpbmcgKyB0ZFBhZGRpbmc7XHJcbiAgICAgICAgICAgIGNvbnRleHRNZW51V2lkdGggKz0gYy5pY29uID8gYnV0dG9uSWNvbldpZHRoIDogMDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250ZXh0TWVudVdpZHRoO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0luTG9jYWxNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb2ZmbGluY2VBY3RpdmUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShCYXJzYUFwaS5PZmZsaW5lLCAnU2V0dGluZ3MuSXNBY3RpdmUnLCBmYWxzZSk7XHJcbiAgICBjb25zdCBvZmZsaW5lVHJ1ZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKEJhcnNhQXBpLk9mZmxpbmUsICdTZXR0aW5ncy5Jc09mZmxpbmUnLCBmYWxzZSk7XHJcbiAgICByZXR1cm4gb2ZmbGluY2VBY3RpdmUgJiYgb2ZmbGluZVRydWU7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExhYmVsV2lkdGgoaXRlbTogYW55KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGZpZWxkWHR5cGUgPSBpdGVtLkZpZWxkVWk/Lm9yaWdpbmFsWHR5cGU7XHJcbiAgICBpZiAoXHJcbiAgICAgICAgZmllbGRYdHlwZSA9PT0gJ1VpLkJ1dHRvbicgfHxcclxuICAgICAgICBmaWVsZFh0eXBlID09PSAnVWkuQ2hlY2tCb3gnIHx8XHJcbiAgICAgICAgIWl0ZW0uVGV4dFZpc2libGUgfHxcclxuICAgICAgICBpdGVtLkNhcHRpb25TZXR0aW5nPy5BbGlnbk1vZGUgPT09ICdBdXRvU2l6ZSdcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBsYWJlbENhcHRpb24gPSBpdGVtLkNhcHRpb247XHJcbiAgICBpZiAobGFiZWxDYXB0aW9uID09PSAnJnp3bmo7Jykge1xyXG4gICAgICAgIGxhYmVsQ2FwdGlvbiA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGFiZWxDYXB0aW9uID0gbGFiZWxDYXB0aW9uICsgJyAqICc7XHJcbiAgICAvLyBpZiAoaXRlbS5GaWVsZFVpPy5TZXR0aW5nPy5Jc01hbmRhdG9yeSkge1xyXG4gICAgLy8gICAgIGlmIChsYWJlbENhcHRpb24uaW5kZXhPZignKicpIDwgMCkge1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGFiZWxDYXB0aW9uID0gbGFiZWxDYXB0aW9uLnJlcGxhY2UoJyonLCAnJyk7XHJcbiAgICAvLyB9XHJcbiAgICBsYWJlbENhcHRpb24gKz0gJzonO1xyXG4gICAgY29uc3QgbGFiZWxXaWR0aCA9IG1lYXN1cmVUZXh0KGxhYmVsQ2FwdGlvbik7XHJcbiAgICBsZXQgbGFiZWxXaXRoUGFkZGluZyA9IGxhYmVsV2lkdGggKyAxMDtcclxuICAgIGlmIChpdGVtLkZpZWxkVWk/LlNldHRpbmc/LkZpZWxkSWNvbikge1xyXG4gICAgICAgIGxhYmVsV2l0aFBhZGRpbmcgKz0gMjQ7XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbS5GaWVsZFVpPy5TZXR0aW5nPy5IZWxwRGVzY3JpcHRpb24pIHtcclxuICAgICAgICBsYWJlbFdpdGhQYWRkaW5nICs9IDI0O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xXaWR0aCA9IE1hdGguY2VpbChsYWJlbFdpdGhQYWRkaW5nKTtcclxuICAgIHJldHVybiBjb250cm9sV2lkdGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtblZhbHVlT2ZNb0RhdGFMaXN0KFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbW86IE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBDb2x1bW5zPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IE5hbWU6IHN0cmluZzsgQ2FwdGlvbjogc3RyaW5nIH1bXSxcclxuICAgIGNhcHRpb24/OiBib29sZWFuXHJcbik6IGFueSB7XHJcbiAgICBsZXQgZmllbGROYW1lID0gQ29sdW1ucyA/IENvbHVtbnMuZmluZCgoYykgPT4gYy5OYW1lID09PSBuYW1lIHx8IGMuQWxpYXMgPT09IG5hbWUpPy5OYW1lIDogbmFtZTtcclxuICAgIGlmICghZmllbGROYW1lKSB7XHJcbiAgICAgICAgZmllbGROYW1lID0gbmFtZTtcclxuICAgIH1cclxuICAgIGxldCB2YWwgPSBmaWVsZE5hbWUgPyBtb1tmaWVsZE5hbWVdIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKGNhcHRpb24pIHtcclxuICAgICAgICBsZXQgY2FwdGlvblZhbCA9IGZpZWxkTmFtZSA/IG1vW2ZpZWxkTmFtZV0/LiRDYXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FwdGlvblZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgY2FwdGlvblZhbCA9IG1vW2ZpZWxkTmFtZSArICckQ2FwdGlvbiddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGNhcHRpb25WYWwgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNhcHRpb25WYWwgPSB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhbCA9IGNhcHRpb25WYWw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmQWxyZWFkeUxvYWRlZChwYXJlbnRNb2R1bGU6IGFueSwgbW9kdWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAocGFyZW50TW9kdWxlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiBJbXBvcnQgJHttb2R1bGVOYW1lfSBpbiB0aGUgQXBwTW9kdWxlIG9ubHkuYCk7XHJcbiAgICB9XHJcbn1cclxuY29uc3QgbWVhc3VyZVRleHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuZXhwb3J0IGZ1bmN0aW9uIG1lYXN1cmVUZXh0KHRleHQ6IHN0cmluZywgZm9udFNpemU/OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKG1lYXN1cmVUZXh0VmFsdWVzW3RleHRdKSB7XHJcbiAgICAgICAgcmV0dXJuIG1lYXN1cmVUZXh0VmFsdWVzW3RleHRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lYXN1cmVUZXh0RG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lYXN1cmVUZXh0JykgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBpZiAoIW1lYXN1cmVUZXh0RG9tKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN0eCA9IG1lYXN1cmVUZXh0RG9tLmdldENvbnRleHQoJzJkJykgYXMgYW55O1xyXG4gICAgZm9udFNpemUgPSBmb250U2l6ZSA/IGZvbnRTaXplIDogJzAuODg1cmVtJztcclxuICAgIGN0eC5mb250ID0gYG5vcm1hbCAke2ZvbnRTaXplfSBJUkFOWWVrYW5EaWdpdHNgO1xyXG4gICAgY29uc3QgeCA9IGN0eC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcclxuICAgIG1lYXN1cmVUZXh0VmFsdWVzW3RleHRdID0geDtcclxuICAgIHJldHVybiB4O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5yYXRlSW5saW5lTW9JZCgpIHtcclxuICAgIHJldHVybiAoQmFyc2FBcGkuaWRHZW5lcmF0b3ItLSkudG9TdHJpbmcoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZW51bVZhbHVlVG9TdHJpbmdTaXplKHZhbHVlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgcmV0dXJuICdzJztcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgcmV0dXJuICdtJztcclxuICAgICAgICBjYXNlICczJzpcclxuICAgICAgICAgICAgcmV0dXJuICdsJztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlVWx2Q29tbWFuZEhhbmRsZXIoYnV0dG9uLCBvcHRpb25zPyk6IHZvaWQge1xyXG4gICAgaWYgKGJ1dHRvbi5Db21tYW5kICYmIGJ1dHRvbi5Db21tYW5kLkhhbmRsZXIpIHtcclxuICAgICAgICBidXR0b24uQ29tbWFuZC5IYW5kbGVyKGJ1dHRvbiwgb3B0aW9ucyk7XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbi5oYW5kbGVyKSB7XHJcbiAgICAgICAgYnV0dG9uLmhhbmRsZXIuYmluZChidXR0b24uc2NvcGUpKGJ1dHRvbiwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkKHBhcnRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RyaW5nQXJyOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0czsgaSsrKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcclxuICAgICAgICBjb25zdCBTNCA9ICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMCkudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIGNvbnN0IFM0Xzogc3RyaW5nID0gUzQubGVuZ3RoID4gMCA/IFM0LnN1YnN0cmluZygxKSA6ICcnO1xyXG4gICAgICAgIHN0cmluZ0Fyci5wdXNoKFM0Xyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5nQXJyLmpvaW4oJy0nKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVTZXJ2aWNlKGxvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsIGN1bHR1cmU/KTogRGF0ZVNlcnZpY2Uge1xyXG4gICAgY29uc3QgZGVmYXVsdEN1bHR1cmUgPSBjdWx0dXJlID8/IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuQ3VsdHVyZTtcclxuICAgIHN3aXRjaCAoZGVmYXVsdEN1bHR1cmUpIHtcclxuICAgICAgICBjYXNlICdmYS1JUic6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZVNoYW1zaVNlcnZpY2UobG9nU2VydmljZSk7XHJcbiAgICAgICAgY2FzZSAnYXItQUUnOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGVIaWpyaVNlcnZpY2UobG9nU2VydmljZSk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlTWlsYWRpU2VydmljZShsb2dTZXJ2aWNlKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbihcclxuICAgIGl0ZW06IFRyZWVOb2RlT2JqLFxyXG4gICAgbGV2ZWw6IG51bWJlcixcclxuICAgIGFycmF5OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10sXHJcbiAgICBwYXJlbnROb2RlOiBUcmVlTm9kZU9iaixcclxuICAgIGF1dG9PcGVuTGV2ZWxzOiBudW1iZXJcclxuKTogYW55IHtcclxuICAgIGxldCBuZXdJdGVtOiBhbnkgPSBpdGVtO1xyXG4gICAgaWYgKGxldmVsID4gMCkge1xyXG4gICAgICAgIGl0ZW0ucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XHJcbiAgICAgICAgaXRlbS5sZXZlbCA9IGxldmVsO1xyXG4gICAgICAgIGl0ZW0uaXNFeHBhbmQgPSBpdGVtLmlzRXhwYW5kID8/IGF1dG9PcGVuTGV2ZWxzID4gbGV2ZWw7XHJcbiAgICAgICAgaXRlbS52aXNpYmlsaXR5ID0gaXRlbS5wYXJlbnROb2RlLmlzRXhwYW5kO1xyXG4gICAgICAgIGFycmF5LnB1c2gobmV3SXRlbSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld0l0ZW0gPSBpdGVtO1xyXG4gICAgICAgIG5ld0l0ZW0uaXNFeHBhbmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gc2V0T25lRGVwdGhMZXZlbChjaGlsZCkpO1xyXG4gICAgICAgIHJldHVybiBpdGVtLmNoaWxkcmVuLm1hcCgoaSkgPT4gZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbihpLCBsZXZlbCArIDEsIGFycmF5LCBuZXdJdGVtLCBhdXRvT3BlbkxldmVscykpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRPbmVEZXB0aExldmVsKG5vZGUpOiB2b2lkIHtcclxuICAgIGxldCBoYXNPbmVEZXB0aCA9IHRydWU7XHJcbiAgICBub2RlLmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgIGlmIChjaGlsZC5EYXRhPy4kSGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgaGFzT25lRGVwdGggPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbm9kZS5oYXNPbmVEZXB0aExldmVsID0gaGFzT25lRGVwdGg7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlyZWZveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlUGF0aChcclxuICAgIHR5cGU6IHN0cmluZyxcclxuICAgIG1vSWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICBmaWxlSWQ6IHN0cmluZyxcclxuICAgIGZpZWxkRGVmSWQ/OiBzdHJpbmcsXHJcbiAgICBzaXplPzogbnVtYmVyLFxyXG4gICAgc2l6ZUg/OiBudW1iZXJcclxuKTogc3RyaW5nIHtcclxuICAgIG1vSWQgPSBtb0lkID09IG51bGwgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChtb0lkKTtcclxuICAgIGZpbGVJZCA9IGZpbGVJZCA9PSBudWxsID8gJycgOiBlbmNvZGVVUklDb21wb25lbnQoZmlsZUlkKTtcclxuICAgIGZpZWxkRGVmSWQgPSBmaWVsZERlZklkID09IG51bGwgPyAnJyA6IGVuY29kZVVSSUNvbXBvbmVudChmaWVsZERlZklkKTtcclxuICAgIHNpemUgPSBzaXplID09PSBudWxsID8gMTI4IDogc2l6ZTtcclxuICAgIHNpemVIID0gc2l6ZUggPT09IG51bGwgPyBzaXplIDogc2l6ZUg7XHJcbiAgICBjb25zdCB1cmwgPSBgL0lILmFzaHg/dHk9JHt0eXBlfSZtb0lkPSR7bW9JZH0maWQ9JHtmaWxlSWR9JmZkSWQ9JHtmaWVsZERlZklkfSZzaT0ke3NpemV9JnNpSD0ke3NpemVIfWA7XHJcbiAgICByZXR1cm4gdXJsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jdGlvblRvQ2hlY2spOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYge30udG9TdHJpbmcuY2FsbChmdW5jdGlvblRvQ2hlY2spID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBEZXZpY2VXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoID4gMCA/IHdpbmRvdy5pbm5lcldpZHRoIDogc2NyZWVuLndpZHRoO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJWYWx1ZShmaWVsZFZhbHVlLCByZXR1cm5WYWx1ZT86IHRydWUpOiBhbnkge1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZFZhbHVlLlZhbHVlO1xyXG4gICAgY29uc3QgdmFsdWVDYXB0aW9uOiBzdHJpbmcgPSBmaWVsZFZhbHVlLlZhbHVlJENhcHRpb247XHJcbiAgICBsZXQgdmFsdWVPYmplY3RDYXB0aW9uID0gbnVsbDtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgdmFsdWVPYmplY3RDYXB0aW9uID0gZmllbGRWYWx1ZS5WYWx1ZS4kQ2FwdGlvbjtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZU9iamVjdENhcHRpb24gJiYgIXJldHVyblZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0Q2FwdGlvbjtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZUNhcHRpb24gJiYgIXZhbHVlQ2FwdGlvbi5zdGFydHNXaXRoKCd0bXAnKSAmJiAhcmV0dXJuVmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWVDYXB0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50SW5WaWV3cG9ydDIoZWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHRvcCA9IGVsLm9mZnNldFRvcDtcclxuICAgIGxldCBsZWZ0ID0gZWwub2Zmc2V0TGVmdDtcclxuICAgIGNvbnN0IHdpZHRoID0gZWwub2Zmc2V0V2lkdGg7XHJcbiAgICBjb25zdCBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgd2hpbGUgKGVsLm9mZnNldFBhcmVudCkge1xyXG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xyXG4gICAgICAgIHRvcCArPSBlbC5vZmZzZXRUb3A7XHJcbiAgICAgICAgbGVmdCArPSBlbC5vZmZzZXRMZWZ0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgICAgdG9wIDwgd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0ICYmXHJcbiAgICAgICAgbGVmdCA8IHdpbmRvdy5wYWdlWE9mZnNldCArIHdpbmRvdy5pbm5lcldpZHRoICYmXHJcbiAgICAgICAgdG9wICsgaGVpZ2h0ID4gd2luZG93LnBhZ2VZT2Zmc2V0ICYmXHJcbiAgICAgICAgbGVmdCArIHdpZHRoID4gd2luZG93LnBhZ2VYT2Zmc2V0XHJcbiAgICApO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBQcmV2ZW50RGVmYXVsRXZlbnQoZSwgcHJvcGFnYXRpb25EaXNhYmxlID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgaWYgKHByb3BhZ2F0aW9uRGlzYWJsZSkge1xyXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbihlKTtcclxuICAgIH1cclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGUpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEhlaWdodChlbERvbTogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IHBhcmVudERvbSA9IGVsRG9tLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBsZXQgcGFyZW50SGVpZ2h0ID0gcGFyZW50RG9tPy5jbGllbnRIZWlnaHQgPz8gMDtcclxuICAgIHdoaWxlIChwYXJlbnREb20gIT0gbnVsbCAmJiBwYXJlbnRIZWlnaHQgPCA0MCkge1xyXG4gICAgICAgIHBhcmVudERvbSA9IHBhcmVudERvbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHBhcmVudEhlaWdodCA9IHBhcmVudERvbT8uY2xpZW50SGVpZ2h0ID8/IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyZW50SGVpZ2h0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcG9uZW50RGVmaW5lZChcclxuICAgIGNvbnRyb2xVaTogeyBvcmlnaW5hbFh0eXBlOiBzdHJpbmcgfSxcclxuICAgIGN1c3RvbVVpU2V0dGluZzogeyBNb2R1bGU6IHN0cmluZzsgTmFtZTogc3RyaW5nOyBTZWxlY3Rvcjogc3RyaW5nIH1cclxuKToge1xyXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nO1xyXG4gICAgbW9kdWxlUGF0aDogc3RyaW5nO1xyXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nO1xyXG4gICAgc2VsZWN0b3I6IHN0cmluZztcclxufSB7XHJcbiAgICBsZXQgbW9kdWxlTmFtZSA9IEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGVmYXVsdFVpTW9kdWxlO1xyXG4gICAgbGV0IG1vZHVsZUtlYmFiTmFtZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLkdldEtlYmFiQ2FzZShtb2R1bGVOYW1lKTtcclxuICAgIGxldCBjb21wb25lbnROYW1lID0gY29udHJvbFVpLm9yaWdpbmFsWHR5cGUucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKCdfJywgJycpO1xyXG4gICAgbGV0IHNlbGVjdG9yOiBzdHJpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UoY29tcG9uZW50TmFtZSk7XHJcbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cmluZygxLCBzZWxlY3Rvci5sZW5ndGgpO1xyXG4gICAgc2VsZWN0b3IgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLkN1c3RvbVVpUHJlZml4ICsgJy0nICsgc2VsZWN0b3I7XHJcbiAgICBpZiAoY3VzdG9tVWlTZXR0aW5nICYmIGN1c3RvbVVpU2V0dGluZy5Nb2R1bGUpIHtcclxuICAgICAgICBtb2R1bGVOYW1lID0gY3VzdG9tVWlTZXR0aW5nLk1vZHVsZTtcclxuICAgICAgICBtb2R1bGVLZWJhYk5hbWUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5HZXRLZWJhYkNhc2UobW9kdWxlTmFtZSk7XHJcbiAgICAgICAgY29tcG9uZW50TmFtZSA9IGN1c3RvbVVpU2V0dGluZy5OYW1lO1xyXG4gICAgICAgIHNlbGVjdG9yID0gY3VzdG9tVWlTZXR0aW5nLlNlbGVjdG9yO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IG1vZHVsZUtlYmFiTmFtZS5zbGljZSgxLCBtb2R1bGVLZWJhYk5hbWUubGVuZ3RoKTtcclxuICAgIHJldHVybiB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGgsIGNvbXBvbmVudE5hbWUsIHNlbGVjdG9yIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmYXJpKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIERldmljZS5pc1NhZmFyaSgpO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ZGKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIERldmljZS5pc0ZGKCk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlzUGhvbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRGV2aWNlLmlzUGhvbmUoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlSXNEZXNrdG9wKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIERldmljZS5pc0Rlc2t0b3AoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlSXNUYWJsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gRGV2aWNlLmlzVGFibGV0KCk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlzTW9iaWxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignbW9iaScpID4gMCB8fCBnZXREZXZpY2VJc1Bob25lKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sU2l6ZU1vZGUoZWw6IEhUTUxFbGVtZW50LCBkZXZpY2VTaXplOiAncycgfCAnbScgfCAnbCcgfCAneGwnID0gJ2wnKTogQWJicmV2YXRpb25EZXZpY2VTaXplIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gZWwub2Zmc2V0V2lkdGg7XHJcbiAgICBpZiAoY29udGFpbmVyV2lkdGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZGV2aWNlU2l6ZTtcclxuICAgIH1cclxuICAgIGlmIChkZXZpY2VTaXplID09PSAncycgfHwgY29udGFpbmVyV2lkdGggPCA2MDApIHtcclxuICAgICAgICBkZXZpY2VTaXplID0gJ3MnO1xyXG4gICAgfSBlbHNlIGlmIChkZXZpY2VTaXplID09PSAnbScgfHwgKGNvbnRhaW5lcldpZHRoID4gNjAwICYmIGNvbnRhaW5lcldpZHRoIDwgMTIwMCkpIHtcclxuICAgICAgICBkZXZpY2VTaXplID0gJ20nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRldmljZVNpemU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlcyhcclxuICAgIGJ5dGVzLFxyXG4gICAgZGVjaW1hbHMgPSAyLFxyXG4gICAgc2l6ZTogJ0J5dGVzJyB8ICdLQicgfCAnTUInIHwgJ0dCJyB8ICdUQicgfCAnUEInIHwgJ0VCJyB8ICdaQicgfCAnWUInXHJcbik6IHN0cmluZyB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gJzAgQnl0ZXMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3QgZG0gPSBkZWNpbWFscyA8IDAgPyAwIDogZGVjaW1hbHM7XHJcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcclxuICAgIGNvbnN0IGkgPSBzaXplcy5maW5kSW5kZXgoKGMpID0+IGMgPT09IHNpemUpO1xyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZEV4dGVuc2lvbih2YWxpZEV4dGVuc2lvbnMpOiBzdHJpbmcge1xyXG4gICAgbGV0IF92YWxpZEV4dGVuc2lvbnMgPSAnJztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbGlkRXh0ZW5zaW9ucykpIHtcclxuICAgICAgICBfdmFsaWRFeHRlbnNpb25zID0gdmFsaWRFeHRlbnNpb25zLm1hcCgoYykgPT4gJy4nICsgYy5FeHRlbnNpb24pLmpvaW4oJywnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBfdmFsaWRFeHRlbnNpb25zO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJY29uKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQmFyc2FBcGkuQ29tbW9uLkZpbGUuRmlsZUljb25EaWN0MTI4W3R5cGVdO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0ltYWdlKHR5cGUpOiBib29sZWFuIHtcclxuICAgIGlmICghdHlwZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gWydpbWcnLCAncG5nJywgJ2pwZWcnLCAnanBnJywgJ2dpZicsICdibXAnLCAndGlmZicsICdpbWFnZScsICdqZmlmJ10uaW5kZXhPZih0eXBlKSA+IC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gR2V0QWxsQ29sdW1uc1NvcnRlZChjb250ZXh0KTogQXJyYXk8UmVwb3J0Vmlld0NvbHVtbj4ge1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGNvbnRleHQsICdTZXR0aW5nLlZpZXcuQ29sdW1ucycsIFtdKS5maWx0ZXIoXHJcbiAgICAgICAgKGMpID0+IGMuTmFtZSAhPT0gJ0lkJyAmJiBjLk5hbWUgIT09ICckU3R5bGVJbmRleCcgJiYgIWMuSGlkZGVuXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGNvbExpc3Q6IENvbFNldHRpbmdbXSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxyXG4gICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgJ1NldHRpbmcuVmlldy5HcmlkU2V0dGluZy5Db2xTZXR0aW5nTGlzdCcsXHJcbiAgICAgICAgW11cclxuICAgICk7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gbmV3IEFycmF5PFJlcG9ydFZpZXdDb2x1bW4+KCk7XHJcbiAgICBjb2xMaXN0LmZvckVhY2goKGNvbFMpID0+IHtcclxuICAgICAgICBjb25zdCBjb2x1bW5PZkNvbExpc3QgPSBhbGxDb2x1bW5zLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gY29sUy5OYW1lKTtcclxuICAgICAgICBpZiAoY29sdW1uT2ZDb2xMaXN0KSB7XHJcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaCh7IC4uLmNvbHVtbk9mQ29sTGlzdCwgSGlkZGVuOiBjb2xTLklzSGlkZGVuLCBXaWR0aDogY29sUy5XaWR0aCB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGFsbENvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbFNldHRpbmcgPSBjb2xMaXN0LmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gY29sdW1uLk5hbWUpO1xyXG4gICAgICAgIGlmICghY29sU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5zLnNwbGljZShpbmRleCwgMCwgeyAuLi5jb2x1bW4sIEhpZGRlbjogY29sTGlzdC5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBHZXRWaXNpYmxlVmFsdWUob2JqZWN0LCBmaWVsZCk6IHN0cmluZyB7XHJcbiAgICBsZXQgb3V0cHV0VmFsdWU7XHJcbiAgICBpZiAob2JqZWN0W2ZpZWxkXT8uJENhcHRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIG91dHB1dFZhbHVlID0gb2JqZWN0W2ZpZWxkXS4kQ2FwdGlvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3V0cHV0VmFsdWUgPSBvYmplY3RbZmllbGQgKyAnJENhcHRpb24nXSAhPT0gdW5kZWZpbmVkID8gb2JqZWN0W2ZpZWxkICsgJyRDYXB0aW9uJ10gOiBvYmplY3RbZmllbGRdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dFZhbHVlO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXAge1xyXG4gICAgJEdyb3VwOiBhbnk7XHJcbiAgICAkTGV2ZWw6IG51bWJlcjtcclxuICAgICRDb3VudDogbnVtYmVyO1xyXG4gICAgJEV4cGFuZGVkOiBib29sZWFuO1xyXG4gICAgJFBhcmVudDogYW55O1xyXG4gICAgJENoaWxkcmVuOiBhbnlbXTtcclxuICAgICRWaXNpYmlsaXR5OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gR3JvdXBCeShjb2xsZWN0aW9uOiBhbnlbXSwgc29ydFNldHRpbmdzOiBTb3J0U2V0dGluZ1tdKTogeyBncm91cGVkOiBHcm91cDsgZ3JvdXBzOiBhbnlbXSB9IHtcclxuICAgIGNvbnN0IGdyb3VwZWQ6IGFueSA9IHt9O1xyXG5cclxuICAgIGNvbnN0IGdyb3VwcyA9IHNvcnRTZXR0aW5ncy5tYXAoKGMpID0+IGMuTmFtZSk7XHJcbiAgICBjb25zdCBnZXRUaXRsZSA9IChtbywgZmllbGROYW1lKTogc3RyaW5nID0+IEdldFZpc2libGVWYWx1ZShtbywgZmllbGROYW1lKTtcclxuICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoYSkgPT4ge1xyXG4gICAgICAgIGdyb3Vwc1xyXG4gICAgICAgICAgICAucmVkdWNlKChvLCBnLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFRpdGxlID0gZ2V0VGl0bGUoYSwgZyk7XHJcbiAgICAgICAgICAgICAgICBvW2dyb3VwVGl0bGVdID0gb1tncm91cFRpdGxlXSB8fCAoaSArIDEgPT09IGdyb3Vwcy5sZW5ndGggPyBbXSA6IHt9KTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9bZ3JvdXBUaXRsZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYS4kTGV2ZWwgPSBncm91cHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGdldFRpdGxlKGEsIGdyb3Vwc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGdyb3VwZWRbdGl0bGVdO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC4kQ291bnQgPSAocGFyZW50LiRDb3VudCA/PyAwKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBncm91cHMubGVuZ3RoIC0gMTsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZ2V0VGl0bGUoYSwgZ3JvdXBzW2pdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50W3RpdGxlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LiRDb3VudCA9IG9bZ3JvdXBUaXRsZV0ubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEyID0gRmluZEdyb3VwKGdyb3VwVGl0bGUsIGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9bZ3JvdXBUaXRsZV0uJEV4cGFuZGVkID0gYTI/LiRFeHBhbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICBvW2dyb3VwVGl0bGVdLiRWaXNpYmlsaXR5ID0gYTI/LiRWaXNpYmlsaXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9bZ3JvdXBUaXRsZV07XHJcbiAgICAgICAgICAgIH0sIGdyb3VwZWQpXHJcbiAgICAgICAgICAgIC5wdXNoKGEpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geyBncm91cGVkLCBncm91cHMgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEZpbmRHcm91cChncm91cFRpdGxlOiBzdHJpbmcsIGE6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoYS4kR3JvdXAgPT09IGdyb3VwVGl0bGUpIHtcclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIGlmIChhLiRQYXJlbnQpIHtcclxuICAgICAgICByZXR1cm4gRmluZEdyb3VwKGdyb3VwVGl0bGUsIGEuJFBhcmVudCk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIEZpbGxBbGxMYXlvdXRDb250cm9scyhpdGVtOiBMYXlvdXRTZXR0aW5nLCBsYXlvdXRDb250cm9sczogTGF5b3V0U2V0dGluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAoaXRlbS54dHlwZSA9PT0gJ0x5LkxheW91dENvbnRyb2wnKSB7XHJcbiAgICAgICAgbGF5b3V0Q29udHJvbHMucHVzaChpdGVtKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWl0ZW0uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGl0ZW0uaXRlbXMuZm9yRWFjaCgoYykgPT4gRmlsbEFsbExheW91dENvbnRyb2xzKGMsIGxheW91dENvbnRyb2xzKSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIEZpbmRUb29sYmFySXRlbSh0b29sYmFySXRlbXM6IE1lbnVJdGVtW10sIHZhbHVlOiBzdHJpbmcsIHByb3A6IHN0cmluZyA9ICd0ZXh0Jyk6IE1lbnVJdGVtIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmaW5kSW5BcnJheSA9ICh0b29sYmFySXRlbXM6IE1lbnVJdGVtW10sIHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgaXRlbTogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuICAgICAgICB0b29sYmFySXRlbXMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGMgPT09ICdvYmplY3QnICYmICFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY1twcm9wXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gYztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMubWVudT8uaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBmaW5kSW5BcnJheShjLm1lbnUuaXRlbXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBmaW5kSW5BcnJheSh0b29sYmFySXRlbXMsIHZhbHVlKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gRmluZExheW91dFNldHRpbmdGcm9tTGF5b3V0OTQobGF5b3V0OTQ6IExheW91dFNldHRpbmcsIGxheW91dFRpdGxlOiBzdHJpbmcpOiBMYXlvdXRTZXR0aW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWxheW91dFRpdGxlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAobGF5b3V0OTQuQ2FwdGlvbiA9PT0gbGF5b3V0VGl0bGUgfHwgbGF5b3V0OTQuVGl0bGUgPT09IGxheW91dFRpdGxlIHx8IGxheW91dDk0LkNvbnRyb2xJZCA9PT0gbGF5b3V0VGl0bGUpIHtcclxuICAgICAgICByZXR1cm4gbGF5b3V0OTQ7XHJcbiAgICB9XHJcbiAgICBsZXQgdGVtcExheW91dDk0OiBMYXlvdXRTZXR0aW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBpZiAobGF5b3V0OTQuaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0OTQuaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0ZW1wTGF5b3V0OTQpIHtcclxuICAgICAgICAgICAgICAgIHRlbXBMYXlvdXQ5NCA9IEZpbmRMYXlvdXRTZXR0aW5nRnJvbUxheW91dDk0KGxheW91dDk0Lml0ZW1zW2ldLCBsYXlvdXRUaXRsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcExheW91dDk0O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmlkU2V0dGluZ3MoY29udGV4dCk6IEdyaWRTZXR0aW5nIHtcclxuICAgIGNvbnN0IGdyaWRTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuVmlldy5HcmlkU2V0dGluZycsIG51bGwpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBDb2xTZXR0aW5nTGlzdDogZ3JpZFNldHRpbmc/LkNvbFNldHRpbmdMaXN0ID8/IG51bGwsXHJcbiAgICAgICAgU29ydFNldHRpbmdMaXN0OiBncmlkU2V0dGluZz8uU29ydFNldHRpbmdMaXN0ID8/IFtdLFxyXG4gICAgICAgIEF1dG9TaXplQ29sdW1uczogZ3JpZFNldHRpbmc/LkF1dG9TaXplQ29sdW1ucyA/PyBmYWxzZVxyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzZXRHcmlkU2V0dGluZ3MoY29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdIHwgYW55W10sIGNvbnRleHQ6IGFueSk6IEdyaWRTZXR0aW5nIHtcclxuICAgIGNvbnN0IGNvbExpc3QgPSBjb2x1bW5zO1xyXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRHcmlkU2V0dGluZ3MoY29udGV4dCk7XHJcbiAgICBzZXR0aW5ncy5Db2xTZXR0aW5nTGlzdCA9IGNvbExpc3QubWFwKChjKSA9PiAoe1xyXG4gICAgICAgIElzSGlkZGVuOiBjLkhpZGRlbixcclxuICAgICAgICBOYW1lOiBjLk5hbWUsXHJcbiAgICAgICAgV2lkdGg6IGMuV2lkdGgsXHJcbiAgICAgICAgQ2FwdGlvbjogYy5DYXB0aW9uXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gc2V0dGluZ3M7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBHZXREZWZhdWx0TW9PYmplY3RJbmZvKHR5cGVEZWZJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIElkOiAnMCcsXHJcbiAgICAgICAgJENhcHRpb246ICcnLFxyXG4gICAgICAgICRUeXBlRGVmSWQ6IHR5cGVEZWZJZCxcclxuICAgICAgICAkU3RhdGU6ICdOZXcnLFxyXG4gICAgICAgICRUeXBlOiAnQ29tbW9uLk1ldGFPYmplY3RXZWInLFxyXG4gICAgICAgICRGaWVsZERpY3Q6IHt9XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXQ5NE9iamVjdEluZm8oKTogTGF5b3V0U2V0dGluZyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIFR5cGU6ICdSb290JyxcclxuICAgICAgICBDb250cm9sSWQ6ICfYsduM2LTZhycsXHJcbiAgICAgICAgeHR5cGU6ICdMeS5MYXlvdXRDb250YWluZXInLFxyXG4gICAgICAgIEJvdW5kczogeyB4OiAwLCB5OiAwLCB3aWR0aDogNDMyLCBoZWlnaHQ6IDI0IH0sXHJcbiAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgVHlwZTogJ1ZlcnRpY2FsSm9pbicsXHJcbiAgICAgICAgICAgICAgICB4dHlwZTogJ0x5LkxheW91dEpvaW4nLFxyXG4gICAgICAgICAgICAgICAgSXNWZXJ0aWNhbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIEJvdW5kczogeyB4OiAwLCB5OiAwLCB3aWR0aDogNDMyLCBoZWlnaHQ6IDgyIH0sXHJcbiAgICAgICAgICAgICAgICBpdGVtczogW11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1TZXR0aW5ncyh0eXBlRGVmSWQ6IHN0cmluZyk6IEZvcm1TZXR0aW5nIHtcclxuICAgIGNvbnN0IG1vID0gR2V0RGVmYXVsdE1vT2JqZWN0SW5mbyh0eXBlRGVmSWQpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1QYW5lbFNldHRpbmdzOiBGb3JtU2V0dGluZyA9IHtcclxuICAgICAgICBWaWV3OiB7XHJcbiAgICAgICAgICAgIExheW91dDk0OiBnZXRMYXlvdXQ5NE9iamVjdEluZm8sXHJcbiAgICAgICAgICAgIENvbnRyb2xJbmZvOiBbXSxcclxuICAgICAgICAgICAgVHlwZURlZklkOiB0eXBlRGVmSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIElzU2VhcmNoUGFuZWw6IHRydWUsXHJcbiAgICAgICAgRGF0YToge1xyXG4gICAgICAgICAgICBNbzogbW9cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGZvcm1QYW5lbFNldHRpbmdzO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtUGFuZWxNZXRhQ29uZGl0aW9ucyhcclxuICAgIHR5cGVEZWZJZDogc3RyaW5nLFxyXG4gICAgY29udHJvbHNJbmZvOiBHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdLFxyXG4gICAgY29udHJvbE5hbWU6IHN0cmluZyxcclxuICAgIHZhbHVlOiBhbnlcclxuKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1TZXR0aW5ncyA9IGdldEZvcm1TZXR0aW5ncyh0eXBlRGVmSWQpO1xyXG4gICAgZm9ybVNldHRpbmdzLlZpZXcuQ29udHJvbEluZm8gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbnRyb2xzSW5mbykpO1xyXG5cclxuICAgIGZvcm1TZXR0aW5ncy5WaWV3LkxheW91dDk0Lml0ZW1zWzBdLml0ZW1zLnB1c2goLi4uY29udHJvbHNJbmZvLm1hcCgoYykgPT4gZ2V0TGF5b3V0Q29udHJvbChjLkNvbnRyb2xOYW1lKSkpO1xyXG4gICAgZm9ybVNldHRpbmdzLkRhdGEuTW9bY29udHJvbE5hbWVdID0gdmFsdWU7XHJcbiAgICBjb25zdCBmb3JtUGFuZWxDdHJsciA9IG5ldyBCYXJzYUFwaS5VbC5Gb3JtUGFuZWxDdHJscih7XHJcbiAgICAgICAgU2V0dGluZzogZm9ybVNldHRpbmdzLFxyXG4gICAgICAgIEZlYXR1cmVzOiB7XHJcbiAgICAgICAgICAgIFdvcmtmbG93OiBmYWxzZSxcclxuICAgICAgICAgICAgVG9vbGJhcjogZmFsc2UsXHJcbiAgICAgICAgICAgIEluZm9CYXI6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm9ybVBhbmVsQ3RybHI7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld01vR3JpZEVkaXRvcihmb3JtU2V0dGluZ3M6IEZvcm1TZXR0aW5nLCB0eXBlZGVmSWQ6IHN0cmluZyk6IFBhcnRpYWw8Rm9ybVNldHRpbmc+IHtcclxuICAgIGNvbnN0IG5ld0Zvcm1TZXR0aW5nczogRm9ybVNldHRpbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZvcm1TZXR0aW5ncykpO1xyXG4gICAgcmV0dXJuIHsgLi4ubmV3Rm9ybVNldHRpbmdzLkRhdGEuTW8sICRUeXBlRGVmSWQ6IHR5cGVkZWZJZCB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHcmlkRWRpdG9yRm9ybVBhbmVsKFxyXG4gICAgZm9ybVNldHRpbmdzOiBGb3JtU2V0dGluZyxcclxuICAgIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgdHlwZWRlZjogc3RyaW5nLFxyXG4gICAgcmVsYXRpb246IGFueSxcclxuICAgIHJld3JpdGVMYXlvdXQ6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgVWx2TWFpbkN0cmxyOiBhbnkgPSBudWxsXHJcbik6IGFueSB7XHJcbiAgICBjb25zdCBuZXdGb3JtU2V0dGluZ3M6IEZvcm1TZXR0aW5nID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmb3JtU2V0dGluZ3MpKTtcclxuICAgIG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vID0geyAuLi5tbywgJFR5cGVEZWZJZDogdHlwZWRlZiB9O1xyXG4gICAgaWYgKHJld3JpdGVMYXlvdXQpIHtcclxuICAgICAgICBuZXdGb3JtU2V0dGluZ3MuVmlldy5MYXlvdXQ5NCA9IGdldExheW91dDk0T2JqZWN0SW5mbygpO1xyXG4gICAgICAgIG5ld0Zvcm1TZXR0aW5ncy5WaWV3LkxheW91dDk0Lml0ZW1zWzBdLml0ZW1zLnB1c2goXHJcbiAgICAgICAgICAgIC4uLm5ld0Zvcm1TZXR0aW5ncy5WaWV3LkNvbnRyb2xJbmZvLm1hcCgoYykgPT5cclxuICAgICAgICAgICAgICAgIGdldExheW91dENvbnRyb2woYy5Db250cm9sTmFtZSwgYy5Db250cm9sRmllbGRDYXB0aW9uVHJhbnNsYXRlZCwgZmFsc2UpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZm9ybVJlcXVlc3RQYXJhbXMgPSBuZXcgQmFyc2FBcGkuVWwuRm9ybVJlcXVlc3RQYXJhbXMoe1xyXG4gICAgICAgIE1vSWQ6IG5ld0Zvcm1TZXR0aW5ncy5EYXRhLk1vLklkLFxyXG4gICAgICAgIFR5cGVEZWZJZDogdHlwZWRlZixcclxuICAgICAgICBSZWxhdGlvbjogcmVsYXRpb25cclxuICAgICAgICAvLyBNb0NvbnRleHQ6IHtcclxuICAgICAgICAvLyAgICAgUmVwb3J0SWQ6ICcnLFxyXG4gICAgICAgIC8vICAgICBWaWV3SWQ6ICcnLFxyXG4gICAgICAgIC8vICAgICBWaWV3TmFtZTogJycsXHJcbiAgICAgICAgLy8gICAgIENvbmRGb3JtYXRpbmc6ICcnLFxyXG4gICAgICAgIC8vICAgICBJbmNsdWRlSW5SZXBvcnQ6ICcnXHJcbiAgICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmb3JtUGFuZWxDdHJsciA9IG5ldyBCYXJzYUFwaS5VbC5Gb3JtUGFuZWxDdHJscih7XHJcbiAgICAgICAgU2V0dGluZzogbmV3Rm9ybVNldHRpbmdzLFxyXG4gICAgICAgIFJlbGF0aW9uOiByZWxhdGlvbixcclxuICAgICAgICBVbHZNYWluQ3RybHI6IFVsdk1haW5DdHJscixcclxuICAgICAgICBGZWF0dXJlczoge1xyXG4gICAgICAgICAgICBXb3JrZmxvdzogZmFsc2UsXHJcbiAgICAgICAgICAgIFRvb2xiYXI6IGZhbHNlLFxyXG4gICAgICAgICAgICBJbmZvQmFyOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgRm9ybVJlcXVlc3RQYXJhbXM6IGZvcm1SZXF1ZXN0UGFyYW1zXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtUGFuZWxDdHJscjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dENvbnRyb2woXHJcbiAgICBjb250cm9sTmFtZTogc3RyaW5nLFxyXG4gICAgY29udHJvbENhcHRpb246IHN0cmluZyA9ICcnLFxyXG4gICAgaGlkZTogYm9vbGVhbiA9IHRydWVcclxuKTogUGFydGlhbDxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbD4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB4dHlwZTogJ0x5LkxheW91dENvbnRyb2wnLFxyXG4gICAgICAgIFR5cGU6ICdMYXlvdXRDb250cm9sSXRlbScsXHJcbiAgICAgICAgQ29udHJvbElkOiBjb250cm9sTmFtZSxcclxuICAgICAgICBJc1ZlcnRpY2FsOiBmYWxzZSxcclxuICAgICAgICBUZXh0TG9jYXRpb246ICdSaWdodCcsXHJcbiAgICAgICAgVGV4dFZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgIFZpc2libGU6ICFoaWRlLFxyXG4gICAgICAgIGhpZGUsXHJcbiAgICAgICAgVXNlTGF5b3V0SXRlbVRleHRGb3JDb250cm9sOiBmYWxzZSxcclxuICAgICAgICBDYXB0aW9uOiBjb250cm9sQ2FwdGlvbixcclxuICAgICAgICBBY2Nlc3NpYmxlTmFtZTogJycsXHJcbiAgICAgICAgQm91bmRzOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiA0MzIsIGhlaWdodDogMjQgfSxcclxuICAgICAgICBNaW5TaXplOiB7IHdpZHRoOiA4OSwgaGVpZ2h0OiAyNCB9LFxyXG4gICAgICAgIE1heFNpemU6IHsgd2lkdGg6IDAsIGhlaWdodDogMjQgfSxcclxuICAgICAgICBDb250cm9sQm91bmRzOiB7IHdpZHRoOiAzODgsIGhlaWdodDogMjAgfSxcclxuICAgICAgICBDb250cm9sTWluU2l6ZTogeyB3aWR0aDogNDUsIGhlaWdodDogMjAgfSxcclxuICAgICAgICBDb250cm9sTWF4U2l6ZTogeyB3aWR0aDogMCwgaGVpZ2h0OiAyMCB9LFxyXG4gICAgICAgIFBhZGRpbmc6IFsyLCAyLCAyLCAyXSxcclxuICAgICAgICBMYWJlbFNpemU6IHsgd2lkdGg6IDM1LCBoZWlnaHQ6IDEzIH0sXHJcbiAgICAgICAgb3JpZ2luYWxYdHlwZTogJydcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sTGlzdChcclxuICAgIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgY29udHJvbERiTmFtZXM6IHN0cmluZ1tdLFxyXG4gICAgaXNTZWFyY2hQYW5lbDogYm9vbGVhbixcclxuICAgIGlzR3JpZEVkaXRvcjogYm9vbGVhblxyXG4pOiBQcm9taXNlPEdlbmVyYWxDb250cm9sSW5mb01vZGVsW10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgQmFyc2FBcGkuQ29tbW9uLkFqYXguR2V0U2VydmVyRGF0YShcclxuICAgICAgICAgICAgJ0Zvcm05NC5HZXRDb250cm9sSW5mb3MnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sSW5mb1BhcmFtZXRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkRGJOYW1lczogY29udHJvbERiTmFtZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgTW86IG5ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYihtbyksXHJcbiAgICAgICAgICAgICAgICAgICAgSXNTZWFyY2hQYW5lbDogaXNTZWFyY2hQYW5lbCxcclxuICAgICAgICAgICAgICAgICAgICBJc0dyaWRFZGl0b3I6IGlzR3JpZEVkaXRvclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAobSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShtKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE56U2FmZUFueSA9IGFueTtcclxuZXhwb3J0IHR5cGUgTnVtYmVySW5wdXQgPSBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsO1xyXG5leHBvcnQgaW50ZXJmYWNlIE5nU3R5bGVJbnRlcmZhY2Uge1xyXG4gICAgW2tsYXNzOiBzdHJpbmddOiBOelNhZmVBbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhhYmxlT2JqZWN0IHtcclxuICAgIFtrZXk6IHN0cmluZ106IE56U2FmZUFueTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakE/OiBJbmRleGFibGVPYmplY3QsIG9iakI/OiBJbmRleGFibGVPYmplY3QpOiBib29sZWFuIHtcclxuICAgIGlmIChvYmpBID09PSBvYmpCKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCAhb2JqQSB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgIW9iakIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcclxuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XHJcblxyXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBrZXlzQVtpZHhdO1xyXG4gICAgICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JqQVtrZXldICE9PSBvYmpCW2tleV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlcjtcclxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyPEQ+KHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZhbGxiYWNrOiBEKTogbnVtYmVyIHwgRDtcclxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZhbGxiYWNrVmFsdWU6IG51bWJlciA9IDApOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIF9pc051bWJlclZhbHVlKHZhbHVlKSA/IE51bWJlcih2YWx1ZSkgOiBmYWxsYmFja1ZhbHVlO1xyXG59XHJcbmZ1bmN0aW9uIHByb3BEZWNvcmF0b3JGYWN0b3J5PFQsIEQ+KFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgZmFsbGJhY2s6ICh2OiBUKSA9PiBEXHJcbik6ICh0YXJnZXQ6IE56U2FmZUFueSwgcHJvcE5hbWU6IHN0cmluZykgPT4gdm9pZCB7XHJcbiAgICBmdW5jdGlvbiBwcm9wRGVjb3JhdG9yKFxyXG4gICAgICAgIHRhcmdldDogTnpTYWZlQW55LFxyXG4gICAgICAgIHByb3BOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgb3JpZ2luYWxEZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8TnpTYWZlQW55PlxyXG4gICAgKTogTnpTYWZlQW55IHtcclxuICAgICAgICBjb25zdCBwcml2YXRlUHJvcE5hbWUgPSBgJCRfX3pvcnJvUHJvcERlY29yYXRvcl9fJHtwcm9wTmFtZX1gO1xyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJpdmF0ZVByb3BOYW1lKSkge1xyXG4gICAgICAgICAgICAvLyB3YXJuKGBUaGUgcHJvcCBcIiR7cHJpdmF0ZVByb3BOYW1lfVwiIGlzIGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgb3ZlcnJpZGVkIGJ5ICR7bmFtZX0gZGVjb3JhdG9yLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJpdmF0ZVByb3BOYW1lLCB7XHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ2V0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdG9yICYmIG9yaWdpbmFsRGVzY3JpcHRvci5nZXRcclxuICAgICAgICAgICAgICAgICAgICA/IG9yaWdpbmFsRGVzY3JpcHRvci5nZXQuYmluZCh0aGlzKSgpXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzW3ByaXZhdGVQcm9wTmFtZV07XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCk6IHZvaWQge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVzY3JpcHRvciAmJiBvcmlnaW5hbERlc2NyaXB0b3Iuc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEZXNjcmlwdG9yLnNldC5iaW5kKHRoaXMpKGZhbGxiYWNrKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzW3ByaXZhdGVQcm9wTmFtZV0gPSBmYWxsYmFjayh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcm9wRGVjb3JhdG9yO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBJbnB1dE51bWJlcihmYWxsYmFja1ZhbHVlPzogTnpTYWZlQW55KTogTnpTYWZlQW55IHtcclxuICAgIHJldHVybiBwcm9wRGVjb3JhdG9yRmFjdG9yeSgnSW5wdXROdW1iZXInLCAodmFsdWU6IHN0cmluZyB8IG51bWJlcikgPT4gdG9OdW1iZXIodmFsdWUsIGZhbGxiYWNrVmFsdWUpKTtcclxufVxyXG5leHBvcnQgZW51bSBBZmZpeFJlc3BvbmRFdmVudHMge1xyXG4gICAgcmVzaXplID0gJ3Jlc2l6ZScsXHJcbiAgICBzY3JvbGwgPSAnc2Nyb2xsJyxcclxuICAgIHRvdWNoc3RhcnQgPSAndG91Y2hzdGFydCcsXHJcbiAgICB0b3VjaG1vdmUgPSAndG91Y2htb3ZlJyxcclxuICAgIHRvdWNoZW5kID0gJ3RvdWNoZW5kJyxcclxuICAgIHBhZ2VzaG93ID0gJ3BhZ2VzaG93JyxcclxuICAgIGxvYWQgPSAnTE9BRCdcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZVJlY3Qge1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuICAgIGhlaWdodD86IG51bWJlcjtcclxuICAgIGJvdHRvbT86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0V2luZG93KHRhcmdldDogRWxlbWVudCB8IFdpbmRvdyk6IHRhcmdldCBpcyBXaW5kb3cge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHRhcmdldCA9PT0gd2luZG93O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0UmVjdCh0YXJnZXQ6IEVsZW1lbnQgfCBXaW5kb3cpOiBTaW1wbGVSZWN0IHtcclxuICAgIHJldHVybiAhaXNUYXJnZXRXaW5kb3codGFyZ2V0KVxyXG4gICAgICAgID8gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgYm90dG9tOiAwXHJcbiAgICAgICAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcsIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBjYXB0aW9uPzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBpZiAobW8uR2V0RlZhbHVlQnlDYXB0aW9uKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG1vLkdldEZWYWx1ZShuYW1lKTtcclxuICAgICAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBtby5HZXRGQ2FwdGlvbihuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYXB0aW9uID09PSAndW5kZWZpbmVkJyAmJiBtby5Jbmhlcml0YW5jZUluZm8gJiYgIShtby4kRmllbGREaWN0ICYmIG1vLiRGaWVsZERpY3RbbmFtZV0pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgUGFyZW50RmllbGROYW1lIH0gPSBtby5Jbmhlcml0YW5jZUluZm87XHJcbiAgICAgICAgICAgIGNvbnN0IG1vUGFyZW50ID0gbW8uR2V0RlZhbHVlKFBhcmVudEZpZWxkTmFtZSk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBtb1BhcmVudC5HZXRGVmFsdWUobmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBtb1BhcmVudC5HZXRGQ2FwdGlvbihuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmllbGROYW1lID0gbW8uJEZpZWxkRGljdCAmJiBtby4kRmllbGREaWN0W25hbWVdID8gbW8uJEZpZWxkRGljdFtuYW1lXSA6IG5hbWU7XHJcbiAgICBsZXQgdmFsID0gbW9bZmllbGROYW1lXTtcclxuICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICAgbGV0IGNhcHRpb25WYWwgPSBtb1tmaWVsZE5hbWVdPy4kQ2FwdGlvbjtcclxuICAgICAgICBpZiAodHlwZW9mIGNhcHRpb25WYWwgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICghY2FwdGlvblZhbCkge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbCA9IG1vW2ZpZWxkTmFtZSArICckQ2FwdGlvbiddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghY2FwdGlvblZhbCkge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbCA9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgPSBjYXB0aW9uVmFsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXHJcbmV4cG9ydCBjb25zdCBhdmFpbGFibGVQcmVmaXhlcyA9IFsnbW96JywgJ21zJywgJ3dlYmtpdCddO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKCk6IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUge1xyXG4gICAgbGV0IGxhc3RUaW1lID0gMDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogYW55IHtcclxuICAgICAgICBjb25zdCBjdXJyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XHJcbiAgICAgICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcclxuICAgICAgICB9LCB0aW1lVG9DYWxsKTtcclxuICAgICAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBFeGVjdXRlRHluYW1pY0NvbW1hbmQoY29tbWFuZDogeyBJZDogc3RyaW5nIH0sIG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IGUgPSB7IGNvbW1hbmQsIER5bmFtaWNTZXR0aW5nOiBtbywgTW86IG1vIH07XHJcbiAgICBCYXJzYUFwaS5Db21tb24uQ3VzdG9tQ29kZU1hbmFnZXIuUnVuRHluYW1pY0NvbW1hbmQoY29tbWFuZC5JZCwgZSk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIEV4ZWN1dGVXb3JrZmxvd0Nob2ljZURlZihzY29wZSwgcGFyYW0sIHN1Y2Nlc3M6IChyZXN1bHQpID0+IHZvaWQsIGZhaWxlZDogKGVycm9yKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBCYXJzYUFwaS5Db21tb24uQWpheC5HZXRTZXJ2ZXJEYXRhKFxyXG4gICAgICAgICdXb3JrZmxvdzk0LkNob2ljZVNlbGVjdCcsXHJcbiAgICAgICAgcGFyYW0sXHJcbiAgICAgICAgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBzdWNjZXNzKHJlc3VsdCk7XHJcbiAgICAgICAgfSwgLy8gc3VjY2Vzc1xyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBmYWlsZWQoZXJyb3IpO1xyXG4gICAgICAgIH0sIC8vICBlcnJvclxyXG4gICAgICAgICgpID0+IHt9LCAvLyBkb1JldHVyblxyXG4gICAgICAgIHNjb3BlLFxyXG4gICAgICAgIHRydWVcclxuICAgICk7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVlc3RBbmltYXRpb25GcmFtZSgpOiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2lzc3Vlcy80NDY1XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZWZpeCA9IGF2YWlsYWJsZVByZWZpeGVzLmZpbHRlcigoa2V5KSA9PiBgJHtrZXl9UmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3cpWzBdO1xyXG5cclxuICAgIHJldHVybiBwcmVmaXggPyAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fVJlcXVlc3RBbmltYXRpb25GcmFtZWBdIDogcmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoKTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGlkOiBudW1iZXIpOiBOelNhZmVBbnkge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcmVmaXggPSBhdmFpbGFibGVQcmVmaXhlcy5maWx0ZXIoXHJcbiAgICAgICAgKGtleSkgPT4gYCR7a2V5fUNhbmNlbEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3cgfHwgYCR7a2V5fUNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZWAgaW4gd2luZG93XHJcbiAgICApWzBdO1xyXG5cclxuICAgIHJldHVybiBwcmVmaXhcclxuICAgICAgICA/IChcclxuICAgICAgICAgICAgICAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fUNhbmNlbEFuaW1hdGlvbkZyYW1lYF0gfHxcclxuICAgICAgICAgICAgICAod2luZG93IGFzIE56U2FmZUFueSlbYCR7cHJlZml4fUNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZWBdXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgIC5jYWxsKHRoaXMsIGlkKVxyXG4gICAgICAgIDogY2xlYXJUaW1lb3V0KGlkKTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRWFzeWluZ0ZuID0gKHQ6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcikgPT4gbnVtYmVyO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVhc2VJbk91dEN1YmljKHQ6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBjYyA9IGMgLSBiO1xyXG4gICAgbGV0IHR0ID0gdCAvIChkIC8gMik7XHJcbiAgICBpZiAodHQgPCAxKSB7XHJcbiAgICAgICAgcmV0dXJuIChjYyAvIDIpICogdHQgKiB0dCAqIHR0ICsgYjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIChjYyAvIDIpICogKCh0dCAtPSAyKSAqIHR0ICogdHQgKyAyKSArIGI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTnpTY3JvbGxUb09wdGlvbnMge1xyXG4gICAgLyoqIEFuaW1hdGlvbiBkdXJhdGlvbiwgZGVmYXVsdCBhcyA0NTAgKi9cclxuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xyXG4gICAgLyoqIFNjcm9sbCBjb250YWluZXIsIGRlZmF1bHQgYXMgd2luZG93ICovXHJcbiAgICBlYXNpbmc/OiBFYXN5aW5nRm47XHJcbiAgICAvKiogU2Nyb2xsIGVuZCBjYWxsYmFjayAqL1xyXG4gICAgY2FsbGJhY2s/KCk6IHZvaWQ7XHJcbn1cclxuZXhwb3J0IGNvbnN0IFdvcmRNaW1lVHlwZSA9XHJcbiAgICAnLmRvYywuZG9jeCxhcHBsaWNhdGlvbi9tc3dvcmQsYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnO1xyXG5leHBvcnQgY29uc3QgSW1hZ2VNaW1lVHlwZSA9ICcuanBlZywuanBnLC5naWYsLnBuZywuYm1wLC50aWYsaW1hZ2UvKic7XHJcbmV4cG9ydCBjb25zdCBQZGZNaW1lVHlwZSA9ICcucGRmJztcclxuZXhwb3J0IGNvbnN0IEFsbEZpbGVzTWltZVR5cGUgPSAnLnR4dCwucHB0LC5wZGYsLionO1xyXG5leHBvcnQgY29uc3QgVmlkZW9NaW1lVHlwZSA9ICd2aWRlby8qJztcclxuZXhwb3J0IGNvbnN0IEF1ZGlvTWltZVR5cGUgPSAnYXVkaW8vKic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQ2hhbmdlTGF5b3V0SW5mb0N1c3RvbVVpKGxheW91dEluZm86IExheW91dFNldHRpbmcsIGNvbXBvbmVudFVpOiBFanJheU9sZ28pOiB2b2lkIHtcclxuICAgIGxheW91dEluZm8uRmllbGRVaS5TZXR0aW5nLkN1c3RvbVVpID0gY29tcG9uZW50VWk7XHJcbn1cclxuZXhwb3J0IGNvbnN0IG1vYmlsZV9yZWdleCA9IG5ldyBSZWdFeHAoJ14oXFxcXCs5OHwwKT85XFxcXGR7OX0kJyk7XHJcbmV4cG9ydCBjb25zdCBudW1iZXJfb25seSA9IG5ldyBSZWdFeHAoJ15bMC05XSskJyk7XHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JiaWRkZW5WYWxpZGF0b3IobmFtZVJlOiBSZWdFeHApOiBWYWxpZGF0b3JGbiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgICAgICBjb25zdCBmb3JiaWRkZW4gPSBuYW1lUmUudGVzdChjb250cm9sLnZhbHVlKTtcclxuICAgICAgICByZXR1cm4gIWZvcmJpZGRlbiA/IHsgZm9yYmlkZGVuTmFtZTogeyB2YWx1ZTogY29udHJvbC52YWx1ZSB9IH0gOiBudWxsO1xyXG4gICAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gR2V0SW1nVGFncyhzZXR0aW5nKSB7XHJcbiAgICBsZXQgc3RyID0gJyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN0ciArPVxyXG4gICAgICAgICAgICBcIjxpbWcgc3JjPSdcIiArXHJcbiAgICAgICAgICAgIHNldHRpbmcuc291cmNlc1tpXSArXHJcbiAgICAgICAgICAgIFwiJyAgY2xhc3M9J1wiICtcclxuICAgICAgICAgICAgZ2V0Q2VudGVyKHNldHRpbmcuaXNDZW50ZXIpICtcclxuICAgICAgICAgICAgXCInICBzdHlsZT0nXCIgK1xyXG4gICAgICAgICAgICBzZXR0aW5nLmN1c3RvbUNzcyArXHJcbiAgICAgICAgICAgIFwiJyAvPiBcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBJbWFnZXRvUHJpbnQoc2V0dGluZykge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICAnPGh0bWw+PGhlYWQ+JyArXHJcbiAgICAgICAgJzxzY3JpcHQgc3JjPVwiL0xpYi9zY3JpcHRzL2pxdWVyeS14Lm1pbi5qc1wiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPVwiTGliL0ltYWdlUHJpbnQvSW1hZ2VQcmludEludGVybmFsLmpzXCI+PC9zY3JpcHQ+JyArXHJcbiAgICAgICAgJzwvaGVhZD48Ym9keSBzdHlsZT1cIm1hcmdpbiA6IDAgMSAwIDFcIj4nICtcclxuICAgICAgICBHZXRJbWdUYWdzKHNldHRpbmcpICtcclxuICAgICAgICAnPC9ib2R5PjwvaHRtbD4nXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUHJpbnRJbWFnZShzZXR0aW5nKSB7XHJcbiAgICBsZXQgcGFnZUxpbmsgPSAnYWJvdXQ6YmxhbmsnO1xyXG4gICAgbGV0IHB3YSA9IHdpbmRvdy5vcGVuKHBhZ2VMaW5rLCAnX25ldycpO1xyXG4gICAgcHdhPy5kb2N1bWVudC5vcGVuKCk7XHJcbiAgICBsZXQgaW1hZ2VUb1ByaW50ID0gSW1hZ2V0b1ByaW50KHNldHRpbmcpO1xyXG4gICAgcHdhPy5kb2N1bWVudC53cml0ZShpbWFnZVRvUHJpbnQpO1xyXG4gICAgcHdhPy5kb2N1bWVudC5jbG9zZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDZW50ZXIoaXNDZW50ZXIpIHtcclxuICAgIGlmIChpc0NlbnRlcikgcmV0dXJuICdjZW50ZXInO1xyXG4gICAgcmV0dXJuICcnO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBTYXZlSW1hZ2VUb0ZpbGUobmFtZTogc3RyaW5nLCBzcmM6IHN0cmluZykge1xyXG4gICAgY29uc3QgdCA9IGdldFVuaXF1ZUlkKDQpO1xyXG4gICAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSBzcmM7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gbmFtZTtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsaW5rLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gICAgfSwgMTApO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFsbEZvcm1GaWVsZHMoZm9ybUdyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIC8vezF9XHJcbiAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgLy97Mn1cclxuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7IC8vezN9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICAvL3s0fVxyXG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgLy97NX1cclxuICAgICAgICAgICAgdmFsaWRhdGVBbGxGb3JtRmllbGRzKGNvbnRyb2wpOyAvL3s2fVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2N1c2FibGVUYWdOYW1lcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBidXR0b24sYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxbaHJlZl0saW5wdXQ6bm90KFtkaXNhYmxlZF0pLGlucHV0LFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0LHNlbGVjdDpub3QoW2Rpc2FibGVkXSksdGV4dGFyZWEsdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFt0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKWA7XHJcbn1cclxuIl19