ps-toolkit-ui 1.20.91 → 1.21.32

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 (169) hide show
  1. package/fesm2022/ps-toolkit-ui.mjs +9415 -0
  2. package/fesm2022/ps-toolkit-ui.mjs.map +1 -0
  3. package/package.json +16 -12
  4. package/types/ps-toolkit-ui.d.ts +1671 -0
  5. package/bundles/ps-toolkit-ui.umd.js +0 -10321
  6. package/bundles/ps-toolkit-ui.umd.js.map +0 -1
  7. package/bundles/ps-toolkit-ui.umd.min.js +0 -2
  8. package/bundles/ps-toolkit-ui.umd.min.js.map +0 -1
  9. package/esm2015/lib/classes/addModal.class.js +0 -36
  10. package/esm2015/lib/classes/chart.class.js +0 -165
  11. package/esm2015/lib/classes/currentDataClass.js +0 -17
  12. package/esm2015/lib/classes/enum.class.js +0 -253
  13. package/esm2015/lib/classes/excel.class.js +0 -56
  14. package/esm2015/lib/classes/form.class.js +0 -667
  15. package/esm2015/lib/classes/header.class.js +0 -16
  16. package/esm2015/lib/classes/helper.class.js +0 -650
  17. package/esm2015/lib/classes/lang.class.js +0 -35
  18. package/esm2015/lib/classes/login.class.js +0 -29
  19. package/esm2015/lib/classes/modal.class.js +0 -49
  20. package/esm2015/lib/classes/permission.class.js +0 -63
  21. package/esm2015/lib/classes/request.class.js +0 -155
  22. package/esm2015/lib/classes/safehtml.class.js +0 -17
  23. package/esm2015/lib/classes/safestyle.class.js +0 -17
  24. package/esm2015/lib/classes/sidebar.class.js +0 -16
  25. package/esm2015/lib/classes/steps.class.js +0 -45
  26. package/esm2015/lib/classes/string.class.js +0 -251
  27. package/esm2015/lib/classes/table.class.js +0 -593
  28. package/esm2015/lib/components/accordion/accordion.component.js +0 -45
  29. package/esm2015/lib/components/alert/alert.component.js +0 -39
  30. package/esm2015/lib/components/base.component.js +0 -54
  31. package/esm2015/lib/components/calendar/calendar.component.js +0 -98
  32. package/esm2015/lib/components/chart/chart.component.js +0 -17
  33. package/esm2015/lib/components/clock/clock.component.js +0 -33
  34. package/esm2015/lib/components/confirm/confirm.component.js +0 -50
  35. package/esm2015/lib/components/error/error.component.js +0 -26
  36. package/esm2015/lib/components/footer/footer.component.js +0 -23
  37. package/esm2015/lib/components/form/bank-card/form.bank-card.component.js +0 -200
  38. package/esm2015/lib/components/form/button/form.button.component.js +0 -68
  39. package/esm2015/lib/components/form/checkbox/form.checkbox.component.js +0 -67
  40. package/esm2015/lib/components/form/ckeditor/form.ckeditor.component.js +0 -90
  41. package/esm2015/lib/components/form/date/form.date.component.js +0 -314
  42. package/esm2015/lib/components/form/datetime/form.datetime.component.js +0 -106
  43. package/esm2015/lib/components/form/file/form.file.component.js +0 -124
  44. package/esm2015/lib/components/form/finger/form.finger.component.js +0 -140
  45. package/esm2015/lib/components/form/hidden/form.hidden.component.js +0 -31
  46. package/esm2015/lib/components/form/icon/form.icon.component.js +0 -84
  47. package/esm2015/lib/components/form/index/form.component.js +0 -51
  48. package/esm2015/lib/components/form/label/form.label.component.js +0 -32
  49. package/esm2015/lib/components/form/plaque/form.plaque.component.js +0 -258
  50. package/esm2015/lib/components/form/plaque/select/form.plaque.select.component.js +0 -468
  51. package/esm2015/lib/components/form/radio/form.radio.component.js +0 -82
  52. package/esm2015/lib/components/form/select/form.select.component.js +0 -452
  53. package/esm2015/lib/components/form/select/item/form.select.item.component.js +0 -27
  54. package/esm2015/lib/components/form/slide/form.slide.component.js +0 -84
  55. package/esm2015/lib/components/form/star/form.star.component.js +0 -66
  56. package/esm2015/lib/components/form/table/form.table.component.js +0 -96
  57. package/esm2015/lib/components/form/tag/form.tag.component.js +0 -100
  58. package/esm2015/lib/components/form/textarea/form.textarea.component.js +0 -83
  59. package/esm2015/lib/components/form/textbox/form.textbox.component.js +0 -227
  60. package/esm2015/lib/components/form/time/form.time.component.js +0 -149
  61. package/esm2015/lib/components/form/toggle/form.toggle.component.js +0 -72
  62. package/esm2015/lib/components/form/tree/form.tree.component.js +0 -157
  63. package/esm2015/lib/components/form/tree/item/form.tree.item.component.js +0 -50
  64. package/esm2015/lib/components/form/uploader/form.uploader.component.js +0 -159
  65. package/esm2015/lib/components/form/vehicle/form.vehicle.component.js +0 -104
  66. package/esm2015/lib/components/form/vehicle/search/form.vehicle.search.component.js +0 -237
  67. package/esm2015/lib/components/header/header.component.js +0 -28
  68. package/esm2015/lib/components/header/sub/sub.header.component.js +0 -14
  69. package/esm2015/lib/components/layout/layout.component.js +0 -18
  70. package/esm2015/lib/components/loading/loading.component.js +0 -22
  71. package/esm2015/lib/components/login/login.component.js +0 -159
  72. package/esm2015/lib/components/modal/modal.component.js +0 -25
  73. package/esm2015/lib/components/notfound/notfound.component.js +0 -29
  74. package/esm2015/lib/components/notification/notification.component.js +0 -14
  75. package/esm2015/lib/components/sidebar/item/sidebar.item.component.js +0 -55
  76. package/esm2015/lib/components/sidebar/sidebar.component.js +0 -98
  77. package/esm2015/lib/components/steps/steps.component.js +0 -88
  78. package/esm2015/lib/components/table/loading/table.loading.component.js +0 -17
  79. package/esm2015/lib/components/table/pagination/table.pagination.component.js +0 -84
  80. package/esm2015/lib/components/table/row/table.row.component.js +0 -450
  81. package/esm2015/lib/components/table/table.component.js +0 -240
  82. package/esm2015/lib/components/tooltip/tooltip.component.js +0 -19
  83. package/esm2015/lib/ps-toolkit-ui.module.js +0 -105
  84. package/esm2015/lib/services/config.service.js +0 -14
  85. package/esm2015/lib/services/sidebar.service.js +0 -21
  86. package/esm2015/ps-toolkit-ui.js +0 -21
  87. package/esm2015/public-api.js +0 -64
  88. package/fesm2015/ps-toolkit-ui.js +0 -8926
  89. package/fesm2015/ps-toolkit-ui.js.map +0 -1
  90. package/lib/classes/addModal.class.d.ts +0 -14
  91. package/lib/classes/chart.class.d.ts +0 -15
  92. package/lib/classes/currentDataClass.d.ts +0 -10
  93. package/lib/classes/enum.class.d.ts +0 -221
  94. package/lib/classes/excel.class.d.ts +0 -8
  95. package/lib/classes/form.class.d.ts +0 -193
  96. package/lib/classes/header.class.d.ts +0 -8
  97. package/lib/classes/helper.class.d.ts +0 -50
  98. package/lib/classes/lang.class.d.ts +0 -5
  99. package/lib/classes/login.class.d.ts +0 -21
  100. package/lib/classes/modal.class.d.ts +0 -19
  101. package/lib/classes/permission.class.d.ts +0 -35
  102. package/lib/classes/request.class.d.ts +0 -10
  103. package/lib/classes/safehtml.class.d.ts +0 -7
  104. package/lib/classes/safestyle.class.d.ts +0 -7
  105. package/lib/classes/sidebar.class.d.ts +0 -14
  106. package/lib/classes/steps.class.d.ts +0 -31
  107. package/lib/classes/string.class.d.ts +0 -249
  108. package/lib/classes/table.class.d.ts +0 -88
  109. package/lib/components/accordion/accordion.component.d.ts +0 -7
  110. package/lib/components/alert/alert.component.d.ts +0 -10
  111. package/lib/components/base.component.d.ts +0 -17
  112. package/lib/components/calendar/calendar.component.d.ts +0 -26
  113. package/lib/components/chart/chart.component.d.ts +0 -5
  114. package/lib/components/clock/clock.component.d.ts +0 -11
  115. package/lib/components/confirm/confirm.component.d.ts +0 -14
  116. package/lib/components/error/error.component.d.ts +0 -7
  117. package/lib/components/footer/footer.component.d.ts +0 -6
  118. package/lib/components/form/bank-card/form.bank-card.component.d.ts +0 -28
  119. package/lib/components/form/button/form.button.component.d.ts +0 -15
  120. package/lib/components/form/checkbox/form.checkbox.component.d.ts +0 -14
  121. package/lib/components/form/ckeditor/form.ckeditor.component.d.ts +0 -14
  122. package/lib/components/form/date/form.date.component.d.ts +0 -45
  123. package/lib/components/form/datetime/form.datetime.component.d.ts +0 -13
  124. package/lib/components/form/file/form.file.component.d.ts +0 -18
  125. package/lib/components/form/finger/form.finger.component.d.ts +0 -15
  126. package/lib/components/form/hidden/form.hidden.component.d.ts +0 -7
  127. package/lib/components/form/icon/form.icon.component.d.ts +0 -16
  128. package/lib/components/form/index/form.component.d.ts +0 -10
  129. package/lib/components/form/label/form.label.component.d.ts +0 -8
  130. package/lib/components/form/plaque/form.plaque.component.d.ts +0 -21
  131. package/lib/components/form/plaque/select/form.plaque.select.component.d.ts +0 -38
  132. package/lib/components/form/radio/form.radio.component.d.ts +0 -13
  133. package/lib/components/form/select/form.select.component.d.ts +0 -45
  134. package/lib/components/form/select/item/form.select.item.component.d.ts +0 -12
  135. package/lib/components/form/slide/form.slide.component.d.ts +0 -13
  136. package/lib/components/form/star/form.star.component.d.ts +0 -13
  137. package/lib/components/form/table/form.table.component.d.ts +0 -9
  138. package/lib/components/form/tag/form.tag.component.d.ts +0 -16
  139. package/lib/components/form/textarea/form.textarea.component.d.ts +0 -13
  140. package/lib/components/form/textbox/form.textbox.component.d.ts +0 -20
  141. package/lib/components/form/time/form.time.component.d.ts +0 -25
  142. package/lib/components/form/toggle/form.toggle.component.d.ts +0 -13
  143. package/lib/components/form/tree/form.tree.component.d.ts +0 -21
  144. package/lib/components/form/tree/item/form.tree.item.component.d.ts +0 -19
  145. package/lib/components/form/uploader/form.uploader.component.d.ts +0 -21
  146. package/lib/components/form/vehicle/form.vehicle.component.d.ts +0 -18
  147. package/lib/components/form/vehicle/search/form.vehicle.search.component.d.ts +0 -22
  148. package/lib/components/header/header.component.d.ts +0 -10
  149. package/lib/components/header/sub/sub.header.component.d.ts +0 -3
  150. package/lib/components/layout/layout.component.d.ts +0 -7
  151. package/lib/components/loading/loading.component.d.ts +0 -5
  152. package/lib/components/login/login.component.d.ts +0 -15
  153. package/lib/components/modal/modal.component.d.ts +0 -9
  154. package/lib/components/notfound/notfound.component.d.ts +0 -8
  155. package/lib/components/notification/notification.component.d.ts +0 -3
  156. package/lib/components/sidebar/item/sidebar.item.component.d.ts +0 -14
  157. package/lib/components/sidebar/sidebar.component.d.ts +0 -22
  158. package/lib/components/steps/steps.component.d.ts +0 -16
  159. package/lib/components/table/loading/table.loading.component.d.ts +0 -5
  160. package/lib/components/table/pagination/table.pagination.component.d.ts +0 -15
  161. package/lib/components/table/row/table.row.component.d.ts +0 -44
  162. package/lib/components/table/table.component.d.ts +0 -43
  163. package/lib/components/tooltip/tooltip.component.d.ts +0 -5
  164. package/lib/ps-toolkit-ui.module.d.ts +0 -4
  165. package/lib/services/config.service.d.ts +0 -6
  166. package/lib/services/sidebar.service.d.ts +0 -9
  167. package/ps-toolkit-ui.d.ts +0 -20
  168. package/ps-toolkit-ui.metadata.json +0 -1
  169. package/public-api.d.ts +0 -60
@@ -1,593 +0,0 @@
1
- import { ModalClass } from './modal.class';
2
- import { InputClass, OptionClass } from './form.class';
3
- import { EnumUtils, FileIcons, InputType, Method, PermissionAccessTypeEnum, PermissionInputActionEnum, PermissionInputTypeEnum, PermissionTypeEnum, ResultStatusEnum, TableCollType, TableOptionType } from './enum.class';
4
- import { RequestClass } from './request.class';
5
- import { PermissionClass } from './permission.class';
6
- import { HelperClass } from './helper.class';
7
- import * as $ from 'jquery';
8
- import { ExcelClass } from './excel.class';
9
- import * as _ from 'lodash';
10
- export class TableClass {
11
- constructor(environment, l, permissions, name = '', cls = '', perPage = 10, height = 50) {
12
- this.environment = null;
13
- this.permission = true;
14
- this.style = {};
15
- this.url = null;
16
- this.method = Method.Post;
17
- this.height = 40;
18
- this.perPage = 10;
19
- this.cols = [];
20
- this.buttons = [];
21
- this.optionsActions = [];
22
- this.rows = [];
23
- this.count = 0;
24
- this.page = 1;
25
- this.sort = null;
26
- this.title = null;
27
- this.description = null;
28
- this.sortType = null;
29
- this.displayLabel = true;
30
- this.sortable = false;
31
- this.expertSearch = false;
32
- this.optionType = TableOptionType.Hidden;
33
- this.loading = true;
34
- this.hasChildren = false;
35
- this.vertical = false;
36
- this.childrenAutoLoad = false;
37
- this.withCheck = false;
38
- this.withSelect = false;
39
- this.showExtraButtons = true;
40
- this.firstLoad = true;
41
- this.extraButtons = [];
42
- this.optionButtons = [];
43
- this.form = null;
44
- this.searchForm = null;
45
- this.modal = null;
46
- this.level = null;
47
- this.withRelatedRow = false;
48
- this.relatedRow = null;
49
- this.listAccess = null;
50
- this.insertAccess = null;
51
- this.subTable = null;
52
- this.request = null;
53
- this.onLoad = null;
54
- this.onSelectRow = null;
55
- this.onDblClickRow = null;
56
- this.onRightClickRow = null;
57
- this.onChangeCheck = null;
58
- this.onSort = null;
59
- this.getRowClass = null;
60
- this.showConfirm = null;
61
- this.environment = environment;
62
- this.l = l;
63
- this.name = name;
64
- this.id = this.name;
65
- this.permissions = permissions;
66
- this.class = cls;
67
- this.perPage = perPage;
68
- this.height = height;
69
- }
70
- load(btn = null) {
71
- if (this.url) {
72
- this.sendRequest(btn);
73
- }
74
- else {
75
- this.loading = false;
76
- }
77
- }
78
- data() {
79
- return this.rows.filter(x => x.checked).map(x => x.Data);
80
- }
81
- setCols() {
82
- for (const c of this.cols.filter(x => x.withSearch)) {
83
- c.search = new InputClass(this.environment, this.l, c.name, null, InputType.Text, 'h-25 table-search', c.searchDefault);
84
- if (c.type === TableCollType.Date || c.type === TableCollType.DateTime || c.type === TableCollType.DateDif || c.type === TableCollType.DateRemain) {
85
- c.search.type = InputType.Date;
86
- }
87
- else if (c.type === TableCollType.Month) {
88
- c.search.type = InputType.Month;
89
- }
90
- else if (c.type === TableCollType.Year) {
91
- c.search.type = InputType.Year;
92
- }
93
- else if (c.type === TableCollType.Price) {
94
- c.search.type = InputType.Price;
95
- }
96
- else if (c.enum != null) {
97
- c.search.type = InputType.Select;
98
- c.search.options = [new OptionClass('', '-1')].concat(EnumUtils.getKeysAndValues(c.enum).map(x => new OptionClass(this.l(x.key), x.value.toString())));
99
- }
100
- else {
101
- c.search.type = InputType.Text;
102
- }
103
- c.search.displayLabel = false;
104
- c.search.onChange = () => {
105
- this.page = 1;
106
- this.load();
107
- };
108
- }
109
- }
110
- sendRequest(btn = null) {
111
- if (this.searchForm && !this.searchForm.check()) {
112
- return;
113
- }
114
- this.loading = true;
115
- if (btn) {
116
- if (btn.loading) {
117
- return;
118
- }
119
- btn.loading = true;
120
- }
121
- this.request = new RequestClass(this.environment).getClient(this.request, this.url, this.method, this.searchData(), (res) => {
122
- if (res.status === ResultStatusEnum.Success) {
123
- if (this.vertical) {
124
- const c = {};
125
- this.cols.forEach(x => c[x.name] = x.name);
126
- c.ColType = 'Column';
127
- res.result.List.unshift({ Data: c, Options: [] });
128
- }
129
- this.rows = res.result.List;
130
- this.count = res.result.Count;
131
- if (this.onLoad) {
132
- this.onLoad(res.result.Data);
133
- }
134
- if (btn) {
135
- btn.loading = false;
136
- }
137
- this.loading = false;
138
- }
139
- else {
140
- let m = '';
141
- if (res.status === ResultStatusEnum.NotRegistered) {
142
- m = 'FormBaseErrorNotRegistered';
143
- }
144
- else if (res.status === ResultStatusEnum.ExpiredRegistered) {
145
- m = 'FormBaseErrorExpiredRegistered';
146
- }
147
- else if (res.status === ResultStatusEnum.InvalidIp) {
148
- m = 'FormBaseErrorInvalidIp';
149
- }
150
- else if (res.status === ResultStatusEnum.NoCredit) {
151
- m = 'FormBaseErrorNoCredit';
152
- }
153
- else if (res.status === ResultStatusEnum.Unauthorized) {
154
- m = 'FormBaseErrorExpired';
155
- HelperClass.eraseCookie('TOKEN');
156
- }
157
- else if (res.status === ResultStatusEnum.NotAccess) {
158
- m = 'FormBaseErrorAccess';
159
- }
160
- else if (res.status === ResultStatusEnum.NotPermission) {
161
- m = 'FormBaseErrorPermission';
162
- this.permission = false;
163
- }
164
- else {
165
- if (typeof res.message === 'string') {
166
- const am = res.message.split(':');
167
- m = this.l(am[0], am.length > 1 ? am.slice(1) : null);
168
- }
169
- else {
170
- // tslint:disable-next-line:forin
171
- for (const msg in res.message) {
172
- // noinspection JSUnfilteredForInLoop
173
- m = this.l(msg, res.message[msg]);
174
- }
175
- }
176
- }
177
- if (m) {
178
- HelperClass.addNotification(this.l(m));
179
- }
180
- this.rows = [];
181
- this.count = 0;
182
- this.page = 1;
183
- if (btn) {
184
- btn.loading = false;
185
- }
186
- this.loading = false;
187
- }
188
- }, () => {
189
- this.rows = [];
190
- this.count = 0;
191
- this.page = 1;
192
- if (btn) {
193
- btn.loading = false;
194
- }
195
- this.loading = false;
196
- });
197
- }
198
- getOptionUrl(url, relatedId, rowId) {
199
- return (relatedId ? url.replace('{}', relatedId) : (url.match(/{}/g) || []).length > 1 ? url.replace('/{}', '') : url).replace('{}', rowId);
200
- }
201
- searchData(report = false) {
202
- let d = {};
203
- if (!report) {
204
- d.Page = this.page;
205
- d.PerPage = this.perPage;
206
- }
207
- else {
208
- d.ReportId = HelperClass.random(20);
209
- }
210
- if (this.sortable) {
211
- d.Sort = 'Priority';
212
- d.SortType = 'ASC';
213
- }
214
- else if (this.sort) {
215
- d.Sort = this.sort;
216
- d.SortType = this.sortType;
217
- }
218
- for (const c of this.cols.filter(x => x.withSearch && x.search != null && x.search.data() != null && x.search.data() !== '')) {
219
- const vl = c.search.data();
220
- this.addData(d, c.name, vl);
221
- }
222
- if (this.withRelatedRow) {
223
- d = Object.assign({}, d, this.relatedRow);
224
- }
225
- return this.searchForm ? this.searchForm.data(d) : d;
226
- }
227
- addData(d, name, vl) {
228
- if (typeof vl === 'object' && !(vl instanceof Array)) {
229
- for (const [key, value] of Object.entries(vl)) {
230
- if (value != null) {
231
- d[key] = value;
232
- }
233
- }
234
- }
235
- else {
236
- if (vl != null) {
237
- d[name] = vl;
238
- }
239
- }
240
- }
241
- getUrl(url) {
242
- return this.permissions.RelatedId ? url.replace('{}', this.permissions.RelatedId) : url.replace('/{}', '');
243
- }
244
- showInsertModal(cId = null, level = null, data = null) {
245
- this.form.isEdit = false;
246
- this.form.url = this.form.baseUrl = this.getUrl(this.insertAccess.Url) + (cId ? '/' + cId : '');
247
- this.form.name = this.insertAccess.Name;
248
- this.form.method = Method.Post;
249
- this.form.inputs.filter(x => x.inEditDisabled).forEach(x => x.disabled = false);
250
- this.form.inputs.filter(x => !x.inEditVisible).forEach(x => x.visible = true);
251
- this.form.inputs.forEach(x => x.required = x.baseRequired);
252
- const l = this.form.inputs.find(x => x.name === 'Level');
253
- if (level != null && l) {
254
- l.value = level;
255
- }
256
- this.modal.show(data);
257
- }
258
- set(changeRows = null) {
259
- this.permission = true;
260
- if (this.permissions) {
261
- this.listAccess = this.permissions.getAccess(PermissionAccessTypeEnum.List);
262
- this.insertAccess = this.permissions.getAccess(PermissionAccessTypeEnum.Insert);
263
- if (this.listAccess !== null) {
264
- this.title = this.listAccess.Name;
265
- this.url = this.getUrl(this.listAccess.Url);
266
- if (this.permissions.Type !== PermissionTypeEnum.Form) {
267
- if (this.firstLoad) {
268
- this.load();
269
- }
270
- }
271
- else {
272
- this.loading = false;
273
- }
274
- }
275
- else {
276
- this.permission = false;
277
- }
278
- }
279
- else {
280
- this.permission = false;
281
- return;
282
- }
283
- if (this.form && this.form.onTop) {
284
- this.form.displayLabel = false;
285
- }
286
- for (const access of this.permissions.getAccesses().filter(x => x.InputAction !== PermissionInputActionEnum.None)) {
287
- if (this.buttons.filter(x => x.name === access.Name).length > 0) {
288
- continue;
289
- }
290
- const accessInp = new InputClass(this.environment, this.l, access.Name, access.Icon, access.InputType === PermissionInputTypeEnum.Button ? InputType.Button : InputType.Icon, 'blue p-0 m-r-10-p w-u h-30');
291
- if (access.AccessType === PermissionAccessTypeEnum.Insert) {
292
- accessInp.class = accessInp.class.replace('blue', 'green');
293
- if (this.form) {
294
- this.form.url = this.form.baseUrl = this.getUrl(access.Url);
295
- if (!this.form.onTop) {
296
- accessInp.onClick = () => {
297
- this.form.onSuccessBase = () => {
298
- this.modal.hide();
299
- this.load();
300
- };
301
- this.showInsertModal();
302
- };
303
- }
304
- else {
305
- this.form.displayLabel = false;
306
- continue;
307
- }
308
- }
309
- else {
310
- if (this.modal) {
311
- accessInp.onClick = () => {
312
- this.modal.show();
313
- };
314
- }
315
- else {
316
- accessInp.url = access.Url;
317
- }
318
- }
319
- }
320
- else if (access.AccessType === PermissionAccessTypeEnum.Report) {
321
- accessInp.onClick = () => {
322
- const p = new PermissionClass();
323
- p.Area = this.permissions.Area;
324
- p.Controller = 'print';
325
- p.Action = this.permissions.Controller + (this.permissions.Action ? this.permissions.Action : '');
326
- const params = $.param(this.searchData(true));
327
- const u = this.getUrl(access.Url);
328
- window.open('/report' + u + (params ? (u.includes('?') ? '&' : '?') + params : ''), '_blank');
329
- };
330
- }
331
- else if (access.InputAction === PermissionInputActionEnum.Modal) {
332
- accessInp.modal = this.optionsActions.find(x => x.name === access.Action);
333
- accessInp.onClick = () => {
334
- if (accessInp.modal.table) {
335
- const p = new PermissionClass();
336
- p.Area = this.permissions.Area;
337
- p.Controller = this.permissions.Controller;
338
- p.Action = access.Action;
339
- accessInp.modal.table.permissions = p;
340
- if (accessInp.modal.table.form) {
341
- accessInp.modal.table.form.url = access.Url;
342
- accessInp.modal.table.form.baseUrl = access.Url;
343
- }
344
- accessInp.modal.table.set();
345
- }
346
- if (accessInp.modal.form) {
347
- accessInp.modal.form.name = access.Name;
348
- accessInp.modal.form.url = access.Url;
349
- accessInp.modal.form.onSuccessBase = () => {
350
- accessInp.modal.hide();
351
- };
352
- }
353
- };
354
- }
355
- else if (access.InputAction === PermissionInputActionEnum.OnClick) {
356
- accessInp.onClick = (btn) => {
357
- this.optionsActions.find(x => x.name === access.Action).onClick(btn);
358
- };
359
- }
360
- this.buttons.push(accessInp);
361
- }
362
- for (const option of this.permissions.getOptions().filter(x => x.Multi)) {
363
- const opt = new InputClass(this.environment, this.l, option.Name, option.Icon, InputType.Icon, 'm-r-10-p');
364
- if (option.AccessType === PermissionAccessTypeEnum.Report) {
365
- opt.onClick = () => {
366
- const params = this.data().map(x => 'Ids=' + x.Id).join('&');
367
- const u = this.getOptionUrl(option.Url, this.permissions.RelatedId, '');
368
- window.open('/report' + u + (params ? (u.includes('?') ? '&' : '?') + params : ''), '_blank');
369
- };
370
- }
371
- else if (option.InputAction === PermissionInputActionEnum.OnClick) {
372
- opt.onClick = (btn) => {
373
- this.optionsActions.find(x => x.name === option.Action).onClick(btn);
374
- };
375
- }
376
- else {
377
- opt.onClick = () => {
378
- const p = new PermissionClass();
379
- p.RelatedId = this.permissions.RelatedId;
380
- p.Area = this.permissions.Area;
381
- p.Controller = option.Controller;
382
- p.Action = option.Action;
383
- const data = { Ids: this.data().map(x => x.Id) };
384
- this.showConfirm(this.l(option.Action + 'ConfirmMulti', data.Ids.length), this.getOptionUrl(option.Url, this.permissions.RelatedId, ''), data, () => {
385
- this.load();
386
- });
387
- };
388
- }
389
- this.optionButtons.push(opt);
390
- }
391
- if (this.form) {
392
- this.form.addButtons('Save', this.permissions.Type === PermissionTypeEnum.Form ? 'green w-10 only-icon f-l' : 'green', this.permissions.Type !== PermissionTypeEnum.Form, this.permissions.getAccesses().some(x => x.AccessType === PermissionAccessTypeEnum.Insert), this.permissions.Type === PermissionTypeEnum.Form ? (data) => {
393
- this.onTopFormSubmit(data, changeRows);
394
- } : null);
395
- if (this.hasChildren) {
396
- const level = new InputClass(this.environment, this.l, 'Level', null, InputType.Hidden);
397
- this.form.inputs.push(level);
398
- }
399
- if (this.form.onTop) {
400
- this.form.onSuccessBase = () => {
401
- this.form.clear(this.insertAccess != null);
402
- this.load();
403
- };
404
- }
405
- else {
406
- if (!this.modal) {
407
- this.modal = new ModalClass(this.environment, this.l, this.form.name);
408
- }
409
- this.modal.form = this.form;
410
- }
411
- }
412
- }
413
- onTopFormSubmit(data, changeRows = null) {
414
- if (data.Id) {
415
- const i = this.rows.findIndex(x => x.Data.Id === data.Id);
416
- this.rows[i].Data = data;
417
- }
418
- else {
419
- data.Id = parseInt(HelperClass.random(5, false, false), 10);
420
- const uAccess = new PermissionClass();
421
- uAccess.Action = 'Update';
422
- uAccess.Type = PermissionTypeEnum.Option;
423
- uAccess.InputAction = PermissionInputActionEnum.None;
424
- uAccess.InputType = PermissionInputTypeEnum.Icon;
425
- uAccess.AccessType = PermissionAccessTypeEnum.Update;
426
- uAccess.Icon = 'fad fa-pen';
427
- uAccess.Name = 'Update';
428
- const dAccess = new PermissionClass();
429
- dAccess.Action = 'Delete';
430
- dAccess.Type = PermissionTypeEnum.Option;
431
- dAccess.InputAction = PermissionInputActionEnum.None;
432
- dAccess.InputType = PermissionInputTypeEnum.Icon;
433
- dAccess.AccessType = PermissionAccessTypeEnum.Delete;
434
- dAccess.Icon = 'fad fa-trash';
435
- dAccess.Name = 'Delete';
436
- if (this.sortType === 'DESC') {
437
- this.rows.push({
438
- Data: data,
439
- Options: [uAccess, dAccess]
440
- });
441
- }
442
- else {
443
- this.rows.unshift({
444
- Data: data,
445
- Options: [uAccess, dAccess]
446
- });
447
- }
448
- }
449
- if (changeRows) {
450
- changeRows.emit(data);
451
- }
452
- this.form.clear(this.insertAccess != null);
453
- if (this.onLoad) {
454
- this.onLoad(null);
455
- }
456
- }
457
- getCell(row, col) {
458
- // console.log('getCell');
459
- const cv = _.get(row.Data, col.name);
460
- if (cv === null) {
461
- return col.default ? col.default : '';
462
- }
463
- else if (col.fun != null) {
464
- return col.fun(row.Data);
465
- }
466
- else if (col.enum !== null) {
467
- return this.l(EnumUtils.getKeyByValue(col.enum, cv));
468
- }
469
- else if (col.type === TableCollType.DateDif) {
470
- return HelperClass.getDateDif(this.l, cv);
471
- }
472
- else if (col.type === TableCollType.Date) {
473
- return HelperClass.getDate(cv);
474
- }
475
- else if (col.type === TableCollType.DateTime) {
476
- return '<span class="ltr">' + HelperClass.getDateTime(cv) + '</span>';
477
- }
478
- else if (col.type === TableCollType.Month) {
479
- return HelperClass.getDate(cv, 'jMMMM jYYYY');
480
- }
481
- else if (col.type === TableCollType.Year) {
482
- return HelperClass.getDate(cv, 'jYYYY');
483
- }
484
- else if (col.type === TableCollType.Time) {
485
- return HelperClass.getTime(cv);
486
- }
487
- else if (col.type === TableCollType.Color) {
488
- return '<div class="color" style="background-color: ' + cv + '; color: ' + HelperClass.getColorByBgColor(cv) + '">' + cv + '</div>';
489
- }
490
- else if (col.type === TableCollType.Url) {
491
- return '<a target="_blank" class="ltr" href="' + cv + '">' + cv + '</a>';
492
- }
493
- else if (col.type === TableCollType.Image) {
494
- return '<img style="height: ' + this.height + 'px" alt="" src="' + this.environment.url + cv + '"/>';
495
- }
496
- else if (col.type === TableCollType.FileSize) {
497
- return HelperClass.getFileSize(cv);
498
- }
499
- else if (col.type === TableCollType.Price) {
500
- try {
501
- return HelperClass.toPrice(this.l, cv);
502
- }
503
- catch (_a) { }
504
- }
505
- else if (col.type === TableCollType.Number) {
506
- return cv.toLocaleString();
507
- }
508
- else if (col.type === TableCollType.Files) {
509
- let files = '';
510
- for (const f of cv) {
511
- const k = f.split('.').at(-1);
512
- if (k === 'jpeg' || k === 'jpg' || k === 'png') {
513
- files += '<a target="_blank" href="' + this.environment.url + f + '" class="m-h-5"><img alt="" src="' + this.environment.url + f + '" style="height: 30px"/></a>';
514
- }
515
- else {
516
- files += '<a target="_blank" href="' + this.environment.url + f + '" class="f-s-30 m-h-5 ' + FileIcons[k] + '"></a>';
517
- }
518
- }
519
- return files;
520
- }
521
- else if (col.type === TableCollType.Plaque) {
522
- const parts = cv.split('_');
523
- if (parts.length === 4) {
524
- return '<div data-copy="' + parts.join(' ') + '" class="plaque' + (parts[1] === 'ع' ? ' p' : '') + (parts[1] === 'ا' ? ' g' : '') + '">' +
525
- '<div class="part1">' + parts[0] + '</div>' +
526
- '<div class="part2">' + parts[1] + '</div>' +
527
- '<div class="part3">' + parts[2] + '</div>' +
528
- '<div class="part4">' + parts[3] + '</div>' +
529
- '</div>';
530
- }
531
- else if (parts.length === 2 && parts.every(x => /^[0-9]+$/.test(x))) {
532
- return '<div data-copy="' + parts.join(' ') + '" class="plaque plaque-m">' +
533
- '<div class="part1">' + parts[0] + '</div>' +
534
- '<div class="part2">' + parts[1] + '</div>' +
535
- '</div>';
536
- }
537
- else if (parts.length === 2) {
538
- return '<div data-copy="' + parts.join(' ') + '" class="plaque plaque-f">' +
539
- '<div class="part1">' + parts[0] + '</div>' +
540
- '<div class="part2">' + parts[1] + '</div>' +
541
- '</div>';
542
- }
543
- else if (parts.length === 1) {
544
- return '<div data-copy="' + parts[0] + '" class="plaque plaque-g">' +
545
- '<div class="part1">' + parts[0] + '</div>' +
546
- '</div>';
547
- }
548
- }
549
- else if (col.type === TableCollType.PlaqueText) {
550
- return `<div class="ltr">${HelperClass.ToReadablePlaque(cv)}</div>`;
551
- }
552
- return this.l(cv);
553
- }
554
- excel() {
555
- var _a, _b;
556
- const data = [];
557
- this.rows.forEach(row => {
558
- const x = {};
559
- this.cols.forEach(col => {
560
- let txt = this.getText(this.getCell(row, col));
561
- if (col.type === TableCollType.Price) {
562
- const tr = txt.replace('ریال', '').replace(/,/g, '').trim();
563
- txt = parseInt(tr, 10);
564
- txt = isNaN(txt) ? 0 : txt;
565
- }
566
- x[this.l(col.name)] = txt;
567
- });
568
- data.push(x);
569
- });
570
- new ExcelClass().exportAsExcelFile(data, this.l((_b = (_a = this.permissions) === null || _a === void 0 ? void 0 : _a.Name) !== null && _b !== void 0 ? _b : 'ExportExcelData'));
571
- }
572
- getText(s) {
573
- const span = document.createElement('span');
574
- span.innerHTML = s;
575
- return span.textContent || span.innerText;
576
- }
577
- }
578
- export class TableCollClass {
579
- constructor(name, cls = '', type = TableCollType.Text, withSearch = true, sort = true) {
580
- this.enum = null;
581
- this.default = null;
582
- this.sort = true;
583
- this.search = null;
584
- this.searchDefault = null;
585
- this.fun = null;
586
- this.name = name;
587
- this.class = cls + ([TableCollType.Color, TableCollType.Url, TableCollType.FileSize].includes(type) ? ' ltr' : '');
588
- this.type = type;
589
- this.withSearch = type === TableCollType.Image ? false : withSearch;
590
- this.sort = type === TableCollType.Image ? false : sort;
591
- }
592
- }
593
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiRDovUHNUb29sa2l0L1VJL3Byb2plY3RzL3BzLXRvb2xraXQtdWkvc3JjLyIsInNvdXJjZXMiOlsibGliL2NsYXNzZXMvdGFibGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQVksVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDaEIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLE9BQU8sVUFBVTtJQUNyQixZQUFZLFdBQWdCLEVBQUUsQ0FBb0IsRUFBRSxXQUE0QixFQUFFLE9BQWUsRUFBRSxFQUFFLE1BQWMsRUFBRSxFQUN6RyxVQUFrQixFQUFFLEVBQUUsU0FBaUIsRUFBRTtRQVVyRCxnQkFBVyxHQUFRLElBQUksQ0FBQztRQUd4QixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBSWxCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxRQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ1gsV0FBTSxHQUFXLE1BQU0sQ0FB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QixZQUFZLElBQVksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLE9BQXNCLGFBQWEsQ0FBQyxJQUFJLEVBQ2hFLGFBQXNCLElBQUksRUFBRSxPQUFnQixJQUFJO1FBTzVELFNBQUksR0FBRyxJQUFJLENBQUM7UUFHWixZQUFPLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFFWixXQUFNLEdBQWUsSUFBSSxDQUFDO1FBQzFCLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBRXJCLFFBQUcsR0FBa0IsSUFBSSxDQUFDO1FBZnhCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUNwRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxRCxDQUFDO0NBV0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01vZGFsQ2xhc3N9IGZyb20gJy4vbW9kYWwuY2xhc3MnO1xyXG5pbXBvcnQge0Zvcm1DbGFzcywgSW5wdXRDbGFzcywgT3B0aW9uQ2xhc3N9IGZyb20gJy4vZm9ybS5jbGFzcyc7XHJcbmltcG9ydCB7XHJcbiAgRW51bVV0aWxzLFxyXG4gIEZpbGVJY29ucyxcclxuICBJbnB1dFR5cGUsXHJcbiAgTWV0aG9kLFxyXG4gIFBlcm1pc3Npb25BY2Nlc3NUeXBlRW51bSxcclxuICBQZXJtaXNzaW9uSW5wdXRBY3Rpb25FbnVtLFxyXG4gIFBlcm1pc3Npb25JbnB1dFR5cGVFbnVtLFxyXG4gIFBlcm1pc3Npb25UeXBlRW51bSxcclxuICBSZXN1bHRTdGF0dXNFbnVtLFxyXG4gIFRhYmxlQ29sbFR5cGUsXHJcbiAgVGFibGVPcHRpb25UeXBlXHJcbn0gZnJvbSAnLi9lbnVtLmNsYXNzJztcclxuaW1wb3J0IHtSZXF1ZXN0Q2xhc3N9IGZyb20gJy4vcmVxdWVzdC5jbGFzcyc7XHJcbmltcG9ydCB7UGVybWlzc2lvbkNsYXNzfSBmcm9tICcuL3Blcm1pc3Npb24uY2xhc3MnO1xyXG5pbXBvcnQge0hlbHBlckNsYXNzfSBmcm9tICcuL2hlbHBlci5jbGFzcyc7XHJcbmltcG9ydCAqIGFzICQgZnJvbSAnanF1ZXJ5JztcclxuaW1wb3J0IHtFeGNlbENsYXNzfSBmcm9tICcuL2V4Y2VsLmNsYXNzJztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlQ2xhc3Mge1xyXG4gIGNvbnN0cnVjdG9yKGVudmlyb25tZW50OiBhbnksIGw6IChrLCB2PykgPT4gc3RyaW5nLCBwZXJtaXNzaW9uczogUGVybWlzc2lvbkNsYXNzLCBuYW1lOiBzdHJpbmcgPSAnJywgY2xzOiBzdHJpbmcgPSAnJyxcclxuICAgICAgICAgICAgICBwZXJQYWdlOiBudW1iZXIgPSAxMCwgaGVpZ2h0OiBudW1iZXIgPSA1MCkge1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xyXG4gICAgdGhpcy5sID0gbDtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLmlkID0gdGhpcy5uYW1lO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy5jbGFzcyA9IGNscztcclxuICAgIHRoaXMucGVyUGFnZSA9IHBlclBhZ2U7XHJcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICB9XHJcbiAgZW52aXJvbm1lbnQ6IGFueSA9IG51bGw7XHJcbiAgbDogKGssIHY/KSA9PiBzdHJpbmc7XHJcbiAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25DbGFzcztcclxuICBwZXJtaXNzaW9uID0gdHJ1ZTtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaWQ6IHN0cmluZztcclxuICBjbGFzczogc3RyaW5nO1xyXG4gIHN0eWxlID0ge307XHJcbiAgdXJsID0gbnVsbDtcclxuICBtZXRob2Q6IE1ldGhvZCA9IE1ldGhvZC5Qb3N0O1xyXG4gIGhlaWdodCA9IDQwO1xyXG4gIHBlclBhZ2UgPSAxMDtcclxuICBjb2xzOiBUYWJsZUNvbGxDbGFzc1tdID0gW107XHJcbiAgYnV0dG9uczogSW5wdXRDbGFzc1tdID0gW107XHJcbiAgb3B0aW9uc0FjdGlvbnM6IGFueVtdID0gW107XHJcbiAgcm93cyA9IFtdO1xyXG4gIGNvdW50ID0gMDtcclxuICBwYWdlID0gMTtcclxuICBzb3J0ID0gbnVsbDtcclxuICB0aXRsZSA9IG51bGw7XHJcbiAgZGVzY3JpcHRpb24gPSBudWxsO1xyXG4gIHNvcnRUeXBlID0gbnVsbDtcclxuICBkaXNwbGF5TGFiZWwgPSB0cnVlO1xyXG4gIHNvcnRhYmxlID0gZmFsc2U7XHJcbiAgZXhwZXJ0U2VhcmNoID0gZmFsc2U7XHJcbiAgb3B0aW9uVHlwZSA9IFRhYmxlT3B0aW9uVHlwZS5IaWRkZW47XHJcbiAgbG9hZGluZyA9IHRydWU7XHJcbiAgaGFzQ2hpbGRyZW4gPSBmYWxzZTtcclxuICB2ZXJ0aWNhbCA9IGZhbHNlO1xyXG4gIGNoaWxkcmVuQXV0b0xvYWQgPSBmYWxzZTtcclxuICB3aXRoQ2hlY2sgPSBmYWxzZTtcclxuICB3aXRoU2VsZWN0ID0gZmFsc2U7XHJcbiAgc2hvd0V4dHJhQnV0dG9ucyA9IHRydWU7XHJcbiAgZmlyc3RMb2FkID0gdHJ1ZTtcclxuICBleHRyYUJ1dHRvbnM6IElucHV0Q2xhc3NbXSA9IFtdO1xyXG4gIG9wdGlvbkJ1dHRvbnM6IElucHV0Q2xhc3NbXSA9IFtdO1xyXG4gIGZvcm06IEZvcm1DbGFzcyA9IG51bGw7XHJcbiAgc2VhcmNoRm9ybTogRm9ybUNsYXNzID0gbnVsbDtcclxuICBtb2RhbDogTW9kYWxDbGFzcyA9IG51bGw7XHJcbiAgbGV2ZWwgPSBudWxsO1xyXG4gIHdpdGhSZWxhdGVkUm93ID0gZmFsc2U7XHJcbiAgcmVsYXRlZFJvdyA9IG51bGw7XHJcbiAgbGlzdEFjY2VzczogUGVybWlzc2lvbkNsYXNzID0gbnVsbDtcclxuICBpbnNlcnRBY2Nlc3M6IFBlcm1pc3Npb25DbGFzcyA9IG51bGw7XHJcbiAgc3ViVGFibGU6IFRhYmxlQ2xhc3MgPSBudWxsO1xyXG4gIHJlcXVlc3Q6IGFueSA9IG51bGw7XHJcbiAgb25Mb2FkOiAoZGF0YSkgPT4gdm9pZCA9IG51bGw7XHJcbiAgb25TZWxlY3RSb3c6IChyb3cpID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uRGJsQ2xpY2tSb3c6IChyb3cpID0+IHZvaWQgPSBudWxsO1xyXG4gIG9uUmlnaHRDbGlja1JvdzogKHJvdykgPT4gdm9pZCA9IG51bGw7XHJcbiAgb25DaGFuZ2VDaGVjazogKHJvdykgPT4gdm9pZCA9IG51bGw7XHJcbiAgb25Tb3J0OiAoKSA9PiB2b2lkID0gbnVsbDtcclxuICBnZXRSb3dDbGFzczogKHJvdzogYW55KSA9PiBzdHJpbmcgPSBudWxsO1xyXG4gIHNob3dDb25maXJtOiAobDogc3RyaW5nLCB1cmw6IHN0cmluZywgZGF0YSwgYWNjZXB0OiAoYnRuOiBJbnB1dENsYXNzKSA9PiB2b2lkKSA9PiB2b2lkID0gbnVsbDtcclxuICBsb2FkKGJ0biA9IG51bGwpOiB2b2lke1xyXG4gICAgaWYgKHRoaXMudXJsKXtcclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdChidG4pO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0YSgpOiBhbnlbXXtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHggPT4geC5jaGVja2VkKS5tYXAoeCA9PiB4LkRhdGEpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29scygpOiB2b2lke1xyXG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY29scy5maWx0ZXIoeCA9PiB4LndpdGhTZWFyY2gpKXtcclxuICAgICAgYy5zZWFyY2ggPSBuZXcgSW5wdXRDbGFzcyh0aGlzLmVudmlyb25tZW50LCB0aGlzLmwsIGMubmFtZSwgbnVsbCwgSW5wdXRUeXBlLlRleHQsICdoLTI1IHRhYmxlLXNlYXJjaCcsIGMuc2VhcmNoRGVmYXVsdCk7XHJcbiAgICAgIGlmIChjLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuRGF0ZSB8fCBjLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuRGF0ZVRpbWUgfHwgYy50eXBlID09PSBUYWJsZUNvbGxUeXBlLkRhdGVEaWYgfHwgYy50eXBlID09PSBUYWJsZUNvbGxUeXBlLkRhdGVSZW1haW4pe1xyXG4gICAgICAgIGMuc2VhcmNoLnR5cGUgPSBJbnB1dFR5cGUuRGF0ZTtcclxuICAgICAgfSBlbHNlIGlmIChjLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuTW9udGgpe1xyXG4gICAgICAgIGMuc2VhcmNoLnR5cGUgPSBJbnB1dFR5cGUuTW9udGg7XHJcbiAgICAgIH0gZWxzZSBpZiAoYy50eXBlID09PSBUYWJsZUNvbGxUeXBlLlllYXIpe1xyXG4gICAgICAgIGMuc2VhcmNoLnR5cGUgPSBJbnB1dFR5cGUuWWVhcjtcclxuICAgICAgfSBlbHNlIGlmIChjLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuUHJpY2Upe1xyXG4gICAgICAgIGMuc2VhcmNoLnR5cGUgPSBJbnB1dFR5cGUuUHJpY2U7XHJcbiAgICAgIH0gZWxzZSBpZiAoYy5lbnVtICE9IG51bGwpe1xyXG4gICAgICAgIGMuc2VhcmNoLnR5cGUgPSBJbnB1dFR5cGUuU2VsZWN0O1xyXG4gICAgICAgIGMuc2VhcmNoLm9wdGlvbnMgPSBbbmV3IE9wdGlvbkNsYXNzKCcnLCAnLTEnKV0uY29uY2F0KEVudW1VdGlscy5nZXRLZXlzQW5kVmFsdWVzKGMuZW51bSkubWFwKHggPT4gbmV3IE9wdGlvbkNsYXNzKHRoaXMubCh4LmtleSksIHgudmFsdWUudG9TdHJpbmcoKSkpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjLnNlYXJjaC50eXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIH1cclxuICAgICAgYy5zZWFyY2guZGlzcGxheUxhYmVsID0gZmFsc2U7XHJcbiAgICAgIGMuc2VhcmNoLm9uQ2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZW5kUmVxdWVzdChidG46IElucHV0Q2xhc3MgPSBudWxsKTogdm9pZHtcclxuICAgIGlmICh0aGlzLnNlYXJjaEZvcm0gJiYgIXRoaXMuc2VhcmNoRm9ybS5jaGVjaygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAoYnRuKXtcclxuICAgICAgaWYgKGJ0bi5sb2FkaW5nKXtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYnRuLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3RDbGFzcyh0aGlzLmVudmlyb25tZW50KS5nZXRDbGllbnQodGhpcy5yZXF1ZXN0LCB0aGlzLnVybCwgdGhpcy5tZXRob2QsIHRoaXMuc2VhcmNoRGF0YSgpLFxyXG4gICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uU3VjY2Vzcykge1xyXG4gICAgICAgICAgaWYgKHRoaXMudmVydGljYWwpe1xyXG4gICAgICAgICAgICBjb25zdCBjOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5jb2xzLmZvckVhY2goeCA9PiBjW3gubmFtZV0gPSB4Lm5hbWUpO1xyXG4gICAgICAgICAgICBjLkNvbFR5cGUgPSAnQ29sdW1uJztcclxuICAgICAgICAgICAgcmVzLnJlc3VsdC5MaXN0LnVuc2hpZnQoe0RhdGE6IGMsIE9wdGlvbnM6IFtdfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJvd3MgPSByZXMucmVzdWx0Lkxpc3Q7XHJcbiAgICAgICAgICB0aGlzLmNvdW50ID0gcmVzLnJlc3VsdC5Db3VudDtcclxuICAgICAgICAgIGlmICh0aGlzLm9uTG9hZCl7XHJcbiAgICAgICAgICAgIHRoaXMub25Mb2FkKHJlcy5yZXN1bHQuRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoYnRuKXtcclxuICAgICAgICAgICAgYnRuLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgbSA9ICcnO1xyXG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm90UmVnaXN0ZXJlZCkge1xyXG4gICAgICAgICAgICBtID0gJ0Zvcm1CYXNlRXJyb3JOb3RSZWdpc3RlcmVkJztcclxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1cyA9PT0gUmVzdWx0U3RhdHVzRW51bS5FeHBpcmVkUmVnaXN0ZXJlZCkge1xyXG4gICAgICAgICAgICBtID0gJ0Zvcm1CYXNlRXJyb3JFeHBpcmVkUmVnaXN0ZXJlZCc7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uSW52YWxpZElwKSB7XHJcbiAgICAgICAgICAgIG0gPSAnRm9ybUJhc2VFcnJvckludmFsaWRJcCc7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm9DcmVkaXQpIHtcclxuICAgICAgICAgICAgbSA9ICdGb3JtQmFzZUVycm9yTm9DcmVkaXQnO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSBSZXN1bHRTdGF0dXNFbnVtLlVuYXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgICBtID0gJ0Zvcm1CYXNlRXJyb3JFeHBpcmVkJztcclxuICAgICAgICAgICAgSGVscGVyQ2xhc3MuZXJhc2VDb29raWUoJ1RPS0VOJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm90QWNjZXNzKSB7XHJcbiAgICAgICAgICAgIG0gPSAnRm9ybUJhc2VFcnJvckFjY2Vzcyc7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXMgPT09IFJlc3VsdFN0YXR1c0VudW0uTm90UGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICBtID0gJ0Zvcm1CYXNlRXJyb3JQZXJtaXNzaW9uJztcclxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcy5tZXNzYWdlID09PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgICAgICAgY29uc3QgYW0gPSByZXMubWVzc2FnZS5zcGxpdCgnOicpO1xyXG4gICAgICAgICAgICAgIG0gPSB0aGlzLmwoYW1bMF0sIGFtLmxlbmd0aCA+IDEgPyBhbS5zbGljZSgxKSA6IG51bGwpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBpbiByZXMubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5maWx0ZXJlZEZvckluTG9vcFxyXG4gICAgICAgICAgICAgICAgbSA9IHRoaXMubChtc2csIHJlcy5tZXNzYWdlW21zZ10pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG0pIHtcclxuICAgICAgICAgICAgSGVscGVyQ2xhc3MuYWRkTm90aWZpY2F0aW9uKHRoaXMubChtKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJvd3MgPSBbXTtcclxuICAgICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgICAgICAgdGhpcy5wYWdlID0gMTtcclxuICAgICAgICAgIGlmIChidG4pe1xyXG4gICAgICAgICAgICBidG4ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yb3dzID0gW107XHJcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcclxuICAgICAgICBpZiAoYnRuKXtcclxuICAgICAgICAgIGJ0bi5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3B0aW9uVXJsKHVybCwgcmVsYXRlZElkLCByb3dJZCk6IHN0cmluZ3tcclxuICAgIHJldHVybiAocmVsYXRlZElkID8gdXJsLnJlcGxhY2UoJ3t9JywgcmVsYXRlZElkKSA6ICh1cmwubWF0Y2goL3t9L2cpIHx8IFtdKS5sZW5ndGggPiAxID8gdXJsLnJlcGxhY2UoJy97fScsICcnKSA6IHVybCkucmVwbGFjZSgne30nLCByb3dJZCk7XHJcbiAgfVxyXG4gIHNlYXJjaERhdGEocmVwb3J0ID0gZmFsc2UpOiB7fSB7XHJcbiAgICBsZXQgZDogYW55ID0ge307XHJcbiAgICBpZiAoIXJlcG9ydCl7XHJcbiAgICAgIGQuUGFnZSA9IHRoaXMucGFnZTtcclxuICAgICAgZC5QZXJQYWdlID0gdGhpcy5wZXJQYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZC5SZXBvcnRJZCA9IEhlbHBlckNsYXNzLnJhbmRvbSgyMCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zb3J0YWJsZSl7XHJcbiAgICAgIGQuU29ydCA9ICdQcmlvcml0eSc7XHJcbiAgICAgIGQuU29ydFR5cGUgPSAnQVNDJztcclxuICAgIH1lbHNlIGlmICh0aGlzLnNvcnQpe1xyXG4gICAgICBkLlNvcnQgPSB0aGlzLnNvcnQ7XHJcbiAgICAgIGQuU29ydFR5cGUgPSB0aGlzLnNvcnRUeXBlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY29scy5maWx0ZXIoeCA9PiB4LndpdGhTZWFyY2ggJiYgeC5zZWFyY2ggIT0gbnVsbCAmJiB4LnNlYXJjaC5kYXRhKCkgIT0gbnVsbCAmJiB4LnNlYXJjaC5kYXRhKCkgIT09ICcnKSl7XHJcbiAgICAgIGNvbnN0IHZsID0gYy5zZWFyY2guZGF0YSgpO1xyXG4gICAgICB0aGlzLmFkZERhdGEoZCwgYy5uYW1lLCB2bCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aXRoUmVsYXRlZFJvdyl7XHJcbiAgICAgIGQgPSBPYmplY3QuYXNzaWduKHt9LCBkLCB0aGlzLnJlbGF0ZWRSb3cpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9ybSA/IHRoaXMuc2VhcmNoRm9ybS5kYXRhKGQpIDogZDtcclxuICB9XHJcbiAgYWRkRGF0YShkOiB7fSwgbmFtZTogc3RyaW5nLCB2bDogYW55KTogdm9pZHtcclxuICAgIGlmICh0eXBlb2YgdmwgPT09ICdvYmplY3QnICYmICEodmwgaW5zdGFuY2VvZiBBcnJheSkpe1xyXG4gICAgICBmb3IgKGNvbnN0IFsga2V5LCB2YWx1ZSBdIG9mIE9iamVjdC5lbnRyaWVzKHZsKSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKXtcclxuICAgICAgICAgIGRba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHZsICE9IG51bGwpe1xyXG4gICAgICAgIGRbbmFtZV0gPSB2bDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXRVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5SZWxhdGVkSWQgPyB1cmwucmVwbGFjZSgne30nLCB0aGlzLnBlcm1pc3Npb25zLlJlbGF0ZWRJZCkgOiB1cmwucmVwbGFjZSgnL3t9JywgJycpO1xyXG4gIH1cclxuICBzaG93SW5zZXJ0TW9kYWwoY0lkID0gbnVsbCwgbGV2ZWwgPSBudWxsLCBkYXRhID0gbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtLmlzRWRpdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5mb3JtLnVybCA9IHRoaXMuZm9ybS5iYXNlVXJsID0gdGhpcy5nZXRVcmwodGhpcy5pbnNlcnRBY2Nlc3MuVXJsKSArIChjSWQgPyAnLycgKyBjSWQgOiAnJyk7XHJcbiAgICB0aGlzLmZvcm0ubmFtZSA9IHRoaXMuaW5zZXJ0QWNjZXNzLk5hbWU7XHJcbiAgICB0aGlzLmZvcm0ubWV0aG9kID0gTWV0aG9kLlBvc3Q7XHJcbiAgICB0aGlzLmZvcm0uaW5wdXRzLmZpbHRlcih4ID0+IHguaW5FZGl0RGlzYWJsZWQpLmZvckVhY2goeCA9PiB4LmRpc2FibGVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy5mb3JtLmlucHV0cy5maWx0ZXIoeCA9PiAheC5pbkVkaXRWaXNpYmxlKS5mb3JFYWNoKHggPT4geC52aXNpYmxlID0gdHJ1ZSk7XHJcbiAgICB0aGlzLmZvcm0uaW5wdXRzLmZvckVhY2goeCA9PiB4LnJlcXVpcmVkID0geC5iYXNlUmVxdWlyZWQpO1xyXG4gICAgY29uc3QgbCA9IHRoaXMuZm9ybS5pbnB1dHMuZmluZCh4ID0+IHgubmFtZSA9PT0gJ0xldmVsJyk7XHJcbiAgICBpZiAobGV2ZWwgIT0gbnVsbCAmJiBsKXtcclxuICAgICAgbC52YWx1ZSA9IGxldmVsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RhbC5zaG93KGRhdGEpO1xyXG4gIH1cclxuICBzZXQoY2hhbmdlUm93cyA9IG51bGwpOiB2b2lke1xyXG4gICAgdGhpcy5wZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zKVxyXG4gICAge1xyXG4gICAgICB0aGlzLmxpc3RBY2Nlc3MgPSB0aGlzLnBlcm1pc3Npb25zLmdldEFjY2VzcyhQZXJtaXNzaW9uQWNjZXNzVHlwZUVudW0uTGlzdCk7XHJcbiAgICAgIHRoaXMuaW5zZXJ0QWNjZXNzID0gdGhpcy5wZXJtaXNzaW9ucy5nZXRBY2Nlc3MoUGVybWlzc2lvbkFjY2Vzc1R5cGVFbnVtLkluc2VydCk7XHJcbiAgICAgIGlmICh0aGlzLmxpc3RBY2Nlc3MgIT09IG51bGwpe1xyXG4gICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmxpc3RBY2Nlc3MuTmFtZTtcclxuICAgICAgICB0aGlzLnVybCA9IHRoaXMuZ2V0VXJsKHRoaXMubGlzdEFjY2Vzcy5VcmwpO1xyXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLlR5cGUgIT09IFBlcm1pc3Npb25UeXBlRW51bS5Gb3JtKXtcclxuICAgICAgICAgIGlmICh0aGlzLmZpcnN0TG9hZCl7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2V7XHJcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLnBlcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0ub25Ub3Ape1xyXG4gICAgICB0aGlzLmZvcm0uZGlzcGxheUxhYmVsID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGFjY2VzcyBvZiB0aGlzLnBlcm1pc3Npb25zLmdldEFjY2Vzc2VzKCkuZmlsdGVyKHggPT4geC5JbnB1dEFjdGlvbiAhPT0gUGVybWlzc2lvbklucHV0QWN0aW9uRW51bS5Ob25lKSl7XHJcbiAgICAgIGlmICh0aGlzLmJ1dHRvbnMuZmlsdGVyKHggPT4geC5uYW1lID09PSBhY2Nlc3MuTmFtZSkubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWNjZXNzSW5wID0gbmV3IElucHV0Q2xhc3ModGhpcy5lbnZpcm9ubWVudCwgdGhpcy5sLCBhY2Nlc3MuTmFtZSwgYWNjZXNzLkljb24sXHJcbiAgICAgICAgYWNjZXNzLklucHV0VHlwZSA9PT0gUGVybWlzc2lvbklucHV0VHlwZUVudW0uQnV0dG9uID8gSW5wdXRUeXBlLkJ1dHRvbiA6IElucHV0VHlwZS5JY29uLCAnYmx1ZSBwLTAgbS1yLTEwLXAgdy11IGgtMzAnKTtcclxuICAgICAgaWYgKGFjY2Vzcy5BY2Nlc3NUeXBlID09PSBQZXJtaXNzaW9uQWNjZXNzVHlwZUVudW0uSW5zZXJ0KXtcclxuICAgICAgICBhY2Nlc3NJbnAuY2xhc3MgPSBhY2Nlc3NJbnAuY2xhc3MucmVwbGFjZSgnYmx1ZScsICdncmVlbicpO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm0pe1xyXG4gICAgICAgICAgdGhpcy5mb3JtLnVybCA9IHRoaXMuZm9ybS5iYXNlVXJsID0gdGhpcy5nZXRVcmwoYWNjZXNzLlVybCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZm9ybS5vblRvcCl7XHJcbiAgICAgICAgICAgIGFjY2Vzc0lucC5vbkNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5vblN1Y2Nlc3NCYXNlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuc2hvd0luc2VydE1vZGFsKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmRpc3BsYXlMYWJlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGlmICh0aGlzLm1vZGFsKXtcclxuICAgICAgICAgICAgYWNjZXNzSW5wLm9uQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgYWNjZXNzSW5wLnVybCA9IGFjY2Vzcy5Vcmw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGFjY2Vzcy5BY2Nlc3NUeXBlID09PSBQZXJtaXNzaW9uQWNjZXNzVHlwZUVudW0uUmVwb3J0KXtcclxuICAgICAgICBhY2Nlc3NJbnAub25DbGljayA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHAgPSBuZXcgUGVybWlzc2lvbkNsYXNzKCk7XHJcbiAgICAgICAgICBwLkFyZWEgPSB0aGlzLnBlcm1pc3Npb25zLkFyZWE7XHJcbiAgICAgICAgICBwLkNvbnRyb2xsZXIgPSAncHJpbnQnO1xyXG4gICAgICAgICAgcC5BY3Rpb24gPSB0aGlzLnBlcm1pc3Npb25zLkNvbnRyb2xsZXIgKyAodGhpcy5wZXJtaXNzaW9ucy5BY3Rpb24gPyB0aGlzLnBlcm1pc3Npb25zLkFjdGlvbiA6ICcnKTtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9ICQucGFyYW0odGhpcy5zZWFyY2hEYXRhKHRydWUpKTtcclxuICAgICAgICAgIGNvbnN0IHUgPSB0aGlzLmdldFVybChhY2Nlc3MuVXJsKTtcclxuICAgICAgICAgIHdpbmRvdy5vcGVuKCcvcmVwb3J0JyArIHUgKyAocGFyYW1zID8gKHUuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JykgKyBwYXJhbXMgOiAnJyksICdfYmxhbmsnKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGFjY2Vzcy5JbnB1dEFjdGlvbiA9PT0gUGVybWlzc2lvbklucHV0QWN0aW9uRW51bS5Nb2RhbCl7XHJcbiAgICAgICAgYWNjZXNzSW5wLm1vZGFsID0gdGhpcy5vcHRpb25zQWN0aW9ucy5maW5kKHggPT4geC5uYW1lID09PSBhY2Nlc3MuQWN0aW9uKTtcclxuICAgICAgICBhY2Nlc3NJbnAub25DbGljayA9ICgpID0+IHtcclxuICAgICAgICAgIGlmIChhY2Nlc3NJbnAubW9kYWwudGFibGUpe1xyXG4gICAgICAgICAgICBjb25zdCBwID0gbmV3IFBlcm1pc3Npb25DbGFzcygpO1xyXG4gICAgICAgICAgICBwLkFyZWEgPSB0aGlzLnBlcm1pc3Npb25zLkFyZWE7XHJcbiAgICAgICAgICAgIHAuQ29udHJvbGxlciA9IHRoaXMucGVybWlzc2lvbnMuQ29udHJvbGxlcjtcclxuICAgICAgICAgICAgcC5BY3Rpb24gPSBhY2Nlc3MuQWN0aW9uO1xyXG4gICAgICAgICAgICBhY2Nlc3NJbnAubW9kYWwudGFibGUucGVybWlzc2lvbnMgPSBwO1xyXG4gICAgICAgICAgICBpZiAoYWNjZXNzSW5wLm1vZGFsLnRhYmxlLmZvcm0pe1xyXG4gICAgICAgICAgICAgIGFjY2Vzc0lucC5tb2RhbC50YWJsZS5mb3JtLnVybCA9IGFjY2Vzcy5Vcmw7XHJcbiAgICAgICAgICAgICAgYWNjZXNzSW5wLm1vZGFsLnRhYmxlLmZvcm0uYmFzZVVybCA9IGFjY2Vzcy5Vcmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWNjZXNzSW5wLm1vZGFsLnRhYmxlLnNldCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGFjY2Vzc0lucC5tb2RhbC5mb3JtKXtcclxuICAgICAgICAgICAgYWNjZXNzSW5wLm1vZGFsLmZvcm0ubmFtZSA9IGFjY2Vzcy5OYW1lO1xyXG4gICAgICAgICAgICBhY2Nlc3NJbnAubW9kYWwuZm9ybS51cmwgPSBhY2Nlc3MuVXJsO1xyXG4gICAgICAgICAgICBhY2Nlc3NJbnAubW9kYWwuZm9ybS5vblN1Y2Nlc3NCYXNlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGFjY2Vzc0lucC5tb2RhbC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIGlmIChhY2Nlc3MuSW5wdXRBY3Rpb24gPT09IFBlcm1pc3Npb25JbnB1dEFjdGlvbkVudW0uT25DbGljayl7XHJcbiAgICAgICAgYWNjZXNzSW5wLm9uQ2xpY2sgPSAoYnRuKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnNBY3Rpb25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IGFjY2Vzcy5BY3Rpb24pLm9uQ2xpY2soYnRuKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYnV0dG9ucy5wdXNoKGFjY2Vzc0lucCk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLnBlcm1pc3Npb25zLmdldE9wdGlvbnMoKS5maWx0ZXIoeCA9PiB4Lk11bHRpKSl7XHJcbiAgICAgIGNvbnN0IG9wdCA9IG5ldyBJbnB1dENsYXNzKHRoaXMuZW52aXJvbm1lbnQsIHRoaXMubCwgb3B0aW9uLk5hbWUsIG9wdGlvbi5JY29uLCBJbnB1dFR5cGUuSWNvbiwgJ20tci0xMC1wJyk7XHJcbiAgICAgIGlmIChvcHRpb24uQWNjZXNzVHlwZSA9PT0gUGVybWlzc2lvbkFjY2Vzc1R5cGVFbnVtLlJlcG9ydCl7XHJcbiAgICAgICAgb3B0Lm9uQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmRhdGEoKS5tYXAoeCA9PiAnSWRzPScgKyB4LklkKS5qb2luKCcmJyk7XHJcbiAgICAgICAgICBjb25zdCB1ID0gdGhpcy5nZXRPcHRpb25Vcmwob3B0aW9uLlVybCwgdGhpcy5wZXJtaXNzaW9ucy5SZWxhdGVkSWQsICcnKTtcclxuICAgICAgICAgIHdpbmRvdy5vcGVuKCcvcmVwb3J0JyArIHUgKyAocGFyYW1zID8gKHUuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JykgKyBwYXJhbXMgOiAnJyksICdfYmxhbmsnKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9ICBlbHNlIGlmIChvcHRpb24uSW5wdXRBY3Rpb24gPT09IFBlcm1pc3Npb25JbnB1dEFjdGlvbkVudW0uT25DbGljayl7XHJcbiAgICAgICAgb3B0Lm9uQ2xpY2sgPSAoYnRuKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnNBY3Rpb25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IG9wdGlvbi5BY3Rpb24pLm9uQ2xpY2soYnRuKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdC5vbkNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcCA9IG5ldyBQZXJtaXNzaW9uQ2xhc3MoKTtcclxuICAgICAgICAgIHAuUmVsYXRlZElkID0gdGhpcy5wZXJtaXNzaW9ucy5SZWxhdGVkSWQ7XHJcbiAgICAgICAgICBwLkFyZWEgPSB0aGlzLnBlcm1pc3Npb25zLkFyZWE7XHJcbiAgICAgICAgICBwLkNvbnRyb2xsZXIgPSBvcHRpb24uQ29udHJvbGxlcjtcclxuICAgICAgICAgIHAuQWN0aW9uID0gb3B0aW9uLkFjdGlvbjtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7SWRzOiB0aGlzLmRhdGEoKS5tYXAoeCA9PiB4LklkKX07XHJcbiAgICAgICAgICB0aGlzLnNob3dDb25maXJtKHRoaXMubChvcHRpb24uQWN0aW9uICsgJ0NvbmZpcm1NdWx0aScsIGRhdGEuSWRzLmxlbmd0aCksIHRoaXMuZ2V0T3B0aW9uVXJsKG9wdGlvbi5VcmwsIHRoaXMucGVybWlzc2lvbnMuUmVsYXRlZElkLCAnJyksIGRhdGEsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub3B0aW9uQnV0dG9ucy5wdXNoKG9wdCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JtKXtcclxuICAgICAgdGhpcy5mb3JtLmFkZEJ1dHRvbnMoJ1NhdmUnLCB0aGlzLnBlcm1pc3Npb25zLlR5cGUgPT09IFBlcm1pc3Npb25UeXBlRW51bS5Gb3JtID8gJ2dyZWVuIHctMTAgb25seS1pY29uIGYtbCcgOiAnZ3JlZW4nLFxyXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMuVHlwZSAhPT0gUGVybWlzc2lvblR5cGVFbnVtLkZvcm0sIHRoaXMucGVybWlzc2lvbnMuZ2V0QWNjZXNzZXMoKS5zb21lKHggPT4geC5BY2Nlc3NUeXBlID09PSBQZXJtaXNzaW9uQWNjZXNzVHlwZUVudW0uSW5zZXJ0KSxcclxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zLlR5cGUgPT09IFBlcm1pc3Npb25UeXBlRW51bS5Gb3JtID8gKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLm9uVG9wRm9ybVN1Ym1pdChkYXRhLCBjaGFuZ2VSb3dzKTtcclxuICAgICAgfSA6IG51bGwpO1xyXG4gICAgICBpZiAodGhpcy5oYXNDaGlsZHJlbil7XHJcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBuZXcgSW5wdXRDbGFzcyh0aGlzLmVudmlyb25tZW50LCB0aGlzLmwsICdMZXZlbCcsIG51bGwsIElucHV0VHlwZS5IaWRkZW4pO1xyXG4gICAgICAgIHRoaXMuZm9ybS5pbnB1dHMucHVzaChsZXZlbCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZm9ybS5vblRvcCl7XHJcbiAgICAgICAgdGhpcy5mb3JtLm9uU3VjY2Vzc0Jhc2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uY2xlYXIodGhpcy5pbnNlcnRBY2Nlc3MgIT0gbnVsbCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWQoKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2RhbCl7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsQ2xhc3ModGhpcy5lbnZpcm9ubWVudCwgdGhpcy5sLCB0aGlzLmZvcm0ubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubW9kYWwuZm9ybSA9IHRoaXMuZm9ybTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBvblRvcEZvcm1TdWJtaXQoZGF0YSwgY2hhbmdlUm93cyA9IG51bGwpOiB2b2lke1xyXG4gICAgaWYgKGRhdGEuSWQpe1xyXG4gICAgICBjb25zdCBpID0gdGhpcy5yb3dzLmZpbmRJbmRleCh4ID0+IHguRGF0YS5JZCA9PT0gZGF0YS5JZCk7XHJcbiAgICAgIHRoaXMucm93c1tpXS5EYXRhID0gZGF0YTtcclxuICAgIH1lbHNle1xyXG4gICAgICBkYXRhLklkID0gcGFyc2VJbnQoSGVscGVyQ2xhc3MucmFuZG9tKDUsIGZhbHNlLCBmYWxzZSksIDEwKTtcclxuICAgICAgY29uc3QgdUFjY2VzcyA9IG5ldyBQZXJtaXNzaW9uQ2xhc3MoKTtcclxuICAgICAgdUFjY2Vzcy5BY3Rpb24gPSAnVXBkYXRlJztcclxuICAgICAgdUFjY2Vzcy5UeXBlID0gUGVybWlzc2lvblR5cGVFbnVtLk9wdGlvbjtcclxuICAgICAgdUFjY2Vzcy5JbnB1dEFjdGlvbiA9IFBlcm1pc3Npb25JbnB1dEFjdGlvbkVudW0uTm9uZTtcclxuICAgICAgdUFjY2Vzcy5JbnB1dFR5cGUgPSBQZXJtaXNzaW9uSW5wdXRUeXBlRW51bS5JY29uO1xyXG4gICAgICB1QWNjZXNzLkFjY2Vzc1R5cGUgPSBQZXJtaXNzaW9uQWNjZXNzVHlwZUVudW0uVXBkYXRlO1xyXG4gICAgICB1QWNjZXNzLkljb24gPSAnZmFkIGZhLXBlbic7XHJcbiAgICAgIHVBY2Nlc3MuTmFtZSA9ICdVcGRhdGUnO1xyXG4gICAgICBjb25zdCBkQWNjZXNzID0gbmV3IFBlcm1pc3Npb25DbGFzcygpO1xyXG4gICAgICBkQWNjZXNzLkFjdGlvbiA9ICdEZWxldGUnO1xyXG4gICAgICBkQWNjZXNzLlR5cGUgPSBQZXJtaXNzaW9uVHlwZUVudW0uT3B0aW9uO1xyXG4gICAgICBkQWNjZXNzLklucHV0QWN0aW9uID0gUGVybWlzc2lvbklucHV0QWN0aW9uRW51bS5Ob25lO1xyXG4gICAgICBkQWNjZXNzLklucHV0VHlwZSA9IFBlcm1pc3Npb25JbnB1dFR5cGVFbnVtLkljb247XHJcbiAgICAgIGRBY2Nlc3MuQWNjZXNzVHlwZSA9IFBlcm1pc3Npb25BY2Nlc3NUeXBlRW51bS5EZWxldGU7XHJcbiAgICAgIGRBY2Nlc3MuSWNvbiA9ICdmYWQgZmEtdHJhc2gnO1xyXG4gICAgICBkQWNjZXNzLk5hbWUgPSAnRGVsZXRlJztcclxuICAgICAgaWYgKHRoaXMuc29ydFR5cGUgPT09ICdERVNDJyl7XHJcbiAgICAgICAgdGhpcy5yb3dzLnB1c2goe1xyXG4gICAgICAgICAgRGF0YTogZGF0YSxcclxuICAgICAgICAgIE9wdGlvbnM6IFt1QWNjZXNzLCBkQWNjZXNzXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucm93cy51bnNoaWZ0KHtcclxuICAgICAgICAgIERhdGE6IGRhdGEsXHJcbiAgICAgICAgICBPcHRpb25zOiBbdUFjY2VzcywgZEFjY2Vzc11cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZVJvd3Mpe1xyXG4gICAgICBjaGFuZ2VSb3dzLmVtaXQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm0uY2xlYXIodGhpcy5pbnNlcnRBY2Nlc3MgIT0gbnVsbCk7XHJcbiAgICBpZiAodGhpcy5vbkxvYWQpe1xyXG4gICAgICB0aGlzLm9uTG9hZChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENlbGwocm93OiBhbnksIGNvbDogVGFibGVDb2xsQ2xhc3MpOiBhbnl7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnZ2V0Q2VsbCcpO1xyXG4gICAgY29uc3QgY3YgPSBfLmdldChyb3cuRGF0YSwgY29sLm5hbWUpO1xyXG4gICAgaWYgKGN2ID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjb2wuZGVmYXVsdCA/IGNvbC5kZWZhdWx0IDogJyc7XHJcbiAgICB9IGVsc2UgaWYgKGNvbC5mdW4gIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gY29sLmZ1bihyb3cuRGF0YSk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbC5lbnVtICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmwoRW51bVV0aWxzLmdldEtleUJ5VmFsdWUoY29sLmVudW0sIGN2KSk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbGxUeXBlLkRhdGVEaWYpIHtcclxuICAgICAgcmV0dXJuIEhlbHBlckNsYXNzLmdldERhdGVEaWYodGhpcy5sLCBjdik7XHJcbiAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbGxUeXBlLkRhdGUpIHtcclxuICAgICAgcmV0dXJuIEhlbHBlckNsYXNzLmdldERhdGUoY3YpO1xyXG4gICAgfSBlbHNlIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2xsVHlwZS5EYXRlVGltZSkge1xyXG4gICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibHRyXCI+JyArIEhlbHBlckNsYXNzLmdldERhdGVUaW1lKGN2KSArICc8L3NwYW4+JztcclxuICAgIH0gZWxzZSAgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbGxUeXBlLk1vbnRoKSB7XHJcbiAgICAgIHJldHVybiBIZWxwZXJDbGFzcy5nZXREYXRlKGN2LCAnak1NTU0gallZWVknKTtcclxuICAgIH0gIGVsc2UgIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2xsVHlwZS5ZZWFyKSB7XHJcbiAgICAgIHJldHVybiBIZWxwZXJDbGFzcy5nZXREYXRlKGN2LCAnallZWVknKTtcclxuICAgIH0gZWxzZSBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuVGltZSkge1xyXG4gICAgICByZXR1cm4gSGVscGVyQ2xhc3MuZ2V0VGltZShjdik7XHJcbiAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbGxUeXBlLkNvbG9yKSB7XHJcbiAgICAgIHJldHVybiAnPGRpdiBjbGFzcz1cImNvbG9yXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAnICsgY3YgKyAnOyBjb2xvcjogJyArIEhlbHBlckNsYXNzLmdldENvbG9yQnlCZ0NvbG9yKGN2KSArICdcIj4nICsgY3YgKyAnPC9kaXY+JztcclxuICAgIH0gZWxzZSBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuVXJsKSB7XHJcbiAgICAgIHJldHVybiAnPGEgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJsdHJcIiBocmVmPVwiJyArIGN2ICsgJ1wiPicgKyBjdiArICc8L2E+JztcclxuICAgIH0gZWxzZSBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuSW1hZ2UpIHtcclxuICAgICAgcmV0dXJuICc8aW1nIHN0eWxlPVwiaGVpZ2h0OiAnICsgdGhpcy5oZWlnaHQgKyAncHhcIiBhbHQ9XCJcIiBzcmM9XCInICsgdGhpcy5lbnZpcm9ubWVudC51cmwgKyBjdiArICdcIi8+JztcclxuICAgIH0gZWxzZSBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuRmlsZVNpemUpIHtcclxuICAgICAgcmV0dXJuIEhlbHBlckNsYXNzLmdldEZpbGVTaXplKGN2KTtcclxuICAgIH0gZWxzZSBpZiAoY29sLnR5cGUgPT09IFRhYmxlQ29sbFR5cGUuUHJpY2UpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSGVscGVyQ2xhc3MudG9QcmljZSh0aGlzLmwsIGN2KTtcclxuICAgICAgfWNhdGNoIHt9XHJcbiAgICB9ICBlbHNlIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2xsVHlwZS5OdW1iZXIpIHtcclxuICAgICAgcmV0dXJuIGN2LnRvTG9jYWxlU3RyaW5nKCk7XHJcbiAgICB9ICBlbHNlIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2xsVHlwZS5GaWxlcykge1xyXG4gICAgICBsZXQgZmlsZXMgPSAnJztcclxuICAgICAgZm9yIChjb25zdCBmIG9mIGN2KSB7XHJcbiAgICAgICAgY29uc3QgayA9IGYuc3BsaXQoJy4nKS5hdCgtMSk7XHJcbiAgICAgICAgaWYgKGsgPT09ICdqcGVnJyB8fCBrID09PSAnanBnJyB8fCBrID09PSAncG5nJyl7XHJcbiAgICAgICAgICBmaWxlcyArPSAnPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cIicgKyB0aGlzLmVudmlyb25tZW50LnVybCArIGYgKyAnXCIgY2xhc3M9XCJtLWgtNVwiPjxpbWcgYWx0PVwiXCIgc3JjPVwiJyArIHRoaXMuZW52aXJvbm1lbnQudXJsICsgZiArICdcIiBzdHlsZT1cImhlaWdodDogMzBweFwiLz48L2E+JztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGZpbGVzICs9ICc8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiJyArIHRoaXMuZW52aXJvbm1lbnQudXJsICsgZiArICdcIiBjbGFzcz1cImYtcy0zMCBtLWgtNSAnICsgRmlsZUljb25zW2tdICsgJ1wiPjwvYT4nO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlsZXM7XHJcbiAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbGxUeXBlLlBsYXF1ZSkge1xyXG4gICAgICBjb25zdCBwYXJ0cyA9IGN2LnNwbGl0KCdfJyk7XHJcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDQpIHtcclxuICAgICAgICByZXR1cm4gJzxkaXYgZGF0YS1jb3B5PVwiJyArIHBhcnRzLmpvaW4oJyAnKSArICdcIiBjbGFzcz1cInBsYXF1ZScgKyAocGFydHNbMV0gPT09ICfYuScgPyAnIHAnIDogJycpICsgKHBhcnRzWzFdID09PSAn2KcnID8gJyBnJyA6ICcnKSArICdcIj4nICtcclxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwicGFydDFcIj4nICsgcGFydHNbMF0gKyAnPC9kaXY+JyArXHJcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInBhcnQyXCI+JyArIHBhcnRzWzFdICsgJzwvZGl2PicgK1xyXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJwYXJ0M1wiPicgKyBwYXJ0c1syXSArICc8L2Rpdj4nICtcclxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwicGFydDRcIj4nICsgcGFydHNbM10gKyAnPC9kaXY+JyArXHJcbiAgICAgICAgICAnPC9kaXY+JztcclxuICAgICAgfSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDIgJiYgcGFydHMuZXZlcnkoeCA9PiAvXlswLTldKyQvLnRlc3QoeCkpKXtcclxuICAgICAgICByZXR1cm4gJzxkaXYgZGF0YS1jb3B5PVwiJyArIHBhcnRzLmpvaW4oJyAnKSArICdcIiBjbGFzcz1cInBsYXF1ZSBwbGFxdWUtbVwiPicgK1xyXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJwYXJ0MVwiPicgKyBwYXJ0c1swXSArICc8L2Rpdj4nICtcclxuICAgICAgICAgICc8ZGl2IGNsYXNzPVwicGFydDJcIj4nICsgcGFydHNbMV0gKyAnPC9kaXY+JyArXHJcbiAgICAgICAgICAnPC9kaXY+JztcclxuICAgICAgfSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpe1xyXG4gICAgICAgIHJldHVybiAnPGRpdiBkYXRhLWNvcHk9XCInICsgcGFydHMuam9pbignICcpICsgJ1wiIGNsYXNzPVwicGxhcXVlIHBsYXF1ZS1mXCI+JyArXHJcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInBhcnQxXCI+JyArIHBhcnRzWzBdICsgJzwvZGl2PicgK1xyXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJwYXJ0MlwiPicgKyBwYXJ0c1sxXSArICc8L2Rpdj4nICtcclxuICAgICAgICAgICc8L2Rpdj4nO1xyXG4gICAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSl7XHJcbiAgICAgICAgcmV0dXJuICc8ZGl2IGRhdGEtY29weT1cIicgKyBwYXJ0c1swXSArICdcIiBjbGFzcz1cInBsYXF1ZSBwbGFxdWUtZ1wiPicgK1xyXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJwYXJ0MVwiPicgKyBwYXJ0c1swXSArICc8L2Rpdj4nICtcclxuICAgICAgICAgICc8L2Rpdj4nO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09PSBUYWJsZUNvbGxUeXBlLlBsYXF1ZVRleHQpIHtcclxuICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwibHRyXCI+JHtIZWxwZXJDbGFzcy5Ub1JlYWRhYmxlUGxhcXVlKGN2KX08L2Rpdj5gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubChjdik7XHJcbiAgfVxyXG4gIGV4Y2VsKCk6IHZvaWR7XHJcbiAgICBjb25zdCBkYXRhID0gW107XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICBjb25zdCB4ID0ge307XHJcbiAgICAgIHRoaXMuY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgbGV0IHR4dDogYW55ID0gdGhpcy5nZXRUZXh0KHRoaXMuZ2V0Q2VsbChyb3csIGNvbCkpO1xyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVDb2xsVHlwZS5QcmljZSl7XHJcbiAgICAgICAgICBjb25zdCB0ciA9IHR4dC5yZXBsYWNlKCfYsduM2KfZhCcsICcnKS5yZXBsYWNlKC8sL2csICcnKS50cmltKCk7XHJcbiAgICAgICAgICB0eHQgPSBwYXJzZUludCh0ciwgMTApO1xyXG4gICAgICAgICAgdHh0ID0gaXNOYU4odHh0KSA/IDAgOiB0eHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHhbdGhpcy5sKGNvbC5uYW1lKV0gPSB0eHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkYXRhLnB1c2goeCk7XHJcbiAgICB9KTtcclxuICAgIG5ldyBFeGNlbENsYXNzKCkuZXhwb3J0QXNFeGNlbEZpbGUoZGF0YSwgdGhpcy5sKHRoaXMucGVybWlzc2lvbnM/Lk5hbWUgPz8gJ0V4cG9ydEV4Y2VsRGF0YScpKTtcclxuICB9XHJcbiAgZ2V0VGV4dChzKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBzcGFuLmlubmVySFRNTCA9IHM7XHJcbiAgICByZXR1cm4gc3Bhbi50ZXh0Q29udGVudCB8fCBzcGFuLmlubmVyVGV4dDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbGxDbGFzcyB7XHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBjbHMgPSAnJywgdHlwZTogVGFibGVDb2xsVHlwZSA9IFRhYmxlQ29sbFR5cGUuVGV4dCxcclxuICAgICAgICAgICAgICB3aXRoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSwgc29ydDogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLmNsYXNzID0gY2xzICsgKFtUYWJsZUNvbGxUeXBlLkNvbG9yLCBUYWJsZUNvbGxUeXBlLlVybCwgVGFibGVDb2xsVHlwZS5GaWxlU2l6ZV0uaW5jbHVkZXModHlwZSkgPyAnIGx0cicgOiAnJyk7XHJcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy53aXRoU2VhcmNoID0gdHlwZSA9PT0gVGFibGVDb2xsVHlwZS5JbWFnZSA/IGZhbHNlIDogd2l0aFNlYXJjaDtcclxuICAgIHRoaXMuc29ydCA9IHR5cGUgPT09IFRhYmxlQ29sbFR5cGUuSW1hZ2UgPyBmYWxzZSA6IHNvcnQ7XHJcbiAgfVxyXG4gIGVudW0gPSBudWxsO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBjbGFzczogc3RyaW5nO1xyXG4gIGRlZmF1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgc29ydCA9IHRydWU7XHJcbiAgd2l0aFNlYXJjaDogYm9vbGVhbjtcclxuICBzZWFyY2g6IElucHV0Q2xhc3MgPSBudWxsO1xyXG4gIHNlYXJjaERlZmF1bHQgPSBudWxsO1xyXG4gIHR5cGU6IFRhYmxlQ29sbFR5cGU7XHJcbiAgZnVuOiAocm93KSA9PiB2b2lkID0gbnVsbDtcclxufVxyXG4iXX0=