verben-ticketing-ui 0.6.0

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 (237) hide show
  1. package/README.md +25 -0
  2. package/esm2022/public-api.mjs +9 -0
  3. package/esm2022/src/lib/components/add-ticket/add-ticket.component.mjs +306 -0
  4. package/esm2022/src/lib/components/add-ticket/add-ticket.module.mjs +98 -0
  5. package/esm2022/src/lib/components/add-ticket/index.mjs +2 -0
  6. package/esm2022/src/lib/components/add-ticket/public-api.mjs +3 -0
  7. package/esm2022/src/lib/components/add-ticket/verben-ticketing-ui-src-lib-components-add-ticket.mjs +5 -0
  8. package/esm2022/src/lib/components/file-render/file-render.component.mjs +34 -0
  9. package/esm2022/src/lib/components/file-render/file-render.module.mjs +94 -0
  10. package/esm2022/src/lib/components/file-render/index.mjs +2 -0
  11. package/esm2022/src/lib/components/file-render/public-api.mjs +3 -0
  12. package/esm2022/src/lib/components/file-render/verben-ticketing-ui-src-lib-components-file-render.mjs +5 -0
  13. package/esm2022/src/lib/components/ticketing/base-table-style.mjs +56 -0
  14. package/esm2022/src/lib/components/ticketing/index.mjs +2 -0
  15. package/esm2022/src/lib/components/ticketing/public-api.mjs +4 -0
  16. package/esm2022/src/lib/components/ticketing/ticketing.component.mjs +813 -0
  17. package/esm2022/src/lib/components/ticketing/ticketing.module.mjs +96 -0
  18. package/esm2022/src/lib/components/ticketing/ticketing.service.mjs +220 -0
  19. package/esm2022/src/lib/components/ticketing/verben-ticketing-ui-src-lib-components-ticketing.mjs +5 -0
  20. package/esm2022/src/lib/components/ticketing-detail/chat-control/chat-control.component.mjs +240 -0
  21. package/esm2022/src/lib/components/ticketing-detail/chat-control/chat-control.module.mjs +98 -0
  22. package/esm2022/src/lib/components/ticketing-detail/index.mjs +2 -0
  23. package/esm2022/src/lib/components/ticketing-detail/public-api.mjs +3 -0
  24. package/esm2022/src/lib/components/ticketing-detail/ticketing-detail.component.mjs +592 -0
  25. package/esm2022/src/lib/components/ticketing-detail/ticketing-detail.module.mjs +109 -0
  26. package/esm2022/src/lib/components/ticketing-detail/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs +5 -0
  27. package/esm2022/src/lib/constants/index.mjs +2 -0
  28. package/esm2022/src/lib/constants/keynames.mjs +2 -0
  29. package/esm2022/src/lib/constants/pagesize.mjs +3 -0
  30. package/esm2022/src/lib/constants/public-api.mjs +3 -0
  31. package/esm2022/src/lib/constants/verben-ticketing-ui-src-lib-constants.mjs +5 -0
  32. package/esm2022/src/lib/models/Application.mjs +2 -0
  33. package/esm2022/src/lib/models/ApplicationRoleAction.mjs +2 -0
  34. package/esm2022/src/lib/models/ApplicationRoleContext.mjs +2 -0
  35. package/esm2022/src/lib/models/BaseModel.mjs +2 -0
  36. package/esm2022/src/lib/models/CacheDataRequest.mjs +2 -0
  37. package/esm2022/src/lib/models/Company.mjs +2 -0
  38. package/esm2022/src/lib/models/ErrorResponse.mjs +11 -0
  39. package/esm2022/src/lib/models/File.mjs +2 -0
  40. package/esm2022/src/lib/models/FilterTypes.mjs +9 -0
  41. package/esm2022/src/lib/models/HttpRequestType.mjs +8 -0
  42. package/esm2022/src/lib/models/KeyValueParam.mjs +2 -0
  43. package/esm2022/src/lib/models/ModelRelationship.mjs +2 -0
  44. package/esm2022/src/lib/models/OAuthParam.mjs +2 -0
  45. package/esm2022/src/lib/models/OAuthType.mjs +9 -0
  46. package/esm2022/src/lib/models/PagedResult.mjs +2 -0
  47. package/esm2022/src/lib/models/PasswordRequestParam.mjs +2 -0
  48. package/esm2022/src/lib/models/PermissionConfig.mjs +2 -0
  49. package/esm2022/src/lib/models/ResponseKeyValue.mjs +2 -0
  50. package/esm2022/src/lib/models/Role.mjs +2 -0
  51. package/esm2022/src/lib/models/RoleAction.mjs +2 -0
  52. package/esm2022/src/lib/models/RoleContext.mjs +2 -0
  53. package/esm2022/src/lib/models/Schedule.mjs +2 -0
  54. package/esm2022/src/lib/models/ScheduleType.mjs +6 -0
  55. package/esm2022/src/lib/models/SearchDynamicWrapper.mjs +2 -0
  56. package/esm2022/src/lib/models/SearchOperator.mjs +6 -0
  57. package/esm2022/src/lib/models/SearchPropertySign.mjs +11 -0
  58. package/esm2022/src/lib/models/SearchPropertyValue.mjs +2 -0
  59. package/esm2022/src/lib/models/SearchPropertyValueType.mjs +11 -0
  60. package/esm2022/src/lib/models/SortDirection.mjs +7 -0
  61. package/esm2022/src/lib/models/TaskUser.mjs +2 -0
  62. package/esm2022/src/lib/models/Tenant.mjs +2 -0
  63. package/esm2022/src/lib/models/TenantConfig.mjs +2 -0
  64. package/esm2022/src/lib/models/TenantPriority.mjs +2 -0
  65. package/esm2022/src/lib/models/Ticket.mjs +2 -0
  66. package/esm2022/src/lib/models/TicketMessage.mjs +2 -0
  67. package/esm2022/src/lib/models/TicketStatus.mjs +8 -0
  68. package/esm2022/src/lib/models/UserRequest.mjs +2 -0
  69. package/esm2022/src/lib/models/auth-mechanism.mjs +8 -0
  70. package/esm2022/src/lib/models/base.mjs +2 -0
  71. package/esm2022/src/lib/models/conditions.mjs +13 -0
  72. package/esm2022/src/lib/models/index.mjs +2 -0
  73. package/esm2022/src/lib/models/log-in.mjs +2 -0
  74. package/esm2022/src/lib/models/mainUser.mjs +2 -0
  75. package/esm2022/src/lib/models/oauth-resp.mjs +2 -0
  76. package/esm2022/src/lib/models/oauth-response.mjs +2 -0
  77. package/esm2022/src/lib/models/object-state.mjs +8 -0
  78. package/esm2022/src/lib/models/otpValue.mjs +2 -0
  79. package/esm2022/src/lib/models/paged.mjs +2 -0
  80. package/esm2022/src/lib/models/public-api.mjs +57 -0
  81. package/esm2022/src/lib/models/query-params.mjs +2 -0
  82. package/esm2022/src/lib/models/request-status.mjs +5 -0
  83. package/esm2022/src/lib/models/resend-otp-data.mjs +2 -0
  84. package/esm2022/src/lib/models/sign-up.mjs +2 -0
  85. package/esm2022/src/lib/models/single-sign-on.mjs +2 -0
  86. package/esm2022/src/lib/models/status.mjs +6 -0
  87. package/esm2022/src/lib/models/user-access-request-status.mjs +7 -0
  88. package/esm2022/src/lib/models/user-access-request.mjs +2 -0
  89. package/esm2022/src/lib/models/user-management.mjs +2 -0
  90. package/esm2022/src/lib/models/user.mjs +2 -0
  91. package/esm2022/src/lib/models/verben-ticketing-ui-src-lib-models.mjs +5 -0
  92. package/esm2022/src/lib/pipes/async-label.pipe.mjs +26 -0
  93. package/esm2022/src/lib/pipes/company-date.pipe.mjs +30 -0
  94. package/esm2022/src/lib/pipes/ellipse-word.pipe.mjs +23 -0
  95. package/esm2022/src/lib/pipes/index.mjs +2 -0
  96. package/esm2022/src/lib/pipes/public-api.mjs +4 -0
  97. package/esm2022/src/lib/pipes/verben-ticketing-ui-src-lib-pipes.mjs +5 -0
  98. package/esm2022/src/lib/services/company-settings.service.mjs +23 -0
  99. package/esm2022/src/lib/services/environment.service.mjs +26 -0
  100. package/esm2022/src/lib/services/http-web-request.service.mjs +100 -0
  101. package/esm2022/src/lib/services/import.service.mjs +247 -0
  102. package/esm2022/src/lib/services/index.mjs +2 -0
  103. package/esm2022/src/lib/services/label.service.mjs +261 -0
  104. package/esm2022/src/lib/services/public-api.mjs +8 -0
  105. package/esm2022/src/lib/services/shared.service.mjs +58 -0
  106. package/esm2022/src/lib/services/util.service.mjs +72 -0
  107. package/esm2022/src/lib/services/verben-ticketing-ui-src-lib-services.mjs +5 -0
  108. package/esm2022/src/utils/components/base-data-view.component.mjs +111 -0
  109. package/esm2022/src/utils/index.mjs +2 -0
  110. package/esm2022/src/utils/models/DataViewConfig.mjs +2 -0
  111. package/esm2022/src/utils/public-api.mjs +3 -0
  112. package/esm2022/src/utils/verben-ticketing-ui-src-utils.mjs +5 -0
  113. package/esm2022/verben-ticketing-ui.mjs +5 -0
  114. package/fesm2022/verben-ticketing-ui-src-lib-components-add-ticket.mjs +403 -0
  115. package/fesm2022/verben-ticketing-ui-src-lib-components-add-ticket.mjs.map +1 -0
  116. package/fesm2022/verben-ticketing-ui-src-lib-components-file-render.mjs +130 -0
  117. package/fesm2022/verben-ticketing-ui-src-lib-components-file-render.mjs.map +1 -0
  118. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs +1018 -0
  119. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing-detail.mjs.map +1 -0
  120. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs +1166 -0
  121. package/fesm2022/verben-ticketing-ui-src-lib-components-ticketing.mjs.map +1 -0
  122. package/fesm2022/verben-ticketing-ui-src-lib-constants.mjs +11 -0
  123. package/fesm2022/verben-ticketing-ui-src-lib-constants.mjs.map +1 -0
  124. package/fesm2022/verben-ticketing-ui-src-lib-models.mjs +138 -0
  125. package/fesm2022/verben-ticketing-ui-src-lib-models.mjs.map +1 -0
  126. package/fesm2022/verben-ticketing-ui-src-lib-pipes.mjs +81 -0
  127. package/fesm2022/verben-ticketing-ui-src-lib-pipes.mjs.map +1 -0
  128. package/fesm2022/verben-ticketing-ui-src-lib-services.mjs +770 -0
  129. package/fesm2022/verben-ticketing-ui-src-lib-services.mjs.map +1 -0
  130. package/fesm2022/verben-ticketing-ui-src-utils.mjs +118 -0
  131. package/fesm2022/verben-ticketing-ui-src-utils.mjs.map +1 -0
  132. package/fesm2022/verben-ticketing-ui.mjs +14 -0
  133. package/fesm2022/verben-ticketing-ui.mjs.map +1 -0
  134. package/index.d.ts +5 -0
  135. package/package.json +82 -0
  136. package/public-api.d.ts +4 -0
  137. package/src/lib/components/add-ticket/add-ticket.component.d.ts +44 -0
  138. package/src/lib/components/add-ticket/add-ticket.module.d.ts +15 -0
  139. package/src/lib/components/add-ticket/index.d.ts +1 -0
  140. package/src/lib/components/add-ticket/public-api.d.ts +2 -0
  141. package/src/lib/components/file-render/file-render.component.d.ts +14 -0
  142. package/src/lib/components/file-render/file-render.module.d.ts +14 -0
  143. package/src/lib/components/file-render/index.d.ts +1 -0
  144. package/src/lib/components/file-render/public-api.d.ts +2 -0
  145. package/src/lib/components/ticketing/base-table-style.d.ts +1 -0
  146. package/src/lib/components/ticketing/index.d.ts +1 -0
  147. package/src/lib/components/ticketing/public-api.d.ts +3 -0
  148. package/src/lib/components/ticketing/ticketing.component.d.ts +100 -0
  149. package/src/lib/components/ticketing/ticketing.module.d.ts +12 -0
  150. package/src/lib/components/ticketing/ticketing.service.d.ts +27 -0
  151. package/src/lib/components/ticketing-detail/chat-control/chat-control.component.d.ts +47 -0
  152. package/src/lib/components/ticketing-detail/chat-control/chat-control.module.d.ts +15 -0
  153. package/src/lib/components/ticketing-detail/index.d.ts +1 -0
  154. package/src/lib/components/ticketing-detail/public-api.d.ts +2 -0
  155. package/src/lib/components/ticketing-detail/ticketing-detail.component.d.ts +77 -0
  156. package/src/lib/components/ticketing-detail/ticketing-detail.module.d.ts +17 -0
  157. package/src/lib/constants/index.d.ts +1 -0
  158. package/src/lib/constants/keynames.d.ts +1 -0
  159. package/src/lib/constants/pagesize.d.ts +2 -0
  160. package/src/lib/constants/public-api.d.ts +2 -0
  161. package/src/lib/models/Application.d.ts +5 -0
  162. package/src/lib/models/ApplicationRoleAction.d.ts +9 -0
  163. package/src/lib/models/ApplicationRoleContext.d.ts +9 -0
  164. package/src/lib/models/BaseModel.d.ts +14 -0
  165. package/src/lib/models/CacheDataRequest.d.ts +7 -0
  166. package/src/lib/models/Company.d.ts +22 -0
  167. package/src/lib/models/ErrorResponse.d.ts +6 -0
  168. package/src/lib/models/File.d.ts +7 -0
  169. package/src/lib/models/FilterTypes.d.ts +6 -0
  170. package/src/lib/models/HttpRequestType.d.ts +6 -0
  171. package/src/lib/models/KeyValueParam.d.ts +5 -0
  172. package/src/lib/models/ModelRelationship.d.ts +7 -0
  173. package/src/lib/models/OAuthParam.d.ts +9 -0
  174. package/src/lib/models/OAuthType.d.ts +7 -0
  175. package/src/lib/models/PagedResult.d.ts +9 -0
  176. package/src/lib/models/PasswordRequestParam.d.ts +5 -0
  177. package/src/lib/models/PermissionConfig.d.ts +7 -0
  178. package/src/lib/models/ResponseKeyValue.d.ts +5 -0
  179. package/src/lib/models/Role.d.ts +9 -0
  180. package/src/lib/models/RoleAction.d.ts +10 -0
  181. package/src/lib/models/RoleContext.d.ts +10 -0
  182. package/src/lib/models/Schedule.d.ts +22 -0
  183. package/src/lib/models/ScheduleType.d.ts +4 -0
  184. package/src/lib/models/SearchDynamicWrapper.d.ts +7 -0
  185. package/src/lib/models/SearchOperator.d.ts +4 -0
  186. package/src/lib/models/SearchPropertySign.d.ts +9 -0
  187. package/src/lib/models/SearchPropertyValue.d.ts +14 -0
  188. package/src/lib/models/SearchPropertyValueType.d.ts +9 -0
  189. package/src/lib/models/SortDirection.d.ts +5 -0
  190. package/src/lib/models/TaskUser.d.ts +10 -0
  191. package/src/lib/models/Tenant.d.ts +22 -0
  192. package/src/lib/models/TenantConfig.d.ts +20 -0
  193. package/src/lib/models/TenantPriority.d.ts +10 -0
  194. package/src/lib/models/Ticket.d.ts +21 -0
  195. package/src/lib/models/TicketMessage.d.ts +11 -0
  196. package/src/lib/models/TicketStatus.d.ts +6 -0
  197. package/src/lib/models/UserRequest.d.ts +32 -0
  198. package/src/lib/models/auth-mechanism.d.ts +14 -0
  199. package/src/lib/models/base.d.ts +12 -0
  200. package/src/lib/models/conditions.d.ts +11 -0
  201. package/src/lib/models/index.d.ts +1 -0
  202. package/src/lib/models/log-in.d.ts +8 -0
  203. package/src/lib/models/mainUser.d.ts +19 -0
  204. package/src/lib/models/oauth-resp.d.ts +6 -0
  205. package/src/lib/models/oauth-response.d.ts +6 -0
  206. package/src/lib/models/object-state.d.ts +6 -0
  207. package/src/lib/models/otpValue.d.ts +9 -0
  208. package/src/lib/models/paged.d.ts +9 -0
  209. package/src/lib/models/public-api.d.ts +56 -0
  210. package/src/lib/models/query-params.d.ts +7 -0
  211. package/src/lib/models/request-status.d.ts +3 -0
  212. package/src/lib/models/resend-otp-data.d.ts +8 -0
  213. package/src/lib/models/sign-up.d.ts +9 -0
  214. package/src/lib/models/single-sign-on.d.ts +7 -0
  215. package/src/lib/models/status.d.ts +4 -0
  216. package/src/lib/models/user-access-request-status.d.ts +5 -0
  217. package/src/lib/models/user-access-request.d.ts +9 -0
  218. package/src/lib/models/user-management.d.ts +8 -0
  219. package/src/lib/models/user.d.ts +24 -0
  220. package/src/lib/pipes/async-label.pipe.d.ts +11 -0
  221. package/src/lib/pipes/company-date.pipe.d.ts +10 -0
  222. package/src/lib/pipes/ellipse-word.pipe.d.ts +8 -0
  223. package/src/lib/pipes/index.d.ts +1 -0
  224. package/src/lib/pipes/public-api.d.ts +3 -0
  225. package/src/lib/services/company-settings.service.d.ts +11 -0
  226. package/src/lib/services/environment.service.d.ts +22 -0
  227. package/src/lib/services/http-web-request.service.d.ts +24 -0
  228. package/src/lib/services/import.service.d.ts +14 -0
  229. package/src/lib/services/index.d.ts +1 -0
  230. package/src/lib/services/label.service.d.ts +24 -0
  231. package/src/lib/services/public-api.d.ts +7 -0
  232. package/src/lib/services/shared.service.d.ts +16 -0
  233. package/src/lib/services/util.service.d.ts +15 -0
  234. package/src/utils/components/base-data-view.component.d.ts +34 -0
  235. package/src/utils/index.d.ts +1 -0
  236. package/src/utils/models/DataViewConfig.d.ts +11 -0
  237. package/src/utils/public-api.d.ts +2 -0
@@ -0,0 +1,592 @@
1
+ import { Component, Input, ViewChildren, } from '@angular/core';
2
+ import { ObjectState, SortDirection } from 'verben-ticketing-ui/src/lib/models';
3
+ import { TicketStatus } from 'verben-ticketing-ui/src/lib/models';
4
+ import { SearchOperator } from 'verben-ticketing-ui/src/lib/models';
5
+ import { SearchPropertySign } from 'verben-ticketing-ui/src/lib/models';
6
+ import { ErrorResponse } from 'verben-ticketing-ui/src/lib/models';
7
+ import { DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD } from 'verben-ticketing-ui/src/lib/constants';
8
+ import { debounceTime, Subject } from 'rxjs';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/router";
11
+ import * as i2 from "verben-ticketing-ui/src/lib/services";
12
+ import * as i3 from "@angular/common";
13
+ import * as i4 from "@angular/forms";
14
+ import * as i5 from "verben-ng-ui";
15
+ import * as i6 from "./chat-control/chat-control.component";
16
+ import * as i7 from "verben-ticketing-ui/src/lib/components/file-render";
17
+ import * as i8 from "verben-ticketing-ui/src/lib/pipes";
18
+ export class TicketingDetailComponent {
19
+ route;
20
+ server;
21
+ utilService;
22
+ sharedService;
23
+ location;
24
+ envSvc;
25
+ user;
26
+ defaultCompany = '';
27
+ constructor(route, server, utilService, sharedService, location, envSvc) {
28
+ this.route = route;
29
+ this.server = server;
30
+ this.utilService = utilService;
31
+ this.sharedService = sharedService;
32
+ this.location = location;
33
+ this.envSvc = envSvc;
34
+ this.ticketingAPI = `${this.envSvc.environment.TicketingAPI}/Ticket`;
35
+ this.glAPI = this.envSvc.environment.GLAPI;
36
+ }
37
+ showForm = false;
38
+ data;
39
+ typingQuery = '';
40
+ isSearchingUsers = false;
41
+ userPopups;
42
+ ticketStatus = TicketStatus;
43
+ ticketingAPI = '';
44
+ tenantOptions = [];
45
+ glAPI = '';
46
+ attachedMessage = null;
47
+ maxFileSize = 15 * 1024 * 1024;
48
+ message = '';
49
+ action;
50
+ searchTrigger$ = new Subject();
51
+ fileData = [];
52
+ code = '';
53
+ color = '#ffe681';
54
+ textColor = '#000';
55
+ statusOptions = Object.keys(TicketStatus);
56
+ ngOnInit() {
57
+ this.route.paramMap.subscribe(async (params) => {
58
+ const code = params.get('code');
59
+ if (code) {
60
+ this.code = code;
61
+ this.getTicketDetail(code);
62
+ this.getAllTask(code);
63
+ this.getTenantPriority();
64
+ }
65
+ this.searchTrigger$.pipe(debounceTime(300)).subscribe((query) => {
66
+ if (query) {
67
+ this.searchUsers(query);
68
+ }
69
+ });
70
+ });
71
+ }
72
+ onFormClose(isShow) {
73
+ this.showForm = isShow;
74
+ }
75
+ onFormOpen(isShow) {
76
+ this.showForm = true;
77
+ }
78
+ async onFilesUpdate(files) {
79
+ if (!files || files.length === 0)
80
+ return;
81
+ // Helper function to convert a file to base64
82
+ const toBase64 = (file) => new Promise((resolve, reject) => {
83
+ const reader = new FileReader();
84
+ reader.readAsDataURL(file);
85
+ reader.onload = () => resolve(reader.result);
86
+ reader.onerror = (error) => reject(error);
87
+ });
88
+ try {
89
+ const convertedFiles = await Promise.all(files.map(async (file) => {
90
+ const base64Data = await toBase64(file);
91
+ const name = file.name || 'file';
92
+ const extension = name.split('.').pop() || '';
93
+ return {
94
+ Name: name,
95
+ Extension: extension,
96
+ Data: base64Data,
97
+ DataState: ObjectState.New,
98
+ };
99
+ }));
100
+ this.fileData = convertedFiles;
101
+ }
102
+ catch (error) {
103
+ console.error('Error converting files to base64:', error);
104
+ }
105
+ }
106
+ async saveMessageChat(ticket, newMessageContent) {
107
+ if (!newMessageContent || newMessageContent.trim().length === 0) {
108
+ this.utilService.showInfo('Message cannot be empty');
109
+ return;
110
+ }
111
+ const newMessage = {
112
+ Code: '',
113
+ Name: this.user?.MailAddress || 'perfection.chizuruoke@verbenalogic.com',
114
+ TicketCode: ticket.Code || '',
115
+ Subject: '',
116
+ Content: newMessageContent.trim(),
117
+ Attachments: this.fileData.length ? this.fileData : [],
118
+ AttachmentUrls: [],
119
+ Company: ticket.Company,
120
+ TenantId: '',
121
+ Upsert: false,
122
+ ServiceName: '',
123
+ CreatedAt: new Date(),
124
+ UpdatedAt: new Date(),
125
+ UpdatedBy: '',
126
+ CreatedBy: '',
127
+ DataState: ObjectState.New,
128
+ Id: '',
129
+ };
130
+ // if (!this.data.Messages) this.data.Messages = [];
131
+ // this.data.Messages.push(newMessage);
132
+ // this.data.DataState = ObjectState.Changed;
133
+ try {
134
+ this.utilService.sendBI(true);
135
+ const res = await this.server.post(`Ticket/SendMailToTicketOwner`, newMessage, this.envSvc.environment.TicketingAPI);
136
+ this.utilService.sendBI(false);
137
+ if (res instanceof ErrorResponse) {
138
+ this.utilService.showError('Failed to send message.');
139
+ return;
140
+ }
141
+ const result = res;
142
+ if (result) {
143
+ this.data.Messages = [...this.data.Messages, result];
144
+ this.data = { ...this.data };
145
+ this.utilService.showSuccess('Message sent successfully');
146
+ }
147
+ }
148
+ catch (error) {
149
+ console.error(error);
150
+ this.utilService.sendBI(false);
151
+ this.utilService.showError('Something went wrong while sending message');
152
+ }
153
+ }
154
+ async save() {
155
+ const item = this.data;
156
+ ((item.DataState = this.data ? ObjectState.Changed : ObjectState.New),
157
+ this.utilService.sendBI(true));
158
+ const res = await this.server.post(`Ticket/SaveTicket`, [item], this.envSvc.environment.TicketingAPI);
159
+ this.utilService.sendBI(false);
160
+ if (res instanceof ErrorResponse) {
161
+ }
162
+ else {
163
+ this.utilService.showSuccess('Ticket saved successfully');
164
+ const result = res;
165
+ if (result !== null) {
166
+ this.data = { ...this.data, ...result };
167
+ }
168
+ }
169
+ }
170
+ goBack() {
171
+ this.location.back();
172
+ }
173
+ disableChatBoxButton() {
174
+ return false;
175
+ }
176
+ onKeyDown(e) { }
177
+ messageChange(e) {
178
+ this.message = e;
179
+ this.detectUserSearchTrigger(e);
180
+ }
181
+ selectUser(user) {
182
+ const before = this.message.replace(/@([a-zA-Z0-9_]*)$/, '');
183
+ this.message = before + '@' + user.MailAddress + ' ';
184
+ this.messageChange(this.message);
185
+ this.closeUserPopup();
186
+ }
187
+ openUserPopup() {
188
+ this.userPopups.forEach((p) => {
189
+ if (!p.dropdownOpen)
190
+ p.toggleDropdown();
191
+ });
192
+ }
193
+ closeUserPopup() {
194
+ this.userPopups.forEach((p) => {
195
+ if (p.dropdownOpen)
196
+ p.toggleDropdown();
197
+ });
198
+ }
199
+ detectUserSearchTrigger(text) {
200
+ const regex = /@([a-zA-Z0-9_]*)$/;
201
+ const match = text.match(regex);
202
+ if (match) {
203
+ this.typingQuery = match[1];
204
+ this.isSearchingUsers = true;
205
+ this.searchTrigger$.next(this.typingQuery);
206
+ }
207
+ else {
208
+ this.typingQuery = '';
209
+ this.isSearchingUsers = false;
210
+ this.closeUserPopup();
211
+ }
212
+ }
213
+ usersResult = [];
214
+ async searchUsers(query) {
215
+ if (!query) {
216
+ this.usersResult = [];
217
+ return;
218
+ }
219
+ const payload = [
220
+ {
221
+ PropertyName: 'MailAddress',
222
+ EntityValue: query,
223
+ Operator: SearchOperator.And,
224
+ Sign: SearchPropertySign.LIKE,
225
+ },
226
+ ];
227
+ const res = await this.server.post(`SearchUsers/0/20`, payload, this.envSvc.environment.AuthenticationAPI);
228
+ if (res instanceof ErrorResponse)
229
+ return;
230
+ this.usersResult = res.Result;
231
+ this.openUserPopup();
232
+ }
233
+ triggerFileUpload() {
234
+ const fileInput = document.createElement('input');
235
+ fileInput.type = 'file';
236
+ fileInput.accept = '.png, .jpg, .jpeg, .pdf';
237
+ fileInput.style.display = 'none'; // Hidden file input
238
+ document.body.appendChild(fileInput); // Temporarily add to DOM
239
+ fileInput.addEventListener('change', () => {
240
+ const file = fileInput.files?.[0];
241
+ if (file) {
242
+ this.processFile(file);
243
+ }
244
+ document.body.removeChild(fileInput); // Clean up after use
245
+ });
246
+ fileInput.click(); // Programmatically trigger click
247
+ }
248
+ async processFile(selectedFile) {
249
+ // Check file size
250
+ if (selectedFile.size > this.maxFileSize) {
251
+ const limitInMB = this.maxFileSize / 1024 / 1024;
252
+ this.utilService.showInfo(`File size limit of ${limitInMB}mb exceeded`);
253
+ return;
254
+ }
255
+ // let fileToProcess: globalThis.File | null = selectedFile;
256
+ // const safeNumber: number = 1 * 1024 * 1024;
257
+ // if (fileToProcess.size > safeNumber) {
258
+ // fileToProcess = await this.utilService.compressImage(selectedFile);
259
+ // if (!fileToProcess) {
260
+ // this.utilService.showError('Error compressing image');
261
+ // return;
262
+ // }
263
+ // }
264
+ // Read file and convert to base64
265
+ const reader = new FileReader();
266
+ reader.readAsDataURL(selectedFile);
267
+ reader.onload = () => {
268
+ const base64data = reader.result;
269
+ const file = this.sharedService.createCustomFile(base64data, 0, selectedFile);
270
+ if (file && this.attachedMessage) {
271
+ this.attachedMessage.Attachments.push(file);
272
+ this.attachedMessage.AttachmentUrls.push(`${file.Name}`);
273
+ // this.profileImage = base64data;
274
+ }
275
+ };
276
+ }
277
+ async getTicketDetail(code) {
278
+ const payload = [
279
+ {
280
+ PropertyName: 'Code',
281
+ EntityValue: code,
282
+ Operator: SearchOperator.And,
283
+ Sign: SearchPropertySign.EQ,
284
+ },
285
+ {
286
+ PropertyName: 'TenantId',
287
+ EntityValue: '',
288
+ Operator: SearchOperator.And,
289
+ Sign: SearchPropertySign.NEQ,
290
+ },
291
+ ];
292
+ this.utilService.sendBI(true);
293
+ const res = await this.server.post(`Ticket/SearchTicket/0/50`, payload, this.envSvc.environment.TicketingAPI);
294
+ this.utilService.sendBI(false);
295
+ if (res instanceof ErrorResponse)
296
+ return undefined;
297
+ const result = res.Result;
298
+ if (result?.length > 0) {
299
+ this.data = result[0];
300
+ this.getMessages(this.data.Code).then((data) => {
301
+ if (data) {
302
+ this.data.Messages = data;
303
+ }
304
+ });
305
+ return result[0];
306
+ }
307
+ return undefined;
308
+ }
309
+ async getMessages(code) {
310
+ const payload = [
311
+ {
312
+ PropertyName: 'TicketCode',
313
+ EntityValue: code,
314
+ Operator: SearchOperator.And,
315
+ Sign: SearchPropertySign.EQ,
316
+ Sort: SortDirection.Desc,
317
+ },
318
+ {
319
+ PropertyName: 'TenantId',
320
+ EntityValue: '',
321
+ Operator: SearchOperator.And,
322
+ Sign: SearchPropertySign.NEQ,
323
+ Sort: SortDirection.Desc,
324
+ },
325
+ ];
326
+ this.utilService.sendBI(true);
327
+ const res = await this.server.post(`Ticket/SearchTicketMessage/0/500`, payload, this.envSvc.environment.TicketingAPI);
328
+ this.utilService.sendBI(false);
329
+ if (res instanceof ErrorResponse)
330
+ return undefined;
331
+ const result = res.Result;
332
+ if (result?.length > 0) {
333
+ return result;
334
+ }
335
+ return undefined;
336
+ }
337
+ async getTenantPriority() {
338
+ const payload = [
339
+ {
340
+ PropertyName: 'TenantId',
341
+ EntityValue: '',
342
+ Operator: SearchOperator.And,
343
+ Sign: SearchPropertySign.NEQ,
344
+ },
345
+ ];
346
+ this.utilService.sendBI(true);
347
+ const res = await this.server.post(`Ticket/SearchTenantPriority/0/50`, payload, this.envSvc.environment.TicketingAPI);
348
+ this.utilService.sendBI(false);
349
+ if (res instanceof ErrorResponse)
350
+ return undefined;
351
+ const result = res.Result;
352
+ if (result?.length > 0) {
353
+ this.tenantOptions = result;
354
+ }
355
+ return undefined;
356
+ }
357
+ cssColorToHex(color) {
358
+ const ctx = document.createElement('canvas').getContext('2d');
359
+ if (!ctx)
360
+ return null;
361
+ ctx.fillStyle = '#000'; // set a known color
362
+ ctx.fillStyle = color; // assign any CSS-valid color
363
+ const computed = ctx.fillStyle;
364
+ // If the browser does NOT understand the value, it won’t change from '#000'
365
+ if (computed.toLowerCase() === '#000000' &&
366
+ color.toLowerCase() !== 'black') {
367
+ return null; // invalid color name or unsupported value
368
+ }
369
+ return computed.toUpperCase(); // returns hex like #1E90FF
370
+ }
371
+ softenColor(hex, lightenPercent = 55, alphaPercent = 55) {
372
+ // Remove #
373
+ if (!hex.startsWith('#')) {
374
+ const converted = this.cssColorToHex(hex);
375
+ if (converted) {
376
+ hex = converted;
377
+ }
378
+ }
379
+ hex = hex.replace(/^#/, '');
380
+ if (hex.length === 3) {
381
+ // Convert shorthand (#abc → #aabbcc)
382
+ hex = hex
383
+ .split('')
384
+ .map((x) => x + x)
385
+ .join('');
386
+ }
387
+ const num = parseInt(hex, 16);
388
+ let r = (num >> 16) & 0xff;
389
+ let g = (num >> 8) & 0xff;
390
+ let b = num & 0xff;
391
+ // Lighten toward white by the given percentage
392
+ r = Math.min(255, Math.round(r + (255 - r) * (lightenPercent / 100)));
393
+ g = Math.min(255, Math.round(g + (255 - g) * (lightenPercent / 100)));
394
+ b = Math.min(255, Math.round(b + (255 - b) * (lightenPercent / 100)));
395
+ // Convert alpha percent to 2-digit hex
396
+ const alpha = Math.round((alphaPercent / 100) * 255);
397
+ const aHex = alpha.toString(16).padStart(2, '0').toUpperCase();
398
+ return `#${r.toString(16).padStart(2, '0').toUpperCase()}${g
399
+ .toString(16)
400
+ .padStart(2, '0')
401
+ .toUpperCase()}${b.toString(16).padStart(2, '0').toUpperCase()}${aHex}`;
402
+ }
403
+ getTicketMessage() {
404
+ if (this.data) {
405
+ const initialMessage = this.data.Messages.find((x) => x.Subject == DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD);
406
+ if (initialMessage) {
407
+ return { ...initialMessage, DataState: ObjectState.Changed };
408
+ }
409
+ else {
410
+ const newMessage = {
411
+ TicketCode: '',
412
+ Subject: DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD,
413
+ Content: '',
414
+ Attachments: [],
415
+ AttachmentUrls: [],
416
+ Company: this.defaultCompany,
417
+ Id: '',
418
+ Code: '',
419
+ TenantId: '',
420
+ ServiceName: '',
421
+ id: '',
422
+ CreatedAt: new Date(),
423
+ UpdatedAt: new Date(),
424
+ DataState: ObjectState.New,
425
+ };
426
+ return newMessage;
427
+ }
428
+ }
429
+ else {
430
+ const newMessage = {
431
+ TicketCode: '',
432
+ Subject: DEFAULT_MESSAGE_FOR_INITIAL_UPLOAD,
433
+ Content: '',
434
+ Attachments: [],
435
+ AttachmentUrls: [],
436
+ Company: this.defaultCompany,
437
+ Id: '',
438
+ Code: '',
439
+ TenantId: '',
440
+ ServiceName: '',
441
+ id: '',
442
+ CreatedAt: new Date(),
443
+ UpdatedAt: new Date(),
444
+ DataState: ObjectState.New,
445
+ };
446
+ return newMessage;
447
+ }
448
+ }
449
+ async getAllTask(code) {
450
+ this.utilService.sendBI(true);
451
+ const res = await this.server.get(`Task/GetTaskInfo/${code}`, this.envSvc.environment.WorkFlowAPI);
452
+ this.utilService.sendBI(false);
453
+ if (res instanceof ErrorResponse) {
454
+ return undefined;
455
+ }
456
+ else {
457
+ const result = res;
458
+ if (result) {
459
+ this.data.TaskData = result;
460
+ }
461
+ return result;
462
+ }
463
+ }
464
+ async passOn(data, fromStage, toStage, comment, recipient) {
465
+ if (!data)
466
+ return;
467
+ const payload = {
468
+ ...data.TaskData,
469
+ DataState: ObjectState.Changed,
470
+ HistoryToDate: data.TaskData.HistoryToDate.map((item) => ({
471
+ ...item,
472
+ Actor: item.Actor
473
+ ? {
474
+ ...item.Actor,
475
+ ActorTags: [],
476
+ }
477
+ : null,
478
+ })),
479
+ CurrentActors: data.TaskData.CurrentActors.map((item) => ({
480
+ ...item,
481
+ ActorTags: [],
482
+ })),
483
+ };
484
+ delete payload.FullStages;
485
+ this.utilService.sendBI(true);
486
+ try {
487
+ const res = await this.server.post(`Task/PassOn/${fromStage}/${toStage}/${comment}${recipient ? '/' + recipient : ''}`, payload, this.envSvc.environment.WorkFlowAPI);
488
+ this.utilService.sendBI(false);
489
+ if (res instanceof ErrorResponse) {
490
+ return undefined;
491
+ }
492
+ else {
493
+ const result = res;
494
+ if (result) {
495
+ data.TaskData = result;
496
+ this.getAllTask(data.Code).then((taskRes) => {
497
+ if (taskRes && data) {
498
+ data.TaskData = taskRes;
499
+ }
500
+ });
501
+ this.showForm = false;
502
+ this.action = null;
503
+ data.TaskComment = '';
504
+ const updatedItem = await this.getUpdatedTicket(data.Code);
505
+ if (updatedItem) {
506
+ data.Status = updatedItem.Status;
507
+ }
508
+ }
509
+ return result;
510
+ }
511
+ }
512
+ catch (err) {
513
+ this.utilService.sendBI(false);
514
+ console.error('PassOn Error:', err);
515
+ return undefined;
516
+ }
517
+ }
518
+ async formFill(formValues, ticket) {
519
+ const payload = formValues;
520
+ this.utilService.sendBI(true);
521
+ try {
522
+ const res = await this.server.post(`Form/FillForm/${this.code}`, payload, this.envSvc.environment.WorkFlowAPI);
523
+ this.utilService.sendBI(false);
524
+ if (res instanceof ErrorResponse) {
525
+ return undefined;
526
+ }
527
+ else {
528
+ await this.passOn(ticket, this.action.action?.FromStage, this.action.action?.ToStage, this.action.comment, '');
529
+ }
530
+ }
531
+ catch (err) {
532
+ this.utilService.sendBI(false);
533
+ console.error('PassOn Error:', err);
534
+ return undefined;
535
+ }
536
+ }
537
+ async getUpdatedTicket(code) {
538
+ const payload = [
539
+ {
540
+ PropertyName: 'Code',
541
+ EntityValue: code,
542
+ Operator: SearchOperator.And,
543
+ Sign: SearchPropertySign.EQ,
544
+ },
545
+ {
546
+ PropertyName: 'TenantId',
547
+ EntityValue: '',
548
+ Operator: SearchOperator.And,
549
+ Sign: SearchPropertySign.NEQ,
550
+ },
551
+ ];
552
+ const res = await this.server.post(`Ticket/SearchTicket/0/50`, payload, this.envSvc.environment.TicketingAPI);
553
+ if (res instanceof ErrorResponse) {
554
+ return undefined;
555
+ }
556
+ var result = res;
557
+ if (result.Result.length > 0) {
558
+ return result.Result[0];
559
+ }
560
+ else {
561
+ return undefined;
562
+ }
563
+ }
564
+ async handleActionComplete(action, data) {
565
+ data.TaskComment = action.comment;
566
+ const hasForms = data.TaskData?.TaskForms?.length > 0;
567
+ if (hasForms) {
568
+ this.showForm = true;
569
+ this.action = action;
570
+ return;
571
+ }
572
+ await this.passOn(data, action?.action.FromStage, action?.action.ToStage, data.TaskComment, '');
573
+ }
574
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingDetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.HttpWebRequestService }, { token: i2.UtilService }, { token: i2.SharedService }, { token: i3.Location }, { token: i2.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
575
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TicketingDetailComponent, selector: "app-ticketing-detail", inputs: { user: "user", defaultCompany: "defaultCompany", color: "color", textColor: "textColor" }, viewQueries: [{ propertyName: "userPopups", predicate: ["userPopup"], descendants: true }], ngImport: i0, template: "<div\n (click)=\"goBack()\"\n class=\"my-4 w-fit ml-auto border p-1 rounded-lg border-gray-400 cursor-pointer\"\n>\n <verben-svg [icon]=\"'arrow-left'\"></verben-svg>\n</div>\n<div *ngIf=\"data\" class=\"grid grid-cols-12 gap-8\">\n <div\n class=\"lg:col-span-8 col-span-12 border relative rounded-2xl p-6 border-[#0000001A]\"\n >\n \n <div class=\"flex gap-2 items-center mt-6\">\n <h3 class=\"mt-2 font-bold\">{{ data.Title }}</h3>\n\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <p class=\"mt-2 text-sm\">{{ data.Description }}</p>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"data.FileUrls\"\n >\n <ng-container *ngFor=\"let file of data.FileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n <div class=\"max-h-[500px] lg:max-h-[230px] overflow-y-auto pr-1\">\n <div *ngFor=\"let message of data.Messages; let last = last\">\n <div\n class=\"mt-6 flex justify-between items-center pb-4\"\n [ngClass]=\"{ 'border-b border-gray-300': !last }\"\n >\n <div class=\"flex items-center gap-2\">\n <img\n class=\"w-[50px] h-[50px] object-cover rounded-full\"\n [src]=\"'/assets/images/avatar.png'\"\n alt=\"avatar\"\n />\n <div>\n <h4 class=\"font-medium\">\n {{\n message.Company\n | asyncLabel : \"Company\" : \"Description\" : glAPI\n | async\n }}\n </h4>\n <p class=\"text-xs\">{{ !message.Name ? \"Nil\" : message.Name }}</p>\n </div>\n </div>\n\n <p class=\"text-sm text-gray-600\">\n {{ message.CreatedAt | companyDate }}\n </p>\n </div>\n\n <p class=\"mt-6 text-sm\">\n {{ !message.Content ? \"Nil\" : message.Content }}\n </p>\n\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"message.AttachmentUrls\"\n >\n <ng-container *ngFor=\"let file of message.AttachmentUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"pt-5\">\n <div class=\"border rounded-lg p-4 border-[#0000001A]\">\n \n\n <lib-chat-control\n (messageChange)=\"messageChange($event)\"\n [placeholder]=\"'Start typing a message....'\"\n [disabled]=\"disableChatBoxButton()\"\n (sendMessageResult)=\"saveMessageChat(data, message)\"\n [(message)]=\"message\"\n [color]=\"color\"\n [textColor]=\"textColor\"\n (filesChange)=\"onFilesUpdate($event)\"\n (formSubmit)=\"onKeyDown($event)\"\n ></lib-chat-control>\n </div>\n <verben-pop-Up\n #userPopup\n [customStyles]=\"{\n 'z-index': '99',\n position: 'absolute',\n bottom: '70px',\n left: '300px'\n }\"\n [enableMouseLeave]=\"false\"\n >\n <div\n class=\"pop-up-content flex flex-col max-h-[200px] w-[300px] overflow-y-auto p-3\"\n dropdown-content\n [style.border-color]=\"color\"\n > \n <p class=\"text-gray-500 p-2\">Suggestions</p>\n\n <div\n *ngFor=\"let u of usersResult\"\n class=\"p-2 hover:bg-gray-100 text-sm cursor-pointer w-fit\"\n (click)=\"selectUser(u)\"\n >\n {{ u.MailAddress }}\n </div>\n\n <p *ngIf=\"usersResult.length === 0\" class=\"text-gray-500 text-sm\">\n No matching users\n </p>\n </div>\n </verben-pop-Up>\n </div>\n </div>\n <div\n class=\"lg:col-span-4 col-span-12 p-4 border rounded-md border-[#0000001A]\"\n >\n <h3 class=\"mt-2 font-bold\">Details</h3>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Ticket ID :</p>\n <p>{{ data.Code }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Subject:</p>\n <p class=\"text-xs text-right\">{{ data.Title }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Status:</p>\n <div\n *ngIf=\"data.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n data.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ data.Status }}</span>\n </div>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">CreatedAt :</p>\n <p class=\"text-sm\">{{ data.CreatedAt | companyDate }}</p>\n </div>\n <div\n *ngIf=\"data.Status === ticketStatus.Completed\"\n class=\"flex items-center justify-between mt-4\"\n >\n <p class=\"text-sm font-light\">Execution Time :</p>\n <p class=\"text-sm\">{{ data.ExecutionTime }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Priority :</p>\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <section class=\"mt-6\">\n <h3 class=\"font-bold\">Properties</h3>\n\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"text-sm text-gray-600\">Status</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [disabled]=\"true\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"data.Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"flex flex-col gap-1 mt-2 mb-18\">\n <div class=\"text-sm text-gray-600\">Priority</div>\n <verben-drop-down\n optionLabel=\"Name\"\n [filter]=\"true\"\n optionValue=\"Code\"\n [disabled]=\"true\"\n [options]=\"tenantOptions\"\n [(ngModel)]=\"data.Priority\"\n [width]=\"'100%'\"\n ></verben-drop-down>\n </div>\n <!-- <verbena-button\n (click)=\"save()\"\n [width]=\"'100%'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Update'\"\n [bgColor]=\"'#9C56BA'\"\n ></verbena-button> -->\n </section>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i5.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.ChatControlComponent, selector: "lib-chat-control", inputs: ["message", "color", "textColor", "disabled", "placeholder", "hideBtn"], outputs: ["messageChange", "formSubmit", "sendMessageResult", "filesChange"] }, { kind: "component", type: i7.FileRenderComponent, selector: "app-file-render", inputs: ["fileUrl"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AsyncLabelPipe, name: "asyncLabel" }, { kind: "pipe", type: i8.CompanyDatePipe, name: "companyDate" }] });
576
+ }
577
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketingDetailComponent, decorators: [{
578
+ type: Component,
579
+ args: [{ selector: 'app-ticketing-detail', template: "<div\n (click)=\"goBack()\"\n class=\"my-4 w-fit ml-auto border p-1 rounded-lg border-gray-400 cursor-pointer\"\n>\n <verben-svg [icon]=\"'arrow-left'\"></verben-svg>\n</div>\n<div *ngIf=\"data\" class=\"grid grid-cols-12 gap-8\">\n <div\n class=\"lg:col-span-8 col-span-12 border relative rounded-2xl p-6 border-[#0000001A]\"\n >\n \n <div class=\"flex gap-2 items-center mt-6\">\n <h3 class=\"mt-2 font-bold\">{{ data.Title }}</h3>\n\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <p class=\"mt-2 text-sm\">{{ data.Description }}</p>\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"data.FileUrls\"\n >\n <ng-container *ngFor=\"let file of data.FileUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n <div class=\"max-h-[500px] lg:max-h-[230px] overflow-y-auto pr-1\">\n <div *ngFor=\"let message of data.Messages; let last = last\">\n <div\n class=\"mt-6 flex justify-between items-center pb-4\"\n [ngClass]=\"{ 'border-b border-gray-300': !last }\"\n >\n <div class=\"flex items-center gap-2\">\n <img\n class=\"w-[50px] h-[50px] object-cover rounded-full\"\n [src]=\"'/assets/images/avatar.png'\"\n alt=\"avatar\"\n />\n <div>\n <h4 class=\"font-medium\">\n {{\n message.Company\n | asyncLabel : \"Company\" : \"Description\" : glAPI\n | async\n }}\n </h4>\n <p class=\"text-xs\">{{ !message.Name ? \"Nil\" : message.Name }}</p>\n </div>\n </div>\n\n <p class=\"text-sm text-gray-600\">\n {{ message.CreatedAt | companyDate }}\n </p>\n </div>\n\n <p class=\"mt-6 text-sm\">\n {{ !message.Content ? \"Nil\" : message.Content }}\n </p>\n\n <div class=\"attachment-section p-2 flex flex-col gap-3\">\n <div\n class=\"attachments-container grid grid-cols-3 gap-2\"\n *ngIf=\"message.AttachmentUrls\"\n >\n <ng-container *ngFor=\"let file of message.AttachmentUrls\">\n <app-file-render [fileUrl]=\"file\"></app-file-render>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"pt-5\">\n <div class=\"border rounded-lg p-4 border-[#0000001A]\">\n \n\n <lib-chat-control\n (messageChange)=\"messageChange($event)\"\n [placeholder]=\"'Start typing a message....'\"\n [disabled]=\"disableChatBoxButton()\"\n (sendMessageResult)=\"saveMessageChat(data, message)\"\n [(message)]=\"message\"\n [color]=\"color\"\n [textColor]=\"textColor\"\n (filesChange)=\"onFilesUpdate($event)\"\n (formSubmit)=\"onKeyDown($event)\"\n ></lib-chat-control>\n </div>\n <verben-pop-Up\n #userPopup\n [customStyles]=\"{\n 'z-index': '99',\n position: 'absolute',\n bottom: '70px',\n left: '300px'\n }\"\n [enableMouseLeave]=\"false\"\n >\n <div\n class=\"pop-up-content flex flex-col max-h-[200px] w-[300px] overflow-y-auto p-3\"\n dropdown-content\n [style.border-color]=\"color\"\n > \n <p class=\"text-gray-500 p-2\">Suggestions</p>\n\n <div\n *ngFor=\"let u of usersResult\"\n class=\"p-2 hover:bg-gray-100 text-sm cursor-pointer w-fit\"\n (click)=\"selectUser(u)\"\n >\n {{ u.MailAddress }}\n </div>\n\n <p *ngIf=\"usersResult.length === 0\" class=\"text-gray-500 text-sm\">\n No matching users\n </p>\n </div>\n </verben-pop-Up>\n </div>\n </div>\n <div\n class=\"lg:col-span-4 col-span-12 p-4 border rounded-md border-[#0000001A]\"\n >\n <h3 class=\"mt-2 font-bold\">Details</h3>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Ticket ID :</p>\n <p>{{ data.Code }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Subject:</p>\n <p class=\"text-xs text-right\">{{ data.Title }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Status:</p>\n <div\n *ngIf=\"data.Status\"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center {{\n data.Status\n }}\"\n >\n <span class=\"enum-dot\"></span>\n <span>{{ data.Status }}</span>\n </div>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">CreatedAt :</p>\n <p class=\"text-sm\">{{ data.CreatedAt | companyDate }}</p>\n </div>\n <div\n *ngIf=\"data.Status === ticketStatus.Completed\"\n class=\"flex items-center justify-between mt-4\"\n >\n <p class=\"text-sm font-light\">Execution Time :</p>\n <p class=\"text-sm\">{{ data.ExecutionTime }}</p>\n </div>\n <div class=\"flex items-center justify-between mt-4\">\n <p class=\"text-sm font-light\">Priority :</p>\n <div\n *ngIf=\"\n data.Priority && data.Priority\n | asyncLabel : 'TenantPriority' : 'Color' : ticketingAPI\n | async as color\n \"\n class=\"enum-val rounded-[8px] flex gap-2 items-center justify-center\"\n [style.backgroundColor]=\"softenColor(color)\"\n >\n <span [style.backgroundColor]=\"color\" class=\"enum-dot\"></span>\n <span>{{\n data.Priority\n | asyncLabel : \"TenantPriority\" : \"Name\" : ticketingAPI\n | async\n }}</span>\n </div>\n </div>\n <section class=\"mt-6\">\n <h3 class=\"font-bold\">Properties</h3>\n\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"text-sm text-gray-600\">Status</div>\n <verben-drop-down\n width=\"100%\"\n placeholder=\"Select Status\"\n [disabled]=\"true\"\n [options]=\"statusOptions\"\n [(ngModel)]=\"data.Status\"\n >\n </verben-drop-down>\n </div>\n <div class=\"flex flex-col gap-1 mt-2 mb-18\">\n <div class=\"text-sm text-gray-600\">Priority</div>\n <verben-drop-down\n optionLabel=\"Name\"\n [filter]=\"true\"\n optionValue=\"Code\"\n [disabled]=\"true\"\n [options]=\"tenantOptions\"\n [(ngModel)]=\"data.Priority\"\n [width]=\"'100%'\"\n ></verben-drop-down>\n </div>\n <!-- <verbena-button\n (click)=\"save()\"\n [width]=\"'100%'\"\n [textColor]=\"'#fff'\"\n [text]=\"'Update'\"\n [bgColor]=\"'#9C56BA'\"\n ></verbena-button> -->\n </section>\n </div>\n</div>\n" }]
580
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.HttpWebRequestService }, { type: i2.UtilService }, { type: i2.SharedService }, { type: i3.Location }, { type: i2.EnvironmentService }], propDecorators: { user: [{
581
+ type: Input
582
+ }], defaultCompany: [{
583
+ type: Input
584
+ }], userPopups: [{
585
+ type: ViewChildren,
586
+ args: ['userPopup']
587
+ }], color: [{
588
+ type: Input
589
+ }], textColor: [{
590
+ type: Input
591
+ }] } });
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0aW5nLWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXRpbmctZGV0YWlsL3RpY2tldGluZy1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0aW5nLWRldGFpbC90aWNrZXRpbmctZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUlMLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUdsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFHeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBUTdDLE1BQU0sT0FBTyx3QkFBd0I7SUFJekI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBUkQsSUFBSSxDQUFRO0lBQ1osY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUNyQyxZQUNVLEtBQXFCLEVBQ3JCLE1BQTZCLEVBQzdCLFdBQTJCLEVBQzNCLGFBQTRCLEVBQzVCLFFBQWtCLEVBQ2xCLE1B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QkFBd0IsNFBDcENyQyx5dVBBa09BOzs0RkQ5TGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtxT0FLdkIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBaUJxQixVQUFVO3NCQUFwQyxZQUFZO3VCQUFDLFdBQVc7Z0JBWWhCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgaW5wdXQsXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtTWFwIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9iamVjdFN0YXRlLCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBUaWNrZXQgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFRpY2tldFN0YXR1cyB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgSHR0cFdlYlJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWUgfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFNlYXJjaE9wZXJhdG9yIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVNpZ24gfSBmcm9tICd2ZXJiZW4tdGlja2V0aW5nLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIGFzIEFwcFV0aWxTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL3NlcnZpY2VzJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBQYWdlZFJlc3VsdCB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgVGlja2V0TWVzc2FnZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJ3ZlcmJlbi10aWNrZXRpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBERUZBVUxUX01FU1NBR0VfRk9SX0lOSVRJQUxfVVBMT0FEIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5cbmltcG9ydCB7IFRlbmFudFByaW9yaXR5IH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGaWxlIH0gZnJvbSAndmVyYmVuLXRpY2tldGluZy11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFZlcmJlblBvcFVwQ29tcG9uZW50IH0gZnJvbSAndmVyYmVuLW5nLXVpJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRpY2tldGluZy1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGlja2V0aW5nLWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90aWNrZXRpbmctZGV0YWlsLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBUaWNrZXRpbmdEZXRhaWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB1c2VyITogVXNlcjtcbiAgQElucHV0KCkgZGVmYXVsdENvbXBhbnk6IHN0cmluZyA9ICcnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHNlcnZlcjogSHR0cFdlYlJlcXVlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IEFwcFV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGVudlN2YzogRW52aXJvbm1lbnRTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLnRpY2tldGluZ0FQSSA9IGAke3RoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSX0vVGlja2V0YDtcblxuICAgIHRoaXMuZ2xBUEkgPSB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5HTEFQSTtcbiAgfVxuICBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBkYXRhITogVGlja2V0O1xuICB0eXBpbmdRdWVyeTogc3RyaW5nID0gJyc7XG4gIGlzU2VhcmNoaW5nVXNlcnMgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZHJlbigndXNlclBvcHVwJykgdXNlclBvcHVwcyE6IFF1ZXJ5TGlzdDxWZXJiZW5Qb3BVcENvbXBvbmVudD47XG4gIHRpY2tldFN0YXR1cyA9IFRpY2tldFN0YXR1cztcbiAgdGlja2V0aW5nQVBJOiBzdHJpbmcgPSAnJztcbiAgdGVuYW50T3B0aW9uczogVGVuYW50UHJpb3JpdHlbXSA9IFtdO1xuICBnbEFQSTogc3RyaW5nID0gJyc7XG4gIGF0dGFjaGVkTWVzc2FnZTogVGlja2V0TWVzc2FnZSB8IG51bGwgPSBudWxsO1xuICBtYXhGaWxlU2l6ZSA9IDE1ICogMTAyNCAqIDEwMjQ7XG4gIG1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBhY3Rpb246IGFueTtcbiAgc2VhcmNoVHJpZ2dlciQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIGZpbGVEYXRhOiBGaWxlW10gPSBbXTtcbiAgY29kZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGNvbG9yID0gJyNmZmU2ODEnO1xuICBASW5wdXQoKSB0ZXh0Q29sb3IgPSAnIzAwMCc7XG4gIHN0YXR1c09wdGlvbnM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoVGlja2V0U3RhdHVzKTtcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbU1hcC5zdWJzY3JpYmUoYXN5bmMgKHBhcmFtczogUGFyYW1NYXApID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBwYXJhbXMuZ2V0KCdjb2RlJyk7XG5cbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMuZ2V0VGlja2V0RGV0YWlsKGNvZGUpO1xuICAgICAgICB0aGlzLmdldEFsbFRhc2soY29kZSk7XG4gICAgICAgIHRoaXMuZ2V0VGVuYW50UHJpb3JpdHkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoVHJpZ2dlciQucGlwZShkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKChxdWVyeSkgPT4ge1xuICAgICAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJzKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgb25Gb3JtQ2xvc2UoaXNTaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93Rm9ybSA9IGlzU2hvdztcbiAgfVxuICBvbkZvcm1PcGVuKGlzU2hvdzogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgb25GaWxlc1VwZGF0ZShmaWxlczogYW55KSB7XG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgZmlsZSB0byBiYXNlNjRcbiAgICBjb25zdCB0b0Jhc2U2NCA9IChmaWxlOiBhbnkpOiBQcm9taXNlPHN0cmluZz4gPT5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRGaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGU6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSBhd2FpdCB0b0Jhc2U2NChmaWxlKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZmlsZS5uYW1lIHx8ICdmaWxlJztcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBuYW1lLnNwbGl0KCcuJykucG9wKCkgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIE5hbWU6IG5hbWUsXG4gICAgICAgICAgICBFeHRlbnNpb246IGV4dGVuc2lvbixcbiAgICAgICAgICAgIERhdGE6IGJhc2U2NERhdGEsXG4gICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLmZpbGVEYXRhID0gY29udmVydGVkRmlsZXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbnZlcnRpbmcgZmlsZXMgdG8gYmFzZTY0OicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlTWVzc2FnZUNoYXQodGlja2V0OiBUaWNrZXQsIG5ld01lc3NhZ2VDb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoIW5ld01lc3NhZ2VDb250ZW50IHx8IG5ld01lc3NhZ2VDb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ01lc3NhZ2UgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TWVzc2FnZSA9IHtcbiAgICAgIENvZGU6ICcnLFxuICAgICAgTmFtZTogdGhpcy51c2VyPy5NYWlsQWRkcmVzcyB8fCAncGVyZmVjdGlvbi5jaGl6dXJ1b2tlQHZlcmJlbmFsb2dpYy5jb20nLFxuICAgICAgVGlja2V0Q29kZTogdGlja2V0LkNvZGUgfHwgJycsXG4gICAgICBTdWJqZWN0OiAnJyxcbiAgICAgIENvbnRlbnQ6IG5ld01lc3NhZ2VDb250ZW50LnRyaW0oKSxcbiAgICAgIEF0dGFjaG1lbnRzOiB0aGlzLmZpbGVEYXRhLmxlbmd0aCA/IHRoaXMuZmlsZURhdGEgOiBbXSxcbiAgICAgIEF0dGFjaG1lbnRVcmxzOiBbXSxcbiAgICAgIENvbXBhbnk6IHRpY2tldC5Db21wYW55LFxuICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgVXBzZXJ0OiBmYWxzZSxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRCeTogJycsXG4gICAgICBDcmVhdGVkQnk6ICcnLFxuICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICBJZDogJycsXG4gICAgfTtcblxuICAgIC8vIGlmICghdGhpcy5kYXRhLk1lc3NhZ2VzKSB0aGlzLmRhdGEuTWVzc2FnZXMgPSBbXTtcblxuICAgIC8vIHRoaXMuZGF0YS5NZXNzYWdlcy5wdXNoKG5ld01lc3NhZ2UpO1xuXG4gICAgLy8gdGhpcy5kYXRhLkRhdGFTdGF0ZSA9IE9iamVjdFN0YXRlLkNoYW5nZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBUaWNrZXQvU2VuZE1haWxUb1RpY2tldE93bmVyYCxcbiAgICAgICAgbmV3TWVzc2FnZSxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuVGlja2V0aW5nQVBJLFxuICAgICAgKTtcblxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignRmFpbGVkIHRvIHNlbmQgbWVzc2FnZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgVGlja2V0TWVzc2FnZTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5kYXRhLk1lc3NhZ2VzID0gWy4uLnRoaXMuZGF0YS5NZXNzYWdlcywgcmVzdWx0XTtcblxuICAgICAgICB0aGlzLmRhdGEgPSB7IC4uLnRoaXMuZGF0YSB9O1xuXG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ01lc3NhZ2Ugc2VudCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dFcnJvcignU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgc2VuZGluZyBtZXNzYWdlJyk7XG4gICAgfVxuICB9XG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZGF0YTtcblxuICAgICgoaXRlbS5EYXRhU3RhdGUgPSB0aGlzLmRhdGEgPyBPYmplY3RTdGF0ZS5DaGFuZ2VkIDogT2JqZWN0U3RhdGUuTmV3KSxcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KFxuICAgICAgYFRpY2tldC9TYXZlVGlja2V0YCxcbiAgICAgIFtpdGVtXSxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdUaWNrZXQgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgVGlja2V0O1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7IC4uLnRoaXMuZGF0YSwgLi4ucmVzdWx0IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ29CYWNrKCkge1xuICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICB9XG4gIGRpc2FibGVDaGF0Qm94QnV0dG9uKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvbktleURvd24oZTogYW55KSB7fVxuICBtZXNzYWdlQ2hhbmdlKGU6IGFueSkge1xuICAgIHRoaXMubWVzc2FnZSA9IGU7XG4gICAgdGhpcy5kZXRlY3RVc2VyU2VhcmNoVHJpZ2dlcihlKTtcbiAgfVxuXG4gIHNlbGVjdFVzZXIodXNlcjogYW55KSB7XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5tZXNzYWdlLnJlcGxhY2UoL0AoW2EtekEtWjAtOV9dKikkLywgJycpO1xuICAgIHRoaXMubWVzc2FnZSA9IGJlZm9yZSArICdAJyArIHVzZXIuTWFpbEFkZHJlc3MgKyAnICc7XG5cbiAgICB0aGlzLm1lc3NhZ2VDaGFuZ2UodGhpcy5tZXNzYWdlKTtcbiAgICB0aGlzLmNsb3NlVXNlclBvcHVwKCk7XG4gIH1cblxuICBvcGVuVXNlclBvcHVwKCkge1xuICAgIHRoaXMudXNlclBvcHVwcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICBpZiAoIXAuZHJvcGRvd25PcGVuKSBwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZVVzZXJQb3B1cCgpIHtcbiAgICB0aGlzLnVzZXJQb3B1cHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgaWYgKHAuZHJvcGRvd25PcGVuKSBwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgfSk7XG4gIH1cblxuICBkZXRlY3RVc2VyU2VhcmNoVHJpZ2dlcih0ZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWdleCA9IC9AKFthLXpBLVowLTlfXSopJC87XG4gICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKHJlZ2V4KTtcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy50eXBpbmdRdWVyeSA9IG1hdGNoWzFdO1xuICAgICAgdGhpcy5pc1NlYXJjaGluZ1VzZXJzID0gdHJ1ZTtcblxuICAgICAgdGhpcy5zZWFyY2hUcmlnZ2VyJC5uZXh0KHRoaXMudHlwaW5nUXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnR5cGluZ1F1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLmlzU2VhcmNoaW5nVXNlcnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2xvc2VVc2VyUG9wdXAoKTtcbiAgICB9XG4gIH1cblxuICB1c2Vyc1Jlc3VsdDogYW55W10gPSBbXTtcblxuICBhc3luYyBzZWFyY2hVc2VycyhxdWVyeTogc3RyaW5nKSB7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgdGhpcy51c2Vyc1Jlc3VsdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnTWFpbEFkZHJlc3MnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogcXVlcnksXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5MSUtFLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBTZWFyY2hVc2Vycy8wLzIwYCxcbiAgICAgIHBheWxvYWQsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BdXRoZW50aWNhdGlvbkFQSSxcbiAgICApO1xuXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHJldHVybjtcblxuICAgIHRoaXMudXNlcnNSZXN1bHQgPSAocmVzIGFzIFBhZ2VkUmVzdWx0PGFueT4pLlJlc3VsdDtcbiAgICB0aGlzLm9wZW5Vc2VyUG9wdXAoKTtcbiAgfVxuXG4gIHRyaWdnZXJGaWxlVXBsb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGVJbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgZmlsZUlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgZmlsZUlucHV0LmFjY2VwdCA9ICcucG5nLCAuanBnLCAuanBlZywgLnBkZic7XG4gICAgZmlsZUlucHV0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vIEhpZGRlbiBmaWxlIGlucHV0XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOyAvLyBUZW1wb3JhcmlseSBhZGQgdG8gRE9NXG5cbiAgICBmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVJbnB1dC5maWxlcz8uWzBdO1xuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlKTtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZmlsZUlucHV0KTsgLy8gQ2xlYW4gdXAgYWZ0ZXIgdXNlXG4gICAgfSk7XG5cbiAgICBmaWxlSW5wdXQuY2xpY2soKTsgLy8gUHJvZ3JhbW1hdGljYWxseSB0cmlnZ2VyIGNsaWNrXG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzRmlsZShzZWxlY3RlZEZpbGU6IGdsb2JhbFRoaXMuRmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpIHtcbiAgICAgIGNvbnN0IGxpbWl0SW5NQiA9IHRoaXMubWF4RmlsZVNpemUgLyAxMDI0IC8gMTAyNDtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oYEZpbGUgc2l6ZSBsaW1pdCBvZiAke2xpbWl0SW5NQn1tYiBleGNlZWRlZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGxldCBmaWxlVG9Qcm9jZXNzOiBnbG9iYWxUaGlzLkZpbGUgfCBudWxsID0gc2VsZWN0ZWRGaWxlO1xuICAgIC8vIGNvbnN0IHNhZmVOdW1iZXI6IG51bWJlciA9IDEgKiAxMDI0ICogMTAyNDtcbiAgICAvLyBpZiAoZmlsZVRvUHJvY2Vzcy5zaXplID4gc2FmZU51bWJlcikge1xuICAgIC8vICAgZmlsZVRvUHJvY2VzcyA9IGF3YWl0IHRoaXMudXRpbFNlcnZpY2UuY29tcHJlc3NJbWFnZShzZWxlY3RlZEZpbGUpO1xuICAgIC8vICAgaWYgKCFmaWxlVG9Qcm9jZXNzKSB7XG4gICAgLy8gICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKCdFcnJvciBjb21wcmVzc2luZyBpbWFnZScpO1xuICAgIC8vICAgICByZXR1cm47XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgLy8gUmVhZCBmaWxlIGFuZCBjb252ZXJ0IHRvIGJhc2U2NFxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoc2VsZWN0ZWRGaWxlKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZTY0ZGF0YSA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMuc2hhcmVkU2VydmljZS5jcmVhdGVDdXN0b21GaWxlKFxuICAgICAgICBiYXNlNjRkYXRhLFxuICAgICAgICAwLFxuICAgICAgICBzZWxlY3RlZEZpbGUsXG4gICAgICApO1xuICAgICAgaWYgKGZpbGUgJiYgdGhpcy5hdHRhY2hlZE1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc3NhZ2UuQXR0YWNobWVudHMucHVzaChmaWxlKTtcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc3NhZ2UuQXR0YWNobWVudFVybHMucHVzaChgJHtmaWxlLk5hbWV9YCk7XG4gICAgICAgIC8vIHRoaXMucHJvZmlsZUltYWdlID0gYmFzZTY0ZGF0YTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGFzeW5jIGdldFRpY2tldERldGFpbChjb2RlOiBzdHJpbmcpOiBQcm9taXNlPFRpY2tldCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnQ29kZScsXG4gICAgICAgIEVudGl0eVZhbHVlOiBjb2RlLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NlYXJjaFRpY2tldC8wLzUwYCxcbiAgICAgIHBheWxvYWQsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5UaWNrZXRpbmdBUEksXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG5cbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PikuUmVzdWx0O1xuICAgIGlmIChyZXN1bHQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGF0YSA9IHJlc3VsdFswXTtcbiAgICAgIHRoaXMuZ2V0TWVzc2FnZXModGhpcy5kYXRhLkNvZGUpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmRhdGEuTWVzc2FnZXMgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdFswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzeW5jIGdldE1lc3NhZ2VzKGNvZGU6IHN0cmluZyk6IFByb21pc2U8VGlja2V0TWVzc2FnZVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW1xuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUaWNrZXRDb2RlJyxcbiAgICAgICAgRW50aXR5VmFsdWU6IGNvZGUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgU29ydDogU29ydERpcmVjdGlvbi5EZXNjLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5ORVEsXG4gICAgICAgIFNvcnQ6IFNvcnREaXJlY3Rpb24uRGVzYyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NlYXJjaFRpY2tldE1lc3NhZ2UvMC81MDBgLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUaWNrZXRNZXNzYWdlPikuUmVzdWx0O1xuICAgIGlmIChyZXN1bHQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3luYyBnZXRUZW5hbnRQcmlvcml0eSgpOiBQcm9taXNlPFRlbmFudFByaW9yaXR5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW1xuICAgICAge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6ICdUZW5hbnRJZCcsXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLk5FUSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgVGlja2V0L1NlYXJjaFRlbmFudFByaW9yaXR5LzAvNTBgLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcblxuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxUZW5hbnRQcmlvcml0eT4pLlJlc3VsdDtcbiAgICBpZiAocmVzdWx0Py5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlbmFudE9wdGlvbnMgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNzc0NvbG9yVG9IZXgoY29sb3I6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gJyMwMDAnOyAvLyBzZXQgYSBrbm93biBjb2xvclxuICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsgLy8gYXNzaWduIGFueSBDU1MtdmFsaWQgY29sb3JcblxuICAgIGNvbnN0IGNvbXB1dGVkID0gY3R4LmZpbGxTdHlsZTtcbiAgICAvLyBJZiB0aGUgYnJvd3NlciBkb2VzIE5PVCB1bmRlcnN0YW5kIHRoZSB2YWx1ZSwgaXQgd29u4oCZdCBjaGFuZ2UgZnJvbSAnIzAwMCdcbiAgICBpZiAoXG4gICAgICBjb21wdXRlZC50b0xvd2VyQ2FzZSgpID09PSAnIzAwMDAwMCcgJiZcbiAgICAgIGNvbG9yLnRvTG93ZXJDYXNlKCkgIT09ICdibGFjaydcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBpbnZhbGlkIGNvbG9yIG5hbWUgb3IgdW5zdXBwb3J0ZWQgdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcHV0ZWQudG9VcHBlckNhc2UoKTsgLy8gcmV0dXJucyBoZXggbGlrZSAjMUU5MEZGXG4gIH1cbiAgc29mdGVuQ29sb3IoaGV4OiBzdHJpbmcsIGxpZ2h0ZW5QZXJjZW50ID0gNTUsIGFscGhhUGVyY2VudCA9IDU1KTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgI1xuICAgIGlmICghaGV4LnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgY29uc3QgY29udmVydGVkID0gdGhpcy5jc3NDb2xvclRvSGV4KGhleCk7XG4gICAgICBpZiAoY29udmVydGVkKSB7XG4gICAgICAgIGhleCA9IGNvbnZlcnRlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIENvbnZlcnQgc2hvcnRoYW5kICgjYWJjIOKGkiAjYWFiYmNjKVxuICAgICAgaGV4ID0gaGV4XG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoeCkgPT4geCArIHgpXG4gICAgICAgIC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBudW0gPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICBsZXQgciA9IChudW0gPj4gMTYpICYgMHhmZjtcbiAgICBsZXQgZyA9IChudW0gPj4gOCkgJiAweGZmO1xuICAgIGxldCBiID0gbnVtICYgMHhmZjtcblxuICAgIC8vIExpZ2h0ZW4gdG93YXJkIHdoaXRlIGJ5IHRoZSBnaXZlbiBwZXJjZW50YWdlXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChyICsgKDI1NSAtIHIpICogKGxpZ2h0ZW5QZXJjZW50IC8gMTAwKSkpO1xuICAgIGcgPSBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoZyArICgyNTUgLSBnKSAqIChsaWdodGVuUGVyY2VudCAvIDEwMCkpKTtcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKGIgKyAoMjU1IC0gYikgKiAobGlnaHRlblBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICAvLyBDb252ZXJ0IGFscGhhIHBlcmNlbnQgdG8gMi1kaWdpdCBoZXhcbiAgICBjb25zdCBhbHBoYSA9IE1hdGgucm91bmQoKGFscGhhUGVyY2VudCAvIDEwMCkgKiAyNTUpO1xuICAgIGNvbnN0IGFIZXggPSBhbHBoYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHtnXG4gICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKVxuICAgICAgLnRvVXBwZXJDYXNlKCl9JHtiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCl9JHthSGV4fWA7XG4gIH1cbiAgZ2V0VGlja2V0TWVzc2FnZSgpOiBUaWNrZXRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBjb25zdCBpbml0aWFsTWVzc2FnZSA9IHRoaXMuZGF0YS5NZXNzYWdlcy5maW5kKFxuICAgICAgICAoeCkgPT4geC5TdWJqZWN0ID09IERFRkFVTFRfTUVTU0FHRV9GT1JfSU5JVElBTF9VUExPQUQsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmluaXRpYWxNZXNzYWdlLCBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2U6IFRpY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgVGlja2V0Q29kZTogJycsXG4gICAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgICBDb250ZW50OiAnJyxcbiAgICAgICAgICBBdHRhY2htZW50czogW10sXG4gICAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICAgIENvbXBhbnk6IHRoaXMuZGVmYXVsdENvbXBhbnksXG4gICAgICAgICAgSWQ6ICcnLFxuICAgICAgICAgIENvZGU6ICcnLFxuICAgICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuZXdNZXNzYWdlOiBUaWNrZXRNZXNzYWdlID0ge1xuICAgICAgICBUaWNrZXRDb2RlOiAnJyxcbiAgICAgICAgU3ViamVjdDogREVGQVVMVF9NRVNTQUdFX0ZPUl9JTklUSUFMX1VQTE9BRCxcbiAgICAgICAgQ29udGVudDogJycsXG4gICAgICAgIEF0dGFjaG1lbnRzOiBbXSxcbiAgICAgICAgQXR0YWNobWVudFVybHM6IFtdLFxuICAgICAgICBDb21wYW55OiB0aGlzLmRlZmF1bHRDb21wYW55LFxuICAgICAgICBJZDogJycsXG4gICAgICAgIENvZGU6ICcnLFxuICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldEFsbFRhc2soY29kZTogc3RyaW5nKTogUHJvbWlzZTxhbnlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgYFRhc2svR2V0VGFza0luZm8vJHtjb2RlfWAsXG4gICAgICB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5Xb3JrRmxvd0FQSSxcbiAgICApO1xuXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBhbnlbXTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5kYXRhLlRhc2tEYXRhID0gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgcGFzc09uKFxuICAgIGRhdGE6IFRpY2tldCxcbiAgICBmcm9tU3RhZ2U6IHN0cmluZyxcbiAgICB0b1N0YWdlOiBzdHJpbmcsXG4gICAgY29tbWVudD86IHN0cmluZyxcbiAgICByZWNpcGllbnQ/OiBzdHJpbmcsXG4gICkge1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAuLi5kYXRhLlRhc2tEYXRhLFxuICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5DaGFuZ2VkLFxuICAgICAgSGlzdG9yeVRvRGF0ZTogZGF0YS5UYXNrRGF0YS5IaXN0b3J5VG9EYXRlLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBBY3RvcjogaXRlbS5BY3RvclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5pdGVtLkFjdG9yLFxuICAgICAgICAgICAgICBBY3RvclRhZ3M6IFtdLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0pKSxcbiAgICAgIEN1cnJlbnRBY3RvcnM6IGRhdGEuVGFza0RhdGEuQ3VycmVudEFjdG9ycy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgQWN0b3JUYWdzOiBbXSxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgZGVsZXRlIChwYXlsb2FkIGFzIGFueSkuRnVsbFN0YWdlcztcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBUYXNrL1Bhc3NPbi8ke2Zyb21TdGFnZX0vJHt0b1N0YWdlfS8ke2NvbW1lbnR9JHtcbiAgICAgICAgICByZWNpcGllbnQgPyAnLycgKyByZWNpcGllbnQgOiAnJ1xuICAgICAgICB9YCxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuV29ya0Zsb3dBUEksXG4gICAgICApO1xuXG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG5cbiAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgYW55O1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgZGF0YS5UYXNrRGF0YSA9IHJlc3VsdDtcbiAgICAgICAgICB0aGlzLmdldEFsbFRhc2soZGF0YS5Db2RlKS50aGVuKCh0YXNrUmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFza1JlcyAmJiBkYXRhKSB7XG4gICAgICAgICAgICAgIGRhdGEuVGFza0RhdGEgPSB0YXNrUmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmFjdGlvbiA9IG51bGw7XG4gICAgICAgICAgZGF0YS5UYXNrQ29tbWVudCA9ICcnO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0gYXdhaXQgdGhpcy5nZXRVcGRhdGVkVGlja2V0KGRhdGEuQ29kZSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZWRJdGVtKSB7XG4gICAgICAgICAgICBkYXRhLlN0YXR1cyA9IHVwZGF0ZWRJdGVtLlN0YXR1cztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgY29uc29sZS5lcnJvcignUGFzc09uIEVycm9yOicsIGVycik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZvcm1GaWxsKGZvcm1WYWx1ZXM6IGFueSwgdGlja2V0OiBUaWNrZXQpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gZm9ybVZhbHVlcztcblxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICAgIGBGb3JtL0ZpbGxGb3JtLyR7dGhpcy5jb2RlfWAsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LldvcmtGbG93QVBJLFxuICAgICAgKTtcblxuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzT24oXG4gICAgICAgICAgdGlja2V0LFxuICAgICAgICAgIHRoaXMuYWN0aW9uLmFjdGlvbj8uRnJvbVN0YWdlLFxuICAgICAgICAgIHRoaXMuYWN0aW9uLmFjdGlvbj8uVG9TdGFnZSxcbiAgICAgICAgICB0aGlzLmFjdGlvbi5jb21tZW50LFxuICAgICAgICAgICcnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgY29uc29sZS5lcnJvcignUGFzc09uIEVycm9yOicsIGVycik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVwZGF0ZWRUaWNrZXQoY29kZTogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSBbXG4gICAgICB7XG4gICAgICAgIFByb3BlcnR5TmFtZTogJ0NvZGUnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogY29kZSxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnVGVuYW50SWQnLFxuICAgICAgICBFbnRpdHlWYWx1ZTogJycsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5ORVEsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgIGBUaWNrZXQvU2VhcmNoVGlja2V0LzAvNTBgLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHRoaXMuZW52U3ZjLmVudmlyb25tZW50LlRpY2tldGluZ0FQSSxcbiAgICApO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8VGlja2V0PjtcbiAgICBpZiAocmVzdWx0LlJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LlJlc3VsdFswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVBY3Rpb25Db21wbGV0ZShhY3Rpb246IGFueSwgZGF0YTogVGlja2V0KSB7XG4gICAgZGF0YS5UYXNrQ29tbWVudCA9IGFjdGlvbi5jb21tZW50O1xuXG4gICAgY29uc3QgaGFzRm9ybXMgPSBkYXRhLlRhc2tEYXRhPy5UYXNrRm9ybXM/Lmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoaGFzRm9ybXMpIHtcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wYXNzT24oXG4gICAgICBkYXRhLFxuICAgICAgYWN0aW9uPy5hY3Rpb24uRnJvbVN0YWdlLFxuICAgICAgYWN0aW9uPy5hY3Rpb24uVG9TdGFnZSxcbiAgICAgIGRhdGEuVGFza0NvbW1lbnQsXG4gICAgICAnJyxcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2XG4gIChjbGljayk9XCJnb0JhY2soKVwiXG4gIGNsYXNzPVwibXktNCB3LWZpdCBtbC1hdXRvIGJvcmRlciBwLTEgcm91bmRlZC1sZyBib3JkZXItZ3JheS00MDAgY3Vyc29yLXBvaW50ZXJcIlxuPlxuICA8dmVyYmVuLXN2ZyBbaWNvbl09XCInYXJyb3ctbGVmdCdcIj48L3ZlcmJlbi1zdmc+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJkYXRhXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xMiBnYXAtOFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsZzpjb2wtc3Bhbi04IGNvbC1zcGFuLTEyIGJvcmRlciByZWxhdGl2ZSByb3VuZGVkLTJ4bCBwLTYgYm9yZGVyLVsjMDAwMDAwMUFdXCJcbiAgPlxuIFxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlciBtdC02XCI+XG4gICAgICA8aDMgY2xhc3M9XCJtdC0yIGZvbnQtYm9sZFwiPnt7IGRhdGEuVGl0bGUgfX08L2gzPlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0YS5Qcmlvcml0eSAmJiBkYXRhLlByaW9yaXR5XG4gICAgICAgICAgICB8IGFzeW5jTGFiZWwgOiAnVGVuYW50UHJpb3JpdHknIDogJ0NvbG9yJyA6IHRpY2tldGluZ0FQSVxuICAgICAgICAgICAgfCBhc3luYyBhcyBjb2xvclxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cImVudW0tdmFsIHJvdW5kZWQtWzhweF0gZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cInNvZnRlbkNvbG9yKGNvbG9yKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JcIiBjbGFzcz1cImVudW0tZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgIGRhdGEuUHJpb3JpdHlcbiAgICAgICAgICAgIHwgYXN5bmNMYWJlbCA6IFwiVGVuYW50UHJpb3JpdHlcIiA6IFwiTmFtZVwiIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHAgY2xhc3M9XCJtdC0yIHRleHQtc21cIj57eyBkYXRhLkRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnQtc2VjdGlvbiBwLTIgZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiYXR0YWNobWVudHMtY29udGFpbmVyIGdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTJcIlxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLkZpbGVVcmxzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWxlIG9mIGRhdGEuRmlsZVVybHNcIj5cbiAgICAgICAgICAgICAgPGFwcC1maWxlLXJlbmRlciBbZmlsZVVybF09XCJmaWxlXCI+PC9hcHAtZmlsZS1yZW5kZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1heC1oLVs1MDBweF0gbGc6bWF4LWgtWzIzMHB4XSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBkYXRhLk1lc3NhZ2VzOyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibXQtNiBmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcGItNFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwJzogIWxhc3QgfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LVs1MHB4XSBoLVs1MHB4XSBvYmplY3QtY292ZXIgcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pbWFnZXMvYXZhdGFyLnBuZydcIlxuICAgICAgICAgICAgICBhbHQ9XCJhdmF0YXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuQ29tcGFueVxuICAgICAgICAgICAgICAgICAgICB8IGFzeW5jTGFiZWwgOiBcIkNvbXBhbnlcIiA6IFwiRGVzY3JpcHRpb25cIiA6IGdsQVBJXG4gICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHNcIj57eyAhbWVzc2FnZS5OYW1lID8gXCJOaWxcIiA6IG1lc3NhZ2UuTmFtZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIHt7IG1lc3NhZ2UuQ3JlYXRlZEF0IHwgY29tcGFueURhdGUgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxwIGNsYXNzPVwibXQtNiB0ZXh0LXNtXCI+XG4gICAgICAgICAge3sgIW1lc3NhZ2UuQ29udGVudCA/IFwiTmlsXCIgOiBtZXNzYWdlLkNvbnRlbnQgfX1cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdHRhY2htZW50LXNlY3Rpb24gcC0yIGZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImF0dGFjaG1lbnRzLWNvbnRhaW5lciBncmlkIGdyaWQtY29scy0zIGdhcC0yXCJcbiAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS5BdHRhY2htZW50VXJsc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsZSBvZiBtZXNzYWdlLkF0dGFjaG1lbnRVcmxzXCI+XG4gICAgICAgICAgICAgIDxhcHAtZmlsZS1yZW5kZXIgW2ZpbGVVcmxdPVwiZmlsZVwiPjwvYXBwLWZpbGUtcmVuZGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicHQtNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJvcmRlciByb3VuZGVkLWxnIHAtNCBib3JkZXItWyMwMDAwMDAxQV1cIj5cbiAgICBcblxuICAgICAgICA8bGliLWNoYXQtY29udHJvbFxuICAgICAgICAgIChtZXNzYWdlQ2hhbmdlKT1cIm1lc3NhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTdGFydCB0eXBpbmcgYSBtZXNzYWdlLi4uLidcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlQ2hhdEJveEJ1dHRvbigpXCJcbiAgICAgICAgICAoc2VuZE1lc3NhZ2VSZXN1bHQpPVwic2F2ZU1lc3NhZ2VDaGF0KGRhdGEsIG1lc3NhZ2UpXCJcbiAgICAgICAgICBbKG1lc3NhZ2UpXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCJ0ZXh0Q29sb3JcIlxuICAgICAgICAgIChmaWxlc0NoYW5nZSk9XCJvbkZpbGVzVXBkYXRlKCRldmVudClcIlxuICAgICAgICAgIChmb3JtU3VibWl0KT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgPjwvbGliLWNoYXQtY29udHJvbD5cbiAgICAgIDwvZGl2PlxuICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwXG4gICAgICAgICAgI3VzZXJQb3B1cFxuICAgICAgICAgIFtjdXN0b21TdHlsZXNdPVwie1xuICAgICAgICAgICAgJ3otaW5kZXgnOiAnOTknLFxuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBib3R0b206ICc3MHB4JyxcbiAgICAgICAgICAgIGxlZnQ6ICczMDBweCdcbiAgICAgICAgICB9XCJcbiAgICAgICAgICBbZW5hYmxlTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInBvcC11cC1jb250ZW50IGZsZXggZmxleC1jb2wgbWF4LWgtWzIwMHB4XSB3LVszMDBweF0gb3ZlcmZsb3cteS1hdXRvIHAtM1wiXG4gICAgICAgICAgICBkcm9wZG93bi1jb250ZW50XG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyLWNvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgICA+IFxuICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1ncmF5LTUwMCBwLTJcIj5TdWdnZXN0aW9uczwvcD5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdSBvZiB1c2Vyc1Jlc3VsdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicC0yIGhvdmVyOmJnLWdyYXktMTAwIHRleHQtc20gY3Vyc29yLXBvaW50ZXIgdy1maXRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VXNlcih1KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHUuTWFpbEFkZHJlc3MgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8cCAqbmdJZj1cInVzZXJzUmVzdWx0Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIE5vIG1hdGNoaW5nIHVzZXJzXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxnOmNvbC1zcGFuLTQgY29sLXNwYW4tMTIgcC00IGJvcmRlciByb3VuZGVkLW1kIGJvcmRlci1bIzAwMDAwMDFBXVwiXG4gID5cbiAgICA8aDMgY2xhc3M9XCJtdC0yIGZvbnQtYm9sZFwiPkRldGFpbHM8L2gzPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gbXQtNFwiPlxuICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbGlnaHRcIj5UaWNrZXQgSUQgOjwvcD5cbiAgICAgIDxwPnt7IGRhdGEuQ29kZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG10LTRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LWxpZ2h0XCI+U3ViamVjdDo8L3A+XG4gICAgICA8cCBjbGFzcz1cInRleHQteHMgdGV4dC1yaWdodFwiPnt7IGRhdGEuVGl0bGUgfX08L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBtdC00XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtc20gZm9udC1saWdodFwiPlN0YXR1czo8L3A+XG4gICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5TdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudW0tdmFsIHJvdW5kZWQtWzhweF0gZmxleCBnYXAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3tcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLlN0YXR1c1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW51bS1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRhdGEuU3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBtdC00XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtc20gZm9udC1saWdodFwiPkNyZWF0ZWRBdCA6PC9wPlxuICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgZGF0YS5DcmVhdGVkQXQgfCBjb21wYW55RGF0ZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImRhdGEuU3RhdHVzID09PSB0aWNrZXRTdGF0dXMuQ29tcGxldGVkXCJcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG10LTRcIlxuICAgID5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LWxpZ2h0XCI+RXhlY3V0aW9uIFRpbWUgOjwvcD5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbVwiPnt7IGRhdGEuRXhlY3V0aW9uVGltZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIG10LTRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LWxpZ2h0XCI+UHJpb3JpdHkgOjwvcD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRhLlByaW9yaXR5ICYmIGRhdGEuUHJpb3JpdHlcbiAgICAgICAgICAgIHwgYXN5bmNMYWJlbCA6ICdUZW5hbnRQcmlvcml0eScgOiAnQ29sb3InIDogdGlja2V0aW5nQVBJXG4gICAgICAgICAgICB8IGFzeW5jIGFzIGNvbG9yXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwiZW51bS12YWwgcm91bmRlZC1bOHB4XSBmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic29mdGVuQ29sb3IoY29sb3IpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjb2xvclwiIGNsYXNzPVwiZW51bS1kb3RcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgZGF0YS5Qcmlvcml0eVxuICAgICAgICAgICAgfCBhc3luY0xhYmVsIDogXCJUZW5hbnRQcmlvcml0eVwiIDogXCJOYW1lXCIgOiB0aWNrZXRpbmdBUElcbiAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxoMyBjbGFzcz1cImZvbnQtYm9sZFwiPlByb3BlcnRpZXM8L2gzPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBtdC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5TdGF0dXM8L2Rpdj5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgIFtvcHRpb25zXT1cInN0YXR1c09wdGlvbnNcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZGF0YS5TdGF0dXNcIlxuICAgICAgICA+XG4gICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEgbXQtMiBtYi0xOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+UHJpb3JpdHk8L2Rpdj5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICBvcHRpb25MYWJlbD1cIk5hbWVcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJDb2RlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW29wdGlvbnNdPVwidGVuYW50T3B0aW9uc1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhLlByaW9yaXR5XCJcbiAgICAgICAgICBbd2lkdGhdPVwiJzEwMCUnXCJcbiAgICAgICAgPjwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgICAgIFt3aWR0aF09XCInMTAwJSdcIlxuICAgICAgICBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgIFt0ZXh0XT1cIidVcGRhdGUnXCJcbiAgICAgICAgW2JnQ29sb3JdPVwiJyM5QzU2QkEnXCJcbiAgICAgID48L3ZlcmJlbmEtYnV0dG9uPiAtLT5cbiAgICA8L3NlY3Rpb24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=