tin-spa 14.0.1 → 14.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/classes/Classes.mjs +206 -53
  3. package/esm2020/lib/classes/TinCore.mjs +46 -213
  4. package/esm2020/lib/components/accounts/accountDialog.component.mjs +56 -0
  5. package/esm2020/lib/components/accounts/accounts.component.mjs +70 -0
  6. package/esm2020/lib/components/alert/alert.component.mjs +7 -21
  7. package/esm2020/lib/components/attach/attach.component.mjs +33 -49
  8. package/esm2020/lib/components/bug/bug.component.mjs +14 -0
  9. package/esm2020/lib/components/change-password/change-password.component.mjs +92 -0
  10. package/esm2020/lib/components/create-account/create-account.component.mjs +109 -0
  11. package/esm2020/lib/components/customers/customers.component.mjs +60 -0
  12. package/esm2020/lib/components/date/date.component.mjs +8 -10
  13. package/esm2020/lib/components/datetime/datetime.component.mjs +3 -6
  14. package/esm2020/lib/{pages → components}/departments/departments.component.mjs +5 -3
  15. package/esm2020/lib/components/employees/employees.component.mjs +21 -0
  16. package/esm2020/lib/components/filter/filter.component.mjs +3 -7
  17. package/esm2020/lib/components/form/form.component.mjs +52 -157
  18. package/esm2020/lib/components/grades/grades.component.mjs +14 -0
  19. package/esm2020/lib/components/inventory/inventory.component.mjs +99 -0
  20. package/esm2020/lib/components/inventory/quantityDialog.component.mjs +53 -0
  21. package/esm2020/lib/components/invitations/invitations.component.mjs +14 -0
  22. package/esm2020/lib/components/invitations-table/invitations-table.component.mjs +70 -0
  23. package/esm2020/lib/components/label/label.component.mjs +3 -9
  24. package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +3 -3
  25. package/esm2020/lib/components/login/login.component.mjs +127 -0
  26. package/esm2020/lib/components/logs/logs.component.mjs +37 -0
  27. package/esm2020/lib/components/membership/membership.component.mjs +48 -0
  28. package/esm2020/lib/components/money/money.component.mjs +9 -26
  29. package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +28 -32
  30. package/esm2020/lib/components/notifications/notifications.component.mjs +14 -0
  31. package/esm2020/lib/components/number/number.component.mjs +8 -23
  32. package/esm2020/lib/components/option/option.component.mjs +14 -39
  33. package/esm2020/lib/components/plans/plans.component.mjs +47 -0
  34. package/esm2020/lib/components/positions/positions.component.mjs +21 -0
  35. package/esm2020/lib/components/profile/profile.component.mjs +92 -0
  36. package/esm2020/lib/components/recover-account/recover-account.component.mjs +46 -0
  37. package/esm2020/lib/{pages → components}/roles/addRoleDialog.component.mjs +3 -3
  38. package/esm2020/lib/components/roles/roles.component.mjs +91 -0
  39. package/esm2020/lib/components/search/search.component.mjs +5 -10
  40. package/esm2020/lib/components/select/select.component.mjs +119 -56
  41. package/esm2020/lib/components/settings/settings.component.mjs +62 -0
  42. package/esm2020/lib/components/signup/signup.component.mjs +50 -0
  43. package/esm2020/lib/components/steps/steps.component.mjs +61 -83
  44. package/esm2020/lib/components/suppliers/suppliers.component.mjs +50 -0
  45. package/esm2020/lib/components/table/detailsDialog.component.mjs +41 -215
  46. package/esm2020/lib/components/table/table.component.mjs +108 -142
  47. package/esm2020/lib/components/table-action/table-action.component.mjs +8 -42
  48. package/esm2020/lib/components/table-header/table-header.component.mjs +15 -87
  49. package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +39 -219
  50. package/esm2020/lib/components/table-internal/table-internal.component.mjs +109 -144
  51. package/esm2020/lib/components/table-row/table-row.component.mjs +6 -41
  52. package/esm2020/lib/components/tasks/tasks.component.mjs +86 -0
  53. package/esm2020/lib/components/tenant-settings/inviteDialog.component.mjs +60 -0
  54. package/esm2020/lib/components/tenant-settings/tenant-settings.component.mjs +155 -0
  55. package/esm2020/lib/components/tenants/tenants.component.mjs +47 -0
  56. package/esm2020/lib/components/text/text.component.mjs +48 -122
  57. package/esm2020/lib/components/tiles/tiles.component.mjs +26 -44
  58. package/esm2020/lib/components/transactions/transactDialog.component.mjs +80 -0
  59. package/esm2020/lib/components/transactions/transactions.component.mjs +101 -0
  60. package/esm2020/lib/components/users/users.component.mjs +118 -0
  61. package/esm2020/lib/components/viewer/viewer.component.mjs +3 -7
  62. package/esm2020/lib/components/viewer/viewerDialog.component.mjs +13 -20
  63. package/esm2020/lib/components/welcome/welcome.component.mjs +86 -0
  64. package/esm2020/lib/modules/admin/admin-routing.module.mjs +22 -32
  65. package/esm2020/lib/modules/index/index-routing.module.mjs +4 -4
  66. package/esm2020/lib/modules/spa-admin.module.mjs +7 -7
  67. package/esm2020/lib/modules/spa-index.module.mjs +4 -4
  68. package/esm2020/lib/modules/spa-user.module.mjs +3 -3
  69. package/esm2020/lib/modules/user/user-routing.module.mjs +3 -3
  70. package/esm2020/lib/services/auth.service.mjs +2 -3
  71. package/esm2020/lib/services/button.service.mjs +32 -92
  72. package/esm2020/lib/services/datalib.service.mjs +78 -551
  73. package/esm2020/lib/services/dialog.service.mjs +7 -51
  74. package/esm2020/lib/services/log.service.mjs +2 -2
  75. package/esm2020/lib/services/table-config.service.mjs +7 -55
  76. package/esm2020/lib/tin-spa.module.mjs +30 -72
  77. package/esm2020/public-api.mjs +25 -35
  78. package/fesm2015/tin-spa.mjs +2681 -6963
  79. package/fesm2015/tin-spa.mjs.map +1 -1
  80. package/fesm2020/tin-spa.mjs +2750 -7078
  81. package/fesm2020/tin-spa.mjs.map +1 -1
  82. package/lib/classes/Classes.d.ts +296 -280
  83. package/lib/classes/TinCore.d.ts +4 -15
  84. package/lib/components/alert/alert.component.d.ts +3 -4
  85. package/lib/components/attach/attach.component.d.ts +6 -13
  86. package/lib/{pages → components}/change-password/change-password.component.d.ts +1 -1
  87. package/lib/{pages → components}/create-account/create-account.component.d.ts +1 -2
  88. package/lib/{pages → components}/customers/customers.component.d.ts +8 -2
  89. package/lib/components/date/date.component.d.ts +1 -1
  90. package/lib/components/datetime/datetime.component.d.ts +1 -2
  91. package/lib/components/filter/filter.component.d.ts +0 -1
  92. package/lib/components/form/form.component.d.ts +9 -20
  93. package/lib/components/invitations/invitations.component.d.ts +8 -0
  94. package/lib/{pages → components}/invitations-table/invitations-table.component.d.ts +1 -1
  95. package/lib/components/label/label.component.d.ts +1 -3
  96. package/lib/{pages → components}/login/login.component.d.ts +3 -10
  97. package/lib/{pages → components}/logs/logs.component.d.ts +6 -2
  98. package/lib/{pages → components}/membership/membership.component.d.ts +6 -2
  99. package/lib/components/money/money.component.d.ts +1 -8
  100. package/lib/components/nav-menu/nav-menu.component.d.ts +2 -6
  101. package/lib/components/notifications/notifications.component.d.ts +8 -0
  102. package/lib/components/number/number.component.d.ts +1 -7
  103. package/lib/components/option/option.component.d.ts +2 -11
  104. package/lib/{pages → components}/plans/plans.component.d.ts +6 -2
  105. package/lib/{pages → components}/profile/profile.component.d.ts +1 -2
  106. package/lib/{pages → components}/roles/addRoleDialog.component.d.ts +1 -1
  107. package/lib/{pages → components}/roles/roles.component.d.ts +3 -15
  108. package/lib/components/search/search.component.d.ts +1 -3
  109. package/lib/components/select/select.component.d.ts +35 -16
  110. package/lib/{pages → components}/signup/signup.component.d.ts +1 -1
  111. package/lib/components/steps/steps.component.d.ts +9 -18
  112. package/lib/{pages → components}/suppliers/suppliers.component.d.ts +4 -1
  113. package/lib/components/table/detailsDialog.component.d.ts +7 -29
  114. package/lib/components/table/table.component.d.ts +9 -18
  115. package/lib/components/table-action/table-action.component.d.ts +1 -4
  116. package/lib/components/table-header/table-header.component.d.ts +4 -19
  117. package/lib/components/table-internal/detailsDialog-internal.component.d.ts +7 -29
  118. package/lib/components/table-internal/table-internal.component.d.ts +9 -18
  119. package/lib/components/table-row/table-row.component.d.ts +2 -5
  120. package/lib/{pages → components}/tasks/tasks.component.d.ts +1 -1
  121. package/lib/components/tenant-settings/inviteDialog.component.d.ts +28 -0
  122. package/lib/{pages → components}/tenant-settings/tenant-settings.component.d.ts +7 -12
  123. package/lib/{pages → components}/tenants/tenants.component.d.ts +2 -2
  124. package/lib/components/text/text.component.d.ts +5 -22
  125. package/lib/components/tiles/tiles.component.d.ts +4 -7
  126. package/lib/{pages → components}/users/users.component.d.ts +16 -8
  127. package/lib/components/viewer/viewerDialog.component.d.ts +1 -3
  128. package/lib/modules/spa-admin.module.d.ts +6 -6
  129. package/lib/modules/spa-index.module.d.ts +3 -3
  130. package/lib/modules/spa-user.module.d.ts +2 -2
  131. package/lib/services/auth.service.d.ts +1 -1
  132. package/lib/services/button.service.d.ts +8 -11
  133. package/lib/services/datalib.service.d.ts +10 -58
  134. package/lib/services/dialog.service.d.ts +2 -3
  135. package/lib/services/log.service.d.ts +1 -1
  136. package/lib/services/table-config.service.d.ts +1 -9
  137. package/lib/tin-spa.module.d.ts +33 -53
  138. package/package.json +1 -1
  139. package/public-api.d.ts +23 -33
  140. package/esm2020/lib/classes/LibClasses.mjs +0 -180
  141. package/esm2020/lib/components/capsules/capsules.component.mjs +0 -63
  142. package/esm2020/lib/components/cards/cards.component.mjs +0 -103
  143. package/esm2020/lib/components/email/email.component.mjs +0 -133
  144. package/esm2020/lib/components/html/html.component.mjs +0 -34
  145. package/esm2020/lib/components/multi-select/multi-select.component.mjs +0 -165
  146. package/esm2020/lib/components/multi-text/multi-text.component.mjs +0 -208
  147. package/esm2020/lib/components/notes/notes.component.mjs +0 -62
  148. package/esm2020/lib/components/page/page.component.mjs +0 -101
  149. package/esm2020/lib/components/select-bitwise/select-bitwise.component.mjs +0 -87
  150. package/esm2020/lib/components/select-common/select-common.component.mjs +0 -206
  151. package/esm2020/lib/components/select-internal/select-internal.component.mjs +0 -75
  152. package/esm2020/lib/components/select-lite/select-lite.component.mjs +0 -18
  153. package/esm2020/lib/components/statuses/statuses.component.mjs +0 -44
  154. package/esm2020/lib/components/suffix/suffix.component.mjs +0 -70
  155. package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +0 -404
  156. package/esm2020/lib/components/table-lite/table-lite.component.mjs +0 -441
  157. package/esm2020/lib/components/tabs/tabs.component.mjs +0 -74
  158. package/esm2020/lib/pages/accounts/accountDialog.component.mjs +0 -56
  159. package/esm2020/lib/pages/accounts/accounts.component.mjs +0 -70
  160. package/esm2020/lib/pages/app-models/app-models.component.mjs +0 -56
  161. package/esm2020/lib/pages/approvals/approvals.component.mjs +0 -19
  162. package/esm2020/lib/pages/approvals-config/approvals-config.component.mjs +0 -165
  163. package/esm2020/lib/pages/bug/bug.component.mjs +0 -14
  164. package/esm2020/lib/pages/change-password/change-password.component.mjs +0 -92
  165. package/esm2020/lib/pages/create-account/create-account.component.mjs +0 -110
  166. package/esm2020/lib/pages/customers/customers.component.mjs +0 -21
  167. package/esm2020/lib/pages/employees/employees.component.mjs +0 -20
  168. package/esm2020/lib/pages/grades/grades.component.mjs +0 -14
  169. package/esm2020/lib/pages/inventory/inventory.component.mjs +0 -99
  170. package/esm2020/lib/pages/inventory/quantityDialog.component.mjs +0 -53
  171. package/esm2020/lib/pages/invitations-table/invitations-table.component.mjs +0 -71
  172. package/esm2020/lib/pages/login/login.component.mjs +0 -166
  173. package/esm2020/lib/pages/logs/logs.component.mjs +0 -42
  174. package/esm2020/lib/pages/membership/membership.component.mjs +0 -44
  175. package/esm2020/lib/pages/notifications/notifications.component.mjs +0 -90
  176. package/esm2020/lib/pages/notifications-config/notifications-config.component.mjs +0 -113
  177. package/esm2020/lib/pages/plans/plans.component.mjs +0 -44
  178. package/esm2020/lib/pages/positions/positions.component.mjs +0 -21
  179. package/esm2020/lib/pages/profile/profile.component.mjs +0 -94
  180. package/esm2020/lib/pages/recover-account/recover-account.component.mjs +0 -46
  181. package/esm2020/lib/pages/roles/roles.component.mjs +0 -151
  182. package/esm2020/lib/pages/settings/settings.component.mjs +0 -54
  183. package/esm2020/lib/pages/signup/signup.component.mjs +0 -50
  184. package/esm2020/lib/pages/suppliers/suppliers.component.mjs +0 -22
  185. package/esm2020/lib/pages/tasks/tasks.component.mjs +0 -86
  186. package/esm2020/lib/pages/tenant-settings/tenant-settings.component.mjs +0 -228
  187. package/esm2020/lib/pages/tenants/tenants.component.mjs +0 -47
  188. package/esm2020/lib/pages/transactions/transactDialog.component.mjs +0 -80
  189. package/esm2020/lib/pages/transactions/transactions.component.mjs +0 -101
  190. package/esm2020/lib/pages/users/users.component.mjs +0 -167
  191. package/esm2020/lib/pages/welcome/welcome.component.mjs +0 -86
  192. package/esm2020/lib/select-context.directive.mjs +0 -23
  193. package/esm2020/lib/services/csv.service.mjs +0 -49
  194. package/esm2020/lib/services/notifications.service.mjs +0 -33
  195. package/lib/classes/LibClasses.d.ts +0 -173
  196. package/lib/components/capsules/capsules.component.d.ts +0 -26
  197. package/lib/components/cards/cards.component.d.ts +0 -39
  198. package/lib/components/email/email.component.d.ts +0 -40
  199. package/lib/components/html/html.component.d.ts +0 -16
  200. package/lib/components/multi-select/multi-select.component.d.ts +0 -47
  201. package/lib/components/multi-text/multi-text.component.d.ts +0 -56
  202. package/lib/components/notes/notes.component.d.ts +0 -19
  203. package/lib/components/page/page.component.d.ts +0 -38
  204. package/lib/components/select-bitwise/select-bitwise.component.d.ts +0 -31
  205. package/lib/components/select-common/select-common.component.d.ts +0 -53
  206. package/lib/components/select-internal/select-internal.component.d.ts +0 -23
  207. package/lib/components/select-lite/select-lite.component.d.ts +0 -8
  208. package/lib/components/statuses/statuses.component.d.ts +0 -12
  209. package/lib/components/suffix/suffix.component.d.ts +0 -23
  210. package/lib/components/table-lite/detailsDialog-lite.component.d.ts +0 -86
  211. package/lib/components/table-lite/table-lite.component.d.ts +0 -91
  212. package/lib/components/tabs/tabs.component.d.ts +0 -32
  213. package/lib/pages/app-models/app-models.component.d.ts +0 -15
  214. package/lib/pages/approvals/approvals.component.d.ts +0 -10
  215. package/lib/pages/approvals-config/approvals-config.component.d.ts +0 -24
  216. package/lib/pages/notifications/notifications.component.d.ts +0 -16
  217. package/lib/pages/notifications-config/notifications-config.component.d.ts +0 -17
  218. package/lib/select-context.directive.d.ts +0 -10
  219. package/lib/services/csv.service.d.ts +0 -10
  220. package/lib/services/notifications.service.d.ts +0 -12
  221. /package/lib/{pages → components}/accounts/accountDialog.component.d.ts +0 -0
  222. /package/lib/{pages → components}/accounts/accounts.component.d.ts +0 -0
  223. /package/lib/{pages → components}/bug/bug.component.d.ts +0 -0
  224. /package/lib/{pages → components}/departments/departments.component.d.ts +0 -0
  225. /package/lib/{pages → components}/employees/employees.component.d.ts +0 -0
  226. /package/lib/{pages → components}/grades/grades.component.d.ts +0 -0
  227. /package/lib/{pages → components}/inventory/inventory.component.d.ts +0 -0
  228. /package/lib/{pages → components}/inventory/quantityDialog.component.d.ts +0 -0
  229. /package/lib/{pages → components}/positions/positions.component.d.ts +0 -0
  230. /package/lib/{pages → components}/recover-account/recover-account.component.d.ts +0 -0
  231. /package/lib/{pages → components}/settings/settings.component.d.ts +0 -0
  232. /package/lib/{pages → components}/transactions/transactDialog.component.d.ts +0 -0
  233. /package/lib/{pages → components}/transactions/transactions.component.d.ts +0 -0
  234. /package/lib/{pages → components}/welcome/welcome.component.d.ts +0 -0
@@ -1,4 +1,4 @@
1
- import { DetailsSource, RoleAccess } from "./Classes";
1
+ import { DetailsSource } from "./Classes";
2
2
  export class Core {
3
3
  static deepClone(obj) {
4
4
  if (obj === null || typeof obj !== 'object') {
@@ -17,45 +17,6 @@ export class Core {
17
17
  });
18
18
  return objCopy;
19
19
  }
20
- static deepClone2(obj) {
21
- // Create new WeakMap for each clone operation
22
- const cloneVisited = new WeakMap();
23
- // Inner function that has access to the cloneVisited map
24
- const clone = (value) => {
25
- // Handle null, undefined and primitives
26
- if (value === null || typeof value !== 'object') {
27
- return value;
28
- }
29
- // Check if object was already cloned
30
- if (cloneVisited.has(value)) {
31
- return cloneVisited.get(value);
32
- }
33
- // Handle arrays
34
- if (Array.isArray(value)) {
35
- const arrCopy = [];
36
- cloneVisited.set(value, arrCopy);
37
- value.forEach((item, index) => {
38
- arrCopy[index] = clone(item);
39
- });
40
- return arrCopy;
41
- }
42
- // Handle dates
43
- if (value instanceof Date) {
44
- return new Date(value);
45
- }
46
- // Handle regular objects
47
- const objCopy = Object.create(Object.getPrototypeOf(value));
48
- cloneVisited.set(value, objCopy);
49
- Object.entries(value).forEach(([key, val]) => {
50
- if (Object.prototype.hasOwnProperty.call(value, key)) {
51
- objCopy[key] = clone(val);
52
- }
53
- });
54
- return objCopy;
55
- };
56
- // Start the clone operation with a fresh WeakMap
57
- return clone(obj);
58
- }
59
20
  static camelToWords(value) {
60
21
  if (!value)
61
22
  return value;
@@ -83,117 +44,20 @@ export class Core {
83
44
  }
84
45
  });
85
46
  }
86
- static checkSecurity(security, currentRole) {
87
- if (!security) {
88
- return true;
89
- }
90
- if (security.deny?.some(role => currentRole[role.name])) {
91
- return false;
92
- }
93
- if (!security.allow || security.allow.length === 0) {
94
- return true;
95
- }
96
- return security.allow.some(role => currentRole[role.name]);
97
- }
98
- static hasFormAccess(formConfig, currentRole) {
99
- return this.getFormAccess(formConfig, currentRole) > RoleAccess.None;
100
- }
101
- static getFormAccess(formConfig, currentRole) {
102
- if (!formConfig?.security?.allow) {
103
- return RoleAccess.Full; // Full access if no restrictions
104
- }
105
- // Check deny first
106
- if (formConfig.security.deny?.some(role => this.getRoleAccess(currentRole, role.name) > RoleAccess.None)) {
107
- return RoleAccess.None;
108
- }
109
- // Get highest level of access from allowed capabilities
110
- let maxAccess = RoleAccess.None;
111
- formConfig.security.allow.forEach(role => {
112
- const access = this.getRoleAccess(currentRole, role.name);
113
- if (access > maxAccess) {
114
- maxAccess = access;
115
- }
116
- });
117
- return maxAccess;
118
- }
119
- static getRoleAccess(role, capName) {
120
- if (!role || !capName)
121
- return RoleAccess.None;
122
- return role[capName] ?? RoleAccess.None;
123
- }
124
- static testVisible(config, data, field, currentRole) {
125
- if ((field.type == 'section' || field.type == 'blank') && field.hidden)
47
+ static testVisible(config, data, f) {
48
+ if (f.hidden)
126
49
  return false;
127
- // First check form level security if exists
128
- if (config.security && !this.hasFormAccess(config, currentRole)) {
50
+ if (config.mode == 'create' && f.hideOnCreate) {
129
51
  return false;
130
52
  }
131
- if (field.section) {
132
- const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);
133
- if (sectionField) {
134
- // Inherit section's conditions
135
- if (!this.checkSecurity(sectionField.securityConfig, currentRole)) {
136
- return false;
137
- }
138
- // if (sectionField.hidden) return false;
139
- if (sectionField.hideOnCreate && config.mode == 'create')
140
- return false;
141
- if (sectionField.hideOnExists && config.mode != 'create')
142
- return false;
143
- if (sectionField.hiddenCondition && sectionField.hiddenCondition(data))
144
- return false;
145
- }
146
- }
147
- // Then check field level security if exists
148
- if (!this.checkSecurity(field.securityConfig, currentRole)) {
149
- return false;
150
- }
151
- if (field.hidden)
152
- return false;
153
- if (config.mode == 'create' && field.hideOnCreate) {
53
+ if (config.mode != 'create' && f.hideOnExists) {
154
54
  return false;
155
55
  }
156
- if (config.mode != 'create' && field.hideOnExists) {
157
- return false;
158
- }
159
- if (field.hiddenCondition) {
160
- return !field.hiddenCondition(data);
161
- }
162
- return true;
163
- }
164
- static testReadOnly(config, data, field) {
165
- // Default readonly conditions
166
- if (config.mode == 'create') {
167
- return false;
168
- }
169
- if (field.readonly) {
170
- return true;
171
- }
172
- if (config.mode == 'view') {
173
- return true;
174
- }
175
- // Check section readonly condition first
176
- if (field.section) {
177
- const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);
178
- if (sectionField?.readonlyCondition && sectionField.readonlyCondition(data)) {
179
- return true;
180
- }
181
- }
182
- // Check field level readonly condition last
183
- if (field.readonlyCondition) {
184
- return field.readonlyCondition(data);
185
- }
186
- return false;
187
- }
188
- static testVisibleHeaderButton(data, btn) {
189
- if (btn.hiddenCondition) {
190
- return !btn.hiddenCondition(data);
56
+ if (f.hiddenCondition) {
57
+ return !f.hiddenCondition(data);
191
58
  }
192
59
  return true;
193
60
  }
194
- static getVisibleSubfields(config, data, field, currentRole) {
195
- return field.subfields?.filter(subfield => Core.testVisible(config, data, subfield, currentRole)) || [];
196
- }
197
61
  static validateObject(fields, data) {
198
62
  console.log("Validations");
199
63
  for (let field of fields) {
@@ -201,12 +65,8 @@ export class Core {
201
65
  continue;
202
66
  let name = field.alias ?? this.camelToWords(field.name);
203
67
  let d = data[field.name];
204
- let isRequired = field.required;
205
- if (!isRequired && field.requiredCondition) {
206
- isRequired = field.requiredCondition(data);
207
- }
208
68
  console.log(name + ' ' + d);
209
- if (isRequired) {
69
+ if (field.required) {
210
70
  if (d == undefined || d == null)
211
71
  return `${name} is required`;
212
72
  if (field.type == 'text') {
@@ -228,28 +88,13 @@ export class Core {
228
88
  return `Please select ${name}`;
229
89
  }
230
90
  }
231
- if (field.type == 'text' && field.regex && d && d.toString().trim() !== '') {
232
- const regexPattern = new RegExp(field.regex.pattern);
233
- if (!regexPattern.test(d)) {
234
- return field.regex.message;
235
- }
236
- }
237
91
  }
238
92
  ;
239
93
  return '';
240
94
  }
241
- static testRequired(config, data, field) {
242
- if (field.required) {
243
- return true;
244
- }
245
- if (field.requiredCondition) {
246
- return field.requiredCondition(data);
247
- }
248
- return false;
249
- }
250
95
  static getInitialValue(field) {
251
96
  if (field.defaultValue) {
252
- if ((field.type == 'date' || field.type == 'datetime') && field.defaultValue == 'now')
97
+ if (field.type == 'date' || field.type == 'datetime' && field.defaultValue == 'now')
253
98
  return this.nowDate(true);
254
99
  return field.defaultValue;
255
100
  }
@@ -273,7 +118,7 @@ export class Core {
273
118
  }
274
119
  }
275
120
  static getClone(x) {
276
- return this.deepClone2(x);
121
+ return this.deepClone(x);
277
122
  }
278
123
  static getNumber(value) {
279
124
  if (value == null || value == "") {
@@ -411,20 +256,12 @@ export class Core {
411
256
  Core.nullDate = "01 Jan 1969";
412
257
  export class DetailsDialogProcessor {
413
258
  static processDetailsConfig(detailsConfig, row) {
414
- const updatedDetailsConfig = Core.getClone(detailsConfig); //{...detailsConfig}
259
+ const updatedDetailsConfig = Core.getClone(detailsConfig);
415
260
  updatedDetailsConfig.details = row;
416
- //Form Config
417
261
  updatedDetailsConfig.formConfig.mode = updatedDetailsConfig.mode ?? "view";
418
262
  if (updatedDetailsConfig.heroField && row) {
419
263
  updatedDetailsConfig.heroValue = row[updatedDetailsConfig.heroField];
420
264
  }
421
- //Table configs
422
- if (updatedDetailsConfig.tableConfig) {
423
- updateTableConfig(updatedDetailsConfig.tableConfig);
424
- }
425
- if (updatedDetailsConfig.tableConfigs) {
426
- updatedDetailsConfig.tableConfigs.forEach(updateTableConfig);
427
- }
428
265
  function updateTableConfig(tableConfig) {
429
266
  tableConfig.heroField = updatedDetailsConfig?.heroField;
430
267
  tableConfig.heroValue = updatedDetailsConfig?.heroValue;
@@ -432,33 +269,27 @@ export class DetailsDialogProcessor {
432
269
  tableConfig.searchConfig = null;
433
270
  tableConfig.tileConfig = null;
434
271
  tableConfig.parentData = updatedDetailsConfig.details;
435
- tableConfig.elevation = 'none';
436
272
  }
437
- //URL
438
273
  if (updatedDetailsConfig.tableConfig) {
439
- transformLoadUrl(updatedDetailsConfig.tableConfig);
274
+ updateTableConfig(updatedDetailsConfig.tableConfig);
440
275
  }
441
276
  if (updatedDetailsConfig.tableConfigs) {
442
- updatedDetailsConfig.tableConfigs.forEach(transformLoadUrl);
443
- }
444
- if (updatedDetailsConfig.stepConfig?.loadAction) {
445
- transformStepUrl(updatedDetailsConfig.stepConfig);
277
+ updatedDetailsConfig.tableConfigs.forEach(updateTableConfig);
446
278
  }
447
279
  function transformLoadUrl(tableConfig) {
448
280
  if (tableConfig.loadAction && tableConfig.loadCriteria && tableConfig.loadIDField) {
449
281
  tableConfig.loadAction.url = `${tableConfig.loadAction.url.split('/')[0]}/${tableConfig.loadCriteria}/${updatedDetailsConfig.details[tableConfig.loadIDField]}`;
450
- console.log("Transformed", tableConfig.loadAction.url);
282
+ console.log("Transformed");
451
283
  }
452
284
  else {
453
285
  console.log("NOT Transformed");
454
286
  }
455
287
  }
456
- function transformStepUrl(stepConfig) {
457
- if (stepConfig.loadAction && stepConfig.loadIDField) {
458
- // let heroId = updatedDetailsConfig.details[updatedDetailsConfig.heroField];
459
- stepConfig.loadAction.url = `${stepConfig.loadAction.url.replace('{id}', updatedDetailsConfig.details[stepConfig.loadIDField])}`;
460
- // console.log("Transformed step URL", stepConfig.loadAction.url);
461
- }
288
+ if (updatedDetailsConfig.tableConfig) {
289
+ transformLoadUrl(updatedDetailsConfig.tableConfig);
290
+ }
291
+ if (updatedDetailsConfig.tableConfigs) {
292
+ updatedDetailsConfig.tableConfigs.forEach(transformLoadUrl);
462
293
  }
463
294
  return updatedDetailsConfig;
464
295
  }
@@ -466,20 +297,20 @@ export class DetailsDialogProcessor {
466
297
  const tableConfig = detailsConfig.tableConfig;
467
298
  const tableConfigs = detailsConfig.tableConfigs;
468
299
  const formConfig = detailsConfig.formConfig;
469
- const stepConfig = detailsConfig.stepConfig;
470
- const statusConfig = detailsConfig.statusConfig;
471
300
  const buttons = detailsConfig.buttons;
472
301
  formConfig.mode = formConfig.mode ?? "view";
473
- return { tableConfig, tableConfigs, formConfig, stepConfig, statusConfig, buttons };
302
+ return { tableConfig, tableConfigs, formConfig, buttons };
474
303
  }
475
304
  static setHeroValue(detailsConfig, details) {
305
+ // console.log(detailsConfig)
476
306
  if ((detailsConfig.formConfig.mode == "create") && detailsConfig.heroField && detailsConfig.heroValue) {
477
307
  details[detailsConfig.heroField] = detailsConfig.heroValue;
478
- // Ensure hero values are set in form config
479
- detailsConfig.formConfig.heroField = detailsConfig.heroField;
480
- detailsConfig.formConfig.heroValue = detailsConfig.heroValue;
481
308
  return;
482
309
  }
310
+ // if (detailsConfig.config.mode != "create" && detailsConfig.heroField) {
311
+ // detailsConfig.heroValue = details[detailsConfig.heroField];
312
+ // }
313
+ // console.log(detailsConfig)
483
314
  }
484
315
  static handleFormMode(detailsConfig, formConfig) {
485
316
  let details;
@@ -487,6 +318,7 @@ export class DetailsDialogProcessor {
487
318
  let loadByAction = false;
488
319
  if (formConfig.mode === "create") {
489
320
  details = Core.generateObject(formConfig.fields);
321
+ // this.setHeroValue(detailsConfig, details);
490
322
  }
491
323
  else {
492
324
  let resp = this.loadDetailsData(detailsConfig, formConfig);
@@ -500,26 +332,32 @@ export class DetailsDialogProcessor {
500
332
  let details;
501
333
  let action;
502
334
  let loadByAction = false;
335
+ console.log("Loading Details Data");
336
+ console.log(detailsConfig);
337
+ console.log(formConfig);
503
338
  //Choose source
504
339
  if (detailsConfig.detailsSource == DetailsSource.Row) {
505
- console.log("Data from Details - Row option");
340
+ console.log("Details Data Row config");
506
341
  details = detailsConfig.details;
507
342
  }
508
343
  else if (detailsConfig.detailsSource == DetailsSource.Url) {
509
- console.log("Data from Url option");
344
+ console.log("Details Data Url config");
510
345
  action = this.loadDetailsFromUrl(detailsConfig, formConfig);
511
346
  loadByAction = true;
512
347
  }
513
348
  else {
514
- //new logic
515
- if (formConfig.loadAction) {
516
- console.log("Data from Url - Guessed");
349
+ console.log("Details Data Else");
350
+ if (detailsConfig.details && !detailsConfig.heroField && !detailsConfig.heroValue) {
351
+ console.log("using form data from details");
352
+ console.log(detailsConfig);
353
+ details = detailsConfig.details;
354
+ }
355
+ else if (formConfig.loadAction) {
517
356
  action = this.loadDetailsFromUrl(detailsConfig, formConfig);
518
357
  loadByAction = true;
519
358
  }
520
359
  else {
521
- console.log("Data from Details - Guessed");
522
- details = detailsConfig.details;
360
+ console.log("auto data source failed to pick, trying source config");
523
361
  }
524
362
  }
525
363
  return { details, loadByAction, action };
@@ -528,23 +366,16 @@ export class DetailsDialogProcessor {
528
366
  let action;
529
367
  if (formConfig.loadAction) {
530
368
  if (detailsConfig.heroField && detailsConfig.details) {
531
- console.log("DetailsConfig Hero ID Field " + detailsConfig.heroField);
369
+ console.log("using form data from url + ID Field " + detailsConfig.heroField);
532
370
  action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[detailsConfig.heroField]}` };
533
371
  }
534
- else if (formConfig.heroField && detailsConfig.details) {
535
- console.log("FormConfig Hero ID Field " + formConfig.heroField);
536
- action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[formConfig.heroField]}` };
537
- }
538
372
  else if (detailsConfig.heroValue) {
539
- console.log("Defined Hero Value " + detailsConfig.heroValue);
373
+ console.log("using form data from url + Solid ID");
540
374
  action = { url: `${formConfig.loadAction.url}/${detailsConfig.heroValue}` };
541
375
  }
542
376
  else {
543
377
  console.log("url source failed : setup hero field or hero value");
544
378
  }
545
- action.cacheDurationMinutes = formConfig.loadAction.cacheDurationMinutes ?? 0;
546
- action.skipCache = formConfig.loadAction.skipCache ?? false;
547
- action.successMessage = formConfig.loadAction.successMessage ?? null;
548
379
  }
549
380
  else {
550
381
  console.log("No load action set");
@@ -554,10 +385,12 @@ export class DetailsDialogProcessor {
554
385
  static setFileField(formConfig) {
555
386
  return formConfig.fields.find(x => x.type === 'file');
556
387
  }
557
- static setupButtons(buttons) {
388
+ static setupButtons(formConfig, buttons) {
558
389
  let extraButtons, createButton, editButton, deleteButton;
559
390
  if (buttons) {
560
- extraButtons = buttons.filter(x => x.name !== "create" && x.name !== "edit" && x.name !== "delete" && x.name !== "view" && x.inDialog);
391
+ if (formConfig.mode !== "create") {
392
+ extraButtons = buttons.filter(x => x.name !== "create" && x.name !== "edit" && x.name !== "delete" && x.name !== "view" && x.inDialog);
393
+ }
561
394
  createButton = buttons.find(x => x.name === "create");
562
395
  editButton = buttons.find(x => x.name === "edit");
563
396
  deleteButton = buttons.find(x => x.name === "delete");
@@ -565,4 +398,4 @@ export class DetailsDialogProcessor {
565
398
  return { extraButtons, createButton, editButton, deleteButton };
566
399
  }
567
400
  }
568
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGluQ29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jbGFzc2VzL1RpbkNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUErQixhQUFhLEVBQXFCLFVBQVUsRUFBa0IsTUFBTSxXQUFXLENBQUM7QUFFdEgsTUFBTSxPQUFPLElBQUk7SUFHUixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFDekIsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUMzQyxPQUFPLEdBQUcsQ0FBQztTQUNaO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBUTtRQUMvQiw4Q0FBOEM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVuQyx5REFB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YWlsc0RpYWxvZ0NvbmZpZywgRGV0YWlsc1NvdXJjZSwgRmllbGQsIEZvcm1Db25maWcsIFJvbGVBY2Nlc3MsIFNlY3VyaXR5Q29uZmlnIH0gZnJvbSBcIi4vQ2xhc3Nlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcmUge1xyXG5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBkZWVwQ2xvbmUob2JqKSB7XHJcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICBjb25zdCBhcnJDb3B5ID0gW107XHJcbiAgICAgIG9iai5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGFyckNvcHlbaW5kZXhdID0gdGhpcy5kZWVwQ2xvbmUoaXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gYXJyQ29weTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvYmpDb3B5ID0ge307XHJcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgb2JqQ29weVtrZXldID0gdGhpcy5kZWVwQ2xvbmUob2JqW2tleV0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb2JqQ29weTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZGVlcENsb25lMihvYmo6IGFueSk6IGFueSB7XHJcbiAgICAvLyBDcmVhdGUgbmV3IFdlYWtNYXAgZm9yIGVhY2ggY2xvbmUgb3BlcmF0aW9uXHJcbiAgICBjb25zdCBjbG9uZVZpc2l0ZWQgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuICAgIC8vIElubmVyIGZ1bmN0aW9uIHRoYXQgaGFzIGFjY2VzcyB0byB0aGUgY2xvbmVWaXNpdGVkIG1hcFxyXG4gICAgY29uc3QgY2xvbmUgPSAodmFsdWU6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgIC8vIEhhbmRsZSBudWxsLCB1bmRlZmluZWQgYW5kIHByaW1pdGl2ZXNcclxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIG9iamVjdCB3YXMgYWxyZWFkeSBjbG9uZWRcclxuICAgICAgaWYgKGNsb25lVmlzaXRlZC5oYXModmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lVmlzaXRlZC5nZXQodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgIGNvbnN0IGFyckNvcHkgPSBbXTtcclxuICAgICAgICBjbG9uZVZpc2l0ZWQuc2V0KHZhbHVlLCBhcnJDb3B5KTtcclxuICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgYXJyQ29weVtpbmRleF0gPSBjbG9uZShpdGVtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gYXJyQ29weTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIGRhdGVzXHJcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBIYW5kbGUgcmVndWxhciBvYmplY3RzXHJcbiAgICAgIGNvbnN0IG9iakNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkpO1xyXG4gICAgICBjbG9uZVZpc2l0ZWQuc2V0KHZhbHVlLCBvYmpDb3B5KTtcclxuXHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xyXG4gICAgICAgICAgb2JqQ29weVtrZXldID0gY2xvbmUodmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIG9iakNvcHk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFN0YXJ0IHRoZSBjbG9uZSBvcGVyYXRpb24gd2l0aCBhIGZyZXNoIFdlYWtNYXBcclxuICAgIHJldHVybiBjbG9uZShvYmopO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNhbWVsVG9Xb3Jkcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGxldCB2ID0gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSlcclxuICAgIHJldHVybiB2LnJlcGxhY2UoLyhbQS1aXSspKihbQS1aXVthLXpdKS9nLCBcIiQxICQyXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZU9iamVjdChmaWVsZHM6IEZpZWxkW10pIHtcclxuXHJcbiAgICBsZXQgZGF0YSA9IHt9O1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG5cclxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT0gJ3NlY3Rpb24nICYmIGZpZWxkLnR5cGUgIT0gJ2JsYW5rJyApe1xyXG4gICAgICAgIGRhdGFbZmllbGQubmFtZV0gPSB0aGlzLmdldEluaXRpYWxWYWx1ZShmaWVsZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhKVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZXNldE9iamVjdChmaWVsZHM6IEZpZWxkW10sIGRhdGEpIHtcclxuXHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlICE9ICdzZWN0aW9uJyAmJiBmaWVsZC50eXBlICE9ICdibGFuaycpIHtcclxuICAgICAgICBkYXRhW2ZpZWxkLm5hbWVdID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNoZWNrU2VjdXJpdHkoc2VjdXJpdHk6IFNlY3VyaXR5Q29uZmlnLCBjdXJyZW50Um9sZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXNlY3VyaXR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWN1cml0eS5kZW55Py5zb21lKHJvbGUgPT4gY3VycmVudFJvbGVbcm9sZS5uYW1lXSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc2VjdXJpdHkuYWxsb3cgfHwgc2VjdXJpdHkuYWxsb3cubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWN1cml0eS5hbGxvdy5zb21lKHJvbGUgPT4gY3VycmVudFJvbGVbcm9sZS5uYW1lXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGhhc0Zvcm1BY2Nlc3MoZm9ybUNvbmZpZzogRm9ybUNvbmZpZywgY3VycmVudFJvbGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUFjY2Vzcyhmb3JtQ29uZmlnLCBjdXJyZW50Um9sZSkgPiBSb2xlQWNjZXNzLk5vbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEZvcm1BY2Nlc3MoZm9ybUNvbmZpZzogRm9ybUNvbmZpZywgY3VycmVudFJvbGU6IGFueSk6IFJvbGVBY2Nlc3Mge1xyXG4gICAgaWYgKCFmb3JtQ29uZmlnPy5zZWN1cml0eT8uYWxsb3cpIHtcclxuICAgICAgcmV0dXJuIFJvbGVBY2Nlc3MuRnVsbDsgLy8gRnVsbCBhY2Nlc3MgaWYgbm8gcmVzdHJpY3Rpb25zXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZGVueSBmaXJzdFxyXG4gICAgaWYgKGZvcm1Db25maWcuc2VjdXJpdHkuZGVueT8uc29tZShyb2xlID0+IHRoaXMuZ2V0Um9sZUFjY2VzcyhjdXJyZW50Um9sZSwgcm9sZS5uYW1lKSA+IFJvbGVBY2Nlc3MuTm9uZSkpIHtcclxuICAgICAgcmV0dXJuIFJvbGVBY2Nlc3MuTm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgaGlnaGVzdCBsZXZlbCBvZiBhY2Nlc3MgZnJvbSBhbGxvd2VkIGNhcGFiaWxpdGllc1xyXG4gICAgbGV0IG1heEFjY2VzcyA9IFJvbGVBY2Nlc3MuTm9uZTtcclxuICAgIGZvcm1Db25maWcuc2VjdXJpdHkuYWxsb3cuZm9yRWFjaChyb2xlID0+IHtcclxuICAgICAgY29uc3QgYWNjZXNzID0gdGhpcy5nZXRSb2xlQWNjZXNzKGN1cnJlbnRSb2xlLCByb2xlLm5hbWUpO1xyXG4gICAgICBpZiAoYWNjZXNzID4gbWF4QWNjZXNzKSB7XHJcbiAgICAgICAgbWF4QWNjZXNzID0gYWNjZXNzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF4QWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Um9sZUFjY2Vzcyhyb2xlOiBhbnksIGNhcE5hbWU6IHN0cmluZyk6IFJvbGVBY2Nlc3Mge1xyXG4gICAgaWYgKCFyb2xlIHx8ICFjYXBOYW1lKSByZXR1cm4gUm9sZUFjY2Vzcy5Ob25lO1xyXG4gICAgcmV0dXJuIHJvbGVbY2FwTmFtZV0gPz8gUm9sZUFjY2Vzcy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB0ZXN0VmlzaWJsZShjb25maWc6IEZvcm1Db25maWcsIGRhdGEsIGZpZWxkOiBGaWVsZCwgY3VycmVudFJvbGU6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICgoZmllbGQudHlwZSA9PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PSAnYmxhbmsnKSAmJiBmaWVsZC5oaWRkZW4pIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBGaXJzdCBjaGVjayBmb3JtIGxldmVsIHNlY3VyaXR5IGlmIGV4aXN0c1xyXG4gICAgaWYgKGNvbmZpZy5zZWN1cml0eSAmJiAhdGhpcy5oYXNGb3JtQWNjZXNzKGNvbmZpZywgY3VycmVudFJvbGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGQuc2VjdGlvbikge1xyXG4gICAgICBjb25zdCBzZWN0aW9uRmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLnR5cGUgPT09ICdzZWN0aW9uJyAmJiBmLm5hbWUgPT09IGZpZWxkLnNlY3Rpb24pO1xyXG4gICAgICBpZiAoc2VjdGlvbkZpZWxkKSB7XHJcbiAgICAgICAgLy8gSW5oZXJpdCBzZWN0aW9uJ3MgY29uZGl0aW9uc1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja1NlY3VyaXR5KHNlY3Rpb25GaWVsZC5zZWN1cml0eUNvbmZpZywgY3VycmVudFJvbGUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIChzZWN0aW9uRmllbGQuaGlkZGVuKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlY3Rpb25GaWVsZC5oaWRlT25DcmVhdGUgJiYgY29uZmlnLm1vZGUgPT0gJ2NyZWF0ZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc2VjdGlvbkZpZWxkLmhpZGVPbkV4aXN0cyAmJiBjb25maWcubW9kZSAhPSAnY3JlYXRlJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChzZWN0aW9uRmllbGQuaGlkZGVuQ29uZGl0aW9uICYmIHNlY3Rpb25GaWVsZC5oaWRkZW5Db25kaXRpb24oZGF0YSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZW4gY2hlY2sgZmllbGQgbGV2ZWwgc2VjdXJpdHkgaWYgZXhpc3RzXHJcbiAgICBpZiAoIXRoaXMuY2hlY2tTZWN1cml0eShmaWVsZC5zZWN1cml0eUNvbmZpZywgY3VycmVudFJvbGUpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGQuaGlkZGVuKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGNvbmZpZy5tb2RlID09ICdjcmVhdGUnICYmIGZpZWxkLmhpZGVPbkNyZWF0ZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChjb25maWcubW9kZSAhPSAnY3JlYXRlJyAmJiBmaWVsZC5oaWRlT25FeGlzdHMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKGZpZWxkLmhpZGRlbkNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gIWZpZWxkLmhpZGRlbkNvbmRpdGlvbihkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdGVzdFJlYWRPbmx5KGNvbmZpZzogRm9ybUNvbmZpZywgZGF0YSwgZmllbGQ6IEZpZWxkKTogYm9vbGVhbiB7XHJcbiAgICAvLyBEZWZhdWx0IHJlYWRvbmx5IGNvbmRpdGlvbnNcclxuICAgIGlmIChjb25maWcubW9kZSA9PSAnY3JlYXRlJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcubW9kZSA9PSAndmlldycpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgc2VjdGlvbiByZWFkb25seSBjb25kaXRpb24gZmlyc3RcclxuICAgIGlmIChmaWVsZC5zZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHNlY3Rpb25GaWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChmID0+IGYudHlwZSA9PT0gJ3NlY3Rpb24nICYmIGYubmFtZSA9PT0gZmllbGQuc2VjdGlvbik7XHJcbiAgICAgIGlmIChzZWN0aW9uRmllbGQ/LnJlYWRvbmx5Q29uZGl0aW9uICYmIHNlY3Rpb25GaWVsZC5yZWFkb25seUNvbmRpdGlvbihkYXRhKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZmllbGQgbGV2ZWwgcmVhZG9ubHkgY29uZGl0aW9uIGxhc3RcclxuICAgIGlmIChmaWVsZC5yZWFkb25seUNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gZmllbGQucmVhZG9ubHlDb25kaXRpb24oZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB0ZXN0VmlzaWJsZUhlYWRlckJ1dHRvbihkYXRhLCBidG4pOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoYnRuLmhpZGRlbkNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gIWJ0bi5oaWRkZW5Db25kaXRpb24oZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldFZpc2libGVTdWJmaWVsZHMoY29uZmlnOiBGb3JtQ29uZmlnLCBkYXRhLCBmaWVsZDogRmllbGQsIGN1cnJlbnRSb2xlOiBhbnkgKTogRmllbGRbXSB7XHJcbiAgICByZXR1cm4gZmllbGQuc3ViZmllbGRzPy5maWx0ZXIoc3ViZmllbGQgPT4gQ29yZS50ZXN0VmlzaWJsZShjb25maWcsIGRhdGEsIHN1YmZpZWxkLGN1cnJlbnRSb2xlICkpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZU9iamVjdChmaWVsZHM6IEZpZWxkW10sIGRhdGEpOiBzdHJpbmcge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiVmFsaWRhdGlvbnNcIilcclxuXHJcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcclxuXHJcbiAgICAgIGlmIChmaWVsZC50eXBlID09ICdmaWxlJyB8fCBmaWVsZC50eXBlID09ICdmaWxlLXZpZXcnIHx8IGZpZWxkLnR5cGUgPT0gJ2JsYW5rJyB8fCBmaWVsZC50eXBlID09ICdzZWN0aW9uJyApIGNvbnRpbnVlXHJcblxyXG5cclxuXHJcbiAgICAgIGxldCBuYW1lID0gZmllbGQuYWxpYXMgPz8gdGhpcy5jYW1lbFRvV29yZHMoZmllbGQubmFtZSk7XHJcbiAgICAgIGxldCBkID0gZGF0YVtmaWVsZC5uYW1lXTtcclxuXHJcbiAgICAgIGxldCBpc1JlcXVpcmVkID0gZmllbGQucmVxdWlyZWQ7XHJcblxyXG4gICAgICBpZiAoIWlzUmVxdWlyZWQgJiYgZmllbGQucmVxdWlyZWRDb25kaXRpb24pIHtcclxuICAgICAgICBpc1JlcXVpcmVkID0gZmllbGQucmVxdWlyZWRDb25kaXRpb24oZGF0YSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhuYW1lICsgJyAnICsgZClcclxuXHJcbiAgICAgIGlmIChpc1JlcXVpcmVkKXtcclxuXHJcbiAgICAgICAgaWYgKGQgPT0gdW5kZWZpbmVkIHx8IGQgPT0gbnVsbCkgcmV0dXJuIGAke25hbWV9IGlzIHJlcXVpcmVkYDtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gJ3RleHQnKXtcclxuXHJcbiAgICAgICAgICBpZiAoZCA9PSAnJykgcmV0dXJuIGBQbGVhc2UgZW50ZXIgJHtuYW1lfWA7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1pbiAmJiBkLmxlbmd0aCA8IGZpZWxkLm1pbikgcmV0dXJuIGBNaW5pbXVtICAke25hbWV9IGxlbmd0aCBpcyAke2ZpZWxkLm1pbn1gXHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1heCAmJiBkLmxlbmd0aCA+IGZpZWxkLm1heCkgcmV0dXJuIGBNYXhpbXVtICR7bmFtZX0gbGVuZ3RoIGlzICR7ZmllbGQubWF4fWBcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZpZWxkLnR5cGUgPT0gJ251bWJlcicgfHwgZmllbGQudHlwZSA9PSAnbW9uZXknIHx8IGZpZWxkLnR5cGUgPT0gJ2RhdGUnKXtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQubWluICYmIGQgPCBmaWVsZC5taW4pIHJldHVybiBgTWluaW11bSAgJHtuYW1lfSBpcyAke2ZpZWxkLm1pbn1gXHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1heCAmJiBkID4gZmllbGQubWF4KSByZXR1cm4gYE1heGltdW0gJHtuYW1lfSBpcyAke2ZpZWxkLm1heH1gXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChmaWVsZC50eXBlID09ICdzZWxlY3QnKSB7XHJcblxyXG4gICAgICAgICAgaWYgKHR5cGVvZihkKSA9PSAnc3RyaW5nJyAmJiBkID09ICcnKSByZXR1cm4gYFBsZWFzZSBzZWxlY3QgJHtuYW1lfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PSAndGV4dCcgJiYgZmllbGQucmVnZXggJiYgZCAmJiBkLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoZmllbGQucmVnZXgucGF0dGVybik7XHJcbiAgICAgICAgaWYgKCFyZWdleFBhdHRlcm4udGVzdChkKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZpZWxkLnJlZ2V4Lm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHRlc3RSZXF1aXJlZChjb25maWc6IEZvcm1Db25maWcsIGRhdGEsIGZpZWxkOiBGaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZpZWxkLnJlcXVpcmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoZmllbGQucmVxdWlyZWRDb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGZpZWxkLnJlcXVpcmVkQ29uZGl0aW9uKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEluaXRpYWxWYWx1ZShmaWVsZDogRmllbGQpIHtcclxuXHJcbiAgICBpZiAoZmllbGQuZGVmYXVsdFZhbHVlKXtcclxuXHJcbiAgICAgIGlmICgoZmllbGQudHlwZSA9PSAnZGF0ZScgfHwgZmllbGQudHlwZSA9PSAnZGF0ZXRpbWUnKSAmJiBmaWVsZC5kZWZhdWx0VmFsdWUgPT0gJ25vdycpIHJldHVybiB0aGlzLm5vd0RhdGUodHJ1ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZmllbGQuZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZC50eXBlID09ICdzZWxlY3QnICYmIChmaWVsZC5oaWRkZW4gfHwgZmllbGQuaGlkZU9uQ3JlYXRlKSkgcmV0dXJuIDA7XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgY2FzZSAnbW9uZXknOlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5ub3dEYXRlKHRydWUpO1xyXG4gICAgICBjYXNlICdjaGVja2JveCc6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldENsb25lKHgpIHtcclxuICAgIHJldHVybiB0aGlzLmRlZXBDbG9uZTIoeCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldE51bWJlcih2YWx1ZTogc3RyaW5nKSB7XHJcblxyXG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvbmx5TnVtYmVycyA9IHZhbHVlLnJlcGxhY2UoL1teXFxkLi1dL2csICcnKTtcclxuICAgIHJldHVybiBvbmx5TnVtYmVyc1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRGaXJzdERheU9mTW9udGgoKSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGVtYWlsSXNWYWxpZChlbWFpbCkge1xyXG4gICAgLy8gcmV0dXJuIC9cXFMrQFxcUytcXC5cXFMrLy50ZXN0KGVtYWlsKVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkVU5DUGF0aChwYXRoOiBzdHJpbmcpIHtcclxuICAgIC8vIHJldHVybiAvXFxcXFxcXFwoW2EtekEtWjAtOV8uJOKXjy1dKylcXFxcKFthLXpBLVowLTlfLiTil48tXSspLiovLnRlc3QocGF0aClcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZERhdGUoZGF0ZSkge1xyXG5cclxuICAgIHZhciBwYXJzZWREYXRlID0gRGF0ZS5wYXJzZShkYXRlKTtcclxuXHJcblxyXG4gICAgaWYgKGlzTmFOKGRhdGUpICYmICFpc05hTihwYXJzZWREYXRlKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbWFpbExpc3QobGlzdDogc3RyaW5nKSB7XHJcblxyXG4gICAgaWYgKGxpc3QuaW5jbHVkZXMoXCI7XCIpKSB7XHJcblxyXG4gICAgICBsZXQgZW1haWxzID0gbGlzdC5zcGxpdChcIjtcIilcclxuXHJcbiAgICAgIGZvciAodmFyIGVtYWlsIG9mIGVtYWlscykge1xyXG4gICAgICAgIGlmICh0aGlzLmVtYWlsSXNWYWxpZChlbWFpbCkgPT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmVtYWlsSXNWYWxpZChsaXN0KSA9PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG51bGxEYXRlID0gXCIwMSBKYW4gMTk2OVwiXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodmFsdWUgIT0gbnVsbCkgJiZcclxuICAgICAgKHZhbHVlICE9PSAnJykgJiZcclxuICAgICAgIWlzTmFOKE51bWJlcih2YWx1ZS50b1N0cmluZygpKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXREaWZmKHN0YXJ0RGF0ZSwgZW5kRGF0ZSA9IERhdGUoKSkge1xyXG5cclxuICAgIHZhciBldmVudFN0YXJ0VGltZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICB2YXIgZXZlbnRFbmRUaW1lID0gbmV3IERhdGUoZW5kRGF0ZSk7XHJcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZXZlbnRFbmRUaW1lLnZhbHVlT2YoKSAtIGV2ZW50U3RhcnRUaW1lLnZhbHVlT2YoKTtcclxuXHJcbiAgICBmdW5jdGlvbiBudW1iZXJFbmRpbmcobnVtYmVyOiBudW1iZXIpIHtcclxuXHJcbiAgICAgIGlmIChudW1iZXIudG9GaXhlZCgpID09ICcxJykge1xyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAncyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG1pbnV0ZXMgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCkpO1xyXG5cclxuICAgIHZhciBob3VyczogbnVtYmVyID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCkpO1xyXG5cclxuICAgIHZhciBkYXlzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcblxyXG4gICAgdmFyIHdlZWtzOiBudW1iZXIgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiA3KSk7XHJcblxyXG4gICAgdmFyIG1vbnRocyA9IChtaWxsaXNlY29uZHMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDcgKiA0KSk7XHJcblxyXG4gICAgdmFyIHllYXJzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogMzY1KSk7XHJcblxyXG5cclxuICAgIGlmICh5ZWFycyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4geWVhcnMudG9GaXhlZCgpICsgJyB5ZWFyJyArIG51bWJlckVuZGluZyh5ZWFycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtb250aHMgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIG1vbnRocy50b0ZpeGVkKCkgKyAnIG1vbnRoJyArIG51bWJlckVuZGluZyhtb250aHMpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAod2Vla3MgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIHdlZWtzLnRvRml4ZWQoKSArICcgd2VlaycgKyBudW1iZXJFbmRpbmcod2Vla3MpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoZGF5cyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gZGF5cy50b0ZpeGVkKCkgKyAnIGRheScgKyBudW1iZXJFbmRpbmcoZGF5cyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gaG91cnMudG9GaXhlZCgpICsgJyBob3VyJyArIG51bWJlckVuZGluZyhob3Vycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtaW51dGVzID49IDEpIHtcclxuXHJcbiAgICAgIHJldHVybiBtaW51dGVzLnRvRml4ZWQoKSArICcgbWludXRlJyArIG51bWJlckVuZGluZyhtaW51dGVzKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA+PSAoLTEwMDAgKiA2MCkpIHtcclxuXHJcbiAgICAgIHJldHVybiAnYSBtaW51dGUnO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICByZXR1cm4gJ04vQSc7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgbm93RGF0ZShOb1RpbWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgIGlmIChOb1RpbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0ZWREYXRlKERhdGUoKSwgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGb3JtYXRlZERhdGUoRGF0ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rm9ybWF0ZWREYXRlKGRhdGVTdHJpbmc6IHN0cmluZywgTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBsZXQgZDogRGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHJpbmcpO1xyXG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAyKTtcclxuXHJcbiAgICBpZiAoTm9UaW1lID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rm9ybWF0ZWREYXRlMihkIDogRGF0ZSwgTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcblxyXG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAyKTtcclxuXHJcbiAgICBpZiAoTm9UaW1lID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QnVzaW5lc3NEYXRlc0NvdW50KHN0YXJ0RGF0ZTogc3RyaW5nLCBlbmREYXRlOiBzdHJpbmcpIHtcclxuICAgIHZhciBjb3VudCA9IDA7XHJcbiAgICB2YXIgX3N0YXJ0RGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICB2YXIgX2VuZERhdGUgPSBuZXcgRGF0ZShlbmREYXRlKTtcclxuXHJcbiAgICB2YXIgY3VyRGF0ZSA9IF9zdGFydERhdGU7XHJcblxyXG4gICAgd2hpbGUgKGN1ckRhdGUgPCBfZW5kRGF0ZSkge1xyXG4gICAgICB2YXIgZGF5T2ZXZWVrID0gY3VyRGF0ZS5nZXREYXkoKTtcclxuICAgICAgaWYgKCEoZGF5T2ZXZWVrID09IDYgfHwgZGF5T2ZXZWVrID09IDApKSBjb3VudCsrO1xyXG4gICAgICBjdXJEYXRlLnNldERhdGUoY3VyRGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBwcm9jZXNzRGV0YWlsc0NvbmZpZyhkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCByb3c6IGFueSk6IERldGFpbHNEaWFsb2dDb25maWcge1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWREZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0gQ29yZS5nZXRDbG9uZShkZXRhaWxzQ29uZmlnKTsgLy97Li4uZGV0YWlsc0NvbmZpZ31cclxuICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHMgPSByb3c7XHJcblxyXG5cclxuICAgIC8vRm9ybSBDb25maWdcclxuICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmZvcm1Db25maWcubW9kZSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLm1vZGUgPz8gXCJ2aWV3XCI7XHJcblxyXG5cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkICYmIHJvdykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUgPSByb3dbdXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9UYWJsZSBjb25maWdzXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgdXBkYXRlVGFibGVDb25maWcodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MpIHtcclxuICAgICAgdXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWdzLmZvckVhY2godXBkYXRlVGFibGVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRhYmxlQ29uZmlnKHRhYmxlQ29uZmlnKSB7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmhlcm9GaWVsZCA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnPy5oZXJvRmllbGQ7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmhlcm9WYWx1ZSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnPy5oZXJvVmFsdWU7XHJcbiAgICAgIC8vIHRhYmxlQ29uZmlnLnNldEhlcm8gPSB1cGRhdGVkRGV0YWlsc0NvbmZpZy5zZXRIZXJvO1xyXG4gICAgICB0YWJsZUNvbmZpZy5zZWFyY2hDb25maWcgPSBudWxsO1xyXG4gICAgICB0YWJsZUNvbmZpZy50aWxlQ29uZmlnID0gbnVsbDtcclxuICAgICAgdGFibGVDb25maWcucGFyZW50RGF0YSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHM7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmVsZXZhdGlvbiA9ICdub25lJztcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vVVJMXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgdHJhbnNmb3JtTG9hZFVybCh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlncykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MuZm9yRWFjaCh0cmFuc2Zvcm1Mb2FkVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcuc3RlcENvbmZpZz8ubG9hZEFjdGlvbikge1xyXG4gICAgICB0cmFuc2Zvcm1TdGVwVXJsKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnN0ZXBDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUxvYWRVcmwodGFibGVDb25maWcpIHtcclxuICAgICAgaWYgKHRhYmxlQ29uZmlnLmxvYWRBY3Rpb24gJiYgdGFibGVDb25maWcubG9hZENyaXRlcmlhICYmIHRhYmxlQ29uZmlnLmxvYWRJREZpZWxkKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcubG9hZEFjdGlvbi51cmwgPSBgJHt0YWJsZUNvbmZpZy5sb2FkQWN0aW9uLnVybC5zcGxpdCgnLycpWzBdfS8ke3RhYmxlQ29uZmlnLmxvYWRDcml0ZXJpYX0vJHt1cGRhdGVkRGV0YWlsc0NvbmZpZy5kZXRhaWxzW3RhYmxlQ29uZmlnLmxvYWRJREZpZWxkXX1gO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlRyYW5zZm9ybWVkXCIsIHRhYmxlQ29uZmlnLmxvYWRBY3Rpb24udXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk5PVCBUcmFuc2Zvcm1lZFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVN0ZXBVcmwoc3RlcENvbmZpZykge1xyXG4gICAgICBpZiAoc3RlcENvbmZpZy5sb2FkQWN0aW9uICYmIHN0ZXBDb25maWcubG9hZElERmllbGQgKSB7XHJcbiAgICAgICAgLy8gbGV0IGhlcm9JZCA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHNbdXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgICAgICBzdGVwQ29uZmlnLmxvYWRBY3Rpb24udXJsID0gYCR7c3RlcENvbmZpZy5sb2FkQWN0aW9uLnVybC5yZXBsYWNlKCd7aWR9JywgdXBkYXRlZERldGFpbHNDb25maWcuZGV0YWlsc1tzdGVwQ29uZmlnLmxvYWRJREZpZWxkXSl9YDtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYW5zZm9ybWVkIHN0ZXAgVVJMXCIsIHN0ZXBDb25maWcubG9hZEFjdGlvbi51cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZERldGFpbHNDb25maWc7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdGljIGluaXRpYWxpemVDb25maWdzKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcpIHtcclxuICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZztcclxuICAgIGNvbnN0IHRhYmxlQ29uZmlncyA9IGRldGFpbHNDb25maWcudGFibGVDb25maWdzO1xyXG4gICAgY29uc3QgZm9ybUNvbmZpZyA9IGRldGFpbHNDb25maWcuZm9ybUNvbmZpZztcclxuICAgIGNvbnN0IHN0ZXBDb25maWcgPSBkZXRhaWxzQ29uZmlnLnN0ZXBDb25maWc7XHJcbiAgICBjb25zdCBzdGF0dXNDb25maWcgPSBkZXRhaWxzQ29uZmlnLnN0YXR1c0NvbmZpZzsgXHJcbiAgICBjb25zdCBidXR0b25zID0gZGV0YWlsc0NvbmZpZy5idXR0b25zO1xyXG4gICAgZm9ybUNvbmZpZy5tb2RlID0gZm9ybUNvbmZpZy5tb2RlID8/IFwidmlld1wiO1xyXG4gICAgcmV0dXJuIHsgdGFibGVDb25maWcsIHRhYmxlQ29uZmlncywgZm9ybUNvbmZpZywgc3RlcENvbmZpZywgc3RhdHVzQ29uZmlnLCBidXR0b25zIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0SGVyb1ZhbHVlKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGRldGFpbHM6IGFueSkge1xyXG5cclxuXHJcbiAgICBpZiAoKGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5tb2RlID09IFwiY3JlYXRlXCIgICkgJiYgZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuICAgICAgZGV0YWlsc1tkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZF0gPSBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZTtcclxuXHJcbiAgICAgIC8vIEVuc3VyZSBoZXJvIHZhbHVlcyBhcmUgc2V0IGluIGZvcm0gY29uZmlnXHJcbiAgICAgIGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5oZXJvRmllbGQgPSBkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZDtcclxuICAgICAgZGV0YWlsc0NvbmZpZy5mb3JtQ29uZmlnLmhlcm9WYWx1ZSA9IGRldGFpbHNDb25maWcuaGVyb1ZhbHVlO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRm9ybU1vZGUoZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZywgZm9ybUNvbmZpZzogRm9ybUNvbmZpZywpIHtcclxuICAgIGxldCBkZXRhaWxzO1xyXG4gICAgbGV0IGFjdGlvbjtcclxuICAgIGxldCBsb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm9ybUNvbmZpZy5tb2RlID09PSBcImNyZWF0ZVwiKSB7XHJcblxyXG4gICAgICBkZXRhaWxzID0gQ29yZS5nZW5lcmF0ZU9iamVjdChmb3JtQ29uZmlnLmZpZWxkcyk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHJlc3AgPSB0aGlzLmxvYWREZXRhaWxzRGF0YShkZXRhaWxzQ29uZmlnLCBmb3JtQ29uZmlnKTtcclxuICAgICAgZGV0YWlscyA9IHJlc3AuZGV0YWlscztcclxuXHJcbiAgICAgIGFjdGlvbiA9IHJlc3AuYWN0aW9uO1xyXG4gICAgICBsb2FkQnlBY3Rpb24gPSByZXNwLmxvYWRCeUFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBkZXRhaWxzLCBsb2FkQnlBY3Rpb24sIGFjdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZERldGFpbHNEYXRhKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuXHJcbiAgICBsZXQgZGV0YWlscztcclxuICAgIGxldCBhY3Rpb247XHJcbiAgICBsZXQgbG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8vQ2hvb3NlIHNvdXJjZVxyXG4gICAgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlJvdykge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJEYXRhIGZyb20gRGV0YWlscyAtIFJvdyBvcHRpb25cIilcclxuICAgICAgZGV0YWlscyA9IGRldGFpbHNDb25maWcuZGV0YWlscztcclxuXHJcbiAgICB9IGVsc2UgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlVybCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBVcmwgb3B0aW9uXCIpXHJcbiAgICAgIGFjdGlvbiA9IHRoaXMubG9hZERldGFpbHNGcm9tVXJsKGRldGFpbHNDb25maWcsIGZvcm1Db25maWcpO1xyXG4gICAgICBsb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvL25ldyBsb2dpY1xyXG4gICAgICBpZiAoZm9ybUNvbmZpZy5sb2FkQWN0aW9uKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBVcmwgLSBHdWVzc2VkXCIpO1xyXG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5sb2FkRGV0YWlsc0Zyb21VcmwoZGV0YWlsc0NvbmZpZywgZm9ybUNvbmZpZyk7XHJcbiAgICAgICAgICBsb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBEZXRhaWxzIC0gR3Vlc3NlZFwiKTtcclxuICAgICAgICAgIGRldGFpbHMgPSBkZXRhaWxzQ29uZmlnLmRldGFpbHM7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgZGV0YWlscywgbG9hZEJ5QWN0aW9uLCBhY3Rpb24gfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGxvYWREZXRhaWxzRnJvbVVybChkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBmb3JtQ29uZmlnOiBGb3JtQ29uZmlnKSB7XHJcbiAgICBsZXQgYWN0aW9uIDogQWN0aW9uO1xyXG5cclxuICAgIGlmIChmb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuXHJcbiAgICAgIGlmIChkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCAmJiBkZXRhaWxzQ29uZmlnLmRldGFpbHMpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEZXRhaWxzQ29uZmlnIEhlcm8gSUQgRmllbGQgXCIgKyBkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCk7XHJcbiAgICAgICAgYWN0aW9uID0geyB1cmw6IGAke2Zvcm1Db25maWcubG9hZEFjdGlvbi51cmx9LyR7ZGV0YWlsc0NvbmZpZy5kZXRhaWxzW2RldGFpbHNDb25maWcuaGVyb0ZpZWxkXX1gIH07XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKGZvcm1Db25maWcuaGVyb0ZpZWxkICYmIGRldGFpbHNDb25maWcuZGV0YWlscykge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkZvcm1Db25maWcgSGVybyBJRCBGaWVsZCBcIiArIGZvcm1Db25maWcuaGVyb0ZpZWxkKTtcclxuICAgICAgICBhY3Rpb24gPSB7IHVybDogYCR7Zm9ybUNvbmZpZy5sb2FkQWN0aW9uLnVybH0vJHtkZXRhaWxzQ29uZmlnLmRldGFpbHNbZm9ybUNvbmZpZy5oZXJvRmllbGRdfWAgfTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAoZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEZWZpbmVkIEhlcm8gVmFsdWUgXCIgKyBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZSk7XHJcbiAgICAgICAgYWN0aW9uID0geyB1cmw6IGAke2Zvcm1Db25maWcubG9hZEFjdGlvbi51cmx9LyR7ZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWV9YCB9O1xyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNle1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXJsIHNvdXJjZSBmYWlsZWQgOiBzZXR1cCBoZXJvIGZpZWxkIG9yIGhlcm8gdmFsdWVcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFjdGlvbi5jYWNoZUR1cmF0aW9uTWludXRlcyA9IGZvcm1Db25maWcubG9hZEFjdGlvbi5jYWNoZUR1cmF0aW9uTWludXRlcyA/PyAwO1xyXG4gICAgICBhY3Rpb24uc2tpcENhY2hlID0gZm9ybUNvbmZpZy5sb2FkQWN0aW9uLnNraXBDYWNoZSA/PyBmYWxzZTtcclxuICAgICAgYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlID0gZm9ybUNvbmZpZy5sb2FkQWN0aW9uLnN1Y2Nlc3NNZXNzYWdlID8/IG51bGw7XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gbG9hZCBhY3Rpb24gc2V0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhY3Rpb247XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0RmlsZUZpZWxkKGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuICAgIHJldHVybiBmb3JtQ29uZmlnLmZpZWxkcy5maW5kKHggPT4geC50eXBlID09PSAnZmlsZScpO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXRpYyBzZXR1cEJ1dHRvbnMoYnV0dG9uczogYW55KSB7XHJcbiAgICBsZXQgZXh0cmFCdXR0b25zLCBjcmVhdGVCdXR0b24sIGVkaXRCdXR0b24sIGRlbGV0ZUJ1dHRvbjtcclxuXHJcbiAgICBpZiAoYnV0dG9ucykge1xyXG4gICAgICBleHRyYUJ1dHRvbnMgPSBidXR0b25zLmZpbHRlcih4ID0+IHgubmFtZSAhPT0gXCJjcmVhdGVcIiAmJiB4Lm5hbWUgIT09IFwiZWRpdFwiICYmIHgubmFtZSAhPT0gXCJkZWxldGVcIiAmJiB4Lm5hbWUgIT09IFwidmlld1wiICYmIHguaW5EaWFsb2cpO1xyXG4gICAgICBjcmVhdGVCdXR0b24gPSBidXR0b25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IFwiY3JlYXRlXCIpO1xyXG4gICAgICBlZGl0QnV0dG9uID0gYnV0dG9ucy5maW5kKHggPT4geC5uYW1lID09PSBcImVkaXRcIik7XHJcbiAgICAgIGRlbGV0ZUJ1dHRvbiA9IGJ1dHRvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gXCJkZWxldGVcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBleHRyYUJ1dHRvbnMsIGNyZWF0ZUJ1dHRvbiwgZWRpdEJ1dHRvbiwgZGVsZXRlQnV0dG9uIH07XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
401
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGluQ29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jbGFzc2VzL1RpbkNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixhQUFhLEVBQXFCLE1BQU0sV0FBVyxDQUFDO0FBRWxGLE1BQU0sT0FBTyxJQUFJO0lBR1IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHO1FBQ3pCLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0MsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFJTSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUV6QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFB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R0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNsRCxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDbEUsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGV0YWlsc0RpYWxvZ0NvbmZpZywgRGV0YWlsc1NvdXJjZSwgRmllbGQsIEZvcm1Db25maWcgfSBmcm9tIFwiLi9DbGFzc2VzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29yZSB7XHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGRlZXBDbG9uZShvYmopIHtcclxuICAgIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICAgIGNvbnN0IGFyckNvcHkgPSBbXTtcclxuICAgICAgb2JqLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgYXJyQ29weVtpbmRleF0gPSB0aGlzLmRlZXBDbG9uZShpdGVtKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhcnJDb3B5O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9iakNvcHkgPSB7fTtcclxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBvYmpDb3B5W2tleV0gPSB0aGlzLmRlZXBDbG9uZShvYmpba2V5XSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmpDb3B5O1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNhbWVsVG9Xb3Jkcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgIGxldCB2ID0gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSlcclxuICAgIHJldHVybiB2LnJlcGxhY2UoLyhbQS1aXSspKihbQS1aXVthLXpdKS9nLCBcIiQxICQyXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZU9iamVjdChmaWVsZHM6IEZpZWxkW10pIHtcclxuXHJcbiAgICBsZXQgZGF0YSA9IHt9O1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG5cclxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT0gJ3NlY3Rpb24nICYmIGZpZWxkLnR5cGUgIT0gJ2JsYW5rJyApe1xyXG4gICAgICAgIGRhdGFbZmllbGQubmFtZV0gPSB0aGlzLmdldEluaXRpYWxWYWx1ZShmaWVsZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRhKVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZXNldE9iamVjdChmaWVsZHM6IEZpZWxkW10sIGRhdGEpIHtcclxuXHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlICE9ICdzZWN0aW9uJyAmJiBmaWVsZC50eXBlICE9ICdibGFuaycpIHtcclxuICAgICAgICBkYXRhW2ZpZWxkLm5hbWVdID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHRlc3RWaXNpYmxlKGNvbmZpZyA6IEZvcm1Db25maWcsIGRhdGEsIGY6IEZpZWxkKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKGYuaGlkZGVuKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGNvbmZpZy5tb2RlID09ICdjcmVhdGUnICYmIGYuaGlkZU9uQ3JlYXRlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKGNvbmZpZy5tb2RlICE9ICdjcmVhdGUnICYmIGYuaGlkZU9uRXhpc3RzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZi5oaWRkZW5Db25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuICFmLmhpZGRlbkNvbmRpdGlvbihkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVPYmplY3QoZmllbGRzOiBGaWVsZFtdLCBkYXRhKTogc3RyaW5nIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlZhbGlkYXRpb25zXCIpXHJcblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgZmllbGRzKSB7XHJcblxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PSAnZmlsZScgfHwgZmllbGQudHlwZSA9PSAnZmlsZS12aWV3JyB8fCBmaWVsZC50eXBlID09ICdibGFuaycgfHwgZmllbGQudHlwZSA9PSAnc2VjdGlvbicgKSBjb250aW51ZVxyXG5cclxuXHJcblxyXG4gICAgICBsZXQgbmFtZSA9IGZpZWxkLmFsaWFzID8/IHRoaXMuY2FtZWxUb1dvcmRzKGZpZWxkLm5hbWUpO1xyXG4gICAgICBsZXQgZCA9IGRhdGFbZmllbGQubmFtZV07XHJcblxyXG5cclxuICAgICAgY29uc29sZS5sb2cobmFtZSArICcgJyArIGQpXHJcblxyXG4gICAgICBpZiAoZmllbGQucmVxdWlyZWQpe1xyXG5cclxuICAgICAgICBpZiAoZCA9PSB1bmRlZmluZWQgfHwgZCA9PSBudWxsKSByZXR1cm4gYCR7bmFtZX0gaXMgcmVxdWlyZWRgO1xyXG5cclxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PSAndGV4dCcpe1xyXG5cclxuICAgICAgICAgIGlmIChkID09ICcnKSByZXR1cm4gYFBsZWFzZSBlbnRlciAke25hbWV9YDtcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQubWluICYmIGQubGVuZ3RoIDwgZmllbGQubWluKSByZXR1cm4gYE1pbmltdW0gICR7bmFtZX0gbGVuZ3RoIGlzICR7ZmllbGQubWlufWBcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQubWF4ICYmIGQubGVuZ3RoID4gZmllbGQubWF4KSByZXR1cm4gYE1heGltdW0gJHtuYW1lfSBsZW5ndGggaXMgJHtmaWVsZC5tYXh9YFxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZmllbGQudHlwZSA9PSAnbnVtYmVyJyB8fCBmaWVsZC50eXBlID09ICdtb25leScgfHwgZmllbGQudHlwZSA9PSAnZGF0ZScpe1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZC5taW4gJiYgZCA8IGZpZWxkLm1pbikgcmV0dXJuIGBNaW5pbXVtICAke25hbWV9IGlzICR7ZmllbGQubWlufWBcclxuXHJcbiAgICAgICAgICBpZiAoZmllbGQubWF4ICYmIGQgPiBmaWVsZC5tYXgpIHJldHVybiBgTWF4aW11bSAke25hbWV9IGlzICR7ZmllbGQubWF4fWBcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZpZWxkLnR5cGUgPT0gJ3NlbGVjdCcpIHtcclxuXHJcbiAgICAgICAgICBpZiAodHlwZW9mKGQpID09ICdzdHJpbmcnICYmIGQgPT0gJycpIHJldHVybiBgUGxlYXNlIHNlbGVjdCAke25hbWV9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRJbml0aWFsVmFsdWUoZmllbGQ6IEZpZWxkKSB7XHJcblxyXG4gICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZSl7XHJcblxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PSAnZGF0ZScgfHwgZmllbGQudHlwZSA9PSAnZGF0ZXRpbWUnICYmIGZpZWxkLmRlZmF1bHRWYWx1ZSA9PSAnbm93JykgcmV0dXJuIHRoaXMubm93RGF0ZSh0cnVlKTtcclxuXHJcbiAgICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkLnR5cGUgPT0gJ3NlbGVjdCcgJiYgKGZpZWxkLmhpZGRlbiB8fCBmaWVsZC5oaWRlT25DcmVhdGUpKSByZXR1cm4gMDtcclxuXHJcbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcclxuICAgICAgY2FzZSAndGV4dCc6XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICBjYXNlICdtb25leSc6XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLm5vd0RhdGUodHJ1ZSk7XHJcbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q2xvbmUoeCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVlcENsb25lKHgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXROdW1iZXIodmFsdWU6IHN0cmluZykge1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb25seU51bWJlcnMgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZC4tXS9nLCAnJyk7XHJcbiAgICByZXR1cm4gb25seU51bWJlcnNcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rmlyc3REYXlPZk1vbnRoKCkge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBlbWFpbElzVmFsaWQoZW1haWwpIHtcclxuICAgIC8vIHJldHVybiAvXFxTK0BcXFMrXFwuXFxTKy8udGVzdChlbWFpbClcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZFVOQ1BhdGgocGF0aDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm4gL1xcXFxcXFxcKFthLXpBLVowLTlfLiTil48tXSspXFxcXChbYS16QS1aMC05Xy4k4pePLV0rKS4qLy50ZXN0KHBhdGgpXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWREYXRlKGRhdGUpIHtcclxuXHJcbiAgICB2YXIgcGFyc2VkRGF0ZSA9IERhdGUucGFyc2UoZGF0ZSk7XHJcblxyXG5cclxuICAgIGlmIChpc05hTihkYXRlKSAmJiAhaXNOYU4ocGFyc2VkRGF0ZSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkRW1haWxMaXN0KGxpc3Q6IHN0cmluZykge1xyXG5cclxuICAgIGlmIChsaXN0LmluY2x1ZGVzKFwiO1wiKSkge1xyXG5cclxuICAgICAgbGV0IGVtYWlscyA9IGxpc3Quc3BsaXQoXCI7XCIpXHJcblxyXG4gICAgICBmb3IgKHZhciBlbWFpbCBvZiBlbWFpbHMpIHtcclxuICAgICAgICBpZiAodGhpcy5lbWFpbElzVmFsaWQoZW1haWwpID09IGZhbHNlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5lbWFpbElzVmFsaWQobGlzdCkgPT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBudWxsRGF0ZSA9IFwiMDEgSmFuIDE5NjlcIlxyXG5cclxuICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoKHZhbHVlICE9IG51bGwpICYmXHJcbiAgICAgICh2YWx1ZSAhPT0gJycpICYmXHJcbiAgICAgICFpc05hTihOdW1iZXIodmFsdWUudG9TdHJpbmcoKSkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGlmZihzdGFydERhdGUsIGVuZERhdGUgPSBEYXRlKCkpIHtcclxuXHJcbiAgICB2YXIgZXZlbnRTdGFydFRpbWUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xyXG4gICAgdmFyIGV2ZW50RW5kVGltZSA9IG5ldyBEYXRlKGVuZERhdGUpO1xyXG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IGV2ZW50RW5kVGltZS52YWx1ZU9mKCkgLSBldmVudFN0YXJ0VGltZS52YWx1ZU9mKCk7XHJcblxyXG4gICAgZnVuY3Rpb24gbnVtYmVyRW5kaW5nKG51bWJlcjogbnVtYmVyKSB7XHJcblxyXG4gICAgICBpZiAobnVtYmVyLnRvRml4ZWQoKSA9PSAnMScpIHtcclxuICAgICAgICByZXR1cm4gJydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ3MnO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhciBtaW51dGVzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjApKTtcclxuXHJcbiAgICB2YXIgaG91cnM6IG51bWJlciA9IChtaWxsaXNlY29uZHMgLyAoMTAwMCAqIDYwICogNjApKTtcclxuXHJcbiAgICB2YXIgZGF5cyA9IChtaWxsaXNlY29uZHMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xyXG5cclxuICAgIHZhciB3ZWVrczogbnVtYmVyID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogNykpO1xyXG5cclxuICAgIHZhciBtb250aHMgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiA3ICogNCkpO1xyXG5cclxuICAgIHZhciB5ZWFycyA9IChtaWxsaXNlY29uZHMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDM2NSkpO1xyXG5cclxuXHJcbiAgICBpZiAoeWVhcnMgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIHllYXJzLnRvRml4ZWQoKSArICcgeWVhcicgKyBudW1iZXJFbmRpbmcoeWVhcnMpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAobW9udGhzID49IDEpIHtcclxuXHJcbiAgICAgIHJldHVybiBtb250aHMudG9GaXhlZCgpICsgJyBtb250aCcgKyBudW1iZXJFbmRpbmcobW9udGhzKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKHdlZWtzID49IDEpIHtcclxuXHJcbiAgICAgIHJldHVybiB3ZWVrcy50b0ZpeGVkKCkgKyAnIHdlZWsnICsgbnVtYmVyRW5kaW5nKHdlZWtzKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKGRheXMgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIGRheXMudG9GaXhlZCgpICsgJyBkYXknICsgbnVtYmVyRW5kaW5nKGRheXMpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIGhvdXJzLnRvRml4ZWQoKSArICcgaG91cicgKyBudW1iZXJFbmRpbmcoaG91cnMpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAobWludXRlcyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gbWludXRlcy50b0ZpeGVkKCkgKyAnIG1pbnV0ZScgKyBudW1iZXJFbmRpbmcobWludXRlcyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtaWxsaXNlY29uZHMgPj0gKC0xMDAwICogNjApKSB7XHJcblxyXG4gICAgICByZXR1cm4gJ2EgbWludXRlJztcclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgcmV0dXJuICdOL0EnO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIG5vd0RhdGUoTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBpZiAoTm9UaW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZvcm1hdGVkRGF0ZShEYXRlKCksIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0ZWREYXRlKERhdGUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEZvcm1hdGVkRGF0ZShkYXRlU3RyaW5nOiBzdHJpbmcsIE5vVGltZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgbGV0IGQ6IERhdGUgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKTtcclxuICAgIGQuc2V0SG91cnMoZC5nZXRIb3VycygpICsgMik7XHJcblxyXG4gICAgaWYgKE5vVGltZSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJy4nKVswXTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEZvcm1hdGVkRGF0ZTIoZCA6IERhdGUsIE5vVGltZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG5cclxuICAgIGQuc2V0SG91cnMoZC5nZXRIb3VycygpICsgMik7XHJcblxyXG4gICAgaWYgKE5vVGltZSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJy4nKVswXTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEJ1c2luZXNzRGF0ZXNDb3VudChzdGFydERhdGU6IHN0cmluZywgZW5kRGF0ZTogc3RyaW5nKSB7XHJcbiAgICB2YXIgY291bnQgPSAwO1xyXG4gICAgdmFyIF9zdGFydERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xyXG4gICAgdmFyIF9lbmREYXRlID0gbmV3IERhdGUoZW5kRGF0ZSk7XHJcblxyXG4gICAgdmFyIGN1ckRhdGUgPSBfc3RhcnREYXRlO1xyXG5cclxuICAgIHdoaWxlIChjdXJEYXRlIDwgX2VuZERhdGUpIHtcclxuICAgICAgdmFyIGRheU9mV2VlayA9IGN1ckRhdGUuZ2V0RGF5KCk7XHJcbiAgICAgIGlmICghKGRheU9mV2VlayA9PSA2IHx8IGRheU9mV2VlayA9PSAwKSkgY291bnQrKztcclxuICAgICAgY3VyRGF0ZS5zZXREYXRlKGN1ckRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRGV0YWlsc0RpYWxvZ1Byb2Nlc3NvciB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcHJvY2Vzc0RldGFpbHNDb25maWcoZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZywgcm93OiBhbnkpOiBEZXRhaWxzRGlhbG9nQ29uZmlnIHtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVkRGV0YWlsc0NvbmZpZyA6IERldGFpbHNEaWFsb2dDb25maWcgPSBDb3JlLmdldENsb25lKGRldGFpbHNDb25maWcpO1xyXG4gICAgdXBkYXRlZERldGFpbHNDb25maWcuZGV0YWlscyA9IHJvdztcclxuXHJcbiAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy5mb3JtQ29uZmlnLm1vZGUgPSB1cGRhdGVkRGV0YWlsc0NvbmZpZy5tb2RlID8/IFwidmlld1wiO1xyXG5cclxuICAgIGlmICh1cGRhdGVkRGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgcm93KSB7XHJcbiAgICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZSA9IHJvd1t1cGRhdGVkRGV0YWlsc0NvbmZpZy5oZXJvRmllbGRdO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVUYWJsZUNvbmZpZyh0YWJsZUNvbmZpZykge1xyXG4gICAgICB0YWJsZUNvbmZpZy5oZXJvRmllbGQgPSB1cGRhdGVkRGV0YWlsc0NvbmZpZz8uaGVyb0ZpZWxkO1xyXG4gICAgICB0YWJsZUNvbmZpZy5oZXJvVmFsdWUgPSB1cGRhdGVkRGV0YWlsc0NvbmZpZz8uaGVyb1ZhbHVlO1xyXG4gICAgICAvLyB0YWJsZUNvbmZpZy5zZXRIZXJvID0gdXBkYXRlZERldGFpbHNDb25maWcuc2V0SGVybztcclxuICAgICAgdGFibGVDb25maWcuc2VhcmNoQ29uZmlnID0gbnVsbDtcclxuICAgICAgdGFibGVDb25maWcudGlsZUNvbmZpZyA9IG51bGw7XHJcbiAgICAgIHRhYmxlQ29uZmlnLnBhcmVudERhdGEgPSB1cGRhdGVkRGV0YWlsc0NvbmZpZy5kZXRhaWxzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZykge1xyXG4gICAgICB1cGRhdGVUYWJsZUNvbmZpZyh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlncykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MuZm9yRWFjaCh1cGRhdGVUYWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtTG9hZFVybCh0YWJsZUNvbmZpZykge1xyXG4gICAgICBpZiAodGFibGVDb25maWcubG9hZEFjdGlvbiAmJiB0YWJsZUNvbmZpZy5sb2FkQ3JpdGVyaWEgJiYgdGFibGVDb25maWcubG9hZElERmllbGQpIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5sb2FkQWN0aW9uLnVybCA9IGAke3RhYmxlQ29uZmlnLmxvYWRBY3Rpb24udXJsLnNwbGl0KCcvJylbMF19LyR7dGFibGVDb25maWcubG9hZENyaXRlcmlhfS8ke3VwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHNbdGFibGVDb25maWcubG9hZElERmllbGRdfWA7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJUcmFuc2Zvcm1lZFwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk5PVCBUcmFuc2Zvcm1lZFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZykge1xyXG4gICAgICB0cmFuc2Zvcm1Mb2FkVXJsKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWdzKSB7XHJcbiAgICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlncy5mb3JFYWNoKHRyYW5zZm9ybUxvYWRVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1cGRhdGVkRGV0YWlsc0NvbmZpZztcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgaW5pdGlhbGl6ZUNvbmZpZ3MoZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZykge1xyXG4gICAgY29uc3QgdGFibGVDb25maWcgPSBkZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnO1xyXG4gICAgY29uc3QgdGFibGVDb25maWdzID0gZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3M7XHJcbiAgICBjb25zdCBmb3JtQ29uZmlnID0gZGV0YWlsc0NvbmZpZy5mb3JtQ29uZmlnO1xyXG4gICAgY29uc3QgYnV0dG9ucyA9IGRldGFpbHNDb25maWcuYnV0dG9ucztcclxuICAgIGZvcm1Db25maWcubW9kZSA9IGZvcm1Db25maWcubW9kZSA/PyBcInZpZXdcIjtcclxuICAgIHJldHVybiB7IHRhYmxlQ29uZmlnLCB0YWJsZUNvbmZpZ3MsIGZvcm1Db25maWcsIGJ1dHRvbnMgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRIZXJvVmFsdWUoZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZywgZGV0YWlsczogYW55KSB7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coZGV0YWlsc0NvbmZpZylcclxuXHJcbiAgICBpZiAoKGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5tb2RlID09IFwiY3JlYXRlXCIgICkgJiYgZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuICAgICAgZGV0YWlsc1tkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZF0gPSBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIChkZXRhaWxzQ29uZmlnLmNvbmZpZy5tb2RlICE9IFwiY3JlYXRlXCIgJiYgZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQpIHtcclxuICAgIC8vICAgZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUgPSBkZXRhaWxzW2RldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coZGV0YWlsc0NvbmZpZylcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYW5kbGVGb3JtTW9kZShkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBmb3JtQ29uZmlnOiBGb3JtQ29uZmlnLCkge1xyXG4gICAgbGV0IGRldGFpbHM7XHJcbiAgICBsZXQgYWN0aW9uO1xyXG4gICAgbGV0IGxvYWRCeUFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChmb3JtQ29uZmlnLm1vZGUgPT09IFwiY3JlYXRlXCIpIHtcclxuXHJcbiAgICAgIGRldGFpbHMgPSBDb3JlLmdlbmVyYXRlT2JqZWN0KGZvcm1Db25maWcuZmllbGRzKTtcclxuXHJcbiAgICAgIC8vIHRoaXMuc2V0SGVyb1ZhbHVlKGRldGFpbHNDb25maWcsIGRldGFpbHMpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCByZXNwID0gdGhpcy5sb2FkRGV0YWlsc0RhdGEoZGV0YWlsc0NvbmZpZywgZm9ybUNvbmZpZyk7XHJcbiAgICAgIGRldGFpbHMgPSByZXNwLmRldGFpbHM7XHJcblxyXG4gICAgICBhY3Rpb24gPSByZXNwLmFjdGlvbjtcclxuICAgICAgbG9hZEJ5QWN0aW9uID0gcmVzcC5sb2FkQnlBY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgZGV0YWlscywgbG9hZEJ5QWN0aW9uLCBhY3Rpb24gfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGxvYWREZXRhaWxzRGF0YShkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBmb3JtQ29uZmlnOiBGb3JtQ29uZmlnKSB7XHJcblxyXG4gICAgbGV0IGRldGFpbHM7XHJcbiAgICBsZXQgYWN0aW9uO1xyXG4gICAgbGV0IGxvYWRCeUFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiTG9hZGluZyBEZXRhaWxzIERhdGFcIiApXHJcbiAgICBjb25zb2xlLmxvZyhkZXRhaWxzQ29uZmlnKVxyXG4gICAgY29uc29sZS5sb2coZm9ybUNvbmZpZylcclxuXHJcblxyXG5cclxuICAgIC8vQ2hvb3NlIHNvdXJjZVxyXG4gICAgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlJvdykge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJEZXRhaWxzIERhdGEgUm93IGNvbmZpZ1wiKVxyXG4gICAgICBkZXRhaWxzID0gZGV0YWlsc0NvbmZpZy5kZXRhaWxzO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoZGV0YWlsc0NvbmZpZy5kZXRhaWxzU291cmNlID09IERldGFpbHNTb3VyY2UuVXJsKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRGV0YWlscyBEYXRhIFVybCBjb25maWdcIilcclxuICAgICAgYWN0aW9uID0gdGhpcy5sb2FkRGV0YWlsc0Zyb21VcmwoZGV0YWlsc0NvbmZpZywgZm9ybUNvbmZpZyk7XHJcbiAgICAgIGxvYWRCeUFjdGlvbiA9IHRydWU7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRGV0YWlscyBEYXRhIEVsc2VcIilcclxuICAgICAgaWYgKGRldGFpbHNDb25maWcuZGV0YWlscyAmJiAhZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgIWRldGFpbHNDb25maWcuaGVyb1ZhbHVlKSB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNpbmcgZm9ybSBkYXRhIGZyb20gZGV0YWlsc1wiKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhkZXRhaWxzQ29uZmlnKTtcclxuICAgICAgICBkZXRhaWxzID0gZGV0YWlsc0NvbmZpZy5kZXRhaWxzO1xyXG5cclxuICAgICAgfSBlbHNlIGlmIChmb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuXHJcbiAgICAgICAgYWN0aW9uID0gdGhpcy5sb2FkRGV0YWlsc0Zyb21VcmwoZGV0YWlsc0NvbmZpZywgZm9ybUNvbmZpZyk7XHJcbiAgICAgICAgbG9hZEJ5QWN0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJhdXRvIGRhdGEgc291cmNlIGZhaWxlZCB0byBwaWNrLCB0cnlpbmcgc291cmNlIGNvbmZpZ1wiKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBkZXRhaWxzLCBsb2FkQnlBY3Rpb24sIGFjdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZERldGFpbHNGcm9tVXJsKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuICAgIGxldCBhY3Rpb247XHJcblxyXG4gICAgaWYgKGZvcm1Db25maWcubG9hZEFjdGlvbikge1xyXG5cclxuICAgICAgaWYgKGRldGFpbHNDb25maWcuaGVyb0ZpZWxkICYmIGRldGFpbHNDb25maWcuZGV0YWlscykge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcInVzaW5nIGZvcm0gZGF0YSBmcm9tIHVybCArIElEIEZpZWxkIFwiICsgZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQpO1xyXG4gICAgICAgIGFjdGlvbiA9IHsgdXJsOiBgJHtmb3JtQ29uZmlnLmxvYWRBY3Rpb24udXJsfS8ke2RldGFpbHNDb25maWcuZGV0YWlsc1tkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZF19YCB9O1xyXG5cclxuICAgICAgfSBlbHNlIGlmIChkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZSkge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcInVzaW5nIGZvcm0gZGF0YSBmcm9tIHVybCArIFNvbGlkIElEXCIpO1xyXG4gICAgICAgIGFjdGlvbiA9IHsgdXJsOiBgJHtmb3JtQ29uZmlnLmxvYWRBY3Rpb24udXJsfS8ke2RldGFpbHNDb25maWcuaGVyb1ZhbHVlfWAgfTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInVybCBzb3VyY2UgZmFpbGVkIDogc2V0dXAgaGVybyBmaWVsZCBvciBoZXJvIHZhbHVlXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gbG9hZCBhY3Rpb24gc2V0XCIpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcmV0dXJuIGFjdGlvbjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRGaWxlRmllbGQoZm9ybUNvbmZpZzogRm9ybUNvbmZpZykge1xyXG4gICAgcmV0dXJuIGZvcm1Db25maWcuZmllbGRzLmZpbmQoeCA9PiB4LnR5cGUgPT09ICdmaWxlJyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdGljIHNldHVwQnV0dG9ucyhmb3JtQ29uZmlnOiBGb3JtQ29uZmlnLCBidXR0b25zOiBhbnkpIHtcclxuICAgIGxldCBleHRyYUJ1dHRvbnMsIGNyZWF0ZUJ1dHRvbiwgZWRpdEJ1dHRvbiwgZGVsZXRlQnV0dG9uO1xyXG5cclxuICAgIGlmIChidXR0b25zKSB7XHJcbiAgICAgIGlmIChmb3JtQ29uZmlnLm1vZGUgIT09IFwiY3JlYXRlXCIpIHtcclxuICAgICAgICBleHRyYUJ1dHRvbnMgPSBidXR0b25zLmZpbHRlcih4ID0+IHgubmFtZSAhPT0gXCJjcmVhdGVcIiAmJiB4Lm5hbWUgIT09IFwiZWRpdFwiICYmIHgubmFtZSAhPT0gXCJkZWxldGVcIiAmJiB4Lm5hbWUgIT09IFwidmlld1wiICYmIHguaW5EaWFsb2cpO1xyXG4gICAgICB9XHJcbiAgICAgIGNyZWF0ZUJ1dHRvbiA9IGJ1dHRvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gXCJjcmVhdGVcIik7XHJcbiAgICAgIGVkaXRCdXR0b24gPSBidXR0b25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IFwiZWRpdFwiKTtcclxuICAgICAgZGVsZXRlQnV0dG9uID0gYnV0dG9ucy5maW5kKHggPT4geC5uYW1lID09PSBcImRlbGV0ZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGV4dHJhQnV0dG9ucywgY3JlYXRlQnV0dG9uLCBlZGl0QnV0dG9uLCBkZWxldGVCdXR0b24gfTtcclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==