@mtgame/core 0.1.58 → 0.1.60

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 (332) hide show
  1. package/bundles/mtgame-core.umd.js +4109 -4076
  2. package/bundles/mtgame-core.umd.js.map +1 -1
  3. package/esm2015/api/basketball-game-api.js +8 -9
  4. package/esm2015/api/feedback-api.js +8 -9
  5. package/esm2015/api/file-api.js +8 -9
  6. package/esm2015/api/football-game-api.js +8 -9
  7. package/esm2015/api/game-base-api.js +8 -9
  8. package/esm2015/api/handball-game-api.js +8 -9
  9. package/esm2015/api/hockey-game-api.js +8 -9
  10. package/esm2015/api/league-api.js +8 -9
  11. package/esm2015/api/league-news-api.js +8 -9
  12. package/esm2015/api/league-player-api.js +7 -9
  13. package/esm2015/api/media-api.js +8 -9
  14. package/esm2015/api/notification-api.js +6 -8
  15. package/esm2015/api/notification-base-api.js +8 -9
  16. package/esm2015/api/org-notification-api.js +6 -8
  17. package/esm2015/api/paginated-response.interface.js +2 -1
  18. package/esm2015/api/public-api.js +2 -1
  19. package/esm2015/api/public-team-api.js +7 -9
  20. package/esm2015/api/public-user-api.js +7 -9
  21. package/esm2015/api/reference-api.js +8 -9
  22. package/esm2015/api/rugby-game-api.js +8 -9
  23. package/esm2015/api/team-api.js +9 -10
  24. package/esm2015/api/team-event-api.js +8 -9
  25. package/esm2015/api/tournament-api.js +8 -9
  26. package/esm2015/api/tournament-join-api.js +8 -9
  27. package/esm2015/api/tournament-season-api.js +8 -9
  28. package/esm2015/api/tournament-stage-api.js +8 -9
  29. package/esm2015/api/user-api.js +8 -9
  30. package/esm2015/api/volleyball-game-api.js +8 -9
  31. package/esm2015/http-cookie.interceptor.js +6 -9
  32. package/esm2015/localization/basketball-game-log-types.js +1 -1
  33. package/esm2015/localization/football-game-log-types.js +1 -1
  34. package/esm2015/localization/handball-game-log-types.js +1 -1
  35. package/esm2015/localization/hockey-game-log-types.js +1 -1
  36. package/esm2015/localization/hockey-penalty-types.js +1 -1
  37. package/esm2015/localization/overtime-types.js +1 -1
  38. package/esm2015/localization/public-api.js +1 -1
  39. package/esm2015/localization/rugby-foul-sanction.js +1 -1
  40. package/esm2015/localization/rugby-game-log-types.js +1 -1
  41. package/esm2015/localization/team-event-type.js +1 -1
  42. package/esm2015/localization/team-user-role.js +1 -1
  43. package/esm2015/localization/user-profile.js +1 -1
  44. package/esm2015/localization/volleyball-game-log-types.js +1 -1
  45. package/esm2015/models/base-statistic.js +2 -1
  46. package/esm2015/models/basketball-game-config.js +1 -1
  47. package/esm2015/models/basketball-game-log.js +1 -1
  48. package/esm2015/models/basketball-game-statistic.js +1 -1
  49. package/esm2015/models/basketball-game-team-statistic.js +1 -1
  50. package/esm2015/models/basketball-profile.js +1 -1
  51. package/esm2015/models/basketball-statistic.js +1 -1
  52. package/esm2015/models/city.js +1 -1
  53. package/esm2015/models/feedback.js +1 -1
  54. package/esm2015/models/file.js +1 -1
  55. package/esm2015/models/football-game-config.js +1 -1
  56. package/esm2015/models/football-game-log.js +1 -1
  57. package/esm2015/models/football-game-statistic.js +1 -1
  58. package/esm2015/models/football-game-team-statistic.js +1 -1
  59. package/esm2015/models/football-profile.js +1 -1
  60. package/esm2015/models/football-statistic.js +1 -1
  61. package/esm2015/models/game-invite.js +1 -1
  62. package/esm2015/models/game-log-base.js +2 -1
  63. package/esm2015/models/game-statistic-base.js +2 -1
  64. package/esm2015/models/game-team-statistic-base.js +2 -1
  65. package/esm2015/models/game-timeline-stages.js +1 -1
  66. package/esm2015/models/game-user-limitation.js +1 -1
  67. package/esm2015/models/game-user.js +1 -1
  68. package/esm2015/models/game.js +1 -1
  69. package/esm2015/models/handball-game-config.js +1 -1
  70. package/esm2015/models/handball-game-log.js +1 -1
  71. package/esm2015/models/handball-game-statistic.js +1 -1
  72. package/esm2015/models/handball-game-team-statistic.js +1 -1
  73. package/esm2015/models/handball-profile.js +1 -1
  74. package/esm2015/models/handball-statistic.js +1 -1
  75. package/esm2015/models/hockey-game-config.js +1 -1
  76. package/esm2015/models/hockey-game-log.js +1 -1
  77. package/esm2015/models/hockey-game-statistic.js +1 -1
  78. package/esm2015/models/hockey-game-team-statistic.js +1 -1
  79. package/esm2015/models/hockey-profile.js +1 -1
  80. package/esm2015/models/hockey-statistic.js +1 -1
  81. package/esm2015/models/league-banner.js +1 -1
  82. package/esm2015/models/league-court.js +1 -1
  83. package/esm2015/models/league-document.js +1 -1
  84. package/esm2015/models/league-news.js +1 -1
  85. package/esm2015/models/league-partner.js +1 -1
  86. package/esm2015/models/league-player.js +1 -1
  87. package/esm2015/models/league-playlist.js +1 -1
  88. package/esm2015/models/league-user.js +1 -1
  89. package/esm2015/models/league.js +1 -1
  90. package/esm2015/models/media-item.js +1 -1
  91. package/esm2015/models/notification-settings.js +1 -1
  92. package/esm2015/models/notification.js +1 -1
  93. package/esm2015/models/organization.js +1 -1
  94. package/esm2015/models/playoff.js +1 -1
  95. package/esm2015/models/poll.js +1 -1
  96. package/esm2015/models/public-api.js +5 -1
  97. package/esm2015/models/rugby-foul-type.js +1 -1
  98. package/esm2015/models/rugby-game-config.js +1 -1
  99. package/esm2015/models/rugby-game-log.js +2 -2
  100. package/esm2015/models/rugby-game-statistic.js +1 -1
  101. package/esm2015/models/rugby-game-team-statistic.js +1 -1
  102. package/esm2015/models/rugby-profile.js +1 -1
  103. package/esm2015/models/rugby-statistic.js +1 -1
  104. package/esm2015/models/sport.js +1 -1
  105. package/esm2015/models/team-access.js +1 -1
  106. package/esm2015/models/team-event-invite.js +1 -1
  107. package/esm2015/models/team-event-type.js +1 -1
  108. package/esm2015/models/team-event.js +1 -1
  109. package/esm2015/models/team-invite-external.js +1 -1
  110. package/esm2015/models/team-invite.js +1 -1
  111. package/esm2015/models/team-permission.js +1 -1
  112. package/esm2015/models/team-user.js +1 -1
  113. package/esm2015/models/team.js +1 -1
  114. package/esm2015/models/tournament-disqualification.js +1 -1
  115. package/esm2015/models/tournament-event.js +1 -1
  116. package/esm2015/models/tournament-group.js +1 -1
  117. package/esm2015/models/tournament-invite.js +1 -1
  118. package/esm2015/models/tournament-join-team.js +1 -1
  119. package/esm2015/models/tournament-news.js +1 -1
  120. package/esm2015/models/tournament-season.js +1 -1
  121. package/esm2015/models/tournament-stage-team.js +1 -1
  122. package/esm2015/models/tournament-stage.js +1 -1
  123. package/esm2015/models/tournament-team-user-invite.js +1 -1
  124. package/esm2015/models/tournament-team-user.js +1 -1
  125. package/esm2015/models/tournament-team.js +1 -1
  126. package/esm2015/models/tournament.js +1 -1
  127. package/esm2015/models/user-access.js +1 -1
  128. package/esm2015/models/user-permission.js +1 -1
  129. package/esm2015/models/user-profile.js +1 -1
  130. package/esm2015/models/user.js +1 -1
  131. package/esm2015/models/util.js +1 -1
  132. package/esm2015/models/volleyball-game-config.js +1 -1
  133. package/esm2015/models/volleyball-game-log.js +1 -1
  134. package/esm2015/models/volleyball-game-statistic.js +1 -1
  135. package/esm2015/models/volleyball-game-team-statistic.js +1 -1
  136. package/esm2015/models/volleyball-profile.js +1 -1
  137. package/esm2015/models/volleyball-statistic.js +1 -1
  138. package/esm2015/mtgame-core.js +1 -1
  139. package/esm2015/public-api.js +1 -1
  140. package/esm2015/services/base.service.js +6 -8
  141. package/esm2015/services/centrifugo.service.js +7 -9
  142. package/esm2015/services/config.service.js +7 -10
  143. package/esm2015/services/public-api.js +1 -1
  144. package/esm2015/storage/local-storage-engine.js +1 -1
  145. package/esm2015/storage/public-api.js +1 -1
  146. package/esm2015/storage/storage-engine.js +1 -1
  147. package/esm2015/storage/store.js +1 -1
  148. package/esm2015/utils/array.js +1 -1
  149. package/esm2015/utils/component-destroyed.js +12 -8
  150. package/esm2015/utils/cookie.js +1 -1
  151. package/esm2015/utils/data.js +1 -1
  152. package/esm2015/utils/device.js +1 -1
  153. package/esm2015/utils/enum.js +1 -1
  154. package/esm2015/utils/errors.js +1 -1
  155. package/esm2015/utils/favicon.js +1 -1
  156. package/esm2015/utils/form.js +1 -1
  157. package/esm2015/utils/public-api.js +1 -1
  158. package/esm2015/utils/validators.js +1 -1
  159. package/fesm2015/mtgame-core.js +195 -191
  160. package/fesm2015/mtgame-core.js.map +1 -1
  161. package/localization/basketball-game-log-types.d.ts +0 -1
  162. package/localization/football-game-log-types.d.ts +0 -1
  163. package/localization/handball-game-log-types.d.ts +0 -1
  164. package/localization/hockey-game-log-types.d.ts +0 -1
  165. package/localization/overtime-types.d.ts +0 -1
  166. package/localization/rugby-foul-sanction.d.ts +0 -1
  167. package/localization/rugby-game-log-types.d.ts +0 -1
  168. package/localization/team-event-type.d.ts +0 -1
  169. package/localization/team-user-role.d.ts +0 -1
  170. package/localization/user-profile.d.ts +0 -6
  171. package/localization/volleyball-game-log-types.d.ts +0 -1
  172. package/package.json +9 -11
  173. package/bundles/mtgame-core.umd.min.js +0 -16
  174. package/bundles/mtgame-core.umd.min.js.map +0 -1
  175. package/esm5/api/basketball-game-api.js +0 -77
  176. package/esm5/api/feedback-api.js +0 -44
  177. package/esm5/api/file-api.js +0 -68
  178. package/esm5/api/football-game-api.js +0 -81
  179. package/esm5/api/game-base-api.js +0 -58
  180. package/esm5/api/handball-game-api.js +0 -81
  181. package/esm5/api/hockey-game-api.js +0 -81
  182. package/esm5/api/league-api.js +0 -168
  183. package/esm5/api/league-news-api.js +0 -82
  184. package/esm5/api/league-player-api.js +0 -37
  185. package/esm5/api/media-api.js +0 -149
  186. package/esm5/api/notification-api.js +0 -21
  187. package/esm5/api/notification-base-api.js +0 -109
  188. package/esm5/api/org-notification-api.js +0 -21
  189. package/esm5/api/paginated-response.interface.js +0 -1
  190. package/esm5/api/public-api.js +0 -27
  191. package/esm5/api/public-team-api.js +0 -34
  192. package/esm5/api/public-user-api.js +0 -44
  193. package/esm5/api/reference-api.js +0 -45
  194. package/esm5/api/rugby-game-api.js +0 -79
  195. package/esm5/api/team-api.js +0 -486
  196. package/esm5/api/team-event-api.js +0 -96
  197. package/esm5/api/tournament-api.js +0 -543
  198. package/esm5/api/tournament-join-api.js +0 -59
  199. package/esm5/api/tournament-season-api.js +0 -134
  200. package/esm5/api/tournament-stage-api.js +0 -65
  201. package/esm5/api/user-api.js +0 -350
  202. package/esm5/api/volleyball-game-api.js +0 -81
  203. package/esm5/http-cookie.interceptor.js +0 -41
  204. package/esm5/localization/basketball-game-log-types.js +0 -28
  205. package/esm5/localization/football-game-log-types.js +0 -34
  206. package/esm5/localization/handball-game-log-types.js +0 -25
  207. package/esm5/localization/hockey-game-log-types.js +0 -31
  208. package/esm5/localization/hockey-penalty-types.js +0 -50
  209. package/esm5/localization/overtime-types.js +0 -14
  210. package/esm5/localization/public-api.js +0 -13
  211. package/esm5/localization/rugby-foul-sanction.js +0 -11
  212. package/esm5/localization/rugby-game-log-types.js +0 -41
  213. package/esm5/localization/team-event-type.js +0 -7
  214. package/esm5/localization/team-user-role.js +0 -15
  215. package/esm5/localization/user-profile.js +0 -82
  216. package/esm5/localization/volleyball-game-log-types.js +0 -27
  217. package/esm5/models/base-statistic.js +0 -1
  218. package/esm5/models/basketball-game-config.js +0 -44
  219. package/esm5/models/basketball-game-log.js +0 -118
  220. package/esm5/models/basketball-game-statistic.js +0 -63
  221. package/esm5/models/basketball-game-team-statistic.js +0 -32
  222. package/esm5/models/basketball-profile.js +0 -48
  223. package/esm5/models/basketball-statistic.js +0 -97
  224. package/esm5/models/city.js +0 -27
  225. package/esm5/models/feedback.js +0 -37
  226. package/esm5/models/file.js +0 -65
  227. package/esm5/models/football-game-config.js +0 -53
  228. package/esm5/models/football-game-log.js +0 -111
  229. package/esm5/models/football-game-statistic.js +0 -213
  230. package/esm5/models/football-game-team-statistic.js +0 -32
  231. package/esm5/models/football-profile.js +0 -48
  232. package/esm5/models/football-statistic.js +0 -174
  233. package/esm5/models/game-invite.js +0 -42
  234. package/esm5/models/game-log-base.js +0 -1
  235. package/esm5/models/game-statistic-base.js +0 -1
  236. package/esm5/models/game-team-statistic-base.js +0 -1
  237. package/esm5/models/game-timeline-stages.js +0 -60
  238. package/esm5/models/game-user-limitation.js +0 -59
  239. package/esm5/models/game-user.js +0 -38
  240. package/esm5/models/game.js +0 -286
  241. package/esm5/models/handball-game-config.js +0 -39
  242. package/esm5/models/handball-game-log.js +0 -99
  243. package/esm5/models/handball-game-statistic.js +0 -162
  244. package/esm5/models/handball-game-team-statistic.js +0 -32
  245. package/esm5/models/handball-profile.js +0 -44
  246. package/esm5/models/handball-statistic.js +0 -105
  247. package/esm5/models/hockey-game-config.js +0 -61
  248. package/esm5/models/hockey-game-log.js +0 -135
  249. package/esm5/models/hockey-game-statistic.js +0 -223
  250. package/esm5/models/hockey-game-team-statistic.js +0 -32
  251. package/esm5/models/hockey-profile.js +0 -46
  252. package/esm5/models/hockey-statistic.js +0 -144
  253. package/esm5/models/league-banner.js +0 -44
  254. package/esm5/models/league-court.js +0 -29
  255. package/esm5/models/league-document.js +0 -31
  256. package/esm5/models/league-news.js +0 -55
  257. package/esm5/models/league-partner.js +0 -34
  258. package/esm5/models/league-player.js +0 -77
  259. package/esm5/models/league-playlist.js +0 -33
  260. package/esm5/models/league-user.js +0 -61
  261. package/esm5/models/league.js +0 -95
  262. package/esm5/models/media-item.js +0 -50
  263. package/esm5/models/notification-settings.js +0 -40
  264. package/esm5/models/notification.js +0 -143
  265. package/esm5/models/organization.js +0 -32
  266. package/esm5/models/playoff.js +0 -102
  267. package/esm5/models/poll.js +0 -154
  268. package/esm5/models/public-api.js +0 -88
  269. package/esm5/models/rugby-foul-type.js +0 -40
  270. package/esm5/models/rugby-game-config.js +0 -51
  271. package/esm5/models/rugby-game-log.js +0 -143
  272. package/esm5/models/rugby-game-statistic.js +0 -68
  273. package/esm5/models/rugby-game-team-statistic.js +0 -32
  274. package/esm5/models/rugby-profile.js +0 -42
  275. package/esm5/models/rugby-statistic.js +0 -119
  276. package/esm5/models/sport.js +0 -104
  277. package/esm5/models/team-access.js +0 -50
  278. package/esm5/models/team-event-invite.js +0 -35
  279. package/esm5/models/team-event-type.js +0 -6
  280. package/esm5/models/team-event.js +0 -58
  281. package/esm5/models/team-invite-external.js +0 -30
  282. package/esm5/models/team-invite.js +0 -46
  283. package/esm5/models/team-permission.js +0 -43
  284. package/esm5/models/team-user.js +0 -53
  285. package/esm5/models/team.js +0 -70
  286. package/esm5/models/tournament-disqualification.js +0 -34
  287. package/esm5/models/tournament-event.js +0 -50
  288. package/esm5/models/tournament-group.js +0 -29
  289. package/esm5/models/tournament-invite.js +0 -48
  290. package/esm5/models/tournament-join-team.js +0 -73
  291. package/esm5/models/tournament-news.js +0 -38
  292. package/esm5/models/tournament-season.js +0 -50
  293. package/esm5/models/tournament-stage-team.js +0 -54
  294. package/esm5/models/tournament-stage.js +0 -40
  295. package/esm5/models/tournament-team-user-invite.js +0 -34
  296. package/esm5/models/tournament-team-user.js +0 -41
  297. package/esm5/models/tournament-team.js +0 -80
  298. package/esm5/models/tournament.js +0 -234
  299. package/esm5/models/user-access.js +0 -30
  300. package/esm5/models/user-permission.js +0 -43
  301. package/esm5/models/user-profile.js +0 -27
  302. package/esm5/models/user.js +0 -107
  303. package/esm5/models/util.js +0 -298
  304. package/esm5/models/volleyball-game-config.js +0 -53
  305. package/esm5/models/volleyball-game-log.js +0 -145
  306. package/esm5/models/volleyball-game-statistic.js +0 -72
  307. package/esm5/models/volleyball-game-team-statistic.js +0 -32
  308. package/esm5/models/volleyball-profile.js +0 -48
  309. package/esm5/models/volleyball-statistic.js +0 -89
  310. package/esm5/mtgame-core.js +0 -5
  311. package/esm5/public-api.js +0 -8
  312. package/esm5/services/base.service.js +0 -19
  313. package/esm5/services/centrifugo.service.js +0 -122
  314. package/esm5/services/config.service.js +0 -52
  315. package/esm5/services/public-api.js +0 -4
  316. package/esm5/storage/local-storage-engine.js +0 -25
  317. package/esm5/storage/public-api.js +0 -4
  318. package/esm5/storage/storage-engine.js +0 -77
  319. package/esm5/storage/store.js +0 -77
  320. package/esm5/utils/array.js +0 -18
  321. package/esm5/utils/component-destroyed.js +0 -21
  322. package/esm5/utils/cookie.js +0 -9
  323. package/esm5/utils/data.js +0 -79
  324. package/esm5/utils/device.js +0 -14
  325. package/esm5/utils/enum.js +0 -7
  326. package/esm5/utils/errors.js +0 -12
  327. package/esm5/utils/favicon.js +0 -47
  328. package/esm5/utils/form.js +0 -22
  329. package/esm5/utils/public-api.js +0 -11
  330. package/esm5/utils/validators.js +0 -49
  331. package/fesm5/mtgame-core.js +0 -9819
  332. package/fesm5/mtgame-core.js.map +0 -1
@@ -1,543 +0,0 @@
1
- import { __awaiter, __decorate, __generator, __values } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { HttpClient, HttpParams } from '@angular/common/http';
4
- import { Tournament } from '../models/tournament';
5
- import { map } from 'rxjs/operators';
6
- import { TournamentNews } from '../models/tournament-news';
7
- import { Game, GameStatuses } from '../models/game';
8
- import { GameTimelineStages } from '../models/game-timeline-stages';
9
- import { TournamentTeam } from '../models/tournament-team';
10
- import { TournamentStage } from '../models/tournament-stage';
11
- import { Playoff } from '../models/playoff';
12
- import { BasketballStatistic } from '../models/basketball-statistic';
13
- import { VolleyballStatistic } from '../models/volleyball-statistic';
14
- import { TournamentTeamUser } from '../models/tournament-team-user';
15
- import { TournamentStageTeam } from '../models/tournament-stage-team';
16
- import { TournamentEvent, TournamentEventTypes } from '../models/tournament-event';
17
- import { ConfigService } from '../services/config.service';
18
- import { HockeyStatistic } from '../models/hockey-statistic';
19
- import { FootballStatistic } from '../models/football-statistic';
20
- import { LeagueUserPermissions } from '../models/league-user';
21
- import { HandballStatistic } from '../models/handball-statistic';
22
- import { RugbyStatistic } from '../models/rugby-statistic';
23
- import { TournamentGroup } from '../models/tournament-group';
24
- import * as i0 from "@angular/core";
25
- import * as i1 from "@angular/common/http";
26
- import * as i2 from "../services/config.service";
27
- var TournamentApi = /** @class */ (function () {
28
- function TournamentApi(httpClient, configService) {
29
- this.httpClient = httpClient;
30
- this.configService = configService;
31
- }
32
- TournamentApi.prototype.getById = function (tournamentId) {
33
- return __awaiter(this, void 0, void 0, function () {
34
- return __generator(this, function (_a) {
35
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/")
36
- .pipe(map(function (result) { return Tournament.toFront(result); }))
37
- .toPromise()];
38
- });
39
- });
40
- };
41
- TournamentApi.prototype.getByAlias = function (leagueId, alias) {
42
- return __awaiter(this, void 0, void 0, function () {
43
- return __generator(this, function (_a) {
44
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/league/" + leagueId + "/tournaments/" + alias + "/")
45
- .pipe(map(function (result) { return Tournament.toFront(result); }))
46
- .toPromise()];
47
- });
48
- });
49
- };
50
- TournamentApi.prototype.getNews = function (tournamentId) {
51
- return __awaiter(this, void 0, void 0, function () {
52
- return __generator(this, function (_a) {
53
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/news/")
54
- .pipe(map(function (result) { return TournamentNews.toFront(result); }))
55
- .toPromise()];
56
- });
57
- });
58
- };
59
- TournamentApi.prototype.getEvents = function (tournamentId, page, size, filters) {
60
- return __awaiter(this, void 0, void 0, function () {
61
- var params;
62
- return __generator(this, function (_a) {
63
- params = new HttpParams().set('page', page.toString())
64
- .set('size', size.toString());
65
- if (filters) {
66
- if (filters.event) {
67
- params = params.set('event', TournamentEventTypes[filters.event]);
68
- }
69
- if (filters.search) {
70
- params = params.set('search', filters.search);
71
- }
72
- if (filters.tournamentTour) {
73
- params = params.set('tournament_tour', filters.tournamentTour.toString());
74
- }
75
- }
76
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/events/", { params: params, observe: 'response' })
77
- .pipe(map(function (result) { return ({
78
- total: +result.headers.get('X-Page-Count'),
79
- data: TournamentEvent.toFront(result.body)
80
- }); }))
81
- .toPromise()];
82
- });
83
- });
84
- };
85
- TournamentApi.prototype.getTournamentStages = function (tournamentId) {
86
- return __awaiter(this, void 0, void 0, function () {
87
- return __generator(this, function (_a) {
88
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/stages/").pipe(map(function (data) { return TournamentStage.toFront(data); })).toPromise()];
89
- });
90
- });
91
- };
92
- TournamentApi.prototype.getPlayoff = function (tournamentId) {
93
- return __awaiter(this, void 0, void 0, function () {
94
- return __generator(this, function (_a) {
95
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/playoff/").pipe(map(function (result) { return Playoff.toFront(result); })).toPromise()];
96
- });
97
- });
98
- };
99
- TournamentApi.prototype.getPlayoffGames = function (playoffId, playoffNumber) {
100
- return __awaiter(this, void 0, void 0, function () {
101
- var params;
102
- return __generator(this, function (_a) {
103
- params = new HttpParams();
104
- if (playoffNumber) {
105
- params = params.set('playoff_number', playoffNumber);
106
- }
107
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_playoff/" + playoffId + "/games/", { params: params }).pipe(map(function (result) { return Game.toFront(result); })).toPromise()];
108
- });
109
- });
110
- };
111
- TournamentApi.prototype.getGamesStages = function (tournamentId) {
112
- return __awaiter(this, void 0, void 0, function () {
113
- return __generator(this, function (_a) {
114
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/games_stages/")
115
- .pipe(map(function (data) { return GameTimelineStages.toFront(data); }))
116
- .toPromise()];
117
- });
118
- });
119
- };
120
- TournamentApi.prototype.getGames = function (tournamentId, page, size, filters) {
121
- if (filters === void 0) { filters = {}; }
122
- return __awaiter(this, void 0, void 0, function () {
123
- var params;
124
- return __generator(this, function (_a) {
125
- params = new HttpParams().set('page', page.toString());
126
- if (size) {
127
- params = params.set('size', size.toString());
128
- }
129
- params = applyGamesFilters(filters, params);
130
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/games/", { params: params, observe: 'response' })
131
- .pipe(map(function (result) { return ({
132
- total: +result.headers.get('X-Page-Count'),
133
- data: Game.toFront(result.body)
134
- }); })).toPromise()];
135
- });
136
- });
137
- };
138
- TournamentApi.prototype.getGroups = function (tournamentId) {
139
- return __awaiter(this, void 0, void 0, function () {
140
- return __generator(this, function (_a) {
141
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/groups/")
142
- .pipe(map(function (result) { return TournamentGroup.toFront(result); }))
143
- .toPromise()];
144
- });
145
- });
146
- };
147
- TournamentApi.prototype.getTeams = function (tournamentId, groupId) {
148
- return __awaiter(this, void 0, void 0, function () {
149
- var params;
150
- return __generator(this, function (_a) {
151
- params = new HttpParams();
152
- if (groupId) {
153
- params = params.set('group_id', groupId.toString());
154
- }
155
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/teams/", { params: params })
156
- .pipe(map(function (result) { return TournamentTeam.toFront(result); }))
157
- .toPromise()];
158
- });
159
- });
160
- };
161
- TournamentApi.prototype.getStageTeams = function (tournamentId) {
162
- return __awaiter(this, void 0, void 0, function () {
163
- return __generator(this, function (_a) {
164
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/stage_teams/")
165
- .pipe(map(function (result) { return TournamentStageTeam.toFront(result); }))
166
- .toPromise()];
167
- });
168
- });
169
- };
170
- TournamentApi.prototype.getTeamById = function (tournamentTeamId) {
171
- return __awaiter(this, void 0, void 0, function () {
172
- return __generator(this, function (_a) {
173
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_team/" + tournamentTeamId + "/")
174
- .pipe(map(function (result) { return TournamentTeam.toFront(result); }))
175
- .toPromise()];
176
- });
177
- });
178
- };
179
- TournamentApi.prototype.getUserById = function (userId) {
180
- return __awaiter(this, void 0, void 0, function () {
181
- return __generator(this, function (_a) {
182
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_team_user/" + userId + "/")
183
- .pipe(map(function (result) { return TournamentTeamUser.toFront(result); }))
184
- .toPromise()];
185
- });
186
- });
187
- };
188
- TournamentApi.prototype.getUserGames = function (tournamentUserId) {
189
- return __awaiter(this, void 0, void 0, function () {
190
- return __generator(this, function (_a) {
191
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_team_user/" + tournamentUserId + "/games/")
192
- .pipe(map(function (result) { return Game.toFront(result); }))
193
- .toPromise()];
194
- });
195
- });
196
- };
197
- TournamentApi.prototype.getBasketballStatisticLeaders = function (filters) {
198
- return __awaiter(this, void 0, void 0, function () {
199
- var params;
200
- return __generator(this, function (_a) {
201
- params = new HttpParams();
202
- params = applyStatisticLeadersFilters(filters, params);
203
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/basketball_statistic_leaders/", { params: params }).pipe(map(function (result) {
204
- var e_1, _a;
205
- try {
206
- for (var _b = __values(Object.keys(result)), _c = _b.next(); !_c.done; _c = _b.next()) {
207
- var key = _c.value;
208
- result[key] = BasketballStatistic.toFront(result[key]);
209
- }
210
- }
211
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
212
- finally {
213
- try {
214
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
215
- }
216
- finally { if (e_1) throw e_1.error; }
217
- }
218
- return result;
219
- })).toPromise()];
220
- });
221
- });
222
- };
223
- TournamentApi.prototype.getVolleyballStatisticLeaders = function (filters) {
224
- return __awaiter(this, void 0, void 0, function () {
225
- var params;
226
- return __generator(this, function (_a) {
227
- params = new HttpParams();
228
- params = applyStatisticLeadersFilters(filters, params);
229
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/volleyball_statistic_leaders/", { params: params }).pipe(map(function (result) {
230
- var e_2, _a;
231
- try {
232
- for (var _b = __values(Object.keys(result)), _c = _b.next(); !_c.done; _c = _b.next()) {
233
- var key = _c.value;
234
- result[key] = VolleyballStatistic.toFront(result[key]);
235
- }
236
- }
237
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
238
- finally {
239
- try {
240
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
241
- }
242
- finally { if (e_2) throw e_2.error; }
243
- }
244
- return result;
245
- })).toPromise()];
246
- });
247
- });
248
- };
249
- TournamentApi.prototype.getHockeyStatisticLeaders = function (filters) {
250
- return __awaiter(this, void 0, void 0, function () {
251
- var params;
252
- return __generator(this, function (_a) {
253
- params = new HttpParams();
254
- params = applyStatisticLeadersFilters(filters, params);
255
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/hockey_statistic_leaders/", { params: params }).pipe(map(function (result) {
256
- var e_3, _a;
257
- try {
258
- for (var _b = __values(Object.keys(result)), _c = _b.next(); !_c.done; _c = _b.next()) {
259
- var key = _c.value;
260
- result[key] = HockeyStatistic.toFront(result[key]);
261
- }
262
- }
263
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
264
- finally {
265
- try {
266
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
267
- }
268
- finally { if (e_3) throw e_3.error; }
269
- }
270
- return result;
271
- })).toPromise()];
272
- });
273
- });
274
- };
275
- TournamentApi.prototype.getFootballStatisticLeaders = function (filters) {
276
- return __awaiter(this, void 0, void 0, function () {
277
- var params;
278
- return __generator(this, function (_a) {
279
- params = new HttpParams();
280
- params = applyStatisticLeadersFilters(filters, params);
281
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/football_statistic_leaders/", { params: params }).pipe(map(function (result) {
282
- var e_4, _a;
283
- try {
284
- for (var _b = __values(Object.keys(result)), _c = _b.next(); !_c.done; _c = _b.next()) {
285
- var key = _c.value;
286
- result[key] = FootballStatistic.toFront(result[key]);
287
- }
288
- }
289
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
290
- finally {
291
- try {
292
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
293
- }
294
- finally { if (e_4) throw e_4.error; }
295
- }
296
- return result;
297
- })).toPromise()];
298
- });
299
- });
300
- };
301
- TournamentApi.prototype.getHandballStatisticLeaders = function (filters) {
302
- return __awaiter(this, void 0, void 0, function () {
303
- var params;
304
- return __generator(this, function (_a) {
305
- params = new HttpParams();
306
- params = applyStatisticLeadersFilters(filters, params);
307
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/handball_statistic_leaders/", { params: params }).pipe(map(function (result) {
308
- var e_5, _a;
309
- try {
310
- for (var _b = __values(Object.keys(result)), _c = _b.next(); !_c.done; _c = _b.next()) {
311
- var key = _c.value;
312
- result[key] = HandballStatistic.toFront(result[key]);
313
- }
314
- }
315
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
316
- finally {
317
- try {
318
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
319
- }
320
- finally { if (e_5) throw e_5.error; }
321
- }
322
- return result;
323
- })).toPromise()];
324
- });
325
- });
326
- };
327
- TournamentApi.prototype.getBasketballStatistic = function (filters) {
328
- return __awaiter(this, void 0, void 0, function () {
329
- var params;
330
- return __generator(this, function (_a) {
331
- params = new HttpParams();
332
- params = applyStatisticFilters(filters, params);
333
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/basketball_statistic/", { params: params, observe: 'response' }).pipe(map(function (result) { return ({
334
- total: +result.headers.get('X-Page-Count'),
335
- data: BasketballStatistic.toFront(result.body)
336
- }); })).toPromise()];
337
- });
338
- });
339
- };
340
- TournamentApi.prototype.getVolleyballStatistic = function (filters) {
341
- return __awaiter(this, void 0, void 0, function () {
342
- var params;
343
- return __generator(this, function (_a) {
344
- params = new HttpParams();
345
- params = applyStatisticFilters(filters, params);
346
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/volleyball_statistic/", { params: params, observe: 'response' }).pipe(map(function (result) { return ({
347
- total: +result.headers.get('X-Page-Count'),
348
- data: VolleyballStatistic.toFront(result.body)
349
- }); })).toPromise()];
350
- });
351
- });
352
- };
353
- TournamentApi.prototype.getHockeyStatistic = function (filters) {
354
- return __awaiter(this, void 0, void 0, function () {
355
- var params;
356
- return __generator(this, function (_a) {
357
- params = new HttpParams();
358
- params = applyStatisticFilters(filters, params);
359
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/hockey_statistic/", { params: params, observe: 'response' }).pipe(map(function (result) { return ({
360
- total: +result.headers.get('X-Page-Count'),
361
- data: HockeyStatistic.toFront(result.body)
362
- }); })).toPromise()];
363
- });
364
- });
365
- };
366
- TournamentApi.prototype.getFootballStatistic = function (filters) {
367
- return __awaiter(this, void 0, void 0, function () {
368
- var params;
369
- return __generator(this, function (_a) {
370
- params = new HttpParams();
371
- params = applyStatisticFilters(filters, params);
372
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/football_statistic/", { params: params, observe: 'response' }).pipe(map(function (result) { return ({
373
- total: +result.headers.get('X-Page-Count'),
374
- data: FootballStatistic.toFront(result.body)
375
- }); })).toPromise()];
376
- });
377
- });
378
- };
379
- TournamentApi.prototype.getHandballStatistic = function (filters) {
380
- return __awaiter(this, void 0, void 0, function () {
381
- var params;
382
- return __generator(this, function (_a) {
383
- params = new HttpParams();
384
- params = applyStatisticFilters(filters, params);
385
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/handball_statistic/", { params: params, observe: 'response' }).pipe(map(function (result) { return ({
386
- total: +result.headers.get('X-Page-Count'),
387
- data: HandballStatistic.toFront(result.body)
388
- }); })).toPromise()];
389
- });
390
- });
391
- };
392
- TournamentApi.prototype.getRugbyStatistic = function (filters) {
393
- return __awaiter(this, void 0, void 0, function () {
394
- var params;
395
- return __generator(this, function (_a) {
396
- params = new HttpParams();
397
- params = applyStatisticFilters(filters, params);
398
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/rugby_statistic/", { params: params, observe: 'response' }).pipe(map(function (result) { return ({
399
- total: +result.headers.get('X-Page-Count'),
400
- data: RugbyStatistic.toFront(result.body)
401
- }); })).toPromise()];
402
- });
403
- });
404
- };
405
- TournamentApi.prototype.getTournamentTeamUsers = function (tournamentTeamId) {
406
- return __awaiter(this, void 0, void 0, function () {
407
- return __generator(this, function (_a) {
408
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_team/" + tournamentTeamId + "/users/").pipe(map(function (result) { return TournamentTeamUser.toFront(result); })).toPromise()];
409
- });
410
- });
411
- };
412
- TournamentApi.prototype.myPermission = function (tournamentId) {
413
- return __awaiter(this, void 0, void 0, function () {
414
- return __generator(this, function (_a) {
415
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament/" + tournamentId + "/permission/").pipe(map(function (data) { return (data.permissions || []).map(function (item) { return LeagueUserPermissions[item]; }); })).toPromise()];
416
- });
417
- });
418
- };
419
- TournamentApi.prototype.getTournamentTeamTournaments = function (tournamentTeamId) {
420
- return __awaiter(this, void 0, void 0, function () {
421
- return __generator(this, function (_a) {
422
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_team/" + tournamentTeamId + "/tournaments/").pipe(map(function (result) { return Tournament.toFront(result); })).toPromise()];
423
- });
424
- });
425
- };
426
- TournamentApi.prototype.getTournamentUserTournaments = function (tournamentTeamUserId) {
427
- return __awaiter(this, void 0, void 0, function () {
428
- return __generator(this, function (_a) {
429
- return [2 /*return*/, this.httpClient.get(this.configService.get('apiUrl') + "/api/v1/tournament_team_user/" + tournamentTeamUserId + "/tournaments/").pipe(map(function (result) { return Tournament.toFront(result); })).toPromise()];
430
- });
431
- });
432
- };
433
- TournamentApi.ctorParameters = function () { return [
434
- { type: HttpClient },
435
- { type: ConfigService }
436
- ]; };
437
- TournamentApi.ɵprov = i0.ɵɵdefineInjectable({ factory: function TournamentApi_Factory() { return new TournamentApi(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.ConfigService)); }, token: TournamentApi, providedIn: "root" });
438
- TournamentApi = __decorate([
439
- Injectable({ providedIn: 'root' })
440
- ], TournamentApi);
441
- return TournamentApi;
442
- }());
443
- export { TournamentApi };
444
- export function applyGamesFilters(filters, params) {
445
- if (filters.tournamentIds) {
446
- params = params.set('tournament_ids', filters.tournamentIds.join(','));
447
- }
448
- if (filters.tournamentStageId) {
449
- params = params.set('tournament_stage_id', filters.tournamentStageId.toString());
450
- }
451
- if (filters.tournamentTour) {
452
- params = params.set('tournament_tour', filters.tournamentTour.toString());
453
- }
454
- if (filters.playoffStage) {
455
- params = params.set('playoff_stage', filters.playoffStage.toString());
456
- }
457
- if (filters.playoffRound) {
458
- params = params.set('playoff_round', filters.playoffRound.toString());
459
- }
460
- if (filters.teamId) {
461
- params = params.set('team_id', filters.teamId.toString());
462
- }
463
- if (filters.status) {
464
- params = params.set('status', GameStatuses[filters.status]);
465
- }
466
- if (filters.statuses) {
467
- var statuses = filters.statuses.map(function (i) { return GameStatuses[i]; });
468
- params = params.set('statuses', statuses.join(','));
469
- }
470
- if (filters.tournamentCourtId) {
471
- params = params.set('tournament_court_id', filters.tournamentCourtId.toString());
472
- }
473
- if (filters.leaguePlayerId) {
474
- params = params.set('league_player_id', filters.leaguePlayerId.toString());
475
- }
476
- if (filters.userId) {
477
- params = params.set('user_id', filters.userId.toString());
478
- }
479
- if (filters.query) {
480
- params = params.set('query', filters.query);
481
- }
482
- if (filters.isPlayoff !== undefined && filters.isPlayoff !== null) {
483
- params = params.set('is_playoff', filters.isPlayoff ? '1' : '0');
484
- }
485
- return params;
486
- }
487
- export function applyStatisticFilters(filters, params) {
488
- var e_6, _a;
489
- try {
490
- for (var _b = __values(Object.keys(filters)), _c = _b.next(); !_c.done; _c = _b.next()) {
491
- var key = _c.value;
492
- if (filters[key]) {
493
- params = params.set(key, filters[key]);
494
- }
495
- }
496
- }
497
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
498
- finally {
499
- try {
500
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
501
- }
502
- finally { if (e_6) throw e_6.error; }
503
- }
504
- if (filters.per_game !== undefined) {
505
- params = params.set('per_game', filters.per_game ? '1' : '0');
506
- }
507
- if (filters.tournament_ids) {
508
- params = params.set('tournament_ids', filters.tournament_ids.join(','));
509
- }
510
- if (filters.is_playoff !== undefined && filters.is_playoff !== null) {
511
- params = params.set('is_playoff', filters.is_playoff ? '1' : '0');
512
- }
513
- return params;
514
- }
515
- export function applyStatisticLeadersFilters(filters, params) {
516
- var e_7, _a;
517
- try {
518
- for (var _b = __values(Object.keys(filters)), _c = _b.next(); !_c.done; _c = _b.next()) {
519
- var key = _c.value;
520
- if (filters[key]) {
521
- params = params.set(key, filters[key]);
522
- }
523
- }
524
- }
525
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
526
- finally {
527
- try {
528
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
529
- }
530
- finally { if (e_7) throw e_7.error; }
531
- }
532
- if (filters.per_game !== undefined) {
533
- params = params.set('per_game', filters.per_game ? '1' : '0');
534
- }
535
- if (filters.tournament_ids) {
536
- params = params.set('tournament_ids', filters.tournament_ids.join(','));
537
- }
538
- if (filters.fields) {
539
- params = params.set('fields', filters.fields.join(','));
540
- }
541
- return params;
542
- }
543
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91cm5hbWVudC1hcGkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbXRnYW1lL2NvcmUvIiwic291cmNlcyI6WyJhcGkvdG91cm5hbWVudC1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUEwRTdEO0lBQ0UsdUJBQ1UsVUFBc0IsRUFDdEIsYUFBNEI7UUFENUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUV0QyxDQUFDO0lBRUssK0JBQU8sR0FBYixVQUFjLFlBQW9COzs7Z0JBQ2hDLHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQywyQkFBc0IsWUFBWSxNQUFHLENBQUM7eUJBQ2pHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUExQixDQUEwQixDQUFDLENBQUM7eUJBQy9DLFNBQVMsRUFBRSxFQUFDOzs7S0FDaEI7SUFFSyxrQ0FBVSxHQUFoQixVQUFpQixRQUFnQixFQUFFLEtBQWE7OztnQkFDOUMsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHVCQUFrQixRQUFRLHFCQUFnQixLQUFLLE1BQUcsQ0FBQzt5QkFDOUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQTFCLENBQTBCLENBQUMsQ0FBQzt5QkFDL0MsU0FBUyxFQUFFLEVBQUM7OztLQUNoQjtJQUVLLCtCQUFPLEdBQWIsVUFBYyxZQUFvQjs7O2dCQUNoQyxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsMkJBQXNCLFlBQVksV0FBUSxDQUFDO3lCQUN0RyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO3lCQUNuRCxTQUFTLEVBQUUsRUFBQzs7O0tBQ2hCO0lBRUssaUNBQVMsR0FBZixVQUFnQixZQUFvQixFQUFFLElBQVksRUFBRSxJQUFZLEVBQUUsT0FBb0M7Ozs7Z0JBQ2hHLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3FCQUN2RCxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7d0JBQ2pCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDbkU7b0JBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO3dCQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUMvQztvQkFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUU7d0JBQzFCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztxQkFDM0U7aUJBQ0Y7Z0JBQ0Qsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDJCQUFzQixZQUFZLGFBQVUsRUFBRSxFQUFDLE1BQU0sUUFBQSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQzt5QkFDdkksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLENBQUM7d0JBQ25CLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQzt3QkFDMUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztxQkFDM0MsQ0FBQyxFQUhrQixDQUdsQixDQUFDLENBQUM7eUJBQ0gsU0FBUyxFQUFFLEVBQUM7OztLQUNoQjtJQUVLLDJDQUFtQixHQUF6QixVQUEwQixZQUFvQjs7O2dCQUM1QyxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsMkJBQXNCLFlBQVksYUFBVSxDQUFDLENBQUMsSUFBSSxDQUM5RyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUE3QixDQUE2QixDQUFDLENBQzNDLENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUssa0NBQVUsR0FBaEIsVUFBaUIsWUFBb0I7OztnQkFDbkMsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDJCQUFzQixZQUFZLGNBQVcsQ0FBQyxDQUFDLElBQUksQ0FDL0csR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBdkIsQ0FBdUIsQ0FBQyxDQUN2QyxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLHVDQUFlLEdBQXJCLFVBQXNCLFNBQWlCLEVBQUUsYUFBc0I7Ozs7Z0JBQ3pELE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLGFBQWEsRUFBRTtvQkFDakIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQ3REO2dCQUNELHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxtQ0FBOEIsU0FBUyxZQUFTLEVBQzVHLEVBQUMsTUFBTSxRQUFBLEVBQUMsQ0FDVCxDQUFDLElBQUksQ0FDSixHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQ3BDLENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUssc0NBQWMsR0FBcEIsVUFBcUIsWUFBb0I7OztnQkFDdkMsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDJCQUFzQixZQUFZLG1CQUFnQixDQUFDO3lCQUM5RyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFoQyxDQUFnQyxDQUFDLENBQUM7eUJBQ25ELFNBQVMsRUFBRSxFQUFDOzs7S0FDaEI7SUFFSyxnQ0FBUSxHQUFkLFVBQWUsWUFBb0IsRUFBRSxJQUFZLEVBQUUsSUFBWSxFQUFFLE9BQW9DO1FBQXBDLHdCQUFBLEVBQUEsWUFBb0M7Ozs7Z0JBQy9GLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzNELElBQUksSUFBSSxFQUFFO29CQUNSLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsTUFBTSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDNUMsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDJCQUFzQixZQUFZLFlBQVMsRUFBRSxFQUFDLE1BQU0sUUFBQSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQzt5QkFDdEksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLENBQUM7d0JBQ25CLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQzt3QkFDMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztxQkFDaEMsQ0FBQyxFQUhrQixDQUdsQixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQzs7O0tBQ3BCO0lBRUssaUNBQVMsR0FBZixVQUFnQixZQUFvQjs7O2dCQUNsQyxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsMkJBQXNCLFlBQVksYUFBVSxDQUFDO3lCQUN4RyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQyxDQUFDO3lCQUNwRCxTQUFTLEVBQUUsRUFBQzs7O0tBQ2hCO0lBRUssZ0NBQVEsR0FBZCxVQUFlLFlBQW9CLEVBQUUsT0FBZ0I7Ozs7Z0JBQy9DLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLE9BQU8sRUFBRTtvQkFDWCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQywyQkFBc0IsWUFBWSxZQUFTLEVBQUUsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDO3lCQUNqSCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO3lCQUNuRCxTQUFTLEVBQUUsRUFBQzs7O0tBQ2hCO0lBRUsscUNBQWEsR0FBbkIsVUFBb0IsWUFBb0I7OztnQkFDdEMsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDJCQUFzQixZQUFZLGtCQUFlLENBQUM7eUJBQzdHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQW5DLENBQW1DLENBQUMsQ0FBQzt5QkFDeEQsU0FBUyxFQUFFLEVBQUM7OztLQUNoQjtJQUVLLG1DQUFXLEdBQWpCLFVBQWtCLGdCQUF3Qjs7O2dCQUN4QyxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0NBQTJCLGdCQUFnQixNQUFHLENBQUM7eUJBQzFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUE5QixDQUE4QixDQUFDLENBQUM7eUJBQ25ELFNBQVMsRUFBRSxFQUFDOzs7S0FDaEI7SUFFSyxtQ0FBVyxHQUFqQixVQUFrQixNQUFjOzs7Z0JBQzlCLHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxxQ0FBZ0MsTUFBTSxNQUFHLENBQUM7eUJBQ3JHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQWxDLENBQWtDLENBQUMsQ0FBQzt5QkFDdkQsU0FBUyxFQUFFLEVBQUM7OztLQUNoQjtJQUVLLG9DQUFZLEdBQWxCLFVBQW1CLGdCQUF3Qjs7O2dCQUN6QyxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMscUNBQWdDLGdCQUFnQixZQUFTLENBQUM7eUJBQ3JILElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQUM7eUJBQ3pDLFNBQVMsRUFBRSxFQUFDOzs7S0FDaEI7SUFFSyxxREFBNkIsR0FBbkMsVUFBb0MsT0FBZ0M7Ozs7Z0JBQzlELE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RCxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsMENBQXVDLEVBQUUsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUNuSCxHQUFHLENBQUMsVUFBQyxNQUE4Qjs7OzRCQUNqQyxLQUFrQixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dDQUFsQyxJQUFNLEdBQUcsV0FBQTtnQ0FDWixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzZCQUN4RDs7Ozs7Ozs7O3dCQUNELE9BQU8sTUFBTSxDQUFDO29CQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLHFEQUE2QixHQUFuQyxVQUFvQyxPQUFnQzs7OztnQkFDOUQsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZELHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQywwQ0FBdUMsRUFBRSxFQUFDLE1BQU0sUUFBQSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQ25ILEdBQUcsQ0FBQyxVQUFDLE1BQThCOzs7NEJBQ2pDLEtBQWtCLElBQUEsS0FBQSxTQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUEsZ0JBQUEsNEJBQUU7Z0NBQWxDLElBQU0sR0FBRyxXQUFBO2dDQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkJBQ3hEOzs7Ozs7Ozs7d0JBQ0QsT0FBTyxNQUFNLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUssaURBQXlCLEdBQS9CLFVBQWdDLE9BQWdDOzs7O2dCQUMxRCxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxHQUFHLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdkQsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHNDQUFtQyxFQUFFLEVBQUMsTUFBTSxRQUFBLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0csR0FBRyxDQUFDLFVBQUMsTUFBOEI7Ozs0QkFDakMsS0FBa0IsSUFBQSxLQUFBLFNBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQSxnQkFBQSw0QkFBRTtnQ0FBbEMsSUFBTSxHQUFHLFdBQUE7Z0NBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkJBQ3BEOzs7Ozs7Ozs7d0JBQ0QsT0FBTyxNQUFNLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUssbURBQTJCLEdBQWpDLFVBQWtDLE9BQWdDOzs7O2dCQUM1RCxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxHQUFHLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdkQsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHdDQUFxQyxFQUFFLEVBQUMsTUFBTSxRQUFBLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FDakgsR0FBRyxDQUFDLFVBQUMsTUFBOEI7Ozs0QkFDakMsS0FBa0IsSUFBQSxLQUFBLFNBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQSxnQkFBQSw0QkFBRTtnQ0FBbEMsSUFBTSxHQUFHLFdBQUE7Z0NBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs2QkFDdEQ7Ozs7Ozs7Ozt3QkFDRCxPQUFPLE1BQU0sQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLEVBQUUsRUFBQzs7O0tBQ2Y7SUFFSyxtREFBMkIsR0FBakMsVUFBa0MsT0FBZ0M7Ozs7Z0JBQzVELE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RCxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsd0NBQXFDLEVBQUUsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUNqSCxHQUFHLENBQUMsVUFBQyxNQUE4Qjs7OzRCQUNqQyxLQUFrQixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dDQUFsQyxJQUFNLEdBQUcsV0FBQTtnQ0FDWixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzZCQUN0RDs7Ozs7Ozs7O3dCQUNELE9BQU8sTUFBTSxDQUFDO29CQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLDhDQUFzQixHQUE1QixVQUE2QixPQUEwQjs7OztnQkFDakQsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRWhELHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxrQ0FBK0IsRUFBRSxFQUFDLE1BQU0sUUFBQSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEksR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsQ0FBQzt3QkFDYixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7d0JBQzFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztxQkFDL0MsQ0FBQyxFQUhZLENBR1osQ0FBQyxDQUNKLENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUssOENBQXNCLEdBQTVCLFVBQTZCLE9BQTBCOzs7O2dCQUNqRCxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFaEQsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGtDQUErQixFQUFFLEVBQUMsTUFBTSxRQUFBLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUNoSSxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxDQUFDO3dCQUNiLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQzt3QkFDMUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO3FCQUMvQyxDQUFDLEVBSFksQ0FHWixDQUFDLENBQ0osQ0FBQyxTQUFTLEVBQUUsRUFBQzs7O0tBQ2Y7SUFFSywwQ0FBa0IsR0FBeEIsVUFBeUIsT0FBMEI7Ozs7Z0JBQzdDLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEdBQUcscUJBQXFCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUVoRCxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsOEJBQTJCLEVBQUUsRUFBQyxNQUFNLFFBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQzVILEdBQUcsQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLENBQUM7d0JBQ2IsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO3dCQUMxQyxJQUFJLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO3FCQUMzQyxDQUFDLEVBSFksQ0FHWixDQUFDLENBQ0osQ0FBQyxTQUFTLEVBQUUsRUFBQzs7O0tBQ2Y7SUFFSyw0Q0FBb0IsR0FBMUIsVUFBMkIsT0FBMEI7Ozs7Z0JBQy9DLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEdBQUcscUJBQXFCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUVoRCxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0NBQTZCLEVBQUUsRUFBQyxNQUFNLFFBQUEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlILEdBQUcsQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLENBQUM7d0JBQ2IsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO3dCQUMxQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7cUJBQzdDLENBQUMsRUFIWSxDQUdaLENBQUMsQ0FDSixDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLDRDQUFvQixHQUExQixVQUEyQixPQUEwQjs7OztnQkFDL0MsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRWhELHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxnQ0FBNkIsRUFBRSxFQUFDLE1BQU0sUUFBQSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUgsR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsQ0FBQzt3QkFDYixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7d0JBQzFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztxQkFDN0MsQ0FBQyxFQUhZLENBR1osQ0FBQyxDQUNKLENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUsseUNBQWlCLEdBQXZCLFVBQXdCLE9BQTBCOzs7O2dCQUM1QyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFaEQsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDZCQUEwQixFQUFFLEVBQUMsTUFBTSxRQUFBLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUMzSCxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxDQUFDO3dCQUNiLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQzt3QkFDMUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztxQkFDMUMsQ0FBQyxFQUhZLENBR1osQ0FBQyxDQUNKLENBQUMsU0FBUyxFQUFFLEVBQUM7OztLQUNmO0lBRUssOENBQXNCLEdBQTVCLFVBQTZCLGdCQUF3Qjs7O2dCQUNuRCxzQkFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZ0NBQTJCLGdCQUFnQixZQUFTLENBQUMsQ0FBQyxJQUFJLENBQ3RILEdBQUcsQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBbEMsQ0FBa0MsQ0FBQyxDQUNsRCxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLG9DQUFZLEdBQWxCLFVBQW1CLFlBQW9COzs7Z0JBQ3JDLHNCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQywyQkFBc0IsWUFBWSxpQkFBYyxDQUFDLENBQUMsSUFBSSxDQUNsSCxHQUFHLENBQUMsVUFBQyxJQUFTLElBQUssT0FBQSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQTNCLENBQTJCLENBQUMsRUFBakUsQ0FBaUUsQ0FBQyxDQUN0RixDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLG9EQUE0QixHQUFsQyxVQUFtQyxnQkFBd0I7OztnQkFDekQsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGdDQUEyQixnQkFBZ0Isa0JBQWUsQ0FBQyxDQUFDLElBQUksQ0FDNUgsR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBMUIsQ0FBMEIsQ0FBQyxDQUMxQyxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjtJQUVLLG9EQUE0QixHQUFsQyxVQUFtQyxvQkFBNEI7OztnQkFDN0Qsc0JBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHFDQUFnQyxvQkFBb0Isa0JBQWUsQ0FBQyxDQUFDLElBQUksQ0FDckksR0FBRyxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBMUIsQ0FBMEIsQ0FBQyxDQUMxQyxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDZjs7Z0JBL1JxQixVQUFVO2dCQUNQLGFBQWE7OztJQUgzQixhQUFhO1FBRHpCLFVBQVUsQ0FBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQztPQUNwQixhQUFhLENBa1N6Qjt3QkFsWUQ7Q0FrWUMsQUFsU0QsSUFrU0M7U0FsU1ksYUFBYTtBQW9TMUIsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQStCLEVBQUUsTUFBa0I7SUFDbkYsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO1FBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDeEU7SUFDRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtRQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUNsRjtJQUNELElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRTtRQUMxQixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDM0U7SUFDRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7UUFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUN2RTtJQUNELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtRQUN4QixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ2xCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDM0Q7SUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDbEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM3RDtJQUNELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtRQUNwQixJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBZixDQUFlLENBQUMsQ0FBQztRQUM1RCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUU7UUFDN0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDbEY7SUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUU7UUFDMUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQzVFO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ2xCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDM0Q7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7UUFDakIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QztJQUNELElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7UUFDakUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbEU7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQXlCLEVBQUUsTUFBa0I7OztRQUNqRixLQUFrQixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO1lBQW5DLElBQU0sR0FBRyxXQUFBO1lBQ1osSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN4QztTQUNGOzs7Ozs7Ozs7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ2xDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO1FBQzFCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDekU7SUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQ25FLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxPQUFnQyxFQUFFLE1BQWtCOzs7UUFDL0YsS0FBa0IsSUFBQSxLQUFBLFNBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQSxnQkFBQSw0QkFBRTtZQUFuQyxJQUFNLEdBQUcsV0FBQTtZQUNaLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDeEM7U0FDRjs7Ozs7Ozs7O0lBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUNsQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRTtRQUMxQixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3pFO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ2xCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBUb3VybmFtZW50IH0gZnJvbSAnLi4vbW9kZWxzL3RvdXJuYW1lbnQnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVG91cm5hbWVudE5ld3MgfSBmcm9tICcuLi9tb2RlbHMvdG91cm5hbWVudC1uZXdzJztcbmltcG9ydCB7IEdhbWUsIEdhbWVTdGF0dXNlcyB9IGZyb20gJy4uL21vZGVscy9nYW1lJztcbmltcG9ydCB7IEdhbWVUaW1lbGluZVN0YWdlcyB9IGZyb20gJy4uL21vZGVscy9nYW1lLXRpbWVsaW5lLXN0YWdlcyc7XG5pbXBvcnQgeyBUb3VybmFtZW50VGVhbSB9IGZyb20gJy4uL21vZGVscy90b3VybmFtZW50LXRlYW0nO1xuaW1wb3J0IHsgVG91cm5hbWVudFN0YWdlIH0gZnJvbSAnLi4vbW9kZWxzL3RvdXJuYW1lbnQtc3RhZ2UnO1xuaW1wb3J0IHsgUGxheW9mZiB9IGZyb20gJy4uL21vZGVscy9wbGF5b2ZmJztcbmltcG9ydCB7IFBhZ2luYXRlZFJlc3BvbnNlIH0gZnJvbSAnLi9wYWdpbmF0ZWQtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IEJhc2tldGJhbGxTdGF0aXN0aWMgfSBmcm9tICcuLi9tb2RlbHMvYmFza2V0YmFsbC1zdGF0aXN0aWMnO1xuaW1wb3J0IHsgVm9sbGV5YmFsbFN0YXRpc3RpYyB9IGZyb20gJy4uL21vZGVscy92b2xsZXliYWxsLXN0YXRpc3RpYyc7XG5pbXBvcnQgeyBUb3VybmFtZW50VGVhbVVzZXIgfSBmcm9tICcuLi9tb2RlbHMvdG91cm5hbWVudC10ZWFtLXVzZXInO1xuaW1wb3J0IHsgVG91cm5hbWVudFN0YWdlVGVhbSB9IGZyb20gJy4uL21vZGVscy90b3VybmFtZW50LXN0YWdlLXRlYW0nO1xuaW1wb3J0IHsgVG91cm5hbWVudEV2ZW50LCBUb3VybmFtZW50RXZlbnRUeXBlcyB9IGZyb20gJy4uL21vZGVscy90b3VybmFtZW50LWV2ZW50JztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBIb2NrZXlTdGF0aXN0aWMgfSBmcm9tICcuLi9tb2RlbHMvaG9ja2V5LXN0YXRpc3RpYyc7XG5pbXBvcnQgeyBGb290YmFsbFN0YXRpc3RpYyB9IGZyb20gJy4uL21vZGVscy9mb290YmFsbC1zdGF0aXN0aWMnO1xuaW1wb3J0IHsgTGVhZ3VlVXNlclBlcm1pc3Npb25zIH0gZnJvbSAnLi4vbW9kZWxzL2xlYWd1ZS11c2VyJztcbmltcG9ydCB7IEhhbmRiYWxsU3RhdGlzdGljIH0gZnJvbSAnLi4vbW9kZWxzL2hhbmRiYWxsLXN0YXRpc3RpYyc7XG5pbXBvcnQgeyBSdWdieVN0YXRpc3RpYyB9IGZyb20gJy4uL21vZGVscy9ydWdieS1zdGF0aXN0aWMnO1xuaW1wb3J0IHsgVG91cm5hbWVudEdyb3VwIH0gZnJvbSAnLi4vbW9kZWxzL3RvdXJuYW1lbnQtZ3JvdXAnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvdXJuYW1lbnRHYW1lc0ZpbHRlcnMge1xuICB0b3VybmFtZW50SWRzPzogbnVtYmVyW107XG4gIHRvdXJuYW1lbnRTZWFzb25JZD86IG51bWJlcjtcbiAgdG91cm5hbWVudFN0YWdlSWQ/OiBudW1iZXI7XG4gIHRvdXJuYW1lbnRUb3VyPzogbnVtYmVyO1xuICB0ZWFtSWQ/OiBudW1iZXI7XG4gIHBsYXlvZmZTdGFnZT86IG51bWJlcjtcbiAgcGxheW9mZlJvdW5kPzogbnVtYmVyO1xuICBwbGF5b2ZmSWQ/OiBudW1iZXI7XG4gIGlzUGxheW9mZj86IGJvb2xlYW47XG4gIHN0YXR1cz86IEdhbWVTdGF0dXNlcztcbiAgc3RhdHVzZXM/OiBHYW1lU3RhdHVzZXNbXTtcbiAgdG91cm5hbWVudENvdXJ0SWQ/OiBudW1iZXI7XG4gIGxlYWd1ZVBsYXllcklkPzogbnVtYmVyO1xuICB1c2VySWQ/OiBudW1iZXI7XG4gIHF1ZXJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTdGF0aXN0aWNHcm91cEJ5VHlwZXMgPSAndGVhbScgfCAndXNlcicgfCAndGVhbV91c2VyJyB8ICd0b3VybmFtZW50X3RlYW0nIHwgJ2xlYWd1ZV9wbGF5ZXInIHwgJ3RvdXJuYW1lbnRfdGVhbV91c2VyJ1xuICB8ICdtb250aCcgfCAnd2luX2xvc2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aXN0aWNGaWx0ZXJzIHtcbiAgdG91cm5hbWVudF9pZD86IG51bWJlcjtcbiAgdG91cm5hbWVudF9pZHM/OiBudW1iZXJbXTtcbiAgdG91cm5hbWVudF9zZWFzb25faWQ/OiBudW1iZXI7XG4gIHRvdXJuYW1lbnRfdGVhbV9pZD86IG51bWJlcjtcbiAgbGVhZ3VlX3BsYXllcl9pZD86IG51bWJlcjtcbiAgdG91cm5hbWVudF90ZWFtX3VzZXJfaWQ/OiBudW1iZXI7XG4gIHRlYW1faWQ/OiBudW1iZXI7XG4gIHRlYW1fdXNlcl9pZD86IG51bWJlcjtcbiAgdXNlcl9pZD86IG51bWJlcjtcbiAgdG91cm5hbWVudF9zdGFnZV9pZD86IG51bWJlcjtcbiAgdG91cm5hbWVudF90b3VyPzogbnVtYmVyO1xuICBwbGF5b2ZmX3N0YWdlPzogbnVtYmVyO1xuICBwbGF5b2ZmX3JvdW5kPzogbnVtYmVyO1xuICBwbGF5b2ZmX2lkPzogbnVtYmVyO1xuICBpc19wbGF5b2ZmPzogYm9vbGVhbjtcbiAgZGF0ZV9mcm9tPzogc3RyaW5nO1xuICBkYXRlX3RvPzogc3RyaW5nO1xuICBxdWVyeT86IHN0cmluZztcbiAgcGVyX2dhbWU/OiBib29sZWFuO1xuICBncm91cF9ieTogU3RhdGlzdGljR3JvdXBCeVR5cGVzO1xuICBvcmRlcl9ieT86IHN0cmluZztcbiAgcGFnZT86IG51bWJlcjtcbiAgc2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aXN0aWNMZWFkZXJzRmlsdGVycyB7XG4gIHRvdXJuYW1lbnRfaWQ/OiBudW1iZXI7XG4gIHRvdXJuYW1lbnRfaWRzPzogbnVtYmVyW107XG4gIHRvdXJuYW1lbnRfc2Vhc29uX2lkPzogbnVtYmVyO1xuICB0b3VybmFtZW50X3RlYW1faWQ/OiBudW1iZXI7XG4gIHRlYW1faWQ/OiBudW1iZXI7XG4gIHRvdXJuYW1lbnRfc3RhZ2VfaWQ/OiBudW1iZXI7XG4gIHRvdXJuYW1lbnRfdG91cj86IG51bWJlcjtcbiAgcGxheW9mZl9zdGFnZT86IG51bWJlcjtcbiAgcGxheW9mZl9pZD86IG51bWJlcjtcbiAgZGF0ZV9mcm9tPzogc3RyaW5nO1xuICBkYXRlX3RvPzogc3RyaW5nO1xuICBwZXJfZ2FtZT86IGJvb2xlYW47XG4gIGdyb3VwX2J5OiBTdGF0aXN0aWNHcm91cEJ5VHlwZXM7XG4gIHNpemU/OiBudW1iZXI7XG4gIGZpZWxkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG91cm5hbWVudEV2ZW50c0xpc3RGaWx0ZXIge1xuICBldmVudD86IFRvdXJuYW1lbnRFdmVudFR5cGVzO1xuICBzZWFyY2g/OiBzdHJpbmc7XG4gIHRvdXJuYW1lbnRUb3VyPzogbnVtYmVyO1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBUb3VybmFtZW50QXBpIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgKSB7XG4gIH1cblxuICBhc3luYyBnZXRCeUlkKHRvdXJuYW1lbnRJZDogbnVtYmVyKTogUHJvbWlzZTxUb3VybmFtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9gKVxuICAgICAgLnBpcGUobWFwKHJlc3VsdCA9PiBUb3VybmFtZW50LnRvRnJvbnQocmVzdWx0KSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRCeUFsaWFzKGxlYWd1ZUlkOiBudW1iZXIsIGFsaWFzOiBzdHJpbmcpOiBQcm9taXNlPFRvdXJuYW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL2xlYWd1ZS8ke2xlYWd1ZUlkfS90b3VybmFtZW50cy8ke2FsaWFzfS9gKVxuICAgICAgLnBpcGUobWFwKHJlc3VsdCA9PiBUb3VybmFtZW50LnRvRnJvbnQocmVzdWx0KSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXROZXdzKHRvdXJuYW1lbnRJZDogbnVtYmVyKTogUHJvbWlzZTxUb3VybmFtZW50TmV3c1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9uZXdzL2ApXG4gICAgICAucGlwZShtYXAocmVzdWx0ID0+IFRvdXJuYW1lbnROZXdzLnRvRnJvbnQocmVzdWx0KSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRFdmVudHModG91cm5hbWVudElkOiBudW1iZXIsIHBhZ2U6IG51bWJlciwgc2l6ZTogbnVtYmVyLCBmaWx0ZXJzPzogVG91cm5hbWVudEV2ZW50c0xpc3RGaWx0ZXIpOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFRvdXJuYW1lbnRFdmVudFtdPj4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldCgncGFnZScsIHBhZ2UudG9TdHJpbmcoKSlcbiAgICAgIC5zZXQoJ3NpemUnLCBzaXplLnRvU3RyaW5nKCkpO1xuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBpZiAoZmlsdGVycy5ldmVudCkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdldmVudCcsIFRvdXJuYW1lbnRFdmVudFR5cGVzW2ZpbHRlcnMuZXZlbnRdKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJzLnNlYXJjaCkge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdzZWFyY2gnLCBmaWx0ZXJzLnNlYXJjaCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVycy50b3VybmFtZW50VG91cikge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0b3VybmFtZW50X3RvdXInLCBmaWx0ZXJzLnRvdXJuYW1lbnRUb3VyLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL3RvdXJuYW1lbnQvJHt0b3VybmFtZW50SWR9L2V2ZW50cy9gLCB7cGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnfSlcbiAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gKHtcbiAgICAgICAgdG90YWw6ICtyZXN1bHQuaGVhZGVycy5nZXQoJ1gtUGFnZS1Db3VudCcpLFxuICAgICAgICBkYXRhOiBUb3VybmFtZW50RXZlbnQudG9Gcm9udChyZXN1bHQuYm9keSlcbiAgICAgIH0pKSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldFRvdXJuYW1lbnRTdGFnZXModG91cm5hbWVudElkOiBudW1iZXIpOiBQcm9taXNlPFRvdXJuYW1lbnRTdGFnZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9zdGFnZXMvYCkucGlwZShcbiAgICAgIG1hcChkYXRhID0+IFRvdXJuYW1lbnRTdGFnZS50b0Zyb250KGRhdGEpKVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRQbGF5b2ZmKHRvdXJuYW1lbnRJZDogbnVtYmVyKTogUHJvbWlzZTxQbGF5b2ZmW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL3RvdXJuYW1lbnQvJHt0b3VybmFtZW50SWR9L3BsYXlvZmYvYCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4gUGxheW9mZi50b0Zyb250KHJlc3VsdCkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldFBsYXlvZmZHYW1lcyhwbGF5b2ZmSWQ6IG51bWJlciwgcGxheW9mZk51bWJlcj86IHN0cmluZyk6IFByb21pc2U8R2FtZVtdPiB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYgKHBsYXlvZmZOdW1iZXIpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3BsYXlvZmZfbnVtYmVyJywgcGxheW9mZk51bWJlcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvdG91cm5hbWVudF9wbGF5b2ZmLyR7cGxheW9mZklkfS9nYW1lcy9gLFxuICAgICAge3BhcmFtc31cbiAgICApLnBpcGUoXG4gICAgICBtYXAocmVzdWx0ID0+IEdhbWUudG9Gcm9udChyZXN1bHQpKVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRHYW1lc1N0YWdlcyh0b3VybmFtZW50SWQ6IG51bWJlcik6IFByb21pc2U8R2FtZVRpbWVsaW5lU3RhZ2VzPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9nYW1lc19zdGFnZXMvYClcbiAgICAgIC5waXBlKG1hcChkYXRhID0+IEdhbWVUaW1lbGluZVN0YWdlcy50b0Zyb250KGRhdGEpKSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldEdhbWVzKHRvdXJuYW1lbnRJZDogbnVtYmVyLCBwYWdlOiBudW1iZXIsIHNpemU6IG51bWJlciwgZmlsdGVyczogVG91cm5hbWVudEdhbWVzRmlsdGVycyA9IHt9KTogUHJvbWlzZTxQYWdpbmF0ZWRSZXNwb25zZTxHYW1lW10+PiB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdwYWdlJywgcGFnZS50b1N0cmluZygpKTtcbiAgICBpZiAoc2l6ZSkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHBhcmFtcyA9IGFwcGx5R2FtZXNGaWx0ZXJzKGZpbHRlcnMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9nYW1lcy9gLCB7cGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnfSlcbiAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gKHtcbiAgICAgICAgdG90YWw6ICtyZXN1bHQuaGVhZGVycy5nZXQoJ1gtUGFnZS1Db3VudCcpLFxuICAgICAgICBkYXRhOiBHYW1lLnRvRnJvbnQocmVzdWx0LmJvZHkpXG4gICAgICB9KSkpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0R3JvdXBzKHRvdXJuYW1lbnRJZDogbnVtYmVyKTogUHJvbWlzZTxUb3VybmFtZW50R3JvdXBbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvdG91cm5hbWVudC8ke3RvdXJuYW1lbnRJZH0vZ3JvdXBzL2ApXG4gICAgICAucGlwZShtYXAocmVzdWx0ID0+IFRvdXJuYW1lbnRHcm91cC50b0Zyb250KHJlc3VsdCkpKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGVhbXModG91cm5hbWVudElkOiBudW1iZXIsIGdyb3VwSWQ/OiBudW1iZXIpOiBQcm9taXNlPFRvdXJuYW1lbnRUZWFtW10+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZ3JvdXBfaWQnLCBncm91cElkLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL3RvdXJuYW1lbnQvJHt0b3VybmFtZW50SWR9L3RlYW1zL2AsIHtwYXJhbXN9KVxuICAgICAgLnBpcGUobWFwKHJlc3VsdCA9PiBUb3VybmFtZW50VGVhbS50b0Zyb250KHJlc3VsdCkpKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3RhZ2VUZWFtcyh0b3VybmFtZW50SWQ6IG51bWJlcik6IFByb21pc2U8VG91cm5hbWVudFN0YWdlVGVhbVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9zdGFnZV90ZWFtcy9gKVxuICAgICAgLnBpcGUobWFwKHJlc3VsdCA9PiBUb3VybmFtZW50U3RhZ2VUZWFtLnRvRnJvbnQocmVzdWx0KSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRUZWFtQnlJZCh0b3VybmFtZW50VGVhbUlkOiBudW1iZXIpOiBQcm9taXNlPFRvdXJuYW1lbnRUZWFtPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50X3RlYW0vJHt0b3VybmFtZW50VGVhbUlkfS9gKVxuICAgICAgLnBpcGUobWFwKHJlc3VsdCA9PiBUb3VybmFtZW50VGVhbS50b0Zyb250KHJlc3VsdCkpKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlckJ5SWQodXNlcklkOiBudW1iZXIpOiBQcm9taXNlPFRvdXJuYW1lbnRUZWFtVXNlcj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvdG91cm5hbWVudF90ZWFtX3VzZXIvJHt1c2VySWR9L2ApXG4gICAgICAucGlwZShtYXAocmVzdWx0ID0+IFRvdXJuYW1lbnRUZWFtVXNlci50b0Zyb250KHJlc3VsdCkpKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlckdhbWVzKHRvdXJuYW1lbnRVc2VySWQ6IG51bWJlcik6IFByb21pc2U8R2FtZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50X3RlYW1fdXNlci8ke3RvdXJuYW1lbnRVc2VySWR9L2dhbWVzL2ApXG4gICAgICAucGlwZShtYXAocmVzdWx0ID0+IEdhbWUudG9Gcm9udChyZXN1bHQpKSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJhc2tldGJhbGxTdGF0aXN0aWNMZWFkZXJzKGZpbHRlcnM6IFN0YXRpc3RpY0xlYWRlcnNGaWx0ZXJzKTogUHJvbWlzZTx7W2tleTogc3RyaW5nXTogQmFza2V0YmFsbFN0YXRpc3RpY1tdfT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIHBhcmFtcyA9IGFwcGx5U3RhdGlzdGljTGVhZGVyc0ZpbHRlcnMoZmlsdGVycywgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL2Jhc2tldGJhbGxfc3RhdGlzdGljX2xlYWRlcnMvYCwge3BhcmFtc30pLnBpcGUoXG4gICAgICBtYXAoKHJlc3VsdDoge1trZXk6IHN0cmluZ106IGFueVtdfSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBCYXNrZXRiYWxsU3RhdGlzdGljLnRvRnJvbnQocmVzdWx0W2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRWb2xsZXliYWxsU3RhdGlzdGljTGVhZGVycyhmaWx0ZXJzOiBTdGF0aXN0aWNMZWFkZXJzRmlsdGVycyk6IFByb21pc2U8e1trZXk6IHN0cmluZ106IFZvbGxleWJhbGxTdGF0aXN0aWNbXX0+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBhcHBseVN0YXRpc3RpY0xlYWRlcnNGaWx0ZXJzKGZpbHRlcnMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS92b2xsZXliYWxsX3N0YXRpc3RpY19sZWFkZXJzL2AsIHtwYXJhbXN9KS5waXBlKFxuICAgICAgbWFwKChyZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBhbnlbXX0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0KSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gVm9sbGV5YmFsbFN0YXRpc3RpYy50b0Zyb250KHJlc3VsdFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0SG9ja2V5U3RhdGlzdGljTGVhZGVycyhmaWx0ZXJzOiBTdGF0aXN0aWNMZWFkZXJzRmlsdGVycyk6IFByb21pc2U8e1trZXk6IHN0cmluZ106IEhvY2tleVN0YXRpc3RpY1tdfT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIHBhcmFtcyA9IGFwcGx5U3RhdGlzdGljTGVhZGVyc0ZpbHRlcnMoZmlsdGVycywgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL2hvY2tleV9zdGF0aXN0aWNfbGVhZGVycy9gLCB7cGFyYW1zfSkucGlwZShcbiAgICAgIG1hcCgocmVzdWx0OiB7W2tleTogc3RyaW5nXTogYW55W119KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IEhvY2tleVN0YXRpc3RpYy50b0Zyb250KHJlc3VsdFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rm9vdGJhbGxTdGF0aXN0aWNMZWFkZXJzKGZpbHRlcnM6IFN0YXRpc3RpY0xlYWRlcnNGaWx0ZXJzKTogUHJvbWlzZTx7W2tleTogc3RyaW5nXTogRm9vdGJhbGxTdGF0aXN0aWNbXX0+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBhcHBseVN0YXRpc3RpY0xlYWRlcnNGaWx0ZXJzKGZpbHRlcnMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS9mb290YmFsbF9zdGF0aXN0aWNfbGVhZGVycy9gLCB7cGFyYW1zfSkucGlwZShcbiAgICAgIG1hcCgocmVzdWx0OiB7W2tleTogc3RyaW5nXTogYW55W119KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IEZvb3RiYWxsU3RhdGlzdGljLnRvRnJvbnQocmVzdWx0W2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRIYW5kYmFsbFN0YXRpc3RpY0xlYWRlcnMoZmlsdGVyczogU3RhdGlzdGljTGVhZGVyc0ZpbHRlcnMpOiBQcm9taXNlPHtba2V5OiBzdHJpbmddOiBIYW5kYmFsbFN0YXRpc3RpY1tdfT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIHBhcmFtcyA9IGFwcGx5U3RhdGlzdGljTGVhZGVyc0ZpbHRlcnMoZmlsdGVycywgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL2hhbmRiYWxsX3N0YXRpc3RpY19sZWFkZXJzL2AsIHtwYXJhbXN9KS5waXBlKFxuICAgICAgbWFwKChyZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBhbnlbXX0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0KSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gSGFuZGJhbGxTdGF0aXN0aWMudG9Gcm9udChyZXN1bHRba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJhc2tldGJhbGxTdGF0aXN0aWMoZmlsdGVycz86IFN0YXRpc3RpY0ZpbHRlcnMpOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPEJhc2tldGJhbGxTdGF0aXN0aWNbXT4+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBhcHBseVN0YXRpc3RpY0ZpbHRlcnMoZmlsdGVycywgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvYmFza2V0YmFsbF9zdGF0aXN0aWMvYCwge3BhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pLnBpcGUoXG4gICAgICBtYXAocmVzdWx0ID0+ICh7XG4gICAgICAgIHRvdGFsOiArcmVzdWx0LmhlYWRlcnMuZ2V0KCdYLVBhZ2UtQ291bnQnKSxcbiAgICAgICAgZGF0YTogQmFza2V0YmFsbFN0YXRpc3RpYy50b0Zyb250KHJlc3VsdC5ib2R5KVxuICAgICAgfSkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldFZvbGxleWJhbGxTdGF0aXN0aWMoZmlsdGVycz86IFN0YXRpc3RpY0ZpbHRlcnMpOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFZvbGxleWJhbGxTdGF0aXN0aWNbXT4+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBhcHBseVN0YXRpc3RpY0ZpbHRlcnMoZmlsdGVycywgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvdm9sbGV5YmFsbF9zdGF0aXN0aWMvYCwge3BhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pLnBpcGUoXG4gICAgICBtYXAocmVzdWx0ID0+ICh7XG4gICAgICAgIHRvdGFsOiArcmVzdWx0LmhlYWRlcnMuZ2V0KCdYLVBhZ2UtQ291bnQnKSxcbiAgICAgICAgZGF0YTogVm9sbGV5YmFsbFN0YXRpc3RpYy50b0Zyb250KHJlc3VsdC5ib2R5KVxuICAgICAgfSkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldEhvY2tleVN0YXRpc3RpYyhmaWx0ZXJzPzogU3RhdGlzdGljRmlsdGVycyk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8SG9ja2V5U3RhdGlzdGljW10+PiB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgcGFyYW1zID0gYXBwbHlTdGF0aXN0aWNGaWx0ZXJzKGZpbHRlcnMsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL2hvY2tleV9zdGF0aXN0aWMvYCwge3BhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pLnBpcGUoXG4gICAgICBtYXAocmVzdWx0ID0+ICh7XG4gICAgICAgIHRvdGFsOiArcmVzdWx0LmhlYWRlcnMuZ2V0KCdYLVBhZ2UtQ291bnQnKSxcbiAgICAgICAgZGF0YTogSG9ja2V5U3RhdGlzdGljLnRvRnJvbnQocmVzdWx0LmJvZHkpXG4gICAgICB9KSlcbiAgICApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rm9vdGJhbGxTdGF0aXN0aWMoZmlsdGVycz86IFN0YXRpc3RpY0ZpbHRlcnMpOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPEZvb3RiYWxsU3RhdGlzdGljW10+PiB7XG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgcGFyYW1zID0gYXBwbHlTdGF0aXN0aWNGaWx0ZXJzKGZpbHRlcnMsIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL2Zvb3RiYWxsX3N0YXRpc3RpYy9gLCB7cGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnfSkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4gKHtcbiAgICAgICAgdG90YWw6ICtyZXN1bHQuaGVhZGVycy5nZXQoJ1gtUGFnZS1Db3VudCcpLFxuICAgICAgICBkYXRhOiBGb290YmFsbFN0YXRpc3RpYy50b0Zyb250KHJlc3VsdC5ib2R5KVxuICAgICAgfSkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldEhhbmRiYWxsU3RhdGlzdGljKGZpbHRlcnM/OiBTdGF0aXN0aWNGaWx0ZXJzKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXNwb25zZTxIYW5kYmFsbFN0YXRpc3RpY1tdPj4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIHBhcmFtcyA9IGFwcGx5U3RhdGlzdGljRmlsdGVycyhmaWx0ZXJzLCBwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS9oYW5kYmFsbF9zdGF0aXN0aWMvYCwge3BhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pLnBpcGUoXG4gICAgICBtYXAocmVzdWx0ID0+ICh7XG4gICAgICAgIHRvdGFsOiArcmVzdWx0LmhlYWRlcnMuZ2V0KCdYLVBhZ2UtQ291bnQnKSxcbiAgICAgICAgZGF0YTogSGFuZGJhbGxTdGF0aXN0aWMudG9Gcm9udChyZXN1bHQuYm9keSlcbiAgICAgIH0pKVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRSdWdieVN0YXRpc3RpYyhmaWx0ZXJzPzogU3RhdGlzdGljRmlsdGVycyk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8UnVnYnlTdGF0aXN0aWNbXT4+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBwYXJhbXMgPSBhcHBseVN0YXRpc3RpY0ZpbHRlcnMoZmlsdGVycywgcGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvcnVnYnlfc3RhdGlzdGljL2AsIHtwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZSd9KS5waXBlKFxuICAgICAgbWFwKHJlc3VsdCA9PiAoe1xuICAgICAgICB0b3RhbDogK3Jlc3VsdC5oZWFkZXJzLmdldCgnWC1QYWdlLUNvdW50JyksXG4gICAgICAgIGRhdGE6IFJ1Z2J5U3RhdGlzdGljLnRvRnJvbnQocmVzdWx0LmJvZHkpXG4gICAgICB9KSlcbiAgICApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VG91cm5hbWVudFRlYW1Vc2Vycyh0b3VybmFtZW50VGVhbUlkOiBudW1iZXIpOiBQcm9taXNlPFRvdXJuYW1lbnRUZWFtVXNlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50X3RlYW0vJHt0b3VybmFtZW50VGVhbUlkfS91c2Vycy9gKS5waXBlKFxuICAgICAgbWFwKHJlc3VsdCA9PiBUb3VybmFtZW50VGVhbVVzZXIudG9Gcm9udChyZXN1bHQpKVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBteVBlcm1pc3Npb24odG91cm5hbWVudElkOiBudW1iZXIpOiBQcm9taXNlPExlYWd1ZVVzZXJQZXJtaXNzaW9uc1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoYCR7dGhpcy5jb25maWdTZXJ2aWNlLmdldCgnYXBpVXJsJyl9L2FwaS92MS90b3VybmFtZW50LyR7dG91cm5hbWVudElkfS9wZXJtaXNzaW9uL2ApLnBpcGUoXG4gICAgICBtYXAoKGRhdGE6IGFueSkgPT4gKGRhdGEucGVybWlzc2lvbnMgfHwgW10pLm1hcChpdGVtID0+IExlYWd1ZVVzZXJQZXJtaXNzaW9uc1tpdGVtXSkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGdldFRvdXJuYW1lbnRUZWFtVG91cm5hbWVudHModG91cm5hbWVudFRlYW1JZDogbnVtYmVyKTogUHJvbWlzZTxUb3VybmFtZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChgJHt0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlVcmwnKX0vYXBpL3YxL3RvdXJuYW1lbnRfdGVhbS8ke3RvdXJuYW1lbnRUZWFtSWR9L3RvdXJuYW1lbnRzL2ApLnBpcGUoXG4gICAgICBtYXAocmVzdWx0ID0+IFRvdXJuYW1lbnQudG9Gcm9udChyZXN1bHQpKVxuICAgICkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBnZXRUb3VybmFtZW50VXNlclRvdXJuYW1lbnRzKHRvdXJuYW1lbnRUZWFtVXNlcklkOiBudW1iZXIpOiBQcm9taXNlPFRvdXJuYW1lbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnU2VydmljZS5nZXQoJ2FwaVVybCcpfS9hcGkvdjEvdG91cm5hbWVudF90ZWFtX3VzZXIvJHt0b3VybmFtZW50VGVhbVVzZXJJZH0vdG91cm5hbWVudHMvYCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4gVG91cm5hbWVudC50b0Zyb250KHJlc3VsdCkpXG4gICAgKS50b1Byb21pc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlHYW1lc0ZpbHRlcnMoZmlsdGVyczogVG91cm5hbWVudEdhbWVzRmlsdGVycywgcGFyYW1zOiBIdHRwUGFyYW1zKTogSHR0cFBhcmFtcyB7XG4gIGlmIChmaWx0ZXJzLnRvdXJuYW1lbnRJZHMpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0b3VybmFtZW50X2lkcycsIGZpbHRlcnMudG91cm5hbWVudElkcy5qb2luKCcsJykpO1xuICB9XG4gIGlmIChmaWx0ZXJzLnRvdXJuYW1lbnRTdGFnZUlkKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgndG91cm5hbWVudF9zdGFnZV9pZCcsIGZpbHRlcnMudG91cm5hbWVudFN0YWdlSWQudG9TdHJpbmcoKSk7XG4gIH1cbiAgaWYgKGZpbHRlcnMudG91cm5hbWVudFRvdXIpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0b3VybmFtZW50X3RvdXInLCBmaWx0ZXJzLnRvdXJuYW1lbnRUb3VyLnRvU3RyaW5nKCkpO1xuICB9XG4gIGlmIChmaWx0ZXJzLnBsYXlvZmZTdGFnZSkge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3BsYXlvZmZfc3RhZ2UnLCBmaWx0ZXJzLnBsYXlvZmZTdGFnZS50b1N0cmluZygpKTtcbiAgfVxuICBpZiAoZmlsdGVycy5wbGF5b2ZmUm91bmQpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwbGF5b2ZmX3JvdW5kJywgZmlsdGVycy5wbGF5b2ZmUm91bmQudG9TdHJpbmcoKSk7XG4gIH1cbiAgaWYgKGZpbHRlcnMudGVhbUlkKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgndGVhbV9pZCcsIGZpbHRlcnMudGVhbUlkLnRvU3RyaW5nKCkpO1xuICB9XG4gIGlmIChmaWx0ZXJzLnN0YXR1cykge1xuICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3N0YXR1cycsIEdhbWVTdGF0dXNlc1tmaWx0ZXJzLnN0YXR1c10pO1xuICB9XG4gIGlmIChmaWx0ZXJzLnN0YXR1c2VzKSB7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBmaWx0ZXJzLnN0YXR1c2VzLm1hcChpID0+IEdhbWVTdGF0dXNlc1tpXSk7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgnc3RhdHVzZXMnLCBzdGF0dXNlcy5qb2luKCcsJykpO1xuICB9XG4gIGlmIChmaWx0ZXJzLnRvdXJuYW1lbnRDb3VydElkKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgndG91cm5hbWVudF9jb3VydF9pZCcsIGZpbHRlcnMudG91cm5hbWVudENvdXJ0SWQudG9TdHJpbmcoKSk7XG4gIH1cbiAgaWYgKGZpbHRlcnMubGVhZ3VlUGxheWVySWQpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdsZWFndWVfcGxheWVyX2lkJywgZmlsdGVycy5sZWFndWVQbGF5ZXJJZC50b1N0cmluZygpKTtcbiAgfVxuICBpZiAoZmlsdGVycy51c2VySWQpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd1c2VyX2lkJywgZmlsdGVycy51c2VySWQudG9TdHJpbmcoKSk7XG4gIH1cbiAgaWYgKGZpbHRlcnMucXVlcnkpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdxdWVyeScsIGZpbHRlcnMucXVlcnkpO1xuICB9XG4gIGlmIChmaWx0ZXJzLmlzUGxheW9mZiAhPT0gdW5kZWZpbmVkICYmIGZpbHRlcnMuaXNQbGF5b2ZmICE9PSBudWxsKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgnaXNfcGxheW9mZicsIGZpbHRlcnMuaXNQbGF5b2ZmID8gJzEnIDogJzAnKTtcbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTdGF0aXN0aWNGaWx0ZXJzKGZpbHRlcnM6IFN0YXRpc3RpY0ZpbHRlcnMsIHBhcmFtczogSHR0cFBhcmFtcyk6IEh0dHBQYXJhbXMge1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWx0ZXJzKSkge1xuICAgIGlmIChmaWx0ZXJzW2tleV0pIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoa2V5LCBmaWx0ZXJzW2tleV0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmaWx0ZXJzLnBlcl9nYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdwZXJfZ2FtZScsIGZpbHRlcnMucGVyX2dhbWUgPyAnMScgOiAnMCcpO1xuICB9XG5cbiAgaWYgKGZpbHRlcnMudG91cm5hbWVudF9pZHMpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCd0b3VybmFtZW50X2lkcycsIGZpbHRlcnMudG91cm5hbWVudF9pZHMuam9pbignLCcpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXJzLmlzX3BsYXlvZmYgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJzLmlzX3BsYXlvZmYgIT09IG51bGwpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdpc19wbGF5b2ZmJywgZmlsdGVycy5pc19wbGF5b2ZmID8gJzEnIDogJzAnKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVN0YXRpc3RpY0xlYWRlcnNGaWx0ZXJzKGZpbHRlcnM6IFN0YXRpc3RpY0xlYWRlcnNGaWx0ZXJzLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBIdHRwUGFyYW1zIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmlsdGVycykpIHtcbiAgICBpZiAoZmlsdGVyc1trZXldKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KGtleSwgZmlsdGVyc1trZXldKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZmlsdGVycy5wZXJfZ2FtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgncGVyX2dhbWUnLCBmaWx0ZXJzLnBlcl9nYW1lID8gJzEnIDogJzAnKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXJzLnRvdXJuYW1lbnRfaWRzKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgndG91cm5hbWVudF9pZHMnLCBmaWx0ZXJzLnRvdXJuYW1lbnRfaWRzLmpvaW4oJywnKSk7XG4gIH1cbiAgaWYgKGZpbHRlcnMuZmllbGRzKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zLnNldCgnZmllbGRzJywgZmlsdGVycy5maWVsZHMuam9pbignLCcpKTtcbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuIl19