mmhglobal-dynamicform 1.2.3 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +14 -2
  2. package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
  3. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
  4. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
  5. package/esm2020/lib/services/main.service.mjs +752 -0
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
  7. package/esm2020/lib/services/zcomponent.service.mjs +81 -0
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
  9. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
  10. package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
  11. package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
  12. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
  13. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
  14. package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
  15. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
  16. package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
  17. package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
  18. package/esm2020/lib/zcard/zcard.component.mjs +72 -0
  19. package/esm2020/lib/zchart/zchart.component.mjs +201 -0
  20. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
  21. package/esm2020/lib/zchip/zchip.component.mjs +121 -0
  22. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
  23. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
  24. package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
  25. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
  26. package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
  27. package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
  28. package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
  29. package/esm2020/lib/zform/zform.component.mjs +147 -0
  30. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
  31. package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
  32. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
  33. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
  34. package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
  35. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
  36. package/esm2020/lib/zimg/zimg.component.mjs +121 -0
  37. package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
  38. package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
  39. package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
  40. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
  41. package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
  42. package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
  43. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
  44. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
  45. package/esm2020/lib/zreport/zreport.component.mjs +105 -0
  46. package/esm2020/lib/zreport/zreport.config.mjs +117 -0
  47. package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
  48. package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
  49. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
  51. package/esm2020/lib/ztab/ztab.component.mjs +187 -0
  52. package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
  53. package/esm2020/lib/ztext/ztext.component.mjs +297 -0
  54. package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
  55. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
  56. package/esm2020/lib/ztree/ztree.component.mjs +380 -0
  57. package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
  58. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
  59. package/esm2020/lib/zudf/zudf.component.mjs +205 -0
  60. package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
  61. package/esm2020/lib/zupload/zupload.component.mjs +359 -0
  62. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
  63. package/esm2020/mmhglobal-dynamicform.mjs +5 -0
  64. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  65. package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
  66. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
  67. package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
  68. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
  69. package/lib/directives/fieldelement.directive.d.ts +3 -0
  70. package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
  71. package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
  72. package/lib/services/main.service.d.ts +3 -0
  73. package/lib/services/zcomponent.debug.service.d.ts +8 -5
  74. package/lib/services/zcomponent.service.d.ts +7 -2
  75. package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
  76. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
  77. package/lib/uicontent/uicontent.component.d.ts +3 -0
  78. package/lib/uiheader/uiheader.component.d.ts +3 -0
  79. package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
  80. package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
  81. package/lib/uipage/uipage.component.d.ts +3 -0
  82. package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
  83. package/lib/zbullet/zbullet.component.d.ts +3 -0
  84. package/lib/zbuttons/zbuttons.component.d.ts +3 -0
  85. package/lib/zcard/zcard.component.d.ts +3 -0
  86. package/lib/zchart/zchart.component.d.ts +3 -0
  87. package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
  88. package/lib/zchip/zchip.component.d.ts +3 -0
  89. package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
  90. package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
  91. package/lib/zdaterange/zdaterange.component.d.ts +3 -0
  92. package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
  93. package/lib/zdatetime/zdatetime.component.d.ts +3 -0
  94. package/lib/zdiv/zdiv.component.d.ts +3 -0
  95. package/lib/zdiv/zdiv.pipe.d.ts +3 -0
  96. package/lib/zform/zform.component.d.ts +3 -0
  97. package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
  98. package/lib/zgauge/zgauge.component.d.ts +3 -0
  99. package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
  100. package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
  101. package/lib/zgrid/zgrid.component.d.ts +4 -1
  102. package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
  103. package/lib/zimg/zimg.component.d.ts +3 -0
  104. package/lib/zkcard/zkcard.component.d.ts +3 -0
  105. package/lib/zlabel/zlabel.component.d.ts +3 -0
  106. package/lib/zmfb/zmfb.component.d.ts +3 -0
  107. package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
  108. package/lib/zmodal/zmodal.component.d.ts +3 -0
  109. package/lib/znumeric/znumeric.component.d.ts +3 -0
  110. package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
  111. package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
  112. package/lib/zreport/zreport.component.d.ts +3 -0
  113. package/lib/zreport/zreport.config.d.ts +3 -0
  114. package/lib/zscheduler/zscheduler.component.d.ts +3 -0
  115. package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
  116. package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
  117. package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
  118. package/lib/ztab/ztab.component.d.ts +3 -0
  119. package/lib/ztab/ztab.pipe.d.ts +3 -0
  120. package/lib/ztext/ztext.component.d.ts +3 -0
  121. package/lib/ztextarea/ztextarea.component.d.ts +3 -0
  122. package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
  123. package/lib/ztree/ztree.component.d.ts +3 -0
  124. package/lib/ztreelist/ztreelist.component.d.ts +3 -0
  125. package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
  126. package/lib/zudf/zudf.component.d.ts +3 -0
  127. package/lib/zunknown/zunknown.component.d.ts +3 -0
  128. package/lib/zupload/zupload.component.d.ts +3 -0
  129. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
  130. package/mmhglobal-dynamicform.d.ts +1 -2
  131. package/package.json +20 -11
  132. package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
  133. package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
  134. package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
  135. package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
  136. package/esm2015/lib/directives/fieldelement.directive.js +0 -15
  137. package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
  138. package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
  139. package/esm2015/lib/services/main.service.js +0 -766
  140. package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
  141. package/esm2015/lib/services/zcomponent.service.js +0 -167
  142. package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
  143. package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
  144. package/esm2015/lib/uicontent/uicontent.component.js +0 -41
  145. package/esm2015/lib/uiheader/uiheader.component.js +0 -65
  146. package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
  147. package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
  148. package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
  149. package/esm2015/lib/zbullet/zbullet.component.js +0 -71
  150. package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
  151. package/esm2015/lib/zcard/zcard.component.js +0 -68
  152. package/esm2015/lib/zchart/zchart.component.js +0 -199
  153. package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
  154. package/esm2015/lib/zchip/zchip.component.js +0 -117
  155. package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
  156. package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
  157. package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
  158. package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
  159. package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
  160. package/esm2015/lib/zdiv/zdiv.component.js +0 -48
  161. package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
  162. package/esm2015/lib/zform/zform.component.js +0 -148
  163. package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
  164. package/esm2015/lib/zgauge/zgauge.component.js +0 -146
  165. package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
  166. package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
  167. package/esm2015/lib/zgrid/zgrid.component.js +0 -834
  168. package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
  169. package/esm2015/lib/zimg/zimg.component.js +0 -123
  170. package/esm2015/lib/zkcard/zkcard.component.js +0 -372
  171. package/esm2015/lib/zlabel/zlabel.component.js +0 -59
  172. package/esm2015/lib/zmfb/zmfb.component.js +0 -215
  173. package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
  174. package/esm2015/lib/zmodal/zmodal.component.js +0 -130
  175. package/esm2015/lib/znumeric/znumeric.component.js +0 -114
  176. package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
  177. package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
  178. package/esm2015/lib/zreport/zreport.component.js +0 -104
  179. package/esm2015/lib/zreport/zreport.config.js +0 -115
  180. package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
  181. package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
  182. package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
  183. package/esm2015/lib/ztab/ztab.component.js +0 -180
  184. package/esm2015/lib/ztab/ztab.pipe.js +0 -22
  185. package/esm2015/lib/ztext/ztext.component.js +0 -286
  186. package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
  187. package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
  188. package/esm2015/lib/ztree/ztree.component.js +0 -374
  189. package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
  190. package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
  191. package/esm2015/lib/zudf/zudf.component.js +0 -206
  192. package/esm2015/lib/zunknown/zunknown.component.js +0 -20
  193. package/esm2015/lib/zupload/zupload.component.js +0 -358
  194. package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
  195. package/esm2015/mmhglobal-dynamicform.js +0 -7
  196. package/fesm2015/mmhglobal-dynamicform.js +0 -10729
  197. package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
  198. package/mmhglobal-dynamicform.metadata.json +0 -1
@@ -1,565 +0,0 @@
1
- /********** Angular **********/
2
- import { Component, Input, ViewChild } from "@angular/core";
3
- import { Validators } from "@angular/forms";
4
- /********** Plugin **********/
5
- import { of } from "rxjs";
6
- import { delay } from "rxjs/operators";
7
- /********** Component & Service **********/
8
- import { ResourceApiService, WebApiService, CacheService, ZComponentHelper, ZSelectPostApiParams, ZComponentProperties } from "mmhglobal-zcore";
9
- export class ZselectmultipleComponent {
10
- // private loadInfiniteDataSub: Subject<boolean> = new Subject<boolean>();
11
- constructor(resourceApiService, webApiService, cacheService) {
12
- this.resourceApiService = resourceApiService;
13
- this.webApiService = webApiService;
14
- this.cacheService = cacheService;
15
- this.showTooltipsInfoIcon = false;
16
- this.showTooltipsInfoBySide = false;
17
- this.tooltipsInfo = null;
18
- this.tooltipsDisplayText = null;
19
- this.items = [];
20
- this.infinitezData = [];
21
- this.infiniteSearchText = null;
22
- // subscription: Subscription;
23
- this.toggleSelectable = true;
24
- this.itemValueField = null;
25
- this.itemTextField = null;
26
- this.itemDataField = null;
27
- this.itemTemplate = "{{item[itemTextField]}}";
28
- this.infiniteScrollPageNo = 0;
29
- this.isLoading = true;
30
- this.componentProperties = new ZComponentProperties();
31
- this.allowCustomValue = false;
32
- this.autoClose = true;
33
- this.dataInfo = {
34
- "itemsResourceURL": "",
35
- "optionFilters": "",
36
- "totalCount": 0
37
- };
38
- this.virtual = {
39
- itemHeight: 28,
40
- pageSize: 15
41
- };
42
- // Common function
43
- this.setEnable = (status) => {
44
- const fc = this.group.form.controls[this.data.Value];
45
- status ? fc.enable() : fc.disable();
46
- this.componentProperties.isReadOnly = !status;
47
- };
48
- this.setVisible = (status) => {
49
- this.componentProperties.isVisible = status;
50
- this.data.Visible = status;
51
- };
52
- this.setRequire = (status) => {
53
- this.componentProperties.isRequired = status;
54
- ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
55
- };
56
- }
57
- ngOnDestroy() {
58
- // if (this.subscription) {
59
- // this.subscription.unsubscribe();
60
- // }
61
- if (this.debounceSub) {
62
- this.debounceSub.unsubscribe();
63
- }
64
- }
65
- ngOnInit() {
66
- this.isLoading = true;
67
- ZComponentHelper.setComponentProperties(this);
68
- ZComponentHelper.registerComponent(this);
69
- ZComponentHelper.setSelectMultipleTextValue(this.data.SelectOptions, this);
70
- this.tooltipsInfo = this.data.TooltipsInfo;
71
- if (this.tooltipsInfo) {
72
- if ((this.tooltipsInfo.Icon != null || this.tooltipsInfo.Icon != undefined) && !this.isMobileScreen()) {
73
- this.showTooltipsInfoIcon = true;
74
- this.setTooltipsInfoIcon();
75
- }
76
- if (this.tooltipsInfo.SideBySide) {
77
- this.showTooltipsInfoBySide = true;
78
- }
79
- this.setTooltipsDisplayText();
80
- }
81
- // [Dropdownlist Multiple] - auto close menu when lose focus.
82
- if (this.data.AutoClose === false)
83
- this.autoClose = this.data.AutoClose;
84
- // Handle Clickable Icons
85
- this.iconList = this.data.ClickableIcons;
86
- if (this.iconList) {
87
- if (this.iconList.length > 0) {
88
- this.iconList.forEach((i) => {
89
- if (i.Tooltip === undefined) {
90
- i.Tooltip = "";
91
- }
92
- else {
93
- i.Tooltip = ZComponentHelper.getGroupEvalValue.call(this, i.Tooltip);
94
- }
95
- // Default position top. right | bottom | top | left
96
- if (i.Position === undefined) {
97
- i.Position = "top";
98
- }
99
- });
100
- }
101
- }
102
- // Handle Button beside dropdown
103
- this.buttonList = this.data.ButtonList;
104
- if (this.buttonList) {
105
- this.buttonList.forEach(button => {
106
- if (button.tooltip) {
107
- button.tooltip = ZComponentHelper.getGroupEvalValue.call(this, button.tooltip);
108
- }
109
- });
110
- }
111
- // dropdown configuration
112
- this.allowCustomValue = this.data.AllowCustomValue || false; // Allow enter text in dropdownbox
113
- const fieldValue = this.data.Value;
114
- const data = this.data;
115
- const zModel = this.group.zModel;
116
- /*
117
- * 4 Styles of declare the component�s option list data source.
118
- * Style #1 - Field.SelectOptions defined as an array of object that contain text and value.
119
- * Style #2 - Field.SelectOptions defined as a phase like �item.Id as item.Name for item in group.zData.ProjectOptions�.
120
- * Style #3 - Field.OptionResourceURL defined the name of resource server api.
121
- * Style #4 - Field.InfiniteScroll$ defined the method name as �group.getMoreDataAsScroll�.
122
- */
123
- if (data.HasInfiniteScroll && data.InfiniteScroll$) {
124
- // when infinitie scroll
125
- let recordId = null;
126
- if (zModel && zModel[fieldValue]) {
127
- // get zModel Value
128
- recordId = zModel[fieldValue].toString();
129
- }
130
- let getzDataForzModel$ = ZComponentHelper.getInfiniteData(null, '', this, recordId);
131
- if (getzDataForzModel$) {
132
- getzDataForzModel$.subscribe((zdata) => {
133
- console.log(data.Name, ' - initial zData load: ', zdata);
134
- if (this.group) {
135
- if (this.group.afterLoadzDataOptions) {
136
- this.group.afterLoadzDataOptions(this.group);
137
- }
138
- }
139
- this.isLoading = false;
140
- });
141
- }
142
- else {
143
- this.isLoading = false;
144
- }
145
- if (!ZComponentHelper.isMobileScreen()) {
146
- this.handleFilter(null, true);
147
- }
148
- }
149
- else {
150
- // Style #1, #2, #3
151
- const isRequired = ZComponentHelper.getGroupEvalValue.call(this, data.IsRequired);
152
- if (this.data.OptionResourceURL) {
153
- this.lazyLoadDataOptions().subscribe(res => {
154
- const optionData = res.dataSet ? res.dataSet : res;
155
- if (optionData && optionData.length === 1 && !this.data.DisableAutoFirstSelection) {
156
- this.autoSelectFirstOption(isRequired, optionData[0], fieldValue, zModel.Id);
157
- }
158
- if (this.group) {
159
- if (this.group.afterLoadzDataOptions) {
160
- this.group.afterLoadzDataOptions(this.group);
161
- }
162
- }
163
- this.isLoading = false;
164
- });
165
- }
166
- else {
167
- if (Array.isArray(this.data.SelectOptions) && this.data.SelectOptions) {
168
- //skip eval if selectoptions is exist
169
- }
170
- else {
171
- const optionData = ZComponentHelper.getGroupEvalValue.call(this, this.itemDataField);
172
- // append data via timeout after data is loaded.
173
- if (optionData && optionData.length === 1 && !this.data.DisableAutoFirstSelection) {
174
- const thisComponent = this;
175
- setTimeout(function () {
176
- thisComponent.autoSelectFirstOption(isRequired, optionData[0], fieldValue, thisComponent.group.zModel.Id);
177
- if (this.group) {
178
- if (this.group.afterLoadzDataOptions) {
179
- this.group.afterLoadzDataOptions(this.group);
180
- }
181
- }
182
- }, 100);
183
- }
184
- }
185
- this.isLoading = false;
186
- }
187
- }
188
- }
189
- // Auto select first option (if required & only 1 option)
190
- autoSelectFirstOption(required, data, zModelPropertyName, id) {
191
- if (ZComponentHelper.isNullUndefinedEmpty(id) && required) {
192
- var optionId = data.Id;
193
- if (this.data.Multiple) {
194
- optionId = [optionId];
195
- }
196
- ZComponentHelper.setModelValue(zModelPropertyName, optionId, this.group);
197
- this.group.subject.next({
198
- type: "onChange",
199
- target: this.data.OnChange,
200
- event,
201
- data: { ['value']: optionId, field: this.data }
202
- });
203
- this.form.markAsPristine();
204
- }
205
- }
206
- // Style #3
207
- lazyLoadDataOptions() {
208
- const resourceUrl = this.resourceApiService.getURL(this.data.OptionResourceURL);
209
- const filterParam = new ZSelectPostApiParams();
210
- filterParam.sorts = this.data.OptionSort;
211
- filterParam.columns = this.data.OptionColumns;
212
- filterParam.filters = this.data.OptionFilter;
213
- return ZComponentHelper.getDataOptions(this.data.OptionName, filterParam, this.group, resourceUrl, this.cacheService, this.webApiService, this.data['DisableCache']);
214
- }
215
- // Style #4, used in ionic-selectable
216
- getInfiniteData(event) {
217
- ZComponentHelper.getInfiniteData(event.component, event.text, this);
218
- }
219
- getItemsData() {
220
- if (this.data.HasInfiniteScroll) {
221
- return this.infinitezData;
222
- }
223
- const optionName = this.data.OptionName || this.itemDataField || 'group.zData.' + this.data.Name;
224
- if (Array.isArray(this.data.SelectOptions) && !this.group.zData[optionName.slice(12)]) {
225
- // return selectionOptions;
226
- // return this.data.SelectOptions;
227
- this.group.zData[optionName.slice(12)] = this.data.SelectOptions;
228
- this.itemDataField = optionName;
229
- }
230
- if (optionName.startsWith('zData.')) {
231
- return this.group.zData[optionName.slice(6)] || [];
232
- }
233
- if (optionName.startsWith('group.zData.')) {
234
- return this.group.zData[optionName.slice(12)] || [];
235
- }
236
- if (optionName.startsWith('group.')) {
237
- return this.group[optionName.slice(6)] || [];
238
- }
239
- if (optionName) {
240
- return this.group[optionName] || [];
241
- }
242
- console.warn(this.data.Name, ' - Invalid setting for OptionName: ', optionName);
243
- }
244
- onSearch(event) {
245
- // console.log("At zselectmultiple.component (onSearch): ", event);
246
- // event.component is for mobile only
247
- const component = event.component;
248
- if (component) {
249
- component.startSearch();
250
- component.enableInfiniteScroll();
251
- }
252
- if (this.data.HasInfiniteScroll) {
253
- // If search text, reset page to 0. Get infinite data
254
- if (event.text !== null && event.text !== this.infiniteSearchText) {
255
- this.infiniteScrollPageNo = 0;
256
- this.modelzData = [];
257
- }
258
- this.getInfiniteData(event);
259
- }
260
- else {
261
- // Reset scroll page, empty items
262
- this.infiniteScrollPageNo = 0;
263
- if (component) {
264
- component.items = [];
265
- }
266
- // Filter zData and push to items
267
- const params = {
268
- referId: null,
269
- pageNo: 0,
270
- pageSize: 20,
271
- sortColumnName: "",
272
- sortOrder: "",
273
- sortColumnNames: [],
274
- sortOrders: [],
275
- filterParams: [],
276
- parameters: ""
277
- };
278
- const searchFields = this.data.SearchFields ? this.data.SearchFields : this.itemTextField;
279
- const filteritems = ZComponentHelper.filterSearchItems(this.getItemsData(), event.text, searchFields, params.pageNo, params.pageSize);
280
- if (component) {
281
- const items = component.items.concat(filteritems);
282
- component.items = items;
283
- component.endInfiniteScroll();
284
- component.endSearch();
285
- this.isLoading = false;
286
- }
287
- }
288
- }
289
- handleFilter(value, justOneTime) {
290
- if (this.debounceSub) {
291
- this.debounceSub.unsubscribe();
292
- }
293
- this.debounceSub = of([]).pipe(delay(500)).subscribe(() => {
294
- this.isLoading = true;
295
- this.onSearch({ component: null, text: value });
296
- if (this.group) {
297
- if (this.group.afterLoadzDataOptions) {
298
- this.group.afterLoadzDataOptions(this.group);
299
- }
300
- }
301
- // if (this.loadInfiniteDataSub) {
302
- // this.loadInfiniteDataSub.unsubscribe();
303
- // }
304
- // this.loadInfiniteDataSub = new Subject(false);
305
- // this.handleFilter(null);
306
- // interval(2000).pipe(takeUntil(this.loadInfiniteDataSub)).subscribe(() => {
307
- // this.onSearch({ component: null, text: value });
308
- // if (justOneTime) {
309
- // this.handleClose();
310
- // }
311
- // });
312
- });
313
- }
314
- handleOpen() {
315
- if (this.data.HasInfiniteScroll) {
316
- this.handleFilter(null);
317
- // // if (this.loadInfiniteDataSub) {
318
- // // this.loadInfiniteDataSub.unsubscribe();
319
- // // }
320
- // // this.loadInfiniteDataSub = new Subject();
321
- // // // this.handleFilter(null);
322
- // // interval(3000).pipe(takeUntil(this.loadInfiniteDataSub)).subscribe(() => {
323
- // // this.handleFilter(null);
324
- // // });
325
- }
326
- }
327
- handleClose() {
328
- // if (this.data.HasInfiniteScroll) {
329
- // if (this.loadInfiniteDataSub) {
330
- // this.loadInfiniteDataSub.next(true);
331
- // // this.loadInfiniteDataSub.complete();
332
- // }
333
- // }
334
- }
335
- handleBlur() {
336
- // this.handleClose();
337
- }
338
- getItemTemplate(item, data, group, itemValueField, itemTextField) {
339
- // ToDO: itemValueField and itemTextField
340
- if (this.data.ItemTemplate) {
341
- const getTemplateFunc = ZComponentHelper.getGroupEvalValue.call(this, this.data.ItemTemplate);
342
- return getTemplateFunc({
343
- item,
344
- data,
345
- group,
346
- itemValueField,
347
- itemTextField
348
- });
349
- }
350
- else if (itemTextField) {
351
- return item[itemTextField];
352
- }
353
- else {
354
- // return item[itemTextField];
355
- return Object.values(item).join(", ");
356
- }
357
- }
358
- getReadOnlyValue() {
359
- const readOnlyValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.ReadOnly);
360
- if (typeof readOnlyValue === 'function') {
361
- const callFunc = readOnlyValue.bind(this.group.ctrlScope);
362
- return callFunc(this.group);
363
- }
364
- return readOnlyValue;
365
- }
366
- getIsRequiredValue() {
367
- const IsRequiredValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.IsRequired);
368
- if (typeof IsRequiredValue === 'function') {
369
- const callFunc = IsRequiredValue.bind(this.group.ctrlScope);
370
- return callFunc(this.group);
371
- }
372
- return IsRequiredValue;
373
- }
374
- getGroupValue(value, group) {
375
- return ZComponentHelper.getGroupValue(value, group);
376
- }
377
- getClass(form, data) {
378
- const ionInvalidClass = this.getIon_InvalidClass(form, data);
379
- return `${ionInvalidClass ? ionInvalidClass : ''} ${this.data.Class}`;
380
- }
381
- getIon_InvalidClass(form, data) {
382
- if (!form) {
383
- //debugger;
384
- }
385
- return ZComponentHelper.getIon_InvalidClass(form, data);
386
- }
387
- onAddItem(event) {
388
- const f = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnAddItem);
389
- if (typeof f === 'function') {
390
- const callFunc = f.bind(this.group.ctrlScope);
391
- return callFunc();
392
- }
393
- console.warn('Invalid declaration of OnAddItem: ', f);
394
- return;
395
- }
396
- // Component basic function
397
- clearData() {
398
- ZComponentHelper.setModelValue(this.data.Value, "", this.group);
399
- }
400
- clearItems() {
401
- this.selectComponent.clear();
402
- this.selectComponent.close();
403
- }
404
- confirmItems() {
405
- this.selectComponent.confirm();
406
- this.selectComponent.close();
407
- }
408
- toggleItems() {
409
- this.selectComponent.toggleItems(this.toggleSelectable);
410
- this.toggleSelectable = !this.toggleSelectable;
411
- // Confirm items and close Select page
412
- // without having the user to click Confirm button.
413
- // this.confirm();
414
- }
415
- // Extra icon beside dropdown. Mainly for popup
416
- onIconClick(clickAction) {
417
- this.onNavigateTo(clickAction);
418
- }
419
- onNavigateTo(clickAction) {
420
- const n = ZComponentHelper.getGroupEvalValue.call(this, clickAction);
421
- if (n) {
422
- this.group.subject.next({
423
- type: 'ztext-onNavigateTo',
424
- target: clickAction,
425
- data: this.group.zModel[this.data.Value]
426
- });
427
- }
428
- }
429
- // Disable Open On Focus
430
- disableOpenOnFocus(comboboxComponent) {
431
- if (this.data.DisableOpenOnFocus) {
432
- return null;
433
- }
434
- else {
435
- return comboboxComponent;
436
- }
437
- }
438
- // OnChange
439
- onChangeEvent(value) {
440
- if (this.data.HasInfiniteScroll && !!this.data.InfiniteScroll$) {
441
- const textField = this.itemTextField.toString();
442
- const valueField = this.itemValueField.toString();
443
- let zdataModel = [];
444
- if (value) {
445
- zdataModel = this.infinitezData.filter(x => x[valueField] === value);
446
- this.modelzData = zdataModel.slice();
447
- }
448
- if (this.itemDataField.startsWith('group.zData.')) {
449
- this.group.zData[this.itemDataField.slice(12)] = zdataModel;
450
- }
451
- else if (this.itemDataField.startsWith('group.')) {
452
- this.group[this.itemDataField.slice(6)] = zdataModel;
453
- }
454
- }
455
- this.group.subject.next({
456
- type: "onChange",
457
- target: this.data.OnChange,
458
- event,
459
- data: { value, field: this.data }
460
- });
461
- }
462
- onValueChange(value) {
463
- // console.log("zselectmultiple (onValueChange): ", value);
464
- ZComponentHelper.setModelValue(this.data.Value, value, this.group);
465
- this.onChangeEvent(value);
466
- }
467
- onChange(event) {
468
- console.log("zselectmultiple (onChange): ", event.value);
469
- ZComponentHelper.setModelValue(this.data.Value, event.value, this.group);
470
- const fc = this.form.controls[this.data.Value];
471
- this.handleClose();
472
- if (
473
- // this.data.IsRequired &&
474
- this.getIsRequiredValue() &&
475
- (event.value === null || event.value.length === 0)) {
476
- fc.setErrors({ required: true });
477
- }
478
- else {
479
- fc.setErrors(null);
480
- }
481
- this.onChangeEvent(event.value);
482
- }
483
- setLabelText(newText) {
484
- this.data.Label = newText;
485
- }
486
- isMobileScreen() {
487
- const v = ZComponentHelper.isMobileScreen();
488
- return v;
489
- }
490
- /********** TooltipsInfo **********/
491
- setTooltipsInfoClass() {
492
- if (this.tooltipsInfo && !this.showTooltipsInfoIcon && this.showTooltipsInfoBySide) {
493
- return 'tooltipsinfo-text';
494
- }
495
- return 'tooltipsinfo-text-wide';
496
- }
497
- setTooltipsInfoColor() {
498
- if (this.tooltipsInfo) {
499
- if (this.tooltipsInfo.TextColor) {
500
- return this.tooltipsInfo.TextColor;
501
- }
502
- }
503
- return "#acacac"; // default grey
504
- }
505
- setTooltipsInfoIcon(displayIcon) {
506
- if (this.showTooltipsInfoIcon) {
507
- if (this.tooltipsInfo.Icon != '') {
508
- if (displayIcon) {
509
- this.tooltipsDisplayIcon = displayIcon;
510
- }
511
- else {
512
- this.tooltipsDisplayIcon = this.tooltipsInfo.Icon;
513
- }
514
- }
515
- else {
516
- this.tooltipsDisplayIcon = 'question-circle';
517
- }
518
- }
519
- }
520
- setTooltipsDisplayText(displayText) {
521
- if (this.tooltipsInfo) {
522
- if (displayText) {
523
- this.tooltipsDisplayText = displayText;
524
- }
525
- else {
526
- this.tooltipsDisplayText = this.tooltipsInfo.DisplayText;
527
- }
528
- }
529
- else {
530
- this.tooltipsDisplayText = '<Display text error>';
531
- }
532
- }
533
- setTooltipsInfoSideBySide() {
534
- if (this.tooltipsInfo) {
535
- if (this.showTooltipsInfoBySide && !this.showTooltipsInfoIcon) {
536
- return 'ion-row divselectmultiple tooltipsinfo-right';
537
- }
538
- }
539
- return 'ion-row divselectmultiple';
540
- }
541
- getFontAwesome(iconName) {
542
- return ZComponentHelper.getFontAwesome(iconName);
543
- }
544
- }
545
- ZselectmultipleComponent.decorators = [
546
- { type: Component, args: [{
547
- selector: "app-zselectmultiple",
548
- template: "<ion-item [ngClass]=\"getClass(form, data)\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && isMobileScreen()\">\r\n\r\n <ion-label *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n\r\n <kendo-label *ngIf=\"data.TooltipsInfo && !showTooltipsInfoIcon && !showTooltipsInfoBySide\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n <div [class]=\"setTooltipsInfoSideBySide()\" *ngIf=\"!isLoading\">\r\n <div style=\"flex-grow: 1;\">\r\n <ionic-selectable #selectComponent item-content\r\n searchFailText=\"Nothing found :(\"\r\n headerColor=\"primary\"\r\n clearButtonText=\"Clear\"\r\n [(ngModel)]=\"group.zModel[data.Value]\"\r\n [id]=\"data.Value\"\r\n [items]=\"getItemsData()\"\r\n [itemValueField]=\"itemValueField\"\r\n [itemTextField]=\"itemTextField\"\r\n [canAddItem]=\"!!data.OnAddItem\"\r\n [canClear]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [canSearch]=\"!data['disable-search']\"\r\n [shouldFocusSearchbar]=\"!data['disable-search']\"\r\n [hasInfiniteScroll]=\"!!data.HasInfiniteScroll\"\r\n [isMultiple]=\"data.Multiple\"\r\n [isEnabled]=\"!(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [shouldStoreItemValue]=\"true\"\r\n (onSearch)=\"onSearch($event)\"\r\n (onInfiniteScroll)=\"getInfiniteData($event)\"\r\n (onAddItem)=\"onAddItem($event)\"\r\n (onChange)=\"onChange($event)\">\r\n\r\n <ng-template ionicSelectableItemIconTemplate\r\n let-item=\"item\"\r\n let-isItemSelected=\"isItemSelected\">\r\n <fa-icon slot=\"start\"\r\n class=\"isItemSelected\"\r\n size=\"sm\"\r\n [icon]=\"['far', isItemSelected ? 'check-circle': 'circle']\"\r\n [styles]=\"{'color': isItemSelected ? 'dodgerBlue' : 'lightGray'}\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableCloseButtonTemplate>\r\n <!-- <ion-icon name=\"close-circle\"></ion-icon> -->\r\n <fa-icon [icon]=\"'times-circle'\" size=\"md\"></fa-icon>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableTitleTemplate>\r\n {{data.Label}}\r\n <ion-text *ngIf=\"getIsRequiredValue()\" color=\"danger\">*</ion-text>\r\n </ng-template>\r\n\r\n <ng-template ionicSelectableItemTemplate let-item=\"item\">\r\n {{ getItemTemplate(item, data, group, itemValueField, itemTextField) }}\r\n <!-- <ng-template zselectitemelement [item]=\"item\"></ng-template> -->\r\n </ng-template>\r\n\r\n <!--<ng-template ionicSelectableFooterTemplate>\r\n <ion-toolbar>\r\n <ion-row>\r\n <ion-col>\r\n <ion-button expand=\"full\" ng-reflect-disabled=\"false\" ng-reflect-expand=\"full\" class=\"button button-full button-solid ion-activatable ion-focusable hydrated\" (click)=\"clearItems()\">\r\n Clear\r\n </ion-button>\r\n </ion-col>\r\n <ion-col>\r\n <ion-button expand=\"full\" ng-reflect-disabled=\"false\" ng-reflect-expand=\"full\" class=\"button button-full button-solid ion-activatable ion-focusable hydrated\" (click)=\"confirmItems()\">\r\n OK\r\n </ion-button>\r\n </ion-col>\r\n </ion-row>\r\n </ion-toolbar>\r\n </ng-template>-->\r\n </ionic-selectable>\r\n </div>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n <!-- side by side and desktop tooltipsinfo -->\r\n <kendo-label *ngIf=\"tooltipsInfo && !showTooltipsInfoIcon && showTooltipsInfoBySide\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n </div>\r\n</ion-item>\r\n\r\n\r\n\r\n<ion-item [ngClass]=\"getClass(form, data)\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && !isMobileScreen()\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}}\r\n <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n <span kendoTooltip\r\n *ngIf=\"data.TooltipsInfo && showTooltipsInfoIcon\"\r\n [title]=\"tooltipsDisplayText\">\r\n <fa-icon [icon]=\"tooltipsDisplayIcon\"\r\n class=\"tooltipsinfo-icon\">\r\n </fa-icon>\r\n </span>\r\n </ion-label>\r\n <!-- mobile tooltipsinfo below label-->\r\n <div [class]=\"setTooltipsInfoSideBySide()\">\r\n <div style=\"flex: 1;\">\r\n <kendo-combobox *ngIf=\"!data.Multiple\"\r\n #comboboxComponent\r\n [data]=\"getItemsData()\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [suggest]=\"true\"\r\n [filterable]=\"!!data.HasInfiniteScroll\"\r\n [openOnFocus]=\"disableOpenOnFocus(comboboxComponent)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n [loading]=\"isLoading\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [virtual]=\"virtual\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n style=\"margin-top: 7px; width: 100%;\">\r\n <ng-template kendoComboBoxItemTemplate let-dataItem>\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n <ng-template kendoTextBoxSuffixTemplate>\r\n\r\n <!-- For Validation feature -->\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"\r\n class=\"validation-icon\"></app-uivalidationmessage>\r\n </ng-template>\r\n </kendo-combobox>\r\n <kendo-multiselect *ngIf=\"data.Multiple\"\r\n [data]=\"getItemsData()\"\r\n [valueField]=\"itemValueField\"\r\n [textField]=\"itemTextField\"\r\n [formControlName]=\"data.Value\"\r\n [valuePrimitive]=\"true\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [allowCustom]=\"allowCustomValue\"\r\n [filterable]=\"!!data.HasInfiniteScroll\"\r\n [checkboxes]=\"data.EnableCheckbox\"\r\n [loading]=\"isLoading\"\r\n [autoClose]=\"autoClose\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [ngClass]=\"{'disabled' : (!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)}\"\r\n (valueChange)=\"onValueChange($event)\"\r\n (filterChange)=\"handleFilter($event)\"\r\n (open)=\"handleOpen()\"\r\n (close)=\"handleClose()\"\r\n (blur)=\"handleBlur()\"\r\n style=\"margin-top: 7px; width: 100%;\">\r\n <ng-template kendoMultiSelectItemTemplate let-dataItem>\r\n {{ getItemTemplate(dataItem, data, group, itemValueField, itemTextField) }}\r\n <!-- <span class=\"template\">{{ dataItem.value }}</span> {{ dataItem.text }} -->\r\n </ng-template>\r\n </kendo-multiselect>\r\n </div>\r\n\r\n <div *ngFor=\"let item of iconList\">\r\n <div kendoTooltip style=\"text-align: center; padding-top: 10px;\"\r\n showOn=\"hover\"\r\n [tooltipWidth]=\"item.Width\"\r\n [position]=\"item.Position\">\r\n <span *ngIf=\"!!item && item.Color\"\r\n (click)=\"onIconClick(item.Click)\"\r\n [title]=\"item.Tooltip\"\r\n style=\"margin-top: 10px;\">\r\n <fa-icon [icon]=\"item.Icon\"\r\n [ngStyle]=\"{'padding': '4px 6px', 'color': (item.Color ? item.Color : 'black')}\"></fa-icon>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ion-button *ngFor=\"let button of buttonList; let i = button\"\r\n fill=\"outline\"\r\n color=\"dark\"\r\n size=\"small\"\r\n strong=\"false\"\r\n class=\"button-container\"\r\n style=\"margin-top: 7px;\"\r\n (click)=\"onIconClick(button.click)\"\r\n [hidden]=\"!button.visible\"\r\n [disabled]=\"group.isTriggered || button.disabled\">\r\n <fa-icon *ngIf=\"button.icon\" [icon]=\"getFontAwesome(button.icon)\" style=\"padding-right: 5px;\"></fa-icon>\r\n <span class=\"ion-text-capitalize\">{{ button.text }}</span>\r\n </ion-button>\r\n\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n\r\n <!-- side by side and desktop tooltipsinfo -->\r\n <kendo-label *ngIf=\"tooltipsInfo && !showTooltipsInfoIcon && ((showTooltipsInfoBySide && isMobileScreen()) || !isMobileScreen())\"\r\n [text]=\"tooltipsDisplayText\"\r\n [class]=\"setTooltipsInfoClass()\"\r\n [style.color]=\"setTooltipsInfoColor()\"></kendo-label>\r\n\r\n </div>\r\n</ion-item>\r\n",
549
- styles: ["fa-icon.isItemSelected{display:inline-block;width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:initial!important;font-size:20px;margin-top:10px;margin-bottom:14px;margin-right:unset;margin-inline-end:20px}.gridInlineEdit{--background:transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.divselectmultiple{justify-content:space-between;width:100%;color:#000}.tooltipsinfo-text{margin-left:5px}.tooltipsinfo-text,.tooltipsinfo-text-wide{text-align:justify;text-justify:inter-word;word-wrap:break-word;font-size:10px;margin-top:6px}.tooltipsinfo-text-wide{width:100%;padding-bottom:5px}.tooltipsinfo-right{display:grid;grid-template-columns:1.2fr .05fr 1fr;grid-gap:0}.tooltipsinfo-icon{padding-left:10px;color:#3880ff}"]
550
- },] }
551
- ];
552
- ZselectmultipleComponent.ctorParameters = () => [
553
- { type: ResourceApiService },
554
- { type: WebApiService },
555
- { type: CacheService }
556
- ];
557
- ZselectmultipleComponent.propDecorators = {
558
- data: [{ type: Input }],
559
- group: [{ type: Input }],
560
- form: [{ type: Input }],
561
- iconList: [{ type: Input }],
562
- buttonList: [{ type: Input }],
563
- selectComponent: [{ type: ViewChild, args: ["selectComponent",] }]
564
- };
565
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNlbGVjdG11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pzZWxlY3RtdWx0aXBsZS96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUt2RCw4QkFBOEI7QUFDOUIsT0FBTyxFQUFrRCxFQUFFLEVBQWtCLE1BQU0sTUFBTSxDQUFDO0FBQzFGLE9BQU8sRUFBaUMsS0FBSyxFQUEyQixNQUFNLGdCQUFnQixDQUFDO0FBRS9GLDJDQUEyQztBQUMzQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFDbkMsZ0JBQWdCLEVBQ0csb0JBQW9CLEVBQ25DLG9CQUFvQixFQUNyQyxNQUFNLGlCQUFpQixDQUFDO0FBUXpCLE1BQU0sT0FBTyx3QkFBd0I7SUFtQ25DLDBFQUEwRTtJQUUxRSxZQUNVLGtCQUFzQyxFQUN0QyxhQUE0QixFQUM1QixZQUEwQjtRQUYxQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBaEM3Qix5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDdEMsMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLGlCQUFZLEdBQTJCLElBQUksQ0FBQztRQUM1Qyx3QkFBbUIsR0FBVyxJQUFJLENBQUM7UUFFMUMsVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUV2QixrQkFBYSxHQUFlLEVBQUUsQ0FBQztRQUMvQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFD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S0FBSzt1QkFDTCxLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsU0FBUyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4vKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudCB9IGZyb20gXCJpb25pYy1zZWxlY3RhYmxlXCI7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgaW50ZXJ2YWwsIHRocm93RXJyb3IsIFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRpbWVyIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgdGFwLCBkZWJvdW5jZVRpbWUsIGRlbGF5LCB0aW1lSW50ZXJ2YWwsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQge1xyXG4gIFJlc291cmNlQXBpU2VydmljZSwgV2ViQXBpU2VydmljZSwgQ2FjaGVTZXJ2aWNlLCBDbGlja2FibGVJY29ucywgQnV0dG9uTGlzdCxcclxuICBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMsIFpTZWxlY3RQb3N0QXBpUGFyYW1zLCB6U2VsZWN0TXVsdGlwbGVQYXJhbXMsXHJcbiAgWkdyb3VwLCBaRmllbGQsIFpDb21wb25lbnRQcm9wZXJ0aWVzLCBUb29sdGlwc0luZm9Qcm9wZXJ0aWVzICAgXHJcbn0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC16c2VsZWN0bXVsdGlwbGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3pzZWxlY3RtdWx0aXBsZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96c2VsZWN0bXVsdGlwbGUuY29tcG9uZW50LnNjc3NcIl1cclxufSlcclxuZXhwb3J0IGNsYXNzIFpzZWxlY3RtdWx0aXBsZUNvbXBvbmVudCBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgaWNvbkxpc3Q6IENsaWNrYWJsZUljb25zW107XHJcbiAgQElucHV0KCkgYnV0dG9uTGlzdDogQnV0dG9uTGlzdFtdO1xyXG4gIEBWaWV3Q2hpbGQoXCJzZWxlY3RDb21wb25lbnRcIikgc2VsZWN0Q29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7XHJcblxyXG4gIHB1YmxpYyBzaG93VG9vbHRpcHNJbmZvSWNvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93VG9vbHRpcHNJbmZvQnlTaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRvb2x0aXBzSW5mbzogVG9vbHRpcHNJbmZvUHJvcGVydGllcyA9IG51bGw7XHJcbiAgcHVibGljIHRvb2x0aXBzRGlzcGxheVRleHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIHRvb2x0aXBzRGlzcGxheUljb246IGFueTtcclxuICBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIG1vZGVsekRhdGE6IEFycmF5PGFueT47XHJcbiAgaW5maW5pdGV6RGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGluZmluaXRlU2VhcmNoVGV4dCA9IG51bGw7XHJcbiAgLy8gc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgdG9nZ2xlU2VsZWN0YWJsZSA9IHRydWU7XHJcbiAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbVRleHRGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBpdGVtRGF0YUZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGl0ZW1UZW1wbGF0ZSA9IFwie3tpdGVtW2l0ZW1UZXh0RmllbGRdfX1cIjtcclxuICBpbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICBjb21wb25lbnRQcm9wZXJ0aWVzID0gbmV3IFpDb21wb25lbnRQcm9wZXJ0aWVzKCk7XHJcbiAgcHJpdmF0ZSBkZWJvdW5jZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIGFsbG93Q3VzdG9tVmFsdWUgPSBmYWxzZTtcclxuICBhdXRvQ2xvc2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGRhdGFJbmZvOiB7fSA9IHtcclxuICAgIFwiaXRlbXNSZXNvdXJjZVVSTFwiOiBcIlwiLFxyXG4gICAgXCJvcHRpb25GaWx0ZXJzXCI6IFwiXCIsXHJcbiAgICBcInRvdGFsQ291bnRcIjogMFxyXG4gIH07XHJcblxyXG4gIC8vIHByaXZhdGUgbG9hZEluZmluaXRlRGF0YVN1YjogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgLy8gICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKHRoaXMuZGVib3VuY2VTdWIpIHtcclxuICAgICAgdGhpcy5kZWJvdW5jZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHZpcnR1YWw6IGFueSA9IHtcclxuICAgIGl0ZW1IZWlnaHQ6IDI4LFxyXG4gICAgcGFnZVNpemU6IDE1XHJcbiAgfTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRQcm9wZXJ0aWVzKHRoaXMpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0U2VsZWN0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMudG9vbHRpcHNJbmZvID0gdGhpcy5kYXRhLlRvb2x0aXBzSW5mbztcclxuICAgIGlmICh0aGlzLnRvb2x0aXBzSW5mbykge1xyXG4gICAgICBpZiAoKHRoaXMudG9vbHRpcHNJbmZvLkljb24gIT0gbnVsbCB8fCB0aGlzLnRvb2x0aXBzSW5mby5JY29uICE9IHVuZGVmaW5lZCkgJiYgIXRoaXMuaXNNb2JpbGVTY3JlZW4oKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2x0aXBzSW5mb0ljb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0VG9vbHRpcHNJbmZvSWNvbigpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRvb2x0aXBzSW5mby5TaWRlQnlTaWRlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93VG9vbHRpcHNJbmZvQnlTaWRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZXRUb29sdGlwc0Rpc3BsYXlUZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gW0Ryb3Bkb3dubGlzdCBNdWx0aXBsZV0gLSBhdXRvIGNsb3NlIG1lbnUgd2hlbiBsb3NlIGZvY3VzLlxyXG4gICAgaWYgKHRoaXMuZGF0YS5BdXRvQ2xvc2UgPT09IGZhbHNlKSB0aGlzLmF1dG9DbG9zZSA9IHRoaXMuZGF0YS5BdXRvQ2xvc2U7XHJcblxyXG4gICAgLy8gSGFuZGxlIENsaWNrYWJsZSBJY29uc1xyXG4gICAgdGhpcy5pY29uTGlzdCA9IHRoaXMuZGF0YS5DbGlja2FibGVJY29ucztcclxuICAgIGlmICh0aGlzLmljb25MaXN0KSB7XHJcbiAgICAgIGlmICh0aGlzLmljb25MaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmljb25MaXN0LmZvckVhY2goKGk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGkuVG9vbHRpcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGkuVG9vbHRpcCA9IFwiXCI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpLlRvb2x0aXAgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgaS5Ub29sdGlwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIERlZmF1bHQgcG9zaXRpb24gdG9wLiByaWdodCB8IGJvdHRvbSB8IHRvcCB8IGxlZnRcclxuICAgICAgICAgIGlmIChpLlBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaS5Qb3NpdGlvbiA9IFwidG9wXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGUgQnV0dG9uIGJlc2lkZSBkcm9wZG93blxyXG4gICAgdGhpcy5idXR0b25MaXN0ID0gdGhpcy5kYXRhLkJ1dHRvbkxpc3Q7XHJcbiAgICBpZiAodGhpcy5idXR0b25MaXN0KSB7XHJcbiAgICAgIHRoaXMuYnV0dG9uTGlzdC5mb3JFYWNoKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgaWYgKGJ1dHRvbi50b29sdGlwKSB7XHJcbiAgICAgICAgICBidXR0b24udG9vbHRpcCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCBidXR0b24udG9vbHRpcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZHJvcGRvd24gY29uZmlndXJhdGlvblxyXG4gICAgdGhpcy5hbGxvd0N1c3RvbVZhbHVlID0gdGhpcy5kYXRhLkFsbG93Q3VzdG9tVmFsdWUgfHwgZmFsc2U7IC8vIEFsbG93IGVudGVyIHRleHQgaW4gZHJvcGRvd25ib3hcclxuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuVmFsdWU7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cC56TW9kZWw7XHJcblxyXG4gICAgLypcclxuICAgICAqIDQgU3R5bGVzIG9mIGRlY2xhcmUgdGhlIGNvbXBvbmVudO+/vXMgb3B0aW9uIGxpc3QgZGF0YSBzb3VyY2UuXHJcbiAgICAgKiBTdHlsZSAjMSAtIEZpZWxkLlNlbGVjdE9wdGlvbnMgZGVmaW5lZCBhcyBhbiBhcnJheSBvZiBvYmplY3QgdGhhdCBjb250YWluIHRleHQgYW5kIHZhbHVlLlxyXG4gICAgICogU3R5bGUgIzIgLSBGaWVsZC5TZWxlY3RPcHRpb25zIGRlZmluZWQgYXMgYSBwaGFzZSBsaWtlIO+/vWl0ZW0uSWQgYXMgaXRlbS5OYW1lIGZvciBpdGVtIGluIGdyb3VwLnpEYXRhLlByb2plY3RPcHRpb25z77+9LlxyXG4gICAgICogU3R5bGUgIzMgLSBGaWVsZC5PcHRpb25SZXNvdXJjZVVSTCBkZWZpbmVkIHRoZSBuYW1lIG9mIHJlc291cmNlIHNlcnZlciBhcGkuXHJcbiAgICAgKiBTdHlsZSAjNCAtIEZpZWxkLkluZmluaXRlU2Nyb2xsJCBkZWZpbmVkIHRoZSBtZXRob2QgbmFtZSBhcyDvv71ncm91cC5nZXRNb3JlRGF0YUFzU2Nyb2xs77+9LlxyXG4gICAgICovXHJcblxyXG4gICAgaWYgKGRhdGEuSGFzSW5maW5pdGVTY3JvbGwgJiYgZGF0YS5JbmZpbml0ZVNjcm9sbCQpIHtcclxuICAgICAgLy8gd2hlbiBpbmZpbml0aWUgc2Nyb2xsXHJcbiAgICAgIGxldCByZWNvcmRJZCA9IG51bGw7XHJcbiAgICAgIGlmICh6TW9kZWwgJiYgek1vZGVsW2ZpZWxkVmFsdWVdKSB7XHJcbiAgICAgICAgLy8gZ2V0IHpNb2RlbCBWYWx1ZVxyXG4gICAgICAgIHJlY29yZElkID0gek1vZGVsW2ZpZWxkVmFsdWVdLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBnZXR6RGF0YUZvcnpNb2RlbCQ6IE9ic2VydmFibGU8YW55PiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0SW5maW5pdGVEYXRhKG51bGwsICcnLCB0aGlzLCByZWNvcmRJZCk7XHJcbiAgICAgIGlmIChnZXR6RGF0YUZvcnpNb2RlbCQpIHtcclxuICAgICAgICBnZXR6RGF0YUZvcnpNb2RlbCQuc3Vic2NyaWJlKCh6ZGF0YSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZGF0YS5OYW1lLCAnIC0gaW5pdGlhbCB6RGF0YSBsb2FkOiAnLCB6ZGF0YSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnModGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghWkNvbXBvbmVudEhlbHBlci5pc01vYmlsZVNjcmVlbigpKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXIobnVsbCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBTdHlsZSAjMSwgIzIsICMzXHJcbiAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgZGF0YS5Jc1JlcXVpcmVkKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRhdGEuT3B0aW9uUmVzb3VyY2VVUkwpIHtcclxuICAgICAgICB0aGlzLmxhenlMb2FkRGF0YU9wdGlvbnMoKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbkRhdGEgPSByZXMuZGF0YVNldCA/IHJlcy5kYXRhU2V0IDogcmVzO1xyXG5cclxuICAgICAgICAgIGlmIChvcHRpb25EYXRhICYmIG9wdGlvbkRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmRhdGEuRGlzYWJsZUF1dG9GaXJzdFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdE9wdGlvbihpc1JlcXVpcmVkLCBvcHRpb25EYXRhWzBdLCBmaWVsZFZhbHVlLCB6TW9kZWwuSWQpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwLmFmdGVyTG9hZHpEYXRhT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucykgJiYgdGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpIHtcclxuICAgICAgICAgIC8vc2tpcCBldmFsIGlmIHNlbGVjdG9wdGlvbnMgaXMgZXhpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25EYXRhID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuaXRlbURhdGFGaWVsZCk7XHJcbiAgICAgICAgICAvLyBhcHBlbmQgZGF0YSB2aWEgdGltZW91dCBhZnRlciBkYXRhIGlzIGxvYWRlZC5cclxuICAgICAgICAgIGlmIChvcHRpb25EYXRhICYmIG9wdGlvbkRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmRhdGEuRGlzYWJsZUF1dG9GaXJzdFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzQ29tcG9uZW50ID0gdGhpcztcclxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5hdXRvU2VsZWN0Rmlyc3RPcHRpb24oaXNSZXF1aXJlZCwgb3B0aW9uRGF0YVswXSwgZmllbGRWYWx1ZSwgdGhpc0NvbXBvbmVudC5ncm91cC56TW9kZWwuSWQpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQXV0byBzZWxlY3QgZmlyc3Qgb3B0aW9uIChpZiByZXF1aXJlZCAmIG9ubHkgMSBvcHRpb24pXHJcbiAgcHJpdmF0ZSBhdXRvU2VsZWN0Rmlyc3RPcHRpb24ocmVxdWlyZWQ6IGJvb2xlYW4sIGRhdGE6IGFueSwgek1vZGVsUHJvcGVydHlOYW1lOiBzdHJpbmcsIGlkOiBhbnkpIHtcclxuICAgIGlmIChaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGlkKSAmJiByZXF1aXJlZCkge1xyXG4gICAgICB2YXIgb3B0aW9uSWQgPSBkYXRhLklkO1xyXG4gICAgICBpZiAodGhpcy5kYXRhLk11bHRpcGxlKSB7XHJcbiAgICAgICAgb3B0aW9uSWQgPSBbb3B0aW9uSWRdO1xyXG4gICAgICB9XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh6TW9kZWxQcm9wZXJ0eU5hbWUsIG9wdGlvbklkLCB0aGlzLmdyb3VwKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcIm9uQ2hhbmdlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuT25DaGFuZ2UsXHJcbiAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgZGF0YTogeyBbJ3ZhbHVlJ106IG9wdGlvbklkLCBmaWVsZDogdGhpcy5kYXRhIH1cclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG5cclxuICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTdHlsZSAjM1xyXG4gIGxhenlMb2FkRGF0YU9wdGlvbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlc291cmNlVXJsID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKFxyXG4gICAgICB0aGlzLmRhdGEuT3B0aW9uUmVzb3VyY2VVUkxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyUGFyYW0gPSBuZXcgWlNlbGVjdFBvc3RBcGlQYXJhbXMoKTtcclxuICAgIGZpbHRlclBhcmFtLnNvcnRzID0gdGhpcy5kYXRhLk9wdGlvblNvcnQ7XHJcbiAgICBmaWx0ZXJQYXJhbS5jb2x1bW5zID0gdGhpcy5kYXRhLk9wdGlvbkNvbHVtbnM7XHJcbiAgICBmaWx0ZXJQYXJhbS5maWx0ZXJzID0gdGhpcy5kYXRhLk9wdGlvbkZpbHRlcjtcclxuXHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXREYXRhT3B0aW9ucyhcclxuICAgICAgdGhpcy5kYXRhLk9wdGlvbk5hbWUsXHJcbiAgICAgIGZpbHRlclBhcmFtLFxyXG4gICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICByZXNvdXJjZVVybCxcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UsXHJcbiAgICAgIHRoaXMud2ViQXBpU2VydmljZSxcclxuICAgICAgdGhpcy5kYXRhWydEaXNhYmxlQ2FjaGUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIFN0eWxlICM0LCB1c2VkIGluIGlvbmljLXNlbGVjdGFibGVcclxuICBnZXRJbmZpbml0ZURhdGEoZXZlbnQ6IHtcclxuICAgIGNvbXBvbmVudDogSW9uaWNTZWxlY3RhYmxlQ29tcG9uZW50O1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gIH0pIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0SW5maW5pdGVEYXRhKGV2ZW50LmNvbXBvbmVudCwgZXZlbnQudGV4dCwgdGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtc0RhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkhhc0luZmluaXRlU2Nyb2xsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluZmluaXRlekRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3B0aW9uTmFtZSA9IHRoaXMuZGF0YS5PcHRpb25OYW1lIHx8IHRoaXMuaXRlbURhdGFGaWVsZCB8fCAnZ3JvdXAuekRhdGEuJyArIHRoaXMuZGF0YS5OYW1lO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLlNlbGVjdE9wdGlvbnMpICYmICF0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSkge1xyXG4gICAgICAvLyByZXR1cm4gc2VsZWN0aW9uT3B0aW9ucztcclxuICAgICAgLy8gcmV0dXJuIHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zO1xyXG4gICAgICB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoMTIpXSA9IHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zO1xyXG4gICAgICB0aGlzLml0ZW1EYXRhRmllbGQgPSBvcHRpb25OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25OYW1lLnN0YXJ0c1dpdGgoJ3pEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwLnpEYXRhW29wdGlvbk5hbWUuc2xpY2UoNildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnZ3JvdXAuekRhdGEuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAuekRhdGFbb3B0aW9uTmFtZS5zbGljZSgxMildIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbk5hbWUuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBbb3B0aW9uTmFtZS5zbGljZSg2KV0gfHwgW107XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9uTmFtZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ncm91cFtvcHRpb25OYW1lXSB8fCBbXTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUud2Fybih0aGlzLmRhdGEuTmFtZSwgJyAtIEludmFsaWQgc2V0dGluZyBmb3IgT3B0aW9uTmFtZTogJywgb3B0aW9uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaChldmVudDogeyBjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudDsgdGV4dDogc3RyaW5nIH0pIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiQXQgenNlbGVjdG11bHRpcGxlLmNvbXBvbmVudCAob25TZWFyY2gpOiBcIiwgZXZlbnQpO1xyXG4gICAgLy8gZXZlbnQuY29tcG9uZW50IGlzIGZvciBtb2JpbGUgb25seVxyXG4gICAgY29uc3QgY29tcG9uZW50ID0gZXZlbnQuY29tcG9uZW50O1xyXG4gICAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgICBjb21wb25lbnQuc3RhcnRTZWFyY2goKTtcclxuICAgICAgY29tcG9uZW50LmVuYWJsZUluZmluaXRlU2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICAvLyBJZiBzZWFyY2ggdGV4dCwgcmVzZXQgcGFnZSB0byAwLiBHZXQgaW5maW5pdGUgZGF0YVxyXG4gICAgICBpZiAoZXZlbnQudGV4dCAhPT0gbnVsbCAmJiBldmVudC50ZXh0ICE9PSB0aGlzLmluZmluaXRlU2VhcmNoVGV4dCkge1xyXG4gICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxQYWdlTm8gPSAwO1xyXG4gICAgICAgIHRoaXMubW9kZWx6RGF0YSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ2V0SW5maW5pdGVEYXRhKGV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBSZXNldCBzY3JvbGwgcGFnZSwgZW1wdHkgaXRlbXNcclxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFBhZ2VObyA9IDA7XHJcbiAgICAgIGlmIChjb21wb25lbnQpIHtcclxuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmlsdGVyIHpEYXRhIGFuZCBwdXNoIHRvIGl0ZW1zXHJcbiAgICAgIGNvbnN0IHBhcmFtczogelNlbGVjdE11bHRpcGxlUGFyYW1zID0ge1xyXG4gICAgICAgIHJlZmVySWQ6IG51bGwsXHJcbiAgICAgICAgcGFnZU5vOiAwLFxyXG4gICAgICAgIHBhZ2VTaXplOiAyMCxcclxuICAgICAgICBzb3J0Q29sdW1uTmFtZTogXCJcIixcclxuICAgICAgICBzb3J0T3JkZXI6IFwiXCIsXHJcbiAgICAgICAgc29ydENvbHVtbk5hbWVzOiBbXSxcclxuICAgICAgICBzb3J0T3JkZXJzOiBbXSxcclxuICAgICAgICBmaWx0ZXJQYXJhbXM6IFtdLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFwiXCJcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHNlYXJjaEZpZWxkcyA9IHRoaXMuZGF0YS5TZWFyY2hGaWVsZHMgPyB0aGlzLmRhdGEuU2VhcmNoRmllbGRzIDogdGhpcy5pdGVtVGV4dEZpZWxkO1xyXG4gICAgICBjb25zdCBmaWx0ZXJpdGVtcyA9IFpDb21wb25lbnRIZWxwZXIuZmlsdGVyU2VhcmNoSXRlbXMoXHJcbiAgICAgICAgdGhpcy5nZXRJdGVtc0RhdGEoKSxcclxuICAgICAgICBldmVudC50ZXh0LFxyXG4gICAgICAgIHNlYXJjaEZpZWxkcyxcclxuICAgICAgICBwYXJhbXMucGFnZU5vLFxyXG4gICAgICAgIHBhcmFtcy5wYWdlU2l6ZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBjb21wb25lbnQuaXRlbXMuY29uY2F0KGZpbHRlcml0ZW1zKTtcclxuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcclxuICAgICAgICBjb21wb25lbnQuZW5kSW5maW5pdGVTY3JvbGwoKTtcclxuICAgICAgICBjb21wb25lbnQuZW5kU2VhcmNoKCk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsdGVyKHZhbHVlOiBhbnksIGp1c3RPbmVUaW1lPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuZGVib3VuY2VTdWIpIHtcclxuICAgICAgdGhpcy5kZWJvdW5jZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kZWJvdW5jZVN1YiA9IG9mKFtdKS5waXBlKGRlbGF5KDUwMCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcblxyXG4gICAgICBpZih0aGlzLmdyb3VwKXtcclxuICAgICAgICBpZiAodGhpcy5ncm91cC5hZnRlckxvYWR6RGF0YU9wdGlvbnMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXAuYWZ0ZXJMb2FkekRhdGFPcHRpb25zKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgICAvLyAgIHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1YiA9IG5ldyBTdWJqZWN0KGZhbHNlKTtcclxuICAgICAgLy8gdGhpcy5oYW5kbGVGaWx0ZXIobnVsbCk7XHJcbiAgICAgIC8vIGludGVydmFsKDIwMDApLnBpcGUodGFrZVVudGlsKHRoaXMubG9hZEluZmluaXRlRGF0YVN1YikpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIC8vICAgdGhpcy5vblNlYXJjaCh7IGNvbXBvbmVudDogbnVsbCwgdGV4dDogdmFsdWUgfSk7XHJcbiAgICAgIC8vICAgaWYgKGp1c3RPbmVUaW1lKSB7XHJcbiAgICAgIC8vICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlT3BlbigpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuSGFzSW5maW5pdGVTY3JvbGwpIHtcclxuICAgICAgdGhpcy5oYW5kbGVGaWx0ZXIobnVsbCk7XHJcbiAgICAgIC8vICAgLy8gaWYgKHRoaXMubG9hZEluZmluaXRlRGF0YVN1Yikge1xyXG4gICAgICAvLyAgIC8vICAgdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIC8vICAgLy8gfVxyXG4gICAgICAvLyAgIC8vIHRoaXMubG9hZEluZmluaXRlRGF0YVN1YiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgICAgIC8vICAgLy8gLy8gdGhpcy5oYW5kbGVGaWx0ZXIobnVsbCk7XHJcbiAgICAgIC8vICAgLy8gaW50ZXJ2YWwoMzAwMCkucGlwZSh0YWtlVW50aWwodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gICAvLyB0aGlzLmhhbmRsZUZpbHRlcihudWxsKTtcclxuICAgICAgLy8gICAvLyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUNsb3NlKCkge1xyXG4gICAgLy8gaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgLy8gICBpZiAodGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViKSB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViLm5leHQodHJ1ZSk7XHJcbiAgICAvLyAgICAgLy8gdGhpcy5sb2FkSW5maW5pdGVEYXRhU3ViLmNvbXBsZXRlKCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUJsdXIoKSB7XHJcbiAgICAvLyB0aGlzLmhhbmRsZUNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtVGVtcGxhdGUoXHJcbiAgICBpdGVtOiBhbnksXHJcbiAgICBkYXRhOiBhbnksXHJcbiAgICBncm91cDogYW55LFxyXG4gICAgaXRlbVZhbHVlRmllbGQ6IHN0cmluZyxcclxuICAgIGl0ZW1UZXh0RmllbGQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgLy8gVG9ETzogaXRlbVZhbHVlRmllbGQgYW5kIGl0ZW1UZXh0RmllbGRcclxuICAgIGlmICh0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGdldFRlbXBsYXRlRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXRlbVRlbXBsYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiBnZXRUZW1wbGF0ZUZ1bmMoe1xyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBncm91cCxcclxuICAgICAgICBpdGVtVmFsdWVGaWVsZCxcclxuICAgICAgICBpdGVtVGV4dEZpZWxkXHJcbiAgICAgIH0gYXMgWlNlbGVjdE11bHRpcGxlVGVtcGxhdGVQYXJhbXMpO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtVGV4dEZpZWxkKSB7XHJcbiAgICAgIHJldHVybiBpdGVtW2l0ZW1UZXh0RmllbGRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmV0dXJuIGl0ZW1baXRlbVRleHRGaWVsZF07XHJcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGl0ZW0pLmpvaW4oXCIsIFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlYWRPbmx5VmFsdWUoKSB7XHJcbiAgICBjb25zdCByZWFkT25seVZhbHVlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5SZWFkT25seSk7XHJcbiAgICBpZiAodHlwZW9mIHJlYWRPbmx5VmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgY2FsbEZ1bmMgPSByZWFkT25seVZhbHVlLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICByZXR1cm4gY2FsbEZ1bmModGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVhZE9ubHlWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldElzUmVxdWlyZWRWYWx1ZSgpIHtcclxuICAgIGNvbnN0IElzUmVxdWlyZWRWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXNSZXF1aXJlZCk7XHJcbiAgICBpZiAodHlwZW9mIElzUmVxdWlyZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCBjYWxsRnVuYyA9IElzUmVxdWlyZWRWYWx1ZS5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKHRoaXMuZ3JvdXApO1xyXG5cclxuICAgIH1cclxuICAgIHJldHVybiBJc1JlcXVpcmVkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXRHcm91cFZhbHVlKHZhbHVlOiBzdHJpbmcsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodmFsdWUsIGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGdldENsYXNzKGZvcm06IEZvcm1Hcm91cCwgZGF0YTogWkZpZWxkKSB7XHJcbiAgICBjb25zdCBpb25JbnZhbGlkQ2xhc3MgPSB0aGlzLmdldElvbl9JbnZhbGlkQ2xhc3MoZm9ybSwgZGF0YSk7XHJcbiAgICByZXR1cm4gYCR7aW9uSW52YWxpZENsYXNzID8gaW9uSW52YWxpZENsYXNzIDogJyd9ICR7dGhpcy5kYXRhLkNsYXNzfWA7XHJcbiAgfVxyXG5cclxuICBnZXRJb25fSW52YWxpZENsYXNzKGZvcm06IEZvcm1Hcm91cCwgZGF0YTogWkZpZWxkKSB7XHJcbiAgICBpZiAoIWZvcm0pIHtcclxuICAgICAgLy9kZWJ1Z2dlcjtcclxuICAgIH1cclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLmdldElvbl9JbnZhbGlkQ2xhc3MoZm9ybSwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBvbkFkZEl0ZW0oZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZiA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25BZGRJdGVtKTtcclxuICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCBjYWxsRnVuYyA9IGYuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgIHJldHVybiBjYWxsRnVuYygpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGRlY2xhcmF0aW9uIG9mIE9uQWRkSXRlbTogJywgZik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLyBDb21wb25lbnQgYmFzaWMgZnVuY3Rpb25cclxuICBjbGVhckRhdGEoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCBcIlwiLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG4gIGNsZWFySXRlbXMoKSB7XHJcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5jbGVhcigpO1xyXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1JdGVtcygpIHtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNvbmZpcm0oKTtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVJdGVtcygpIHtcclxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LnRvZ2dsZUl0ZW1zKHRoaXMudG9nZ2xlU2VsZWN0YWJsZSk7XHJcbiAgICB0aGlzLnRvZ2dsZVNlbGVjdGFibGUgPSAhdGhpcy50b2dnbGVTZWxlY3RhYmxlO1xyXG5cclxuICAgIC8vIENvbmZpcm0gaXRlbXMgYW5kIGNsb3NlIFNlbGVjdCBwYWdlXHJcbiAgICAvLyB3aXRob3V0IGhhdmluZyB0aGUgdXNlciB0byBjbGljayBDb25maXJtIGJ1dHRvbi5cclxuICAgIC8vIHRoaXMuY29uZmlybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gRXh0cmEgaWNvbiBiZXNpZGUgZHJvcGRvd24uIE1haW5seSBmb3IgcG9wdXBcclxuICBvbkljb25DbGljayhjbGlja0FjdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGVUbyhjbGlja0FjdGlvbik7IFxyXG4gIH1cclxuXHJcbiAgb25OYXZpZ2F0ZVRvKGNsaWNrQWN0aW9uOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG4gPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgY2xpY2tBY3Rpb24pO1xyXG4gICAgaWYgKG4pIHtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6ICd6dGV4dC1vbk5hdmlnYXRlVG8nLFxyXG4gICAgICAgIHRhcmdldDogY2xpY2tBY3Rpb24sXHJcbiAgICAgICAgZGF0YTogdGhpcy5ncm91cC56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBEaXNhYmxlIE9wZW4gT24gRm9jdXNcclxuICBkaXNhYmxlT3Blbk9uRm9jdXMoY29tYm9ib3hDb21wb25lbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EaXNhYmxlT3Blbk9uRm9jdXMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbWJvYm94Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gT25DaGFuZ2VcclxuICBwcml2YXRlIG9uQ2hhbmdlRXZlbnQodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5IYXNJbmZpbml0ZVNjcm9sbCAmJiAhIXRoaXMuZGF0YS5JbmZpbml0ZVNjcm9sbCQpIHtcclxuICAgICAgY29uc3QgdGV4dEZpZWxkID0gdGhpcy5pdGVtVGV4dEZpZWxkLnRvU3RyaW5nKCk7XHJcbiAgICAgIGNvbnN0IHZhbHVlRmllbGQgPSB0aGlzLml0ZW1WYWx1ZUZpZWxkLnRvU3RyaW5nKCk7XHJcbiAgICAgIGxldCB6ZGF0YU1vZGVsID0gW107XHJcbiAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgIHpkYXRhTW9kZWwgPSB0aGlzLmluZmluaXRlekRhdGEuZmlsdGVyKHggPT4geFt2YWx1ZUZpZWxkXSA9PT0gdmFsdWUpO1xyXG4gICAgICAgIHRoaXMubW9kZWx6RGF0YSA9IHpkYXRhTW9kZWwuc2xpY2UoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pdGVtRGF0YUZpZWxkLnN0YXJ0c1dpdGgoJ2dyb3VwLnpEYXRhLicpKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cC56RGF0YVt0aGlzLml0ZW1EYXRhRmllbGQuc2xpY2UoMTIpXSA9IHpkYXRhTW9kZWw7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pdGVtRGF0YUZpZWxkLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cFt0aGlzLml0ZW1EYXRhRmllbGQuc2xpY2UoNildID0gemRhdGFNb2RlbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgdHlwZTogXCJvbkNoYW5nZVwiLFxyXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YS5PbkNoYW5nZSxcclxuICAgICAgZXZlbnQsXHJcbiAgICAgIGRhdGE6IHsgdmFsdWUsIGZpZWxkOiB0aGlzLmRhdGEgfVxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25WYWx1ZUNoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInpzZWxlY3RtdWx0aXBsZSAob25WYWx1ZUNoYW5nZSk6IFwiLCB2YWx1ZSk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCB2YWx1ZSwgdGhpcy5ncm91cCk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRXZlbnQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2UoZXZlbnQ6IHsgY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQ7IHZhbHVlOiBhbnkgfSkge1xyXG4gICAgY29uc29sZS5sb2coXCJ6c2VsZWN0bXVsdGlwbGUgKG9uQ2hhbmdlKTogXCIsIGV2ZW50LnZhbHVlKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzLmRhdGEuVmFsdWUsIGV2ZW50LnZhbHVlLCB0aGlzLmdyb3VwKTtcclxuICAgIGNvbnN0IGZjID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAvLyB0aGlzLmRhdGEuSXNSZXF1aXJlZCAmJlxyXG4gICAgICB0aGlzLmdldElzUmVxdWlyZWRWYWx1ZSgpICYmXHJcbiAgICAgIChldmVudC52YWx1ZSA9PT0gbnVsbCB8fCBldmVudC52YWx1ZS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgZmMuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYy5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZUV2ZW50KGV2ZW50LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIENvbW1vbiBmdW5jdGlvblxyXG4gIHB1YmxpYyBzZXRFbmFibGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCBmYyA9IHRoaXMuZ3JvdXAuZm9ybS5jb250cm9sc1t0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgc3RhdHVzID8gZmMuZW5hYmxlKCkgOiBmYy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSA9ICFzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUgPSBzdGF0dXM7XHJcbiAgICB0aGlzLmRhdGEuVmlzaWJsZSA9IHN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSZXF1aXJlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQgPSBzdGF0dXM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmNoYW5nZVZhbGlkYXRvcihzdGF0dXMsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSwgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRMYWJlbFRleHQobmV3VGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRhdGEuTGFiZWwgPSBuZXdUZXh0O1xyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGVTY3JlZW4oKSB7XHJcbiAgICBjb25zdCB2ID0gWkNvbXBvbmVudEhlbHBlci5pc01vYmlsZVNjcmVlbigpO1xyXG4gICAgcmV0dXJuIHY7XHJcbiAgfVxyXG5cclxuICAvKioqKioqKioqKiBUb29sdGlwc0luZm8gKioqKioqKioqKi9cclxuICBwdWJsaWMgc2V0VG9vbHRpcHNJbmZvQ2xhc3MoKSB7XHJcbiAgICBpZiAodGhpcy50b29sdGlwc0luZm8gJiYgIXRoaXMuc2hvd1Rvb2x0aXBzSW5mb0ljb24gJiYgdGhpcy5zaG93VG9vbHRpcHNJbmZvQnlTaWRlKSB7XHJcbiAgICAgIHJldHVybiAndG9vbHRpcHNpbmZvLXRleHQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICd0b29sdGlwc2luZm8tdGV4dC13aWRlJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUb29sdGlwc0luZm9Db2xvcigpIHtcclxuICAgIGlmICh0aGlzLnRvb2x0aXBzSW5mbykge1xyXG4gICAgICBpZiAodGhpcy50b29sdGlwc0luZm8uVGV4dENvbG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbHRpcHNJbmZvLlRleHRDb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBcIiNhY2FjYWNcIjsgLy8gZGVmYXVsdCBncmV5XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VG9vbHRpcHNJbmZvSWNvbihkaXNwbGF5SWNvbj86IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc2hvd1Rvb2x0aXBzSW5mb0ljb24pIHtcclxuICAgICAgaWYgKHRoaXMudG9vbHRpcHNJbmZvLkljb24gIT0gJycpIHtcclxuICAgICAgICBpZiAoZGlzcGxheUljb24pIHtcclxuICAgICAgICAgIHRoaXMudG9vbHRpcHNEaXNwbGF5SWNvbiA9IGRpc3BsYXlJY29uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9vbHRpcHNEaXNwbGF5SWNvbiA9IHRoaXMudG9vbHRpcHNJbmZvLkljb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcHNEaXNwbGF5SWNvbiA9ICdxdWVzdGlvbi1jaXJjbGUnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUb29sdGlwc0Rpc3BsYXlUZXh0KGRpc3BsYXlUZXh0Pzogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy50b29sdGlwc0luZm8pIHtcclxuICAgICAgaWYgKGRpc3BsYXlUZXh0KSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwc0Rpc3BsYXlUZXh0ID0gZGlzcGxheVRleHQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwc0Rpc3BsYXlUZXh0ID0gdGhpcy50b29sdGlwc0luZm8uRGlzcGxheVRleHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvb2x0aXBzRGlzcGxheVRleHQgPSAnPERpc3BsYXkgdGV4dCBlcnJvcj4nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRvb2x0aXBzSW5mb1NpZGVCeVNpZGUoKSB7XHJcbiAgICBpZiAodGhpcy50b29sdGlwc0luZm8pIHtcclxuICAgICAgaWYgKHRoaXMuc2hvd1Rvb2x0aXBzSW5mb0J5U2lkZSAmJiAhdGhpcy5zaG93VG9vbHRpcHNJbmZvSWNvbiApIHtcclxuICAgICAgICByZXR1cm4gJ2lvbi1yb3cgZGl2c2VsZWN0bXVsdGlwbGUgdG9vbHRpcHNpbmZvLXJpZ2h0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICdpb24tcm93IGRpdnNlbGVjdG11bHRpcGxlJztcclxuICB9XHJcbiAgIFxyXG4gIHB1YmxpYyBnZXRGb250QXdlc29tZShpY29uTmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRGb250QXdlc29tZShpY29uTmFtZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==