@shipfox/api-runners 4.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/CHANGELOG.md +83 -0
  3. package/dist/config.d.ts +5 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +53 -6
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/capacity-assignments.d.ts +7 -0
  8. package/dist/core/capacity-assignments.d.ts.map +1 -0
  9. package/dist/core/capacity-assignments.js +6 -0
  10. package/dist/core/capacity-assignments.js.map +1 -0
  11. package/dist/core/demand.d.ts +6 -6
  12. package/dist/core/demand.d.ts.map +1 -1
  13. package/dist/core/demand.js +10 -10
  14. package/dist/core/demand.js.map +1 -1
  15. package/dist/core/entities/capacity-assignment.d.ts +9 -0
  16. package/dist/core/entities/capacity-assignment.d.ts.map +1 -0
  17. package/dist/core/entities/capacity-assignment.js +3 -0
  18. package/dist/core/entities/capacity-assignment.js.map +1 -0
  19. package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
  20. package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
  21. package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
  22. package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
  23. package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
  24. package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
  25. package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
  26. package/dist/core/entities/provisioner-token.d.ts +10 -2
  27. package/dist/core/entities/provisioner-token.d.ts.map +1 -1
  28. package/dist/core/entities/provisioner-token.js.map +1 -1
  29. package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +6 -6
  30. package/dist/core/entities/runner-instance.d.ts.map +1 -0
  31. package/dist/core/entities/runner-instance.js +3 -0
  32. package/dist/core/entities/runner-instance.js.map +1 -0
  33. package/dist/core/entities/runner-session.d.ts +4 -2
  34. package/dist/core/entities/runner-session.d.ts.map +1 -1
  35. package/dist/core/entities/runner-session.js.map +1 -1
  36. package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
  37. package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
  38. package/dist/core/ephemeral-registration-tokens.js +12 -12
  39. package/dist/core/ephemeral-registration-tokens.js.map +1 -1
  40. package/dist/core/errors.d.ts +16 -4
  41. package/dist/core/errors.d.ts.map +1 -1
  42. package/dist/core/errors.js +22 -4
  43. package/dist/core/errors.js.map +1 -1
  44. package/dist/core/index.d.ts +10 -4
  45. package/dist/core/index.d.ts.map +1 -1
  46. package/dist/core/index.js +6 -2
  47. package/dist/core/index.js.map +1 -1
  48. package/dist/core/job-executions.d.ts +2 -0
  49. package/dist/core/job-executions.d.ts.map +1 -1
  50. package/dist/core/job-executions.js +1 -2
  51. package/dist/core/job-executions.js.map +1 -1
  52. package/dist/core/maintenance.d.ts +1 -1
  53. package/dist/core/maintenance.d.ts.map +1 -1
  54. package/dist/core/maintenance.js +5 -5
  55. package/dist/core/maintenance.js.map +1 -1
  56. package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
  57. package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
  58. package/dist/core/provisioner-capability-snapshots.js +10 -0
  59. package/dist/core/provisioner-capability-snapshots.js.map +1 -0
  60. package/dist/core/provisioner-tokens.d.ts +10 -0
  61. package/dist/core/provisioner-tokens.d.ts.map +1 -1
  62. package/dist/core/provisioner-tokens.js +23 -1
  63. package/dist/core/provisioner-tokens.js.map +1 -1
  64. package/dist/core/rate-limit.d.ts.map +1 -1
  65. package/dist/core/rate-limit.js +2 -7
  66. package/dist/core/rate-limit.js.map +1 -1
  67. package/dist/core/runner-activation.d.ts +13 -0
  68. package/dist/core/runner-activation.d.ts.map +1 -0
  69. package/dist/core/runner-activation.js +36 -0
  70. package/dist/core/runner-activation.js.map +1 -0
  71. package/dist/core/runner-control-sessions.d.ts +46 -0
  72. package/dist/core/runner-control-sessions.d.ts.map +1 -0
  73. package/dist/core/runner-control-sessions.js +121 -0
  74. package/dist/core/runner-control-sessions.js.map +1 -0
  75. package/dist/core/runner-instances.d.ts +79 -0
  76. package/dist/core/runner-instances.d.ts.map +1 -0
  77. package/dist/core/runner-instances.js +168 -0
  78. package/dist/core/runner-instances.js.map +1 -0
  79. package/dist/core/runner-sessions.d.ts +8 -2
  80. package/dist/core/runner-sessions.d.ts.map +1 -1
  81. package/dist/core/runner-sessions.js +8 -5
  82. package/dist/core/runner-sessions.js.map +1 -1
  83. package/dist/db/capacity-assignments.d.ts +7 -0
  84. package/dist/db/capacity-assignments.d.ts.map +1 -0
  85. package/dist/db/capacity-assignments.js +72 -0
  86. package/dist/db/capacity-assignments.js.map +1 -0
  87. package/dist/db/db.d.ts +2837 -1009
  88. package/dist/db/db.d.ts.map +1 -1
  89. package/dist/db/db.js +11 -2
  90. package/dist/db/db.js.map +1 -1
  91. package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
  92. package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
  93. package/dist/db/ephemeral-registration-tokens.js +21 -21
  94. package/dist/db/ephemeral-registration-tokens.js.map +1 -1
  95. package/dist/db/index.d.ts +7 -4
  96. package/dist/db/index.d.ts.map +1 -1
  97. package/dist/db/index.js +5 -2
  98. package/dist/db/index.js.map +1 -1
  99. package/dist/db/job-executions.d.ts +6 -6
  100. package/dist/db/job-executions.d.ts.map +1 -1
  101. package/dist/db/job-executions.js +20 -19
  102. package/dist/db/job-executions.js.map +1 -1
  103. package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
  104. package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
  105. package/dist/db/provisioner-capability-snapshots.js +57 -0
  106. package/dist/db/provisioner-capability-snapshots.js.map +1 -0
  107. package/dist/db/provisioner-tokens.d.ts +7 -2
  108. package/dist/db/provisioner-tokens.d.ts.map +1 -1
  109. package/dist/db/provisioner-tokens.js +59 -10
  110. package/dist/db/provisioner-tokens.js.map +1 -1
  111. package/dist/db/reservations.d.ts +18 -0
  112. package/dist/db/reservations.d.ts.map +1 -1
  113. package/dist/db/reservations.js +88 -1
  114. package/dist/db/reservations.js.map +1 -1
  115. package/dist/db/runner-instances.d.ts +91 -0
  116. package/dist/db/runner-instances.d.ts.map +1 -0
  117. package/dist/db/runner-instances.js +511 -0
  118. package/dist/db/runner-instances.js.map +1 -0
  119. package/dist/db/runner-sessions.d.ts +5 -0
  120. package/dist/db/runner-sessions.d.ts.map +1 -1
  121. package/dist/db/runner-sessions.js +48 -2
  122. package/dist/db/runner-sessions.js.map +1 -1
  123. package/dist/db/schema/capacity-assignments.d.ts +113 -0
  124. package/dist/db/schema/capacity-assignments.d.ts.map +1 -0
  125. package/dist/db/schema/capacity-assignments.js +29 -0
  126. package/dist/db/schema/capacity-assignments.js.map +1 -0
  127. package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
  128. package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
  129. package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
  130. package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
  131. package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
  132. package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
  133. package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
  134. package/dist/db/schema/provisioner-tokens.d.ts +19 -1
  135. package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
  136. package/dist/db/schema/provisioner-tokens.js +29 -3
  137. package/dist/db/schema/provisioner-tokens.js.map +1 -1
  138. package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
  139. package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
  140. package/dist/db/schema/runner-activation-tokens.js +27 -0
  141. package/dist/db/schema/runner-activation-tokens.js.map +1 -0
  142. package/dist/db/schema/runner-control-sessions.d.ts +338 -0
  143. package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
  144. package/dist/db/schema/runner-control-sessions.js +52 -0
  145. package/dist/db/schema/runner-control-sessions.js.map +1 -0
  146. package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +88 -34
  147. package/dist/db/schema/runner-instances.d.ts.map +1 -0
  148. package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +19 -14
  149. package/dist/db/schema/runner-instances.js.map +1 -0
  150. package/dist/db/schema/runner-sessions.d.ts +39 -5
  151. package/dist/db/schema/runner-sessions.d.ts.map +1 -1
  152. package/dist/db/schema/runner-sessions.js +13 -6
  153. package/dist/db/schema/runner-sessions.js.map +1 -1
  154. package/dist/db/schema/running-job-executions.d.ts +2 -2
  155. package/dist/db/schema/running-job-executions.js +4 -4
  156. package/dist/db/schema/running-job-executions.js.map +1 -1
  157. package/dist/index.d.ts +7 -2
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +45 -38
  160. package/dist/index.js.map +1 -1
  161. package/dist/installation-provisioning.d.ts +14 -0
  162. package/dist/installation-provisioning.d.ts.map +1 -0
  163. package/dist/installation-provisioning.js +7 -0
  164. package/dist/installation-provisioning.js.map +1 -0
  165. package/dist/metrics/index.d.ts +1 -1
  166. package/dist/metrics/index.d.ts.map +1 -1
  167. package/dist/metrics/index.js +1 -1
  168. package/dist/metrics/index.js.map +1 -1
  169. package/dist/metrics/instance.d.ts +11 -7
  170. package/dist/metrics/instance.d.ts.map +1 -1
  171. package/dist/metrics/instance.js +13 -7
  172. package/dist/metrics/instance.js.map +1 -1
  173. package/dist/presentation/auth/index.d.ts +1 -0
  174. package/dist/presentation/auth/index.d.ts.map +1 -1
  175. package/dist/presentation/auth/index.js +1 -0
  176. package/dist/presentation/auth/index.js.map +1 -1
  177. package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
  178. package/dist/presentation/auth/provisioner-token-auth.js +5 -1
  179. package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
  180. package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
  181. package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
  182. package/dist/presentation/auth/runner-control-session-auth.js +29 -0
  183. package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
  184. package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
  185. package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
  186. package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
  187. package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
  188. package/dist/presentation/dto/index.d.ts +2 -2
  189. package/dist/presentation/dto/index.d.ts.map +1 -1
  190. package/dist/presentation/dto/index.js +2 -2
  191. package/dist/presentation/dto/index.js.map +1 -1
  192. package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -3
  193. package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -1
  194. package/dist/presentation/dto/mint-registration-tokens.js +4 -4
  195. package/dist/presentation/dto/mint-registration-tokens.js.map +1 -1
  196. package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
  197. package/dist/presentation/dto/poll-demand.js +7 -1
  198. package/dist/presentation/dto/poll-demand.js.map +1 -1
  199. package/dist/presentation/dto/provisioner-token.d.ts +1 -0
  200. package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
  201. package/dist/presentation/dto/provisioner-token.js +5 -1
  202. package/dist/presentation/dto/provisioner-token.js.map +1 -1
  203. package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
  204. package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
  205. package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
  206. package/dist/presentation/dto/runner-instances.js.map +1 -0
  207. package/dist/presentation/index.d.ts +2 -2
  208. package/dist/presentation/index.d.ts.map +1 -1
  209. package/dist/presentation/index.js +2 -2
  210. package/dist/presentation/index.js.map +1 -1
  211. package/dist/presentation/inter-module.d.ts +5 -0
  212. package/dist/presentation/inter-module.d.ts.map +1 -0
  213. package/dist/presentation/inter-module.js +43 -0
  214. package/dist/presentation/inter-module.js.map +1 -0
  215. package/dist/presentation/routes/assign-capacity.d.ts +2 -0
  216. package/dist/presentation/routes/assign-capacity.d.ts.map +1 -0
  217. package/dist/presentation/routes/assign-capacity.js +44 -0
  218. package/dist/presentation/routes/assign-capacity.js.map +1 -0
  219. package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
  220. package/dist/presentation/routes/get-provisioner-me.js +5 -1
  221. package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
  222. package/dist/presentation/routes/heartbeat.d.ts +2 -1
  223. package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
  224. package/dist/presentation/routes/heartbeat.js +60 -50
  225. package/dist/presentation/routes/heartbeat.js.map +1 -1
  226. package/dist/presentation/routes/index.d.ts +3 -1
  227. package/dist/presentation/routes/index.d.ts.map +1 -1
  228. package/dist/presentation/routes/index.js +83 -50
  229. package/dist/presentation/routes/index.js.map +1 -1
  230. package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -1
  231. package/dist/presentation/routes/mint-registration-tokens.js +5 -5
  232. package/dist/presentation/routes/mint-registration-tokens.js.map +1 -1
  233. package/dist/presentation/routes/planned-capacity.d.ts +3 -0
  234. package/dist/presentation/routes/planned-capacity.d.ts.map +1 -0
  235. package/dist/presentation/routes/planned-capacity.js +54 -0
  236. package/dist/presentation/routes/planned-capacity.js.map +1 -0
  237. package/dist/presentation/routes/poll-demand.d.ts +2 -0
  238. package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
  239. package/dist/presentation/routes/poll-demand.js +86 -45
  240. package/dist/presentation/routes/poll-demand.js.map +1 -1
  241. package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
  242. package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
  243. package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
  244. package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
  245. package/dist/presentation/routes/register.d.ts +2 -1
  246. package/dist/presentation/routes/register.d.ts.map +1 -1
  247. package/dist/presentation/routes/register.js +55 -52
  248. package/dist/presentation/routes/register.js.map +1 -1
  249. package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
  250. package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
  251. package/dist/presentation/routes/report-runner-instances.js +37 -0
  252. package/dist/presentation/routes/report-runner-instances.js.map +1 -0
  253. package/dist/presentation/routes/request-job.d.ts +2 -1
  254. package/dist/presentation/routes/request-job.d.ts.map +1 -1
  255. package/dist/presentation/routes/request-job.js +39 -36
  256. package/dist/presentation/routes/request-job.js.map +1 -1
  257. package/dist/presentation/routes/runner-enrollment.d.ts +7 -0
  258. package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
  259. package/dist/presentation/routes/runner-enrollment.js +185 -0
  260. package/dist/presentation/routes/runner-enrollment.js.map +1 -0
  261. package/dist/temporal/activities/index.d.ts +2 -2
  262. package/dist/temporal/activities/index.d.ts.map +1 -1
  263. package/dist/temporal/activities/index.js +2 -2
  264. package/dist/temporal/activities/index.js.map +1 -1
  265. package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
  266. package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
  267. package/dist/temporal/activities/maintenance-activities.js +3 -3
  268. package/dist/temporal/activities/maintenance-activities.js.map +1 -1
  269. package/dist/temporal/workflows/index.bundle.js +3 -3
  270. package/dist/temporal/workflows/stuck-job-detector.js +2 -2
  271. package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
  272. package/dist/tsconfig.test.tsbuildinfo +1 -1
  273. package/drizzle/0000_initial.sql +102 -24
  274. package/drizzle/meta/0000_snapshot.json +483 -63
  275. package/package.json +31 -36
  276. package/src/config.test.ts +0 -26
  277. package/src/config.ts +47 -6
  278. package/src/core/capacity-assignments.ts +10 -0
  279. package/src/core/demand.test.ts +29 -29
  280. package/src/core/demand.ts +22 -22
  281. package/src/core/entities/capacity-assignment.ts +8 -0
  282. package/src/core/entities/ephemeral-registration-token.ts +1 -1
  283. package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
  284. package/src/core/entities/provisioner-token.ts +8 -2
  285. package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +5 -5
  286. package/src/core/entities/runner-session.ts +4 -2
  287. package/src/core/ephemeral-registration-tokens.test.ts +11 -11
  288. package/src/core/ephemeral-registration-tokens.ts +18 -20
  289. package/src/core/errors.ts +23 -4
  290. package/src/core/index.ts +39 -17
  291. package/src/core/job-executions.ts +3 -2
  292. package/src/core/maintenance.test.ts +13 -17
  293. package/src/core/maintenance.ts +5 -5
  294. package/src/core/provisioner-capability-snapshots.test.ts +35 -0
  295. package/src/core/provisioner-capability-snapshots.ts +12 -0
  296. package/src/core/provisioner-tokens.test.ts +20 -0
  297. package/src/core/provisioner-tokens.ts +33 -0
  298. package/src/core/rate-limit.test.ts +11 -27
  299. package/src/core/rate-limit.ts +3 -11
  300. package/src/core/runner-activation.ts +72 -0
  301. package/src/core/runner-control-sessions.ts +190 -0
  302. package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
  303. package/src/core/runner-instances.ts +310 -0
  304. package/src/core/runner-sessions.test.ts +112 -22
  305. package/src/core/runner-sessions.ts +25 -14
  306. package/src/db/capacity-assignments.test.ts +159 -0
  307. package/src/db/capacity-assignments.ts +116 -0
  308. package/src/db/db.ts +11 -2
  309. package/src/db/ephemeral-registration-tokens.test.ts +9 -9
  310. package/src/db/ephemeral-registration-tokens.ts +26 -26
  311. package/src/db/index.ts +31 -21
  312. package/src/db/job-executions.test.ts +13 -11
  313. package/src/db/job-executions.ts +33 -27
  314. package/src/db/provisioner-capability-snapshots.test.ts +175 -0
  315. package/src/db/provisioner-capability-snapshots.ts +130 -0
  316. package/src/db/provisioner-tokens.test.ts +139 -2
  317. package/src/db/provisioner-tokens.ts +123 -15
  318. package/src/db/reservations.test.ts +49 -0
  319. package/src/db/reservations.ts +146 -1
  320. package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +429 -353
  321. package/src/db/runner-instances.ts +942 -0
  322. package/src/db/runner-sessions.test.ts +19 -6
  323. package/src/db/runner-sessions.ts +78 -2
  324. package/src/db/schema/capacity-assignments.ts +34 -0
  325. package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
  326. package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
  327. package/src/db/schema/provisioner-tokens.ts +33 -2
  328. package/src/db/schema/runner-activation-tokens.ts +22 -0
  329. package/src/db/schema/runner-control-sessions.ts +46 -0
  330. package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +26 -27
  331. package/src/db/schema/runner-sessions.ts +11 -7
  332. package/src/db/schema/running-job-executions.ts +5 -5
  333. package/src/index.test.ts +26 -0
  334. package/src/index.ts +39 -19
  335. package/src/installation-provisioning.ts +14 -0
  336. package/src/metrics/index.ts +5 -5
  337. package/src/metrics/instance.ts +25 -14
  338. package/src/presentation/auth/index.ts +4 -0
  339. package/src/presentation/auth/provisioner-token-auth.ts +8 -4
  340. package/src/presentation/auth/runner-control-session-auth.ts +31 -0
  341. package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
  342. package/src/presentation/dto/index.ts +5 -5
  343. package/src/presentation/dto/mint-registration-tokens.ts +8 -15
  344. package/src/presentation/dto/poll-demand.ts +3 -1
  345. package/src/presentation/dto/provisioner-token.ts +5 -0
  346. package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
  347. package/src/presentation/index.ts +2 -1
  348. package/src/presentation/inter-module.test.ts +15 -0
  349. package/src/presentation/inter-module.ts +53 -0
  350. package/src/presentation/routes/assign-capacity.ts +48 -0
  351. package/src/presentation/routes/get-provisioner-me.ts +3 -4
  352. package/src/presentation/routes/heartbeat.test.ts +4 -3
  353. package/src/presentation/routes/heartbeat.ts +67 -64
  354. package/src/presentation/routes/index.ts +93 -43
  355. package/src/presentation/routes/list-active-runners.test.ts +23 -23
  356. package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
  357. package/src/presentation/routes/mint-registration-tokens.test.ts +12 -12
  358. package/src/presentation/routes/mint-registration-tokens.ts +5 -7
  359. package/src/presentation/routes/planned-capacity.ts +49 -0
  360. package/src/presentation/routes/poll-demand-release.test.ts +4 -4
  361. package/src/presentation/routes/poll-demand.test.ts +161 -22
  362. package/src/presentation/routes/poll-demand.ts +105 -45
  363. package/src/presentation/routes/provisioner-me.test.ts +37 -3
  364. package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
  365. package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
  366. package/src/presentation/routes/register.test.ts +9 -5
  367. package/src/presentation/routes/register.ts +61 -57
  368. package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
  369. package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
  370. package/src/presentation/routes/request-job.test.ts +5 -3
  371. package/src/presentation/routes/request-job.ts +41 -37
  372. package/src/presentation/routes/runner-enrollment.test.ts +259 -0
  373. package/src/presentation/routes/runner-enrollment.ts +174 -0
  374. package/src/temporal/activities/index.ts +2 -2
  375. package/src/temporal/activities/maintenance-activities.test.ts +7 -7
  376. package/src/temporal/activities/maintenance-activities.ts +3 -3
  377. package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
  378. package/src/temporal/workflows/stuck-job-detector.ts +2 -2
  379. package/test/env.ts +1 -3
  380. package/test/factories/ephemeral-registration-token.ts +2 -2
  381. package/test/factories/provisioner-token.ts +3 -1
  382. package/test/factories/runner-instance.ts +57 -0
  383. package/test/factories/runner-session.ts +3 -1
  384. package/test/fixtures/auth-inter-module.ts +30 -0
  385. package/test/globalSetup.ts +5 -1
  386. package/test/index.ts +2 -1
  387. package/tsconfig.build.tsbuildinfo +1 -1
  388. package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
  389. package/dist/core/entities/provisioned-runner.js +0 -3
  390. package/dist/core/entities/provisioned-runner.js.map +0 -1
  391. package/dist/core/provisioned-runners.d.ts +0 -67
  392. package/dist/core/provisioned-runners.d.ts.map +0 -1
  393. package/dist/core/provisioned-runners.js +0 -162
  394. package/dist/core/provisioned-runners.js.map +0 -1
  395. package/dist/db/provisioned-runners.d.ts +0 -79
  396. package/dist/db/provisioned-runners.d.ts.map +0 -1
  397. package/dist/db/provisioned-runners.js +0 -466
  398. package/dist/db/provisioned-runners.js.map +0 -1
  399. package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
  400. package/dist/db/schema/provisioned-runners.js.map +0 -1
  401. package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
  402. package/dist/presentation/dto/provisioned-runners.js.map +0 -1
  403. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
  404. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
  405. package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
  406. package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
  407. package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
  408. package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
  409. package/dist/presentation/routes/report-provisioned-runners.js +0 -37
  410. package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
  411. package/src/core/provisioned-runners.ts +0 -301
  412. package/src/db/provisioned-runners.ts +0 -886
  413. package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
  414. package/test/factories/provisioned-runner.ts +0 -78
@@ -11255,7 +11255,7 @@ __webpack_require__.r(__webpack_exports__);
11255
11255
  /* harmony import */ var _core_maintenance_policy_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! #core/maintenance-policy.js */ "./dist/core/maintenance-policy.js");
11256
11256
 
11257
11257
 
11258
- const { deleteExpiredEphemeralRegistrationTokensActivity, deleteExpiredReservationsActivity, deleteExpiredRunnerSessionsActivity, detectAndExpireStuckJobsActivity, reapStaleProvisionedRunnersActivity } = (0,_temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__.proxyActivities)({
11258
+ const { deleteExpiredEphemeralRegistrationTokensActivity, deleteExpiredReservationsActivity, deleteExpiredRunnerSessionsActivity, detectAndExpireStuckJobsActivity, reapStaleRunnerInstancesActivity } = (0,_temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__.proxyActivities)({
11259
11259
  startToCloseTimeout: '60s'
11260
11260
  });
11261
11261
  async function stuckJobDetector() {
@@ -11304,7 +11304,7 @@ async function stuckJobDetector() {
11304
11304
  thresholdSeconds: _core_maintenance_policy_js__WEBPACK_IMPORTED_MODULE_1__.STUCK_JOB_THRESHOLD_SECONDS
11305
11305
  });
11306
11306
  }
11307
- const { reaped, reservationsReleased } = await reapStaleProvisionedRunnersActivity();
11307
+ const { reaped, reservationsReleased } = await reapStaleRunnerInstancesActivity();
11308
11308
  if (reaped > 0) {
11309
11309
  _temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__.log.info('Stuck-job detector reaped stale provisioned runners', {
11310
11310
  reaped,
@@ -11423,4 +11423,4 @@ exports.importInterceptors = function importInterceptors() {
11423
11423
  __TEMPORAL__ = __webpack_exports__;
11424
11424
  /******/ })()
11425
11425
  ;
11426
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuRCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUM5RixJQUFJLENB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OztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QVksbUJBQU8sQ0FBQyx1S0FBOEM7QUFDbEUsV0FBVzs7QUFFWCxRQUFRLGtCQUFrQixFQUFFLG1CQUFPLENBQUMsdUtBQThDO0FBQ2xGOztBQUVBLHNCQUFzQjs7QUFFdEI7O0FBRUEsdUJBQXVCO0FBQ3ZCLFNBQVMsbUJBQU8sNEJBQTRCLDhFQUFxRjtBQUNqSTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1jYW5jZWxsYXRpb24tZGV0YWlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnRpbnVlLWFzLW5ldy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvZGF0YS1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvbnZlcnRlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvdHlwZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZGVwcmVjYXRlZC10aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2VuY29kaW5nLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2Vycm9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9mYWlsdXJlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmZhY2VzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvb2JqZWN0cy1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2xvZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ByaW9yaXR5LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3Jlc2VydmVkLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3JldHJ5LXBvbGljeS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3R5cGUtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy91c2VyLW1ldGFkYXRhLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LWVudW0udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdmVyc2lvbmluZy1pbnRlbnQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2VyLWRlcGxveW1lbnRzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZmxvdy1oYW5kbGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvYWxlYS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvY2FuY2VsbGF0aW9uLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9jdXJyZW50LXJhbmRvbS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZXJyb3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9mbGFncy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLWF0dHJpYnV0ZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2dsb2JhbC1vdmVycmlkZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmNlcHRvci1jb21wb3NpdGlvbi50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJjZXB0b3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmZhY2VzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcm5hbHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2xvZ3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL21ldHJpY3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL25leHVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9wa2cudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3JhbmRvbS1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9yYW5kb20tc3RyZWFtLXNlZWQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3JhbmRvbS1zdHJlYW1zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9zaW5rcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc3RhY2staGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdHJpZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdXBkYXRlLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZXItaW50ZXJmYWNlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZmxvdy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9oYW5kbGVyLWVycm9yLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL29wZXJhdGlvbi1lcnJvci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL29wZXJhdGlvbi1oYW5kbGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9zZXJ2aWNlLWhhbmRsZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL29iamVjdC11dGlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2Uvc2VydmljZS1kZWZpbml0aW9uLnRzIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX2ZhaWx1cmVfY29udmVydGVyIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX3BheWxvYWRfY29udmVydGVyIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9tc0AzLjAuMC1jYW5hcnkuMS9ub2RlX21vZHVsZXMvbXMvZGlzdC9pbmRleC5tanMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL2xvbmdANS4zLjIvbm9kZV9tb2R1bGVzL2xvbmcvaW5kZXguanMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbGlicy9hcGkvcnVubmVycy9zcmMvY29yZS9tYWludGVuYW5jZS1wb2xpY3kudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbGlicy9hcGkvcnVubmVycy9zcmMvdGVtcG9yYWwvd29ya2Zsb3dzL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL3J1bm5lcnMvc3JjL3RlbXBvcmFsL3dvcmtmbG93cy9zdHVjay1qb2ItZGV0ZWN0b3IudHMiLCJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0IiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL3J1bm5lcnMvZGlzdC90ZW1wb3JhbC93b3JrZmxvd3MvaW5kZXgtYXV0b2dlbmVyYXRlZC1lbnRyeXBvaW50LmNqcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc0hvbGRlciB7XG4gIGRldGFpbHM/OiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzT3B0aW9ucyB7XG4gIG5vdEZvdW5kPzogYm9vbGVhbjtcbiAgY2FuY2VsUmVxdWVzdGVkPzogYm9vbGVhbjtcbiAgcGF1c2VkPzogYm9vbGVhbjtcbiAgdGltZWRPdXQ/OiBib29sZWFuO1xuICB3b3JrZXJTaHV0ZG93bj86IGJvb2xlYW47XG4gIHJlc2V0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVhc29ucyBmb3IgdGhlIGFjdGl2aXR5J3MgY2FuY2VsbGF0aW9uLiBDYW5jZWxsYXRpb24gZGV0YWlscyBhcmUgc2V0IG9uY2UgYW5kIGRvIG5vdCBjaGFuZ2Ugb25jZSBzZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMge1xuICByZWFkb25seSBub3RGb3VuZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBib29sZWFuO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRpbWVkT3V0OiBib29sZWFuO1xuICByZWFkb25seSB3b3JrZXJTaHV0ZG93bjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVzZXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubm90Rm91bmQgPSBvcHRpb25zLm5vdEZvdW5kID8/IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gb3B0aW9ucy5jYW5jZWxSZXF1ZXN0ZWQgPz8gZmFsc2U7XG4gICAgdGhpcy5wYXVzZWQgPSBvcHRpb25zLnBhdXNlZCA/PyBmYWxzZTtcbiAgICB0aGlzLnRpbWVkT3V0ID0gb3B0aW9ucy50aW1lZE91dCA/PyBmYWxzZTtcbiAgICB0aGlzLndvcmtlclNodXRkb3duID0gb3B0aW9ucy53b3JrZXJTaHV0ZG93biA/PyBmYWxzZTtcbiAgICB0aGlzLnJlc2V0ID0gb3B0aW9ucy5yZXNldCA/PyBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUHJvdG8oXG4gICAgcHJvdG86IGNvcmVzZGsuYWN0aXZpdHlfdGFzay5JQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMge1xuICAgIGlmIChwcm90byA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscygpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyh7XG4gICAgICBub3RGb3VuZDogcHJvdG8uaXNOb3RGb3VuZCA/PyBmYWxzZSxcbiAgICAgIGNhbmNlbFJlcXVlc3RlZDogcHJvdG8uaXNDYW5jZWxsZWQgPz8gZmFsc2UsXG4gICAgICBwYXVzZWQ6IHByb3RvLmlzUGF1c2VkID8/IGZhbHNlLFxuICAgICAgdGltZWRPdXQ6IHByb3RvLmlzVGltZWRPdXQgPz8gZmFsc2UsXG4gICAgICB3b3JrZXJTaHV0ZG93bjogcHJvdG8uaXNXb3JrZXJTaHV0ZG93biA/PyBmYWxzZSxcbiAgICAgIHJlc2V0OiBwcm90by5pc1Jlc2V0ID8/IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IFByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSc7XG5cbi8vIE5vdGU6IFRoZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgaGVyZSBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoZXkgc2hvdWxkIGhhdmUgYmVlbiBkZWZpbmVkXG4vLyBpbiB0aGUgJ3dvcmtmbG93JyBwYWNrYWdlLCBpbnN0ZWFkIG9mICdjb21tb24nLiBUaGV5IGFyZSBub3cgcmVleHBvcnRlZCBmcm9tIHRoZSAnd29ya2Zsb3cnXG4vLyBwYWNrYWdlLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBpbXBvcnQgdGhlbSwgYnV0IHdlIHVuZm9ydHVuYXRlbHkgY2FuJ3QgcmVtb3ZlIHRoZW0gZnJvbVxuLy8gaGVyZSBhcyB0aGF0IHdvdWxkIGJlIGEgYnJlYWtpbmcgY2hhbmdlLlxuXG4vKipcbiAqIERldGVybWluZXM6XG4gKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAqXG4gKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gKi9cbi8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eU9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgYW5kXG4vLyAgICAgICAgICAgICAgYExvY2FsQWN0aXZpdHlPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkcyBsYXRlciBpbiB0aGlzIGZpbGUuXG5leHBvcnQgY29uc3QgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIEFjdGl2aXR5LCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvblxuICAgKiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYWN0dWFsbHkgYmUgZGVsaXZlcmVkIHRvIHRoZSBBY3Rpdml0eTsgZS5nLiB0aGUgY2FsbGluZyBXb3JrZmxvd1xuICAgKiBtYXkgZXhpdCBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGNvbXBsZXRlZCwgb3IgdGhlIEFjdGl2aXR5IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseVxuICAgKiBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZSBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlXG4gICAqIHdvcmtmbG93IHRoaW5rcyB0aGUgYWN0aXZpdHkgd2FzIGNhbmNlbGxlZCwgYnV0IHRoZSBhY3Rpdml0eSBhY3R1YWxseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBUbyBlbnN1cmUgdGhhdCB0aGUgV29ya2Zsb3cgaXMgcHJvcGVybHkgaW5mb3JtZWQgb2YgdGhlIEFjdGl2aXR5J3MgZmluYWwgc3RhdGUgKGkuZS4gZWl0aGVyXG4gICAqIGNvbXBsZXRpb24gb3IgY2FuY2VsbGF0aW9uKSwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCBhbmQgd2FpdCBmb3IgdGhlIGFjdGl2aXR5XG4gICAqIHRvIGNvbXBsZXRlIGl0cyBleGVjdXRpb24gKGVpdGhlciBzdWNjZXNzZnVsbHksIHVuY2Vzc2Z1bGx5LCBvciBhcyBjYW5jZWxsZWQpLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIEFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IHRvIHJlY2VpdmUgYSBjYW5jZWxsYXRpb24gbm90aWZpY2F0aW9uLiBUaGlzIGNhbiBibG9ja1xuICAgKiB0aGUgV29ya2Zsb3cncyBjYW5jZWxsYXRpb24gZm9yIGEgbG9uZyB0aW1lIGlmIHRoZSBBY3Rpdml0eSBkb2Vzbid0IGhlYXJ0YmVhdCBvciBjaG9vc2VzIHRvXG4gICAqIGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuXG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9ICh0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsIGRlY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDAsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAxLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDIsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG5vbi1sb2NhbCBhY3Rpdml0eSBpbnZvY2F0aW9uIGluc2lkZSBhIHdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgdG8gdXNlIGZvciB0cmFja2luZyB0aGUgYWN0aXZpdHkgaW4gV29ya2Zsb3cgaGlzdG9yeS5cbiAgICogVGhlIGBhY3Rpdml0eUlkYCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIGFjdGl2aXR5IGZ1bmN0aW9uLlxuICAgKiBEb2VzIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyXG4gICAqL1xuICBhY3Rpdml0eUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGN1cnJlbnQgd29ya2VyIHRhc2sgcXVldWVcbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSGVhcnRiZWF0IGludGVydmFsLiBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCBiZWZvcmUgdGhpcyBpbnRlcnZhbCBwYXNzZXMgYWZ0ZXIgYSBsYXN0IGhlYXJ0YmVhdCBvciBhY3Rpdml0eSBzdGFydC5cbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBoZWFydGJlYXRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lIGhvdyBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBzZXJ2ZXItZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuIFRvIGVuc3VyZSB6ZXJvIHJldHJpZXMsIHNldCBtYXhpbXVtIGF0dGVtcHRzIHRvIDEuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgb2YgYSBzaW5nbGUgQWN0aXZpdHkgZXhlY3V0aW9uIGF0dGVtcHQuIE5vdGUgdGhhdCB0aGUgVGVtcG9yYWwgU2VydmVyIGRvZXNuJ3QgZGV0ZWN0IFdvcmtlciBwcm9jZXNzXG4gICAqIGZhaWx1cmVzIGRpcmVjdGx5OiBpbnN0ZWFkLCBpdCByZWxpZXMgb24gdGhpcyB0aW1lb3V0IHRvIGRldGVjdCB0aGF0IGFuIEFjdGl2aXR5IGRpZG4ndCBjb21wbGV0ZSBvbiB0aW1lLiBUaGVyZWZvcmUsIHRoaXNcbiAgICogdGltZW91dCBzaG91bGQgYmUgYXMgc2hvcnQgYXMgdGhlIGxvbmdlc3QgcG9zc2libGUgZXhlY3V0aW9uIG9mIHRoZSBBY3Rpdml0eSBib2R5LiBQb3RlbnRpYWxseSBsb25nLXJ1bm5pbmdcbiAgICogQWN0aXZpdGllcyBtdXN0IHNwZWNpZnkge0BsaW5rIGhlYXJ0YmVhdFRpbWVvdXR9IGFuZCBjYWxsIHtAbGluayBhY3Rpdml0eS5Db250ZXh0LmhlYXJ0YmVhdH0gcGVyaW9kaWNhbGx5IGZvclxuICAgKiB0aW1lbHkgZmFpbHVyZSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRpbWUgdGhhdCB0aGUgQWN0aXZpdHkgVGFzayBjYW4gc3RheSBpbiB0aGUgVGFzayBRdWV1ZSBiZWZvcmUgaXQgaXMgcGlja2VkIHVwIGJ5IGEgV29ya2VyLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHRpbWVvdXQgdW5sZXNzIHVzaW5nIGhvc3Qtc3BlY2lmaWMgVGFzayBRdWV1ZXMgZm9yIEFjdGl2aXR5IFRhc2tzIGFyZSBiZWluZyB1c2VkIGZvciByb3V0aW5nLlxuICAgKiBgc2NoZWR1bGVUb1N0YXJ0VGltZW91dGAgaXMgYWx3YXlzIG5vbi1yZXRyeWFibGUuIFJldHJ5aW5nIGFmdGVyIHRoaXMgdGltZW91dCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgaXQgd291bGQganVzdCBwdXQgdGhlIEFjdGl2aXR5IFRhc2sgYmFjayBpbnRvIHRoZSBzYW1lIFRhc2sgUXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRvdGFsIHRpbWUgdGhhdCBhIHdvcmtmbG93IGlzIHdpbGxpbmcgdG8gd2FpdCBmb3IgdGhlIEFjdGl2aXR5IHRvIGNvbXBsZXRlLlxuICAgKiBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgbGltaXRzIHRoZSB0b3RhbCB0aW1lIG9mIGFuIEFjdGl2aXR5J3MgZXhlY3V0aW9uIGluY2x1ZGluZyByZXRyaWVzICh1c2Uge0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IHRvIGxpbWl0IHRoZSB0aW1lIG9mIGEgc2luZ2xlIGF0dGVtcHQpLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHk7IGFuZFxuICAgKiAtIHdoZW4gc2hvdWxkIHRoZSBBY3Rpdml0eSBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgdG8gV29ya2Zsb3cgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGVcbiAgICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBjYW5jZWxsYXRpb24gYmVpbmdcbiAgICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gICAqIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlIEFjdGl2aXR5IGNhbGwgd2FzIG1hZGUuIFRlcm1pbmF0aW9uIG9mIGEgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqIGFsd2F5cyByZXN1bHRzIGluIGNhbmNlbGxhdGlvbiBvZiBpdHMgb3V0c3RhbmRpbmcgQWN0aXZpdHkgZXhlY3V0aW9ucywgcmVnYXJkbGVzcyBvZiB0aG9zZVxuICAgKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBFYWdlciBkaXNwYXRjaCBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBpbXByb3ZlcyB0aGUgdGhyb3VnaHB1dCBhbmQgbG9hZCBvbiB0aGUgc2VydmVyIGZvciBzY2hlZHVsaW5nIEFjdGl2aXRpZXMuXG4gICAqIFdoZW4gdXNlZCwgdGhlIHNlcnZlciB3aWxsIGhhbmQgb3V0IEFjdGl2aXR5IHRhc2tzIGJhY2sgdG8gdGhlIFdvcmtlciB3aGVuIGl0IGNvbXBsZXRlcyBhIFdvcmtmbG93IHRhc2suXG4gICAqIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHNlcnZlciB2ZXJzaW9uIDEuMTcgYmVoaW5kIHRoZSBgc3lzdGVtLmVuYWJsZUFjdGl2aXR5RWFnZXJFeGVjdXRpb25gIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogRWFnZXIgZGlzcGF0Y2ggd2lsbCBvbmx5IGJlIHVzZWQgaWYgYGFsbG93RWFnZXJEaXNwYXRjaGAgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIGFuZCB7QGxpbmsgdGFza1F1ZXVlfSBpcyBlaXRoZXJcbiAgICogb21pdHRlZCBvciB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dFYWdlckRpc3BhdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBBY3Rpdml0eSBzaG91bGQgcnVuIG9uIGFcbiAgICogd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgYWN0aXZpdHlcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lcyBob3cgYW4gYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgU0RLLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLlxuICAgKiBOb3RlIHRoYXQgbG9jYWwgYWN0aXZpdGllcyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgbWF4aW11bSBhdHRlbXB0cyBpcyBzZXQgdG8gMSBkdWUgdG8gV29ya2Zsb3cgdGFzayByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHRhc2sgaXMgZGlzcGF0Y2hlZC4gVGhpc1xuICAgKiB0aW1lb3V0IGlzIGFsd2F5cyByZXRyeWFibGUuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqIElmIHNldCwgdGhpcyBtdXN0IGJlIDw9IHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbWl0cyB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBjYW4gaWRsZSBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBleGVjdXRlZC4gVGhhdCBjYW4gaGFwcGVuIGlmXG4gICAqIHRoZSB3b3JrZXIgaXMgY3VycmVudGx5IGF0IG1heCBjb25jdXJyZW50IGxvY2FsIGFjdGl2aXR5IGV4ZWN1dGlvbnMuIFRoaXMgdGltZW91dCBpcyBhbHdheXNcbiAgICogbm9uIHJldHJ5YWJsZSBhcyBhbGwgYSByZXRyeSB3b3VsZCBhY2hpZXZlIGlzIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHNhbWUgcXVldWUuIERlZmF1bHRzXG4gICAqIHRvIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpZiBub3Qgc3BlY2lmaWVkIGFuZCB0aGF0IGlzIHNldC4gTXVzdCBiZSA8PVxuICAgKiB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gd2hlbiBzZXQsIG90aGVyd2lzZSwgaXQgd2lsbCBiZSBjbGFtcGVkIGRvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0IGZvciBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uLiBMaW1pdHMgaG93XG4gICAqIGxvbmcgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZC5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWN0aXZpdHkgaXMgcmV0cnlpbmcgYW5kIGJhY2tvZmYgd291bGQgZXhjZWVkIHRoaXMgdmFsdWUsIGEgc2VydmVyIHNpZGUgdGltZXIgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gICAqIE90aGVyd2lzZSwgYmFja29mZiB3aWxsIGhhcHBlbiBpbnRlcm5hbGx5IGluIHRoZSBTREsuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiovXG4gIGxvY2FsUmV0cnlUaHJlc2hvbGQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gICAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICAgKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICAgKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAgICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gICAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgTWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gPSB7XG4gIEhJU1RPUllfU0laRV9UT09fTEFSR0U6ICdISVNUT1JZX1NJWkVfVE9PX0xBUkdFJyxcbiAgVE9PX01BTllfSElTVE9SWV9FVkVOVFM6ICdUT09fTUFOWV9ISVNUT1JZX0VWRU5UUycsXG4gIFRPT19NQU5ZX1VQREFURVM6ICdUT09fTUFOWV9VUERBVEVTJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9ICh0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24pW2tleW9mIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLCBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gICdTVUdHRVNUX0NPTlRJTlVFX0FTX05FV19SRUFTT05fJ1xuPihcbiAge1xuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5ISVNUT1JZX1NJWkVfVE9PX0xBUkdFXTogMSxcbiAgICBbU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24uVE9PX01BTllfSElTVE9SWV9FVkVOVFNdOiAyLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9VUERBVEVTXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4pO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uc0Zyb21Qcm90byhcbiAgcmVhc29uczogdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlYXNvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZXM6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlYXNvbnMpIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24ocik7XG4gICAgaWYgKGRlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnB1c2goZGVjb2RlZCk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciB9IGZyb20gJy4vZmFpbHVyZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29kZWMgfSBmcm9tICcuL3BheWxvYWQtY29kZWMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQcm90b0ZhaWx1cmUgfSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7XG4gIEFjdGl2aXR5RmFpbHVyZSxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksXG4gIGRlY29kZVJldHJ5U3RhdGUsXG4gIGRlY29kZVRpbWVvdXRUeXBlLFxuICBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZW5jb2RlUmV0cnlTdGF0ZSxcbiAgZW5jb2RlVGltZW91dFR5cGUsXG4gIEZBSUxVUkVfU09VUkNFLFxuICBOZXh1c09wZXJhdGlvbkZhaWx1cmUsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJy4uL3RpbWUnO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBhcnJheUZyb21QYXlsb2FkcywgZnJvbVBheWxvYWRzQXRJbmRleCwgdG9QYXlsb2Fkc1dpdGhDb250ZXh0IH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuXG4vLyBDYW4ndCBpbXBvcnQgcHJvdG8gZW51bXMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgdXNlIHRoaXMgaGVscGVyIHR5cGUgYW5kIGVudW0gY29udmVydGVyIGluc3RlYWQuXG5jb25zdCBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgPSB7XG4gIFJFVFJZQUJMRTogJ1JFVFJZQUJMRScsXG4gIE5PTl9SRVRSWUFCTEU6ICdOT05fUkVUUllBQkxFJyxcbn0gYXMgY29uc3Q7XG50eXBlIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9XG4gICh0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKVtrZXlvZiB0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXTtcblxuY29uc3QgW2VuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciwgZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gICdORVhVU19IQU5ETEVSX0VSUk9SX1JFVFJZX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLlJFVFJZQUJMRV06IDEsXG4gICAgW05leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvci5OT05fUkVUUllBQkxFXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuKTtcblxuZnVuY3Rpb24gY29tYmluZVJlZ0V4cCguLi5yZWdleHBzOiBSZWdFeHBbXSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cHMubWFwKCh4KSA9PiBgKD86JHt4LnNvdXJjZX0pYCkuam9pbignfCcpKTtcbn1cblxuLyoqXG4gKiBTdGFjayB0cmFjZXMgd2lsbCBiZSBjdXRvZmYgd2hlbiBvbiBvZiB0aGVzZSBwYXR0ZXJucyBpcyBtYXRjaGVkXG4gKi9cbmNvbnN0IENVVE9GRl9TVEFDS19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBBY3Rpdml0eSBleGVjdXRpb24gKi9cbiAgL1xccythdCAoQWN0aXZpdHlcXC4pP2V4ZWN1dGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIE5leHVzIGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0KCBhc3luYyk/IChOZXh1c0hhbmRsZXJcXC4pP2ludm9rZVVzZXJDb2RlIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11uZXh1c1tcXFxcL11pbmRleFxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBhY3RpdmF0aW9uIChpbmJvdW5kIGhhbmRsZXJzIG9ubHkpICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKEFjdGl2YXRvclxcLik/KHN0YXJ0V29ya2Zsb3d8cXVlcnlXb3JrZmxvd3xzaWduYWxXb3JrZmxvd3x1cGRhdGV8dmFsaWRhdGVVcGRhdGUpTmV4dEhhbmRsZXIgXFwoLipcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogV29ya2Zsb3cgcnVuIGFueXRoaW5nIGluIGNvbnRleHQgKi9cbiAgL1xccythdCAoU2NyaXB0XFwuKT9ydW5JbkNvbnRleHQgXFwobmF0aXZlfHVua25vd258KD86KD86bm9kZTp2bXx2bVxcLmpzKTpcXGQrOlxcZCspXFwpL1xuKTtcblxuLyoqXG4gKiBBbnkgc3RhY2sgdHJhY2UgZnJhbWVzIHRoYXQgbWF0Y2ggYW55IG9mIHRob3NlIHdpbCBiZSBkb3BwZWQuXG4gKiBUaGUgXCJudWxsLlwiIHByZWZpeCBvbiBzb21lIGNhc2VzIGlzIHRvIGF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDI0MTdcbiAqL1xuY29uc3QgRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP25leHQgXFwoLipbXFxcXC9dY29tbW9uW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVyY2VwdG9yc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/ZXhlY3V0ZU5leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQ3V0cyBvdXQgdGhlIGZyYW1ld29yayBwYXJ0IG9mIGEgc3RhY2sgdHJhY2UsIGxlYXZpbmcgb25seSB1c2VyIGNvZGUgZW50cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3V0b2ZmU3RhY2tUcmFjZShzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gKHN0YWNrID8/ICcnKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBhY2MgPSBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChDVVRPRkZfU1RBQ0tfUEFUVEVSTlMudGVzdChsaW5lKSkgYnJlYWs7XG4gICAgaWYgKCFEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUy50ZXN0KGxpbmUpKSBhY2MucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gYWNjLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEEgYEZhaWx1cmVDb252ZXJ0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGZyb20gcHJvdG8gYEZhaWx1cmVgIGluc3RhbmNlcyB0byBKUyBgRXJyb3JzYCBhbmQgYmFjay5cbiAqXG4gKiBXZSByZWNvbW1lbmRlZCB1c2luZyB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpbnN0ZWFkIG9mIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGluIG9yZGVyXG4gKiB0byBtYWludGFpbiBjcm9zcy1sYW5ndWFnZSBGYWlsdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2F1Z2h0IGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlLlxuICAgKi9cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm90b0ZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgZXJyb3IgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBgVGVtcG9yYWxGYWlsdXJlYC5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9yKGVycjogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgXCJzaGFwZVwiIG9mIHRoZSBhdHRyaWJ1dGVzIHNldCBhcyB0aGUge0BsaW5rIFByb3RvRmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlc30gcGF5bG9hZCBpbiBjYXNlXG4gKiB7QGxpbmsgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcy5lbmNvZGVDb21tb25BdHRyaWJ1dGVzfSBpcyBzZXQgdG8gYHRydWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXMge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrX3RyYWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5jb2RlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgKGZvciBlbmNyeXB0aW5nIHRoZXNlIGF0dHJpYnV0ZXMgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30pLlxuICAgKi9cbiAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0LCBjcm9zcy1sYW5ndWFnZS1jb21wYXRpYmxlIEZhaWx1cmUgY29udmVydGVyLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGl0IHdpbGwgbGVhdmUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyBhcyBwbGFpbiB0ZXh0LiBJbiBvcmRlciB0byBlbmNyeXB0IHRoZW0sIHNldFxuICogYGVuY29kZUNvbW1vbkF0dHJpYnV0ZXNgIHRvIGB0cnVlYCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBhbmQgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30gdGhhdCBjYW4gZW5jcnlwdCAvXG4gKiBkZWNyeXB0IFBheWxvYWRzIGluIHlvdXIge0BsaW5rIFdvcmtlck9wdGlvbnMuZGF0YUNvbnZlcnRlciB8IFdvcmtlcn0gYW5kXG4gKiB7QGxpbmsgQ2xpZW50T3B0aW9ucy5kYXRhQ29udmVydGVyIHwgQ2xpZW50IG9wdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGYWlsdXJlQ29udmVydGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgeyBlbmNvZGVDb21tb25BdHRyaWJ1dGVzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuY29kZUNvbW1vbkF0dHJpYnV0ZXM6IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgPz8gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogRG9lcyBub3Qgc2V0IGNvbW1vbiBwcm9wZXJ0aWVzLCB0aGF0IGlzIGRvbmUgaW4ge0BsaW5rIGZhaWx1cmVUb0Vycm9yfS5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9ySW5uZXIoXG4gICAgZmFpbHVyZTogUHJvdG9GYWlsdXJlLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IEVycm9yIHtcbiAgICBpZiAoZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLnR5cGUsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5jYXRlZ29yeSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnNlcnZlckZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFNlcnZlckZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRpbWVvdXRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmcm9tUGF5bG9hZHNBdEluZGV4KHBheWxvYWRDb252ZXJ0ZXIsIDAsIGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIGRlY29kZVRpbWVvdXRUeXBlKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLnRpbWVvdXRUeXBlKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGVybWluYXRlZEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm1pbmF0ZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuY2FuY2VsZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMsIGNvbnRleHQpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgJ1Jlc2V0V29ya2Zsb3cnLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5yZXNldFdvcmtmbG93RmFpbHVyZUluZm8ubGFzdEhlYXJ0YmVhdERldGFpbHM/LnBheWxvYWRzLCBjb250ZXh0KSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgY29uc3QgeyBuYW1lc3BhY2UsIHdvcmtmbG93VHlwZSwgd29ya2Zsb3dFeGVjdXRpb24sIHJldHJ5U3RhdGUgfSA9IGZhaWx1cmUuY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvO1xuICAgICAgaWYgKCEod29ya2Zsb3dUeXBlPy5uYW1lICYmIHdvcmtmbG93RXhlY3V0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgb24gY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENoaWxkV29ya2Zsb3dGYWlsdXJlKFxuICAgICAgICBuYW1lc3BhY2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgd29ya2Zsb3dUeXBlLm5hbWUsXG4gICAgICAgIGRlY29kZVJldHJ5U3RhdGUocmV0cnlTdGF0ZSksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvKSB7XG4gICAgICBpZiAoIWZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGU/Lm5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3Rpdml0eVR5cGU/Lm5hbWUgb24gYWN0aXZpdHlGYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0eUZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGUubmFtZSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5yZXRyeVN0YXRlKSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmlkZW50aXR5ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvKSB7XG4gICAgICBsZXQgcmV0cnlhYmxlT3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXRyeUJlaGF2aW9yID0gZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8ucmV0cnlCZWhhdmlvcik7XG4gICAgICBzd2l0Y2ggKHJldHJ5QmVoYXZpb3IpIHtcbiAgICAgICAgY2FzZSAnUkVUUllBQkxFJzpcbiAgICAgICAgICByZXRyeWFibGVPdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ05PTl9SRVRSWUFCTEUnOlxuICAgICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd0Vycm9yVHlwZSA9IGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8udHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZTogbmV4dXMuSGFuZGxlckVycm9yVHlwZSA9IE9iamVjdC5oYXNPd24obmV4dXMuSGFuZGxlckVycm9yVHlwZSwgcmF3RXJyb3JUeXBlKVxuICAgICAgICA/IG5leHVzLkhhbmRsZXJFcnJvclR5cGVbcmF3RXJyb3JUeXBlIGFzIGtleW9mIHR5cGVvZiBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlXVxuICAgICAgICA6ICdVTktOT1dOJztcblxuICAgICAgcmV0dXJuIG5ldyBuZXh1cy5IYW5kbGVyRXJyb3IocmVzb2x2ZWRUeXBlLCBmYWlsdXJlLm1lc3NhZ2UgPz8gJ05leHVzIGhhbmRsZXIgZXJyb3InLCB7XG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUsXG4gICAgICAgIHJhd0Vycm9yVHlwZSxcbiAgICAgICAgb3JpZ2luYWxGYWlsdXJlOiB0aGlzLnRlbXBvcmFsRmFpbHVyZVRvTmV4dXNGYWlsdXJlKGZhaWx1cmUpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgTmV4dXNPcGVyYXRpb25GYWlsdXJlKFxuICAgICAgICAvLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgc2V0IGEgZGVmYXVsdCBtZXNzYWdlIGhlcmUsIG9uY2Ugd2UndmUgZGVjaWRlZCBvbiBlcnJvciBoYW5kbGluZy5cbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLnNjaGVkdWxlZEV2ZW50SWQ/LnRvTnVtYmVyKCksXG4gICAgICAgIC8vIFdlIGFzc3VtZSB0aGVzZSB3aWxsIGFsd2F5cyBiZSBzZXQgb3IgZ3JhY2VmdWxseSBzZXQgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLmVuZHBvaW50ID8/ICcnLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8uc2VydmljZSA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvbiA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvblRva2VuID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVtcG9yYWxGYWlsdXJlKFxuICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogRXJyb3Ige1xuICAgIGlmIChmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhdHRycyA9IHBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQ8RGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcz4oZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcywgY29udGV4dCk7XG4gICAgICAvLyBEb24ndCBhcHBseSBlbmNvZGVkQXR0cmlidXRlcyB1bmxlc3MgdGhleSBjb25mb3JtIHRvIGFuIGV4cGVjdGVkIHNjaGVtYVxuICAgICAgaWYgKHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgYXR0cnMgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja190cmFjZSB9ID0gYXR0cnM7XG4gICAgICAgIC8vIEF2b2lkIG11dGF0aW5nIHRoZSBhcmd1bWVudFxuICAgICAgICBmYWlsdXJlID0geyAuLi5mYWlsdXJlIH07XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhY2tfdHJhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmFpbHVyZS5zdGFja1RyYWNlID0gc3RhY2tfdHJhY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcklubmVyKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICAgIGVyci5zdGFjayA9IGZhaWx1cmUuc3RhY2tUcmFjZSA/PyAnJztcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICBlcnIuZmFpbHVyZSA9IGZhaWx1cmU7XG4gICAgfVxuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFByb3RvRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IHRoaXMuZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnIsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jb2RlQ29tbW9uQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja1RyYWNlIH0gPSBmYWlsdXJlO1xuICAgICAgZmFpbHVyZS5tZXNzYWdlID0gJ0VuY29kZWQgZmFpbHVyZSc7XG4gICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSAnJztcbiAgICAgIGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlOiBzdGFja1RyYWNlIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlSW5uZXIoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm90b0ZhaWx1cmUge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlICYmIGVyci5mYWlsdXJlKSByZXR1cm4gZXJyLmZhaWx1cmU7XG4gICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoZXJyLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2aXR5RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgYWN0aXZpdHlUeXBlOiB7IG5hbWU6IGVyci5hY3Rpdml0eVR5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IGVyci5leGVjdXRpb24sXG4gICAgICAgICAgICB3b3JrZmxvd1R5cGU6IHsgbmFtZTogZXJyLndvcmtmbG93VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhcHBsaWNhdGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgIG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSxcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIGVyci5kZXRhaWxzKSB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuZXh0UmV0cnlEZWxheTogbXNPcHRpb25hbFRvVHMoZXJyLm5leHRSZXRyeURlbGF5KSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeShlcnIuY2F0ZWdvcnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgY2FuY2VsZWRGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgZGV0YWlsczpcbiAgICAgICAgICAgICAgZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB7IHBheWxvYWRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQocGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0aW1lb3V0RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHRpbWVvdXRUeXBlOiBlbmNvZGVUaW1lb3V0VHlwZShlcnIudGltZW91dFR5cGUpLFxuICAgICAgICAgICAgbGFzdEhlYXJ0YmVhdERldGFpbHM6IGVyci5sYXN0SGVhcnRiZWF0RGV0YWlsc1xuICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBbZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzXSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFNlcnZlckZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHNlcnZlckZhaWx1cmVJbmZvOiB7IG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlcm1pbmF0ZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0ZXJtaW5hdGVkRmFpbHVyZUluZm86IHt9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIG5leHVzLkhhbmRsZXJFcnJvcikge1xuICAgICAgICBpZiAoZXJyLm9yaWdpbmFsRmFpbHVyZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGVyci5vcmlnaW5hbEZhaWx1cmUsIGVyci5yZXRyeWFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXRyeUJlaGF2aW9yOiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHN3aXRjaCAoZXJyLnJldHJ5YWJsZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IgPSBlbmNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoJ1JFVFJZQUJMRScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IgPSBlbmNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoJ05PTl9SRVRSWUFCTEUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICBuZXh1c0hhbmRsZXJGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5leHVzT3BlcmF0aW9uRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgbmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgc2NoZWR1bGVkRXZlbnRJZDogZXJyLnNjaGVkdWxlZEV2ZW50SWQgPyBMb25nLmZyb21OdW1iZXIoZXJyLnNjaGVkdWxlZEV2ZW50SWQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5kcG9pbnQ6IGVyci5lbmRwb2ludCxcbiAgICAgICAgICAgIHNlcnZpY2U6IGVyci5zZXJ2aWNlLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiBlcnIub3BlcmF0aW9uLFxuICAgICAgICAgICAgb3BlcmF0aW9uVG9rZW46IGVyci5vcGVyYXRpb25Ub2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gSnVzdCBhIFRlbXBvcmFsRmFpbHVyZVxuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IHtcbiAgICAgIHNvdXJjZTogRkFJTFVSRV9TT1VSQ0UsXG4gICAgfTtcblxuICAgIGlmIChpc0Vycm9yKGVycikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIG1lc3NhZ2U6IFN0cmluZyhlcnIubWVzc2FnZSA/PyAnJyksXG4gICAgICAgIHN0YWNrVHJhY2U6IGN1dG9mZlN0YWNrVHJhY2UoZXJyLnN0YWNrKSxcbiAgICAgICAgY2F1c2U6IHRoaXMub3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKChlcnIgYXMgYW55KS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gYCBbQSBub24tRXJyb3IgdmFsdWUgd2FzIHRocm93biBmcm9tIHlvdXIgY29kZS4gV2UgcmVjb21tZW5kIHRocm93aW5nIEVycm9yIG9iamVjdHMgc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSBhIHN0YWNrIHRyYWNlXWA7XG5cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IGVyciArIHJlY29tbWVuZGF0aW9uIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgIHRyeSB7XG4gICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShlcnIpO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICBtZXNzYWdlID0gU3RyaW5nKGVycik7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBtZXNzYWdlICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBTdHJpbmcoZXJyKSArIHJlY29tbWVuZGF0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICovXG4gIG9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihcbiAgICBmYWlsdXJlOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmFpbHVyZSA/IHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gZXJyb3IgdG8gYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZFxuICAgKi9cbiAgb3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKFxuICAgIGVycjogdW5rbm93bixcbiAgICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICAgIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuICApOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBlcnIgPyB0aGlzLmVycm9yVG9GYWlsdXJlKGVyciwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIG5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGZhaWx1cmU6IG5leHVzLkZhaWx1cmUsIHJldHJ5YWJsZTogYm9vbGVhbik6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGZhaWx1cmUubWV0YWRhdGE/LnR5cGUgPT09ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJykge1xuICAgICAgaWYgKGZhaWx1cmUuZGV0YWlscyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtaXNzaW5nIGRldGFpbHMgZm9yIE5leHVzIEZhaWx1cmUgb2YgdHlwZSAndGVtcG9yYWwuYXBpLmZhaWx1cmUudjEuRmFpbHVyZSdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVyZS5kZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhbEZhaWx1cmU6IFByb3RvRmFpbHVyZSA9IHt9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8gPSB7XG4gICAgICAgIHR5cGU6ICdOZXh1c0ZhaWx1cmUnLFxuICAgICAgICBub25SZXRyeWFibGU6ICFyZXRyeWFibGUsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBwYXlsb2FkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBlbmNvZGluZzogZW5jb2RlKCdqc29uL3BsYWluJykgfSxcbiAgICAgICAgICAgICAgZGF0YTogZW5jb2RlKEpTT04uc3RyaW5naWZ5KHsgLi4uZmFpbHVyZSwgbWVzc2FnZTogJycgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHRlbXBvcmFsRmFpbHVyZS5tZXNzYWdlID0gZmFpbHVyZS5tZXNzYWdlO1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLnN0YWNrVHJhY2UgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgICByZXR1cm4gdGVtcG9yYWxGYWlsdXJlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGVtcG9yYWxGYWlsdXJlVG9OZXh1c0ZhaWx1cmUoZmFpbHVyZTogUHJvdG9GYWlsdXJlKTogbmV4dXMuRmFpbHVyZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGZhaWx1cmUubWVzc2FnZSA/PyAnJyxcbiAgICAgIG1ldGFkYXRhOiB7IHR5cGU6ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJyB9LFxuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgUHJvdG9GYWlsdXJlIGFzIHRoZSBOZXh1cyBmYWlsdXJlIGRldGFpbHMgc28gaXQgY2FuIGJlIHJvdW5kLXRyaXBwZWRcbiAgICAgIC8vIGxvc3NsZXNzbHkgYmFjayB0byBhIFByb3RvRmFpbHVyZSB2aWEgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUuXG4gICAgICBkZXRhaWxzOiB7IC4uLmZhaWx1cmUgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5cbi8qKlxuICogYFBheWxvYWRDb2RlY2AgaXMgYW4gb3B0aW9uYWwgc3RlcCB0aGF0IGhhcHBlbnMgYmV0d2VlbiB0aGUgd2lyZSBhbmQgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyfTpcbiAqXG4gKiBUZW1wb3JhbCBTZXJ2ZXIgPC0tPiBXaXJlIDwtLT4gYFBheWxvYWRDb2RlY2AgPC0tPiBgUGF5bG9hZENvbnZlcnRlcmAgPC0tPiBVc2VyIGNvZGVcbiAqXG4gKiBJbXBsZW1lbnQgdGhpcyB0byB0cmFuc2Zvcm0gYW4gYXJyYXkgb2Yge0BsaW5rIFBheWxvYWR9cyB0by9mcm9tIHRoZSBmb3JtYXQgc2VudCBvdmVyIHRoZSB3aXJlIGFuZCBzdG9yZWQgYnkgVGVtcG9yYWwgU2VydmVyLlxuICogQ29tbW9uIHRyYW5zZm9ybWF0aW9ucyBhcmUgZW5jcnlwdGlvbiBhbmQgY29tcHJlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvZGVjIHtcbiAgLyoqXG4gICAqIEVuY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIGZvciBzZW5kaW5nIG92ZXIgdGhlIHdpcmUuXG4gICAqIEBwYXJhbSBwYXlsb2FkcyBNYXkgaGF2ZSBsZW5ndGggMC5cbiAgICovXG4gIGVuY29kZShwYXlsb2FkczogUGF5bG9hZFtdLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUHJvbWlzZTxQYXlsb2FkW10+O1xufVxuIiwiaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgeyBQYXlsb2FkQ29udmVydGVyRXJyb3IsIFZhbHVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgZW5jb2RpbmdLZXlzLCBlbmNvZGluZ1R5cGVzLCBNRVRBREFUQV9FTkNPRElOR19LRVkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgbGlrZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLlxuICpcbiAqIFRoaXMgaXMgY2FsbGVkIGluc2lkZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RldGVybWluaXNtIHwgV29ya2Zsb3cgaXNvbGF0ZX0uXG4gKiBUbyB3cml0ZSBhc3luYyBjb2RlIG9yIHVzZSBOb2RlIEFQSXMgKG9yIHVzZSBwYWNrYWdlcyB0aGF0IHVzZSBOb2RlIEFQSXMpLCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBTaG91bGQgdGhyb3cge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSB2YWx1ZXMgSlMgdmFsdWVzIHRvIGNvbnZlcnQgdG8gUGF5bG9hZHNcbiAqIEByZXR1cm4gbGlzdCBvZiB7QGxpbmsgUGF5bG9hZH1zXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIGZhaWxlZCBmb3IgYW55XG4gKiAgICAgcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXlsb2Fkcyhjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIC4uLnZhbHVlczogdW5rbm93bltdKTogUGF5bG9hZFtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvUGF5bG9hZHNXaXRoQ29udGV4dChjb252ZXJ0ZXIsIHVuZGVmaW5lZCwgdmFsdWVzKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGNvbnZlcnNpb24gb2YgYSBsaXN0IG9mIHZhbHVlcyB3aXRoIGFuIG9wdGlvbmFsIHNlcmlhbGl6YXRpb24gY29udGV4dC5cbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BheWxvYWRzV2l0aENvbnRleHQoXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgY29udGV4dDogU2VyaWFsaXphdGlvbkNvbnRleHQgfCB1bmRlZmluZWQsXG4gIHZhbHVlczogdW5rbm93bltdXG4pOiBQYXlsb2FkW10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBhbiBvcHRpb25hbCB2YWx1ZSwgYW5kIHRoZW4gZW5jb2RlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICB2YWx1ZTogdW5rbm93bixcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBQYXlsb2FkIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdmFsdWU7XG5cbiAgcmV0dXJuIHBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBlYWNoIHZhbHVlIGluIHRoZSBtYXAuXG4gKlxuICogQHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgY29udmVyc2lvbiBvZiBhbnkgdmFsdWUgaW4gdGhlIG1hcCBmYWlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nLCBUID0gYW55PihcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBtYXA6IFJlY29yZDxLLCBUPixcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBSZWNvcmQ8SywgUGF5bG9hZD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcCkubWFwKChbaywgdl0pOiBbSywgUGF5bG9hZF0gPT4gW2sgYXMgSywgY29udmVydGVyLnRvUGF5bG9hZCh2LCBjb250ZXh0KV0pXG4gICkgYXMgUmVjb3JkPEssIFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzLiBVc2VmdWwgZm9yIGRlc2VyaWFsaXppbmdcbiAqIGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBpbnZvY2F0aW9ucy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyXG4gKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIHZhbHVlIGluIHRoZSBwYXlsb2Fkc1xuICogQHBhcmFtIHBheWxvYWRzIHNlcmlhbGl6ZWQgdmFsdWUgdG8gY29udmVydCB0byBKUyB2YWx1ZXMuXG4gKiBAcmV0dXJuIGNvbnZlcnRlZCBKUyB2YWx1ZVxuICogQHRocm93cyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlckVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSBkYXRhIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUGF5bG9hZHNBdEluZGV4PFQ+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIHBheWxvYWRzPzogUGF5bG9hZFtdIHwgbnVsbCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBUIHtcbiAgLy8gVG8gbWFrZSBhZGRpbmcgYXJndW1lbnRzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlXG4gIGlmIChwYXlsb2FkcyA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWRzID09PSBudWxsIHx8IGluZGV4ID49IHBheWxvYWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBwYXlsb2Fkcz8uW2luZGV4XTtcbiAgaWYgKCFwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGcm9tUGF5bG9hZHMoXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgcGF5bG9hZHM/OiBQYXlsb2FkW10gfCBudWxsLFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IHVua25vd25bXSB7XG4gIGlmICghcGF5bG9hZHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIHBheWxvYWRzLm1hcCgocGF5bG9hZDogUGF5bG9hZCkgPT4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQsIGNvbnRleHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEZyb21QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nLCBUID0gdW5rbm93bj4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgbWFwPzogUmVjb3JkPEssIFBheWxvYWQ+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBSZWNvcmQ8SywgVD4gfCB1bmRlZmluZWQge1xuICBpZiAobWFwID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCBwYXlsb2FkXSk6IFtLLCB1bmtub3duXSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkIGFzIFBheWxvYWQsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtrIGFzIEssIHZhbHVlXTtcbiAgICB9KVxuICApIGFzIFJlY29yZDxLLCBUPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgY29uc3QgcmF3UGF5bG9hZFR5cGVCcmFuZDogdW5pcXVlIHN5bWJvbDtcbi8qKlxuICogUmF3VmFsdWUgaXMgYSB3cmFwcGVyIG92ZXIgYSBwYXlsb2FkLlxuICogQSBwYXlsb2FkIHRoYXQgYmVsb25ncyB0byBhIFJhd1ZhbHVlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBieXBhc3NlcyB1c2VyLWRlZmluZWQgcGF5bG9hZCBjb252ZXJ0ZXJzLFxuICogaW5zdGVhZCB1c2luZyB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlci4gVGhlIHBheWxvYWQgc3RpbGwgdW5kZXJnb2VzIGNvZGVjIGNvbnZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXdWYWx1ZTxUID0gdW5rbm93bj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXlsb2FkOiBQYXlsb2FkO1xuICBwcml2YXRlIHJlYWRvbmx5IFtyYXdQYXlsb2FkVHlwZUJyYW5kXTogVCA9IHVuZGVmaW5lZCBhcyBUO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyID0gZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSwgY29udGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVBheWxvYWQocDogUGF5bG9hZCk6IFJhd1ZhbHVlIHtcbiAgICByZXR1cm4gbmV3IFJhd1ZhbHVlKHAsIGlkZW50aXR5UGF5bG9hZENvbnZlcnRlcik7XG4gIH1cblxuICBnZXQgcGF5bG9hZCgpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0sIG9yIGB1bmRlZmluZWRgIGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUO1xuXG4gIHJlYWRvbmx5IGVuY29kaW5nVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyaWVzIHRvIGNvbnZlcnQgdmFsdWVzIHRvIHtAbGluayBQYXlsb2FkfXMgdXNpbmcgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nfXMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBpbiB0aGUgb3JkZXIgcHJvdmlkZWQuXG4gKlxuICogQ29udmVydHMgUGF5bG9hZHMgdG8gdmFsdWVzIGJhc2VkIG9uIHRoZSBgUGF5bG9hZC5tZXRhZGF0YS5lbmNvZGluZ2AgZmllbGQsIHdoaWNoIG1hdGNoZXMgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nLmVuY29kaW5nVHlwZX1cbiAqIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBjcmVhdGVkIHRoZSBQYXlsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICByZWFkb25seSBjb252ZXJ0ZXJzOiBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nW107XG4gIHJlYWRvbmx5IGNvbnZlcnRlckJ5RW5jb2Rpbmc6IE1hcDxzdHJpbmcsIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXSkge1xuICAgIGlmIChjb252ZXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFBheWxvYWRDb252ZXJ0ZXJFcnJvcignTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJ0ZXJzID0gY29udmVydGVycztcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlckJ5RW5jb2Rpbmcuc2V0KGNvbnZlcnRlci5lbmNvZGluZ1R5cGUsIGNvbnZlcnRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJ1biBgLnRvUGF5bG9hZCh2YWx1ZSlgIG9uIGVhY2ggY29udmVydGVyIGluIHRoZSBvcmRlciBwcm92aWRlZCBhdCBjb25zdHJ1Y3Rpb24uXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0LCB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciB0aGF0IGNhbiBoYW5kbGUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHRvUGF5bG9hZDxUPih2YWx1ZTogVCwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUGF5bG9hZCB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5wYXlsb2FkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0ICR7dmFsdWV9IHRvIHBheWxvYWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZnJvbVBheWxvYWR9IGJhc2VkIG9uIHRoZSBgZW5jb2RpbmdgIG1ldGFkYXRhIG9mIHRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkLm1ldGFkYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jb2RpbmcgPSBkZWNvZGUocGF5bG9hZC5tZXRhZGF0YVtNRVRBREFUQV9FTkNPRElOR19LRVldISk7XG4gICAgY29uc3QgY29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXJCeUVuY29kaW5nLmdldChlbmNvZGluZyk7XG4gICAgaWYgKGNvbnZlcnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5rbm93biBlbmNvZGluZzogJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkLCBjb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gSlMgdW5kZWZpbmVkIGFuZCBOVUxMIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTDtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihfY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55OyAvLyBKdXN0IHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gYmluYXJ5IGRhdGEgdHlwZXMgYW5kIFJBVyBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW5hcnlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVztcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19SQVcsXG4gICAgICB9LFxuICAgICAgZGF0YTogdmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIFdyYXAgd2l0aCBVaW50OEFycmF5IGZyb20gdGhpcyBjb250ZXh0IHRvIGVuc3VyZSBgaW5zdGFuY2VvZmAgd29ya3NcbiAgICAgIChcbiAgICAgICAgY29udGVudC5kYXRhID8gbmV3IFVpbnQ4QXJyYXkoY29udGVudC5kYXRhLmJ1ZmZlciwgY29udGVudC5kYXRhLmJ5dGVPZmZzZXQsIGNvbnRlbnQuZGF0YS5sZW5ndGgpIDogY29udGVudC5kYXRhXG4gICAgICApIGFzIGFueVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIG5vbi11bmRlZmluZWQgdmFsdWVzIGFuZCBzZXJpYWxpemVkIEpTT04gUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgSnNvblBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTjtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IGpzb247XG4gICAgdHJ5IHtcbiAgICAgIGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19KU09OLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IGVuY29kZShqc29uKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KGNvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAoY29udGVudC5kYXRhID09PSB1bmRlZmluZWQgfHwgY29udGVudC5kYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignR290IHBheWxvYWQgd2l0aCBubyBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZShjb250ZW50LmRhdGEpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgZXh0ZW5kcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIHtcbiAgLy8gTWF0Y2ggdGhlIG9yZGVyIHVzZWQgaW4gb3RoZXIgU0RLcywgYnV0IGV4Y2x1ZGUgUHJvdG9idWYgY29udmVydGVycyBzbyB0aGF0IHRoZSBjb2RlLCBpbmNsdWRpbmdcbiAgLy8gYHByb3RvMy1qc29uLXNlcmlhbGl6ZXJgLCBkb2Vzbid0IHRha2Ugc3BhY2UgaW4gV29ya2Zsb3cgYnVuZGxlcyB0aGF0IGRvbid0IHVzZSBQcm90b2J1ZnMuIFRvIHVzZSBQcm90b2J1ZnMsIHVzZVxuICAvLyB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJXaXRoUHJvdG9idWZzfS5cbiAgLy9cbiAgLy8gR28gU0RLOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVtcG9yYWxpby9zZGstZ28vYmxvYi81ZTU2NDVmMGM1NTBkY2Y3MTdjMDk1YWUzMmM3NmE3MDg3ZDJlOTg1L2NvbnZlcnRlci9kZWZhdWx0X2RhdGFfY29udmVydGVyLmdvI0wyOFxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihuZXcgVW5kZWZpbmVkUGF5bG9hZENvbnZlcnRlcigpLCBuZXcgQmluYXJ5UGF5bG9hZENvbnZlcnRlcigpLCBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0gdXNlZCBieSB0aGUgU0RLLiBTdXBwb3J0cyBgVWludDhBcnJheWAgYW5kIEpTT04gc2VyaWFsaXphYmxlcyAoc28gaWZcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9KU09OL3N0cmluZ2lmeSNkZXNjcmlwdGlvbiB8IGBKU09OLnN0cmluZ2lmeSh5b3VyQXJnT3JSZXR2YWwpYH1cbiAqIHdvcmtzLCB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlciB3aWxsIHdvcmspLlxuICpcbiAqIFRvIGFsc28gc3VwcG9ydCBQcm90b2J1ZnMsIGNyZWF0ZSBhIGN1c3RvbSBwYXlsb2FkIGNvbnZlcnRlciB3aXRoIHtAbGluayBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcn06XG4gKlxuICogYGNvbnN0IG15Q29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKHsgcHJvdG9idWZSb290IH0pYFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgcGF5bG9hZCBjb252ZXJ0ZXIgcmV0dXJucyB0aGUgaW5wdXRzIGl0IHdhcyBnaXZlbi5cbiAqL1xuY2xhc3MgSWRlbnRpdHlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQge1xuICAgIHJldHVybiB2YWx1ZSBhcyBQYXlsb2FkO1xuICB9XG5cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiBwYXlsb2FkIGFzIFQ7XG4gIH1cbn1cblxuY29uc3QgaWRlbnRpdHlQYXlsb2FkQ29udmVydGVyID0gbmV3IElkZW50aXR5UGF5bG9hZENvbnZlcnRlcigpO1xuIiwiaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hBdHRyaWJ1dGVzLCBTZWFyY2hBdHRyaWJ1dGVQYWlyLCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyIH0gZnJvbSAnLi4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHtcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBpc1ZhbGlkVmFsdWVGb3JUeXBlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlLFxufSBmcm9tICcuLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IEpzb25QYXlsb2FkQ29udmVydGVyLCBtYXBGcm9tUGF5bG9hZHMsIG1hcFRvUGF5bG9hZHMgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcblxuLyoqXG4gKiBDb252ZXJ0cyBTZWFyY2ggQXR0cmlidXRlIHZhbHVlcyB1c2luZyBKc29uUGF5bG9hZENvbnZlcnRlclxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG4gIHZhbGlkTm9uRGF0ZVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlczogdW5rbm93bik6IFBheWxvYWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgU2VhcmNoQXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBmaXJzdFR5cGUgPSB0eXBlb2YgZmlyc3RWYWx1ZTtcbiAgICAgIGlmIChmaXJzdFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBhcnJheXMgb2Ygc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIERhdGVzLiBUaGUgdmFsdWUgJHt2YWx1ZX0gYXQgaW5kZXggJHtpZHh9IGlzIG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZE5vbkRhdGVUeXBlcy5pbmNsdWRlcyhmaXJzdFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBmaXJzdFR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgQWxsIFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlLiBUaGUgZmlyc3QgdmFsdWUgJHtmaXJzdFZhbHVlfSBvZiB0eXBlICR7Zmlyc3RUeXBlfSBkb2Vzbid0IG1hdGNoIHZhbHVlICR7dmFsdWV9IG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9IGF0IGluZGV4ICR7aWR4fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgdGFrZXMgY2FyZSBvZiBjb252ZXJ0aW5nIERhdGVzIHRvIElTTyBzdHJpbmdzXG4gICAgY29uc3QgcmV0ID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZXMpO1xuICAgIGlmIChyZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHBheWxvYWRzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogRGF0ZXRpbWUgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBgRGF0ZWBzXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuanNvbkNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcbiAgICBsZXQgYXJyYXlXcmFwcGVkVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICBjb25zdCBzZWFyY2hBdHRyaWJ1dGVUeXBlID0gcGF5bG9hZC5tZXRhZGF0YS50eXBlID8gZGVjb2RlKHBheWxvYWQubWV0YWRhdGEudHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlYXJjaEF0dHJpYnV0ZVR5cGUgPT09ICdEYXRldGltZScpIHtcbiAgICAgIGFycmF5V3JhcHBlZFZhbHVlID0gYXJyYXlXcmFwcGVkVmFsdWUubWFwKChkYXRlU3RyaW5nKSA9PiBuZXcgRGF0ZShkYXRlU3RyaW5nKSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVdyYXBwZWRWYWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcigpO1xuXG5leHBvcnQgY2xhc3MgVHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKTtcblxuICBwdWJsaWMgdG9QYXlsb2FkPFQ+KGF0dHI6IFQpOiBQYXlsb2FkIHtcbiAgICBpZiAoIShhdHRyIGluc3RhbmNlb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSB8fCBhdHRyIGluc3RhbmNlb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgRXhwZWN0IGlucHV0IHRvIGJlIGluc3RhbmNlIG9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUgb3IgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSwgZ290OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF0dHJcbiAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdlIGNoZWNrIGZvciBkZWxldGlvbiBhcyB3ZWxsIGFzIHJlZ3VsYXIgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXMuXG4gICAgaWYgKGF0dHIudmFsdWUgIT09IG51bGwgJiYgIWlzVmFsaWRWYWx1ZUZvclR5cGUoYXR0ci50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgc2VhcmNoIGF0dHJpYnV0ZSB2YWx1ZSAke2F0dHIudmFsdWV9IGZvciBnaXZlbiB0eXBlICR7YXR0ci50eXBlfWApO1xuICAgIH1cblxuICAgIC8vIEZvciBzZXJ2ZXIgc2VhcmNoIGF0dHJpYnV0ZXMgdG8gd29yayBwcm9wZXJseSwgd2UgY2Fubm90IHNldCB0aGUgbWV0YWRhdGFcbiAgICAvLyB0eXBlIHdoZW4gd2Ugc2V0IG51bGxcbiAgICBpZiAoYXR0ci52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQoYXR0ci52YWx1ZSk7XG4gICAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCB0eXBlZCBzZWFyY2ggYXR0cmlidXRlIHRvIHBheWxvYWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cblxuICAgIC8vIEpTT04uc3RyaW5naWZ5IHRha2VzIGNhcmUgb2YgY29udmVydGluZyBEYXRlcyB0byBJU08gc3RyaW5nc1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKGF0dHIudmFsdWUpO1xuICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCB0eXBlZCBzZWFyY2ggYXR0cmlidXRlIHRvIHBheWxvYWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiB0aGlzIHNob3VsZG4ndCBiZSB0aGUgY2FzZSBidXQgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB3aXRob3V0IHRoaXMgY2hlY2suXG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cbiAgICAvLyBBZGQgZW5jb2RlZCB0eXBlIG9mIHNlYXJjaCBhdHRyaWJ1dGUgdG8gbWV0YXRkYXRhXG4gICAgcGF5bG9hZC5tZXRhZGF0YVsndHlwZSddID0gZW5jb2RlKFR5cGVkU2VhcmNoQXR0cmlidXRlcy50b01ldGFkYXRhVHlwZShhdHRyLnR5cGUpKTtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8vIE5vdGU6IHR5cGUgY2FzdGluZyB1bmRlZmluZWQgdmFsdWVzIGlzIG5vdCBjbGVhciB0byBjYWxsZXIuXG4gIC8vIFdlIGNhbid0IGNoYW5nZSB0aGUgdHlwaW5nIG9mIHRoZSBtZXRob2QgdG8gcmV0dXJuIHVuZGVmaW5lZCwgaXQncyBub3QgYWxsb3dlZCBieSB0aGUgaW50ZXJmYWNlLlxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyAndHlwZScgbWV0YWRhdGEgZmllbGQgb3Igbm8gZ2l2ZW4gdmFsdWUsIHdlIHNraXAuXG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEudHlwZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMudG9TZWFyY2hBdHRyaWJ1dGVUeXBlKGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpKTtcbiAgICAvLyBVbnJlY29nbml6ZWQgbWV0YWRhdGEgdHlwZSAoc2FuaXR5IGNoZWNrKS5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gdGhpcy5qc29uQ29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpO1xuXG4gICAgLy8gSGFuZGxlIGxlZ2FjeSB2YWx1ZXMgd2l0aG91dCBLRVlXT1JEX0xJU1QgdHlwZS5cbiAgICBpZiAodHlwZSAhPT0gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1QgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIENhbm5vdCBoYXZlIGFuIGFycmF5IHdpdGggbXVsdGlwbGUgdmFsdWVzIGZvciBub24tS0VZV09SRF9MSVNUIHR5cGUuXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgICB9XG4gICAgICAvLyBVbnBhY2sgc2luZ2xlIHZhbHVlIGFycmF5LlxuICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgJiYgdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZm9yIHRoZSBnaXZlbiB0eXBlLiBJZiBub3QsIHNraXAuXG4gICAgaWYgKCFpc1ZhbGlkVmFsdWVGb3JUeXBlKHR5cGUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUodHlwZSwgdmFsdWUpIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuLy8gSWYgYm90aCBwYXJhbXMgYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLlxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKFxuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcyxcbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaEF0dHJpYnV0ZXMgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpIDoge30pLFxuICAgIC4uLih0eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgID8gbWFwVG9QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+KFxuICAgICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0eXBlZFNlYXJjaEF0dHJpYnV0ZXMpID8gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzIDogdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldEFsbCgpKS5tYXAoXG4gICAgICAgICAgICAgIChwYWlyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYWlyLmtleS5uYW1lLCBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhpbmRleGVkRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB8IHVuZGVmaW5lZCB8IG51bGwpOiBTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgaWYgKCFpbmRleGVkRmllbGRzKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwRnJvbVBheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIGluZGV4ZWRGaWVsZHMpIGFzIFNlYXJjaEF0dHJpYnV0ZXMpLmZpbHRlcihcbiAgICAgIChbXywgdl0pID0+IHYgJiYgdi5sZW5ndGggPiAwXG4gICAgKSAvLyBGaWx0ZXIgb3V0IGVtcHR5IGFycmF5cyByZXR1cm5lZCBieSBwcmUgMS4xOCBzZXJ2ZXJzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoXG4gIGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbFxuKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgcmV0dXJuIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBtYXBGcm9tUGF5bG9hZHM8c3RyaW5nLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlPFNlYXJjaEF0dHJpYnV0ZVR5cGU+IHwgdW5kZWZpbmVkPihcbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxuICAgICAgICBpbmRleGVkRmllbGRzXG4gICAgICApID8/IHt9XG4gICAgKS5yZWR1Y2U8U2VhcmNoQXR0cmlidXRlUGFpcltdPigoYWNjLCBbaywgYXR0cl0pID0+IHtcbiAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIGNvbnZlcnRlci5cbiAgICAgIGlmICghYXR0cikge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0geyBuYW1lOiBrLCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIEVuc3VyZSBpcyB2YWxpZCBwYWlyLlxuICAgICAgaWYgKGlzVmFsaWRWYWx1ZUZvclR5cGUoa2V5LnR5cGUsIGF0dHIudmFsdWUpKSB7XG4gICAgICAgIGFjYy5wdXNoKHsga2V5LCB2YWx1ZTogYXR0ci52YWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVBhaXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX0VOQ09ESU5HX0tFWSA9ICdlbmNvZGluZyc7XG5leHBvcnQgY29uc3QgZW5jb2RpbmdUeXBlcyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogJ2JpbmFyeS9udWxsJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiAnYmluYXJ5L3BsYWluJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogJ2pzb24vcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRl9KU09OOiAnanNvbi9wcm90b2J1ZicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiAnYmluYXJ5L3Byb3RvYnVmJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBFbmNvZGluZ1R5cGUgPSAodHlwZW9mIGVuY29kaW5nVHlwZXMpW2tleW9mIHR5cGVvZiBlbmNvZGluZ1R5cGVzXTtcblxuZXhwb3J0IGNvbnN0IGVuY29kaW5nS2V5cyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1JBVzogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT04pLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUYpLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX01FU1NBR0VfVFlQRV9LRVkgPSAnbWVzc2FnZVR5cGUnO1xuIiwiaW1wb3J0ICogYXMgdGltZSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyB0eXBlIFRpbWVzdGFtcCB9IGZyb20gJy4vdGltZSc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUudHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNOdW1iZXJUb1RzKG1pbGxpcyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb1RzKHN0cjogRHVyYXRpb24gfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5tc09wdGlvbmFsVG9UcyhzdHIpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb051bWJlcih2YWwpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvTnVtYmVyKHZhbDogRHVyYXRpb24pOiBudW1iZXIge1xuICByZXR1cm4gdGltZS5tc1RvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9EYXRlKHRzOiBUaW1lc3RhbXApOiBEYXRlIHtcbiAgcmV0dXJuIHRpbWUudHNUb0RhdGUodHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm9wdGlvbmFsVHNUb0RhdGUodHMpO1xufVxuIiwiLy8gUGFzdGVkIHdpdGggbW9kaWZpY2F0aW9ucyBmcm9tOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYW5vbnljby9GYXN0ZXN0U21hbGxlc3RUZXh0RW5jb2RlckRlY29kZXIvbWFzdGVyL0VuY29kZXJEZWNvZGVyVG9nZXRoZXIuc3JjLmpzXG4vKiBlc2xpbnQgbm8tZmFsbHRocm91Z2g6IDAgKi9cblxuY29uc3QgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbmNvbnN0IGVuY29kZXJSZWdleHAgPSAvW1xceDgwLVxcdUQ3ZmZcXHVEQzAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0/L2c7XG5jb25zdCB0bXBCdWZmZXJVMTYgPSBuZXcgVWludDE2QXJyYXkoMzIpO1xuXG5leHBvcnQgY2xhc3MgVGV4dERlY29kZXIge1xuICBkZWNvZGUoaW5wdXRBcnJheU9yQnVmZmVyOiBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5wdXRBczggPSBpbnB1dEFycmF5T3JCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gaW5wdXRBcnJheU9yQnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5wdXRBcnJheU9yQnVmZmVyKTtcblxuICAgIGxldCByZXN1bHRpbmdTdHJpbmcgPSAnJyxcbiAgICAgIHRtcFN0ciA9ICcnLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbmV4dEVuZCA9IDAsXG4gICAgICBjcDAgPSAwLFxuICAgICAgY29kZVBvaW50ID0gMCxcbiAgICAgIG1pbkJpdHMgPSAwLFxuICAgICAgY3AxID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICB0bXAgPSAtMTtcbiAgICBjb25zdCBsZW4gPSBpbnB1dEFzOC5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGxlbk1pbnVzMzIgPSAobGVuIC0gMzIpIHwgMDtcbiAgICAvLyBOb3RlIHRoYXQgdG1wIHJlcHJlc2VudHMgdGhlIDJuZCBoYWxmIG9mIGEgc3Vycm9nYXRlIHBhaXIgaW5jYXNlIGEgc3Vycm9nYXRlIGdldHMgZGl2aWRlZCBiZXR3ZWVuIGJsb2Nrc1xuICAgIGZvciAoOyBpbmRleCA8IGxlbjsgKSB7XG4gICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICBmb3IgKDsgcG9zIDwgbmV4dEVuZDsgaW5kZXggPSAoaW5kZXggKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgY3AwID0gaW5wdXRBczhbaW5kZXhdICYgMHhmZjtcbiAgICAgICAgc3dpdGNoIChjcDAgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgaWYgKGNwMSA+PiA2ICE9PSAwYjEwIHx8IDBiMTExMTAxMTEgPCBjcDApIHtcbiAgICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZVBvaW50ID0gKChjcDAgJiAwYjExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gNTsgLy8gMjAgZW5zdXJlcyBpdCBuZXZlciBwYXNzZXMgLT4gYWxsIGludmFsaWQgcmVwbGFjZW1lbnRzXG4gICAgICAgICAgICBjcDAgPSAweDEwMDsgLy8gIGtlZXAgdHJhY2sgb2YgdGggYml0IHNpemVcbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gY3AxID4+IDYgPT09IDBiMTAgPyAobWluQml0cyArIDQpIHwgMCA6IDI0OyAvLyAyNCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IChjcDAgKyAweDEwMCkgJiAweDMwMDsgLy8ga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPDw9IDY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgfD0gKChjcDAgJiAwYjExMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSAobWluQml0cyArIDcpIHwgMDtcblxuICAgICAgICAgICAgLy8gTm93LCBwcm9jZXNzIHRoZSBjb2RlIHBvaW50XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsZW4gJiYgY3AxID4+IDYgPT09IDBiMTAgJiYgY29kZVBvaW50ID4+IG1pbkJpdHMgJiYgY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY3AwID0gY29kZVBvaW50O1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSAoY29kZVBvaW50IC0gMHgxMDAwMCkgfCAwO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb2RlUG9pbnQgLyoweGZmZmYgPCBjb2RlUG9pbnQqLykge1xuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICAgICAgLy9uZXh0RW5kID0gbmV4dEVuZCAtIDF8MDtcblxuICAgICAgICAgICAgICAgIHRtcCA9ICgoY29kZVBvaW50ID4+IDEwKSArIDB4ZDgwMCkgfCAwOyAvLyBoaWdoU3Vycm9nYXRlXG4gICAgICAgICAgICAgICAgY3AwID0gKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApIHwgMDsgLy8gbG93U3Vycm9nYXRlICh3aWxsIGJlIGluc2VydGVkIGxhdGVyIGluIHRoZSBzd2l0Y2gtc3RhdGVtZW50KVxuXG4gICAgICAgICAgICAgICAgaWYgKHBvcyA8IDMxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBub3RpY2UgMzEgaW5zdGVhZCBvZiAzMlxuICAgICAgICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSB0bXA7XG4gICAgICAgICAgICAgICAgICBwb3MgPSAocG9zICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgICAgdG1wID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIGVsc2UsIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dEFzOCBhbmQgbGV0IHRtcDAgYmUgZmlsbGVkIGluIGxhdGVyIG9uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFIHRoYXQgY3AxIGlzIGJlaW5nIHVzZWQgYXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIHRoZSBzd2FwcGluZyBvZiB0bXAgd2l0aCBjcDBcbiAgICAgICAgICAgICAgICAgIGNwMSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHRtcCA9IGNwMDtcbiAgICAgICAgICAgICAgICAgIGNwMCA9IGNwMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBuZXh0RW5kID0gKG5leHRFbmQgKyAxKSB8IDA7IC8vIGJlY2F1c2Ugd2UgYXJlIGFkdmFuY2luZyBpIHdpdGhvdXQgYWR2YW5jaW5nIHBvc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb2RlIHBvaW50IG1lYW5zIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgd2l0aCBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgY3AwID4+PSA4O1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIGNwMCAtIDEpIHwgMDsgLy8gcmVzZXQgaW5kZXggIGJhY2sgdG8gd2hhdCBpdCB3YXMgYmVmb3JlXG4gICAgICAgICAgICAgIGNwMCA9IDB4ZmZmZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluYWxseSwgcmVzZXQgdGhlIHZhcmlhYmxlcyBmb3IgdGhlIG5leHQgZ28tYXJvdW5kXG4gICAgICAgICAgICBtaW5CaXRzID0gMDtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDA7XG4gICAgICAgICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICAgICAgLypjYXNlIDExOlxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICBjYXNlIDk6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjb2RlUG9pbnQgPyBjb2RlUG9pbnQgPSAwIDogY3AwID0gMHhmZmZkOyAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgY29udGludWU7Ki9cbiAgICAgICAgICBkZWZhdWx0OiAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gY3AwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgIH1cbiAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgfVxuICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls1XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls4XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMThdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzFdXG4gICAgICApO1xuICAgICAgaWYgKHBvcyA8IDMyKSB0bXBTdHIgPSB0bXBTdHIuc2xpY2UoMCwgKHBvcyAtIDMyKSB8IDApOyAvLy0oMzItcG9zKSk7XG4gICAgICBpZiAoaW5kZXggPCBsZW4pIHtcbiAgICAgICAgLy9mcm9tQ2hhckNvZGUuYXBwbHkoMCwgdG1wQnVmZmVyVTE2IDogVWludDhBcnJheSA/ICB0bXBCdWZmZXJVMTYuc3ViYXJyYXkoMCxwb3MpIDogdG1wQnVmZmVyVTE2LnNsaWNlKDAscG9zKSk7XG4gICAgICAgIHRtcEJ1ZmZlclUxNlswXSA9IHRtcDtcbiAgICAgICAgcG9zID0gfnRtcCA+Pj4gMzE7IC8vdG1wICE9PSAtMSA/IDEgOiAwO1xuICAgICAgICB0bXAgPSAtMTtcblxuICAgICAgICBpZiAodG1wU3RyLmxlbmd0aCA8IHJlc3VsdGluZ1N0cmluZy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICh0bXAgIT09IC0xKSB7XG4gICAgICAgIHRtcFN0ciArPSBmcm9tQ2hhckNvZGUodG1wKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0aW5nU3RyaW5nICs9IHRtcFN0cjtcbiAgICAgIHRtcFN0ciA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdTdHJpbmc7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGVuY29kZXJSZXBsYWNlcihub25Bc2NpaUNoYXJzOiBzdHJpbmcpIHtcbiAgLy8gbWFrZSB0aGUgVVRGIHN0cmluZyBpbnRvIGEgYmluYXJ5IFVURi04IGVuY29kZWQgc3RyaW5nXG4gIGxldCBwb2ludCA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgwKSB8IDA7XG4gIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICBpZiAocG9pbnQgPD0gMHhkYmZmKSB7XG4gICAgICBjb25zdCBuZXh0Y29kZSA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgxKSB8IDA7IC8vIGRlZmF1bHRzIHRvIDAgd2hlbiBOYU4sIGNhdXNpbmcgbnVsbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblxuICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgcG9pbnQgPSAoKHBvaW50IDw8IDEwKSArIG5leHRjb2RlIC0gMHgzNWZkYzAwKSB8IDA7XG4gICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZilcbiAgICAgICAgICByZXR1cm4gZnJvbUNoYXJDb2RlKFxuICAgICAgICAgICAgKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gMTIpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH1cbiAgfVxuICAvKmlmIChwb2ludCA8PSAweDAwN2YpIHJldHVybiBub25Bc2NpaUNoYXJzO1xuICBlbHNlICovIGlmIChwb2ludCA8PSAweDA3ZmYpIHtcbiAgICByZXR1cm4gZnJvbUNoYXJDb2RlKCgweDYgPDwgNSkgfCAocG9pbnQgPj4gNiksICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKSk7XG4gIH0gZWxzZVxuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAoMHhlIC8qMGIxMTEwKi8gPDwgNCkgfCAocG9pbnQgPj4gMTIpLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqL1xuICAgICk7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0RW5jb2RlciB7XG4gIHB1YmxpYyBlbmNvZGUoaW5wdXRTdHJpbmc6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIC8vIDB4YzAgPT4gMGIxMTAwMDAwMDsgMHhmZiA9PiAwYjExMTExMTExOyAweGMwLTB4ZmYgPT4gMGIxMXh4eHh4eFxuICAgIC8vIDB4ODAgPT4gMGIxMDAwMDAwMDsgMHhiZiA9PiAwYjEwMTExMTExOyAweDgwLTB4YmYgPT4gMGIxMHh4eHh4eFxuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAnJyArIGlucHV0U3RyaW5nLFxuICAgICAgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwO1xuICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheSgoKGxlbiA8PCAxKSArIDgpIHwgMCk7XG4gICAgbGV0IHRtcFJlc3VsdDogVWludDhBcnJheTtcbiAgICBsZXQgaSA9IDAsXG4gICAgICBwb3MgPSAwLFxuICAgICAgcG9pbnQgPSAwLFxuICAgICAgbmV4dGNvZGUgPSAwO1xuICAgIGxldCB1cGdyYWRlZGVkQXJyYXlTaXplID0gIVVpbnQ4QXJyYXk7IC8vIG5vcm1hbCBhcnJheXMgYXJlIGF1dG8tZXhwYW5kaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwLCBwb3MgPSAocG9zICsgMSkgfCAwKSB7XG4gICAgICBwb2ludCA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKSB8IDA7XG4gICAgICBpZiAocG9pbnQgPD0gMHgwMDdmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gcG9pbnQ7XG4gICAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgICAgICByZXN1bHRbcG9zXSA9ICgweDYgPDwgNSkgfCAocG9pbnQgPj4gNik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkZW5DaGVjazoge1xuICAgICAgICAgIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICAgICAgICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgICAgICAgICAgbmV4dGNvZGUgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoKGkgPSAoaSArIDEpIHwgMCkpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICAgICAgICAgIGlmICgweGRjMDAgPD0gbmV4dGNvZGUgJiYgbmV4dGNvZGUgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3NdID0gKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrIHdpZGVuQ2hlY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdXBncmFkZWRlZEFycmF5U2l6ZSAmJiBpIDw8IDEgPCBwb3MgJiYgaSA8PCAxIDwgKChwb3MgLSA3KSB8IDApKSB7XG4gICAgICAgICAgICB1cGdyYWRlZGVkQXJyYXlTaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIHRtcFJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbiAqIDMpO1xuICAgICAgICAgICAgdG1wUmVzdWx0LnNldChyZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdG1wUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcG9zXSA9ICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVaW50OEFycmF5ID8gcmVzdWx0LnN1YmFycmF5KDAsIHBvcykgOiByZXN1bHQuc2xpY2UoMCwgcG9zKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmNvZGVJbnRvKGlucHV0U3RyaW5nOiBzdHJpbmcsIHU4QXJyOiBVaW50OEFycmF5KTogeyB3cml0dGVuOiBudW1iZXI7IHJlYWQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbmNvZGVkU3RyaW5nID0gaW5wdXRTdHJpbmcgPT09IHZvaWQgMCA/ICcnIDogKCcnICsgaW5wdXRTdHJpbmcpLnJlcGxhY2UoZW5jb2RlclJlZ2V4cCwgZW5jb2RlclJlcGxhY2VyKTtcbiAgICBsZXQgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwLFxuICAgICAgaSA9IDAsXG4gICAgICBjaGFyID0gMCxcbiAgICAgIHJlYWQgPSAwO1xuICAgIGNvbnN0IHU4QXJyTGVuID0gdThBcnIubGVuZ3RoIHwgMDtcbiAgICBjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0U3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgaWYgKHU4QXJyTGVuIDwgbGVuKSBsZW4gPSB1OEFyckxlbjtcbiAgICBwdXRDaGFyczoge1xuICAgICAgZm9yICg7IGkgPCBsZW47IGkgPSAoaSArIDEpIHwgMCkge1xuICAgICAgICBjaGFyID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgICAgc3dpdGNoIChjaGFyID4+IDQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgIC8vIGV4dGVuc2lvbiBwb2ludHM6XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBpZiAoKChpICsgMSkgfCAwKSA8IHU4QXJyTGVuKSB7XG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGlmICgoKGkgKyAyKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgLy9pZiAoIShjaGFyID09PSAweEVGICYmIGVuY29kZWRTdHJpbmcuc3Vic3RyKGkrMXwwLDIpID09PSBcIlxceEJGXFx4QkRcIikpXG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGlmICgoKGkgKyAzKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWsgcHV0Q2hhcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWFkID0gcmVhZCArICgoY2hhciA+PiA2KSAhPT0gMikgfDA7XG4gICAgICAgIHU4QXJyW2ldID0gY2hhcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogaSwgcmVhZDogaW5wdXRMZW5ndGggPCByZWFkID8gaW5wdXRMZW5ndGggOiByZWFkIH07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUocyk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgVWludDhBcnJheSBpbnRvIGEgVVRGLTggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoYTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlKGEpO1xufVxuIiwiaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8qKlxuICogVGhyb3duIGZyb20gY29kZSB0aGF0IHJlY2VpdmVzIGEgdmFsdWUgdGhhdCBpcyB1bmV4cGVjdGVkIG9yIHRoYXQgaXQncyB1bmFibGUgdG8gaGFuZGxlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1ZhbHVlRXJyb3InKVxuZXhwb3J0IGNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgUGF5bG9hZCBDb252ZXJ0ZXIgaXMgbWlzY29uZmlndXJlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdQYXlsb2FkQ29udmVydGVyRXJyb3InKVxuZXhwb3J0IGNsYXNzIFBheWxvYWRDb252ZXJ0ZXJFcnJvciBleHRlbmRzIFZhbHVlRXJyb3Ige31cblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbid0IGJlIGNvbXBsZXRlZCBiZWNhdXNlIGl0IGlzIGlsbGVnYWwgZ2l2ZW4gdGhlXG4gKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBvYmplY3Q7IGUuZy4gdHJ5aW5nIHRvIHVzZSBhIHJlc291cmNlIGFmdGVyIGl0IGhhcyBiZWVuIGNsb3NlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdJbGxlZ2FsU3RhdGVFcnJvcicpXG5leHBvcnQgY2xhc3MgSWxsZWdhbFN0YXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgV29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gSWQgaXMgbm90IGtub3duIHRvIFRlbXBvcmFsIFNlcnZlci5cbiAqIEl0IGNvdWxkIGJlIGJlY2F1c2U6XG4gKiAtIElkIHBhc3NlZCBpcyBpbmNvcnJlY3RcbiAqIC0gV29ya2Zsb3cgaXMgY2xvc2VkIChmb3Igc29tZSBjYWxscywgZS5nLiBgdGVybWluYXRlYClcbiAqIC0gV29ya2Zsb3cgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgU2VydmVyIGFmdGVyIHJlYWNoaW5nIGl0cyByZXRlbnRpb24gbGltaXRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd05vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ05hbWVzcGFjZU5vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHN1cGVyKGBOYW1lc3BhY2Ugbm90IGZvdW5kOiAnJHtuYW1lc3BhY2V9J2ApO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3cgdGhpcyBlcnJvciBmcm9tIGFuIEFjdGl2aXR5IGluIG9yZGVyIHRvIG1ha2UgdGhlIFdvcmtlciBmb3JnZXQgYWJvdXQgdGhpcyBBY3Rpdml0eS5cbiAqXG4gKiBUaGUgQWN0aXZpdHkgY2FuIHRoZW4gYmUgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5IChmcm9tIGFueXdoZXJl4oCUdXN1YWxseSBvdXRzaWRlIHRoZSBXb3JrZXIpIHVzaW5nXG4gKiB0aGUgQ2xpZW50J3MgYWN0aXZpdHkgaGFuZGxlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqaW1wb3J0IHsgQ29tcGxldGVBc3luY0Vycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vYWN0aXZpdHknO1xuICpcbiAqZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15QWN0aXZpdHkoKTogUHJvbWlzZTxuZXZlcj4ge1xuICogIC8vIC4uLlxuICogIHRocm93IG5ldyBDb21wbGV0ZUFzeW5jRXJyb3IoKTtcbiAqfVxuICogYGBgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29tcGxldGVBc3luY0Vycm9yJylcbmV4cG9ydCBjbGFzcyBDb21wbGV0ZUFzeW5jRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSwgaXNSZWNvcmQsIFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG5leHBvcnQgY29uc3QgRkFJTFVSRV9TT1VSQ0UgPSAnVHlwZVNjcmlwdFNESyc7XG5leHBvcnQgdHlwZSBQcm90b0ZhaWx1cmUgPSB0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5JRmFpbHVyZTtcblxuZXhwb3J0IGNvbnN0IFRpbWVvdXRUeXBlID0ge1xuICBTVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcbiAgU0NIRURVTEVfVE9fU1RBUlQ6ICdTQ0hFRFVMRV9UT19TVEFSVCcsXG4gIFNDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuICBIRUFSVEJFQVQ6ICdIRUFSVEJFQVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNUQVJUX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU1RBUlRfVE9fQ0xPU0U6ICdTVEFSVF9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU0NIRURVTEVfVE9fU1RBUlR9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19DTE9TRX0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEhFQVJUQkVBVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX0hFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUaW1lb3V0VHlwZSA9ICh0eXBlb2YgVGltZW91dFR5cGUpW2tleW9mIHR5cGVvZiBUaW1lb3V0VHlwZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlVGltZW91dFR5cGUsIGRlY29kZVRpbWVvdXRUeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIHR5cGVvZiBUaW1lb3V0VHlwZSxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4+KFxuICB7XG4gICAgW1RpbWVvdXRUeXBlLlNUQVJUX1RPX0NMT1NFXTogMSxcbiAgICBbVGltZW91dFR5cGUuU0NIRURVTEVfVE9fU1RBUlRdOiAyLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19DTE9TRV06IDMsXG4gICAgW1RpbWVvdXRUeXBlLkhFQVJUQkVBVF06IDQsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdUSU1FT1VUX1RZUEVfJ1xuKTtcblxuZXhwb3J0IGNvbnN0IFJldHJ5U3RhdGUgPSB7XG4gIElOX1BST0dSRVNTOiAnSU5fUFJPR1JFU1MnLFxuICBOT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuICBUSU1FT1VUOiAnVElNRU9VVCcsXG4gIE1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG4gIFJFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6ICdJTlRFUk5BTF9TRVJWRVJfRVJST1InLFxuICBDQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSU5fUFJPR1JFU1N9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOX1BST0dSRVNTOiAnSU5fUFJPR1JFU1MnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5PTl9SRVRSWUFCTEVfRkFJTFVSRX0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfTk9OX1JFVFJZQUJMRV9GQUlMVVJFOiAnTk9OX1JFVFJZQUJMRV9GQUlMVVJFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBUSU1FT1VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9USU1FT1VUOiAnVElNRU9VVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQ6ICdNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFVFJZX1BPTElDWV9OT1RfU0VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9SRVRSWV9QT0xJQ1lfTk9UX1NFVDogJ1JFVFJZX1BPTElDWV9OT1RfU0VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTlRFUk5BTF9TRVJWRVJfRVJST1J9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ0FOQ0VMX1JFUVVFU1RFRH0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfQ0FOQ0VMX1JFUVVFU1RFRDogJ0NBTkNFTF9SRVFVRVNURUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHVuZGVmaW5lZGAgaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZXRyeVN0YXRlID0gKHR5cGVvZiBSZXRyeVN0YXRlKVtrZXlvZiB0eXBlb2YgUmV0cnlTdGF0ZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlUmV0cnlTdGF0ZSwgZGVjb2RlUmV0cnlTdGF0ZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICB0eXBlb2YgUmV0cnlTdGF0ZSxcbiAgJ1JFVFJZX1NUQVRFXydcbj4oXG4gIHtcbiAgICBbUmV0cnlTdGF0ZS5JTl9QUk9HUkVTU106IDEsXG4gICAgW1JldHJ5U3RhdGUuTk9OX1JFVFJZQUJMRV9GQUlMVVJFXTogMixcbiAgICBbUmV0cnlTdGF0ZS5USU1FT1VUXTogMyxcbiAgICBbUmV0cnlTdGF0ZS5NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRURdOiA0LFxuICAgIFtSZXRyeVN0YXRlLlJFVFJZX1BPTElDWV9OT1RfU0VUXTogNSxcbiAgICBbUmV0cnlTdGF0ZS5JTlRFUk5BTF9TRVJWRVJfRVJST1JdOiA2LFxuICAgIFtSZXRyeVN0YXRlLkNBTkNFTF9SRVFVRVNURURdOiA3LFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUkVUUllfU1RBVEVfJ1xuKTtcblxuLyoqXG4gKiBBIGNhdGVnb3J5IHRvIGRlc2NyaWJlIHRoZSBzZXZlcml0eSBhbmQgY2hhbmdlIHRoZSBvYnNlcnZhYmlsaXR5IGJlaGF2aW9yIG9mIGFuIGFwcGxpY2F0aW9uIGZhaWx1cmUuXG4gKlxuICogQ3VycmVudGx5LCBvYnNlcnZhYmlsaXR5IGJlaGF2aW9yIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG86XG4gKiAtIGFjdGl2aXRpZXMgdGhhdCBmYWlsIGR1ZSB0byBhIEJFTklHTiBhcHBsaWNhdGlvbiBmYWlsdXJlIGVtaXQgREVCVUcgbGV2ZWwgbG9ncyBhbmQgZG8gbm90IHJlY29yZCBtZXRyaWNzXG4gKlxuICogQGV4cGVyaW1lbnRhbCBDYXRlZ29yeSBpcyBhIG5ldyBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSA9IHtcbiAgQkVOSUdOOiAnQkVOSUdOJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSA9ICh0eXBlb2YgQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkpW2tleW9mIHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgJ0FQUExJQ0FUSU9OX0VSUk9SX0NBVEVHT1JZXydcbj4oXG4gIHtcbiAgICBbQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkuQkVOSUdOXTogMSxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0FQUExJQ0FUSU9OX0VSUk9SX0NBVEVHT1JZXydcbik7XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RXhlY3V0aW9uID0gdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JV29ya2Zsb3dFeGVjdXRpb247XG5cbi8qKlxuICogUmVwcmVzZW50cyBmYWlsdXJlcyB0aGF0IGNhbiBjcm9zcyBXb3JrZmxvdyBhbmQgQWN0aXZpdHkgYm91bmRhcmllcy5cbiAqXG4gKiAqKk5ldmVyIGV4dGVuZCB0aGlzIGNsYXNzIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4uKipcbiAqXG4gKiBUaGUgb25seSBjaGlsZCBjbGFzcyB5b3Ugc2hvdWxkIGV2ZXIgdGhyb3cgZnJvbSB5b3VyIGNvZGUgaXMge0BsaW5rIEFwcGxpY2F0aW9uRmFpbHVyZX0uXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGVtcG9yYWxGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZW1wb3JhbEZhaWx1cmUgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgZmFpbHVyZSB0aGF0IGNvbnN0cnVjdGVkIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIE9ubHkgcHJlc2VudCBpZiB0aGlzIGVycm9yIHdhcyBnZW5lcmF0ZWQgZnJvbSBhbiBleHRlcm5hbCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmFpbHVyZT86IFByb3RvRmFpbHVyZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlID8/IHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuLyoqIEV4Y2VwdGlvbnMgb3JpZ2luYXRlZCBhdCB0aGUgVGVtcG9yYWwgc2VydmljZS4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignU2VydmVyRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgU2VydmVyRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbm9uUmV0cnlhYmxlOiBib29sZWFuLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogYEFwcGxpY2F0aW9uRmFpbHVyZWBzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZhaWx1cmVzIGluIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllcy5cbiAqXG4gKiBUaGUge0BsaW5rIHR5cGV9IHByb3BlcnR5IGlzIG1hdGNoZWQgYWdhaW5zdCB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30gdG8gZGV0ZXJtaW5lIGlmIGFuIGluc3RhbmNlXG4gKiBvZiB0aGlzIGVycm9yIGlzIHJldHJ5YWJsZS4gQW5vdGhlciB3YXkgdG8gYXZvaWQgcmV0cnlpbmcgaXMgYnkgc2V0dGluZyB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyB0byBgdHJ1ZWAuXG4gKlxuICogSW4gV29ya2Zsb3dzLCBpZiB5b3UgdGhyb3cgYSBub24tYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHRoZSBXb3JrZmxvdyBUYXNrIHdpbGwgZmFpbCBhbmQgYmUgcmV0cmllZC4gSWYgeW91IHRocm93IGFuXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiB3aWxsIGZhaWwuXG4gKlxuICogSW4gQWN0aXZpdGllcywgeW91IGNhbiBlaXRoZXIgdGhyb3cgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAgb3IgYW5vdGhlciBgRXJyb3JgIHRvIGZhaWwgdGhlIEFjdGl2aXR5IFRhc2suIEluIHRoZVxuICogbGF0dGVyIGNhc2UsIHRoZSBgRXJyb3JgIHdpbGwgYmUgY29udmVydGVkIHRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLiBUaGUgY29udmVyc2lvbiBpcyBkb25lIGFzIGZvbGxvd2luZzpcbiAqXG4gKiAtIGB0eXBlYCBpcyBzZXQgdG8gYGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWVgXG4gKiAtIGBtZXNzYWdlYCBpcyBzZXQgdG8gYGVycm9yLm1lc3NhZ2VgXG4gKiAtIGBub25SZXRyeWFibGVgIGlzIHNldCB0byBmYWxzZVxuICogLSBgZGV0YWlsc2AgYXJlIHNldCB0byBudWxsXG4gKiAtIHN0YWNrIHRyYWNlIGlzIGNvcGllZCBmcm9tIHRoZSBvcmlnaW5hbCBlcnJvclxuICpcbiAqIFdoZW4gYW4ge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9hY3Rpdml0eS1leGVjdXRpb24jYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkgfCB1bmRlZmluZWQgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgZnJvbSBhbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEZpcnN0IGNhbGxzIHtAbGluayBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUgfCBgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKWB9IGFuZCB0aGVuIG92ZXJyaWRlcyBhbnkgZmllbGRzXG4gICAqIHByb3ZpZGVkIGluIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yIHwgdW5rbm93biwgb3ZlcnJpZGVzPzogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcik7XG4gICAgT2JqZWN0LmFzc2lnbihmYWlsdXJlLCBvdmVycmlkZXMpO1xuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBiZSByZXRyeWFibGUgKHVubGVzcyBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSA9IGZhbHNlLCBkZXRhaWxzLCBuZXh0UmV0cnlEZWxheSwgY2F1c2UsIGNhdGVnb3J5IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSwgY2F0ZWdvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBjYXRlZ29yeSBvZiB0aGUgYXBwbGljYXRpb24gZXJyb3IuXG4gICAqIEFmZmVjdHMgd29ya2VyLXNpZGUgbG9nZ2luZyBhbmQgbWV0cmljcyBiZWhhdmlvciBvZiB0aGlzIGZhaWx1cmUuXG4gICAqL1xuICBjYXRlZ29yeT86IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5O1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIE5leHVzIE9wZXJhdGlvbiBleGVjdXRlZCBpbnNpZGUgYSBXb3JrZmxvdyBmYWlscy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOZXh1c09wZXJhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIE5leHVzT3BlcmF0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZEV2ZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgYWRkIGEgTmV4dXNIYW5kbGVyRmFpbHVyZSBjbGFzcyBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG5cbi8qKlxuICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gKiAgLSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElEIGlzIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGlzIGBXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfRkFJTGBcbiAqICAtIFRoZXJlIGlzIGEgY2xvc2VkIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWBcbiAqICAtIFRoZXJlIGlzIGNsb3NlZCBXb3JrZmxvdyBpbiB0aGUgYENvbXBsZXRlZGAgc3RhdGUgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFlgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBgZXJyb3JgIGlzIGFscmVhZHkgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHJldHVybnMgYGVycm9yYC5cbiAqXG4gKiBPdGhlcndpc2UsIGNvbnZlcnRzIGBlcnJvcmAgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoOlxuICpcbiAqIC0gYG1lc3NhZ2VgOiBgZXJyb3IubWVzc2FnZWAgb3IgYFN0cmluZyhlcnJvcilgXG4gKiAtIGB0eXBlYDogYGVycm9yLmNvbnN0cnVjdG9yLm5hbWVgIG9yIGBlcnJvci5uYW1lYFxuICogLSBgc3RhY2tgOiBgZXJyb3Iuc3RhY2tgIG9yIGAnJ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5tZXNzYWdlKSkgfHwgU3RyaW5nKGVycm9yKTtcbiAgY29uc3QgdHlwZSA9IChpc1JlY29yZChlcnJvcikgJiYgKGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlOiBmYWxzZSB9KTtcbiAgZmFpbHVyZS5zdGFjayA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLnN0YWNrKSkgfHwgJyc7XG4gIHJldHVybiBmYWlsdXJlO1xufVxuXG4vKipcbiAqIElmIGBlcnJgIGlzIGFuIEVycm9yIGl0IGlzIHR1cm5lZCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICpcbiAqIElmIGBlcnJgIHdhcyBhbHJlYWR5IGEgYFRlbXBvcmFsRmFpbHVyZWAsIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yLlxuICpcbiAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggYFN0cmluZyhlcnIpYCBhcyB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnI6IHVua25vd24pOiBUZW1wb3JhbEZhaWx1cmUge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICByZXR1cm4gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycik7XG59XG5cbi8qKlxuICogR2V0IHRoZSByb290IGNhdXNlIG1lc3NhZ2Ugb2YgZ2l2ZW4gYGVycm9yYC5cbiAqXG4gKiBJbiBjYXNlIGBlcnJvcmAgaXMgYSB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSwgcmVjdXJzZSB0aGUgYGNhdXNlYCBjaGFpbiBhbmQgcmV0dXJuIHRoZSByb290IGBjYXVzZS5tZXNzYWdlYC5cbiAqIE90aGVyd2lzZSwgcmV0dXJuIGBlcnJvci5tZXNzYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RDYXVzZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZSA/IHJvb3RDYXVzZShlcnJvci5jYXVzZSkgOiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIiwiLyoqXG4gKiBDb21tb24gbGlicmFyeSBmb3IgY29kZSB0aGF0J3MgdXNlZCBhY3Jvc3MgdGhlIENsaWVudCwgV29ya2VyLCBhbmQvb3IgV29ya2Zsb3dcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1vcHRpb25zJztcbmV4cG9ydCB7IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMsIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB9IGZyb20gJy4vYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMnO1xuZXhwb3J0IHsgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gfSBmcm9tICcuL2NvbnRpbnVlLWFzLW5ldyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgU2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG59IGZyb20gJy4vY29udmVydGVyL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2RlcHJlY2F0ZWQtdGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhaWx1cmUnO1xuZXhwb3J0IHsgSGVhZGVycywgTmV4dCB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3ByaW9yaXR5JztcbmV4cG9ydCAqIGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5leHBvcnQgdHlwZSB7IFRpbWVzdGFtcCwgRHVyYXRpb24sIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi90aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2VyLWRlcGxveW1lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctZGVmaW5pdGlvbi1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmV4cG9ydCB7XG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2RpbmcuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYXJyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShhcnIpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvckNvZGUoZXJyb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlGdW5jLCBPbWl0TGFzdFBhcmFtIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGludGVyY2VwdG9yIGZ1bmN0aW9uXG4gKlxuICogQ2FsbGVkIGZyb20gYW4gaW50ZXJjZXB0b3IgdG8gY29udGludWUgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG5leHBvcnQgdHlwZSBOZXh0PElGLCBGTiBleHRlbmRzIGtleW9mIElGPiA9IFJlcXVpcmVkPElGPltGTl0gZXh0ZW5kcyBBbnlGdW5jID8gT21pdExhc3RQYXJhbTxSZXF1aXJlZDxJRj5bRk5dPiA6IG5ldmVyO1xuXG4vKiogSGVhZGVycyBhcmUganVzdCBhIG1hcHBpbmcgb2YgaGVhZGVyIG5hbWUgdG8gUGF5bG9hZCAqL1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG50eXBlIFdyYXBOZXh0ID0gPEYgZXh0ZW5kcyBBbnlGdW5jPihuZXh0OiBGKSA9PiBGO1xuXG4vKipcbiAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJjZXB0b3IgY2hhaW5pbmcuXG4gKlxuICogVGhlIHdvcmtmbG93IHBhY2thZ2UgbmVlZHMgb25lIHNtYWxsIGJlaGF2aW9yYWwgZXh0ZW5zaW9uIG92ZXIgdGhlIGdlbmVyaWMgaW50ZXJjZXB0b3JcbiAqIHNlbWFudGljczogZXZlcnkgYG5leHQoLi4uKWAgY29udGludWF0aW9uIGl0IGhhbmRzIHRvIHdvcmtmbG93IGludGVyY2VwdG9ycyBtdXN0IGZpcnN0XG4gKiByZXN0b3JlIHRoZSB3b3JrZmxvdyByYW5kb20gc2NvcGUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHRoYXQgY29udGludWF0aW9uIHdhcyBjcmVhdGVkLlxuICpcbiAqIFdlIGtlZXAgdGhlIGNoYWluLWNvbnN0cnVjdGlvbiBsb29wIGhlcmUgYXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggc28gb3JkZXJpbmcgYW5kXG4gKiBiYXNpYyBjb21wb3NpdGlvbiBiZWhhdmlvciBjYW5ub3QgZHJpZnQgYmV0d2VlbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGNsaWVudCxcbiAqIHdvcmtlciwgYWN0aXZpdHksIGFuZCBuZXh1cyBjb2RlIGFuZCB0aGUgd29ya2Zsb3ctc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGhhdCBkZWNvcmF0ZXNcbiAqIGBuZXh0KC4uLilgIGF0IGVhY2ggYm91bmRhcnkuIFRoZSBvbmx5IGJlaGF2aW9yIHRoYXQgdmFyaWVzIGJldHdlZW4gY2FsbGVycyBpcyB0aGVcbiAqIGB3cmFwTmV4dGAgaG9vazogbW9zdCBwYWNrYWdlcyB1c2UgdGhlIGlkZW50aXR5IHdyYXBwZXIsIHdoaWxlIHdvcmtmbG93IGNvZGUgc3VwcGxpZXMgYVxuICogd3JhcHBlciB0aGF0IHJlLWVudGVycyB0aGUgY2FwdHVyZWQgd29ya2Zsb3cgYXN5bmMtbG9jYWwgcmFuZG9tIHNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUludGVyY2VwdG9yc1dpdGg8SSwgTSBleHRlbmRzIGtleW9mIEk+KFxuICBpbnRlcmNlcHRvcnM6IElbXSxcbiAgbWV0aG9kOiBNLFxuICBuZXh0OiBOZXh0PEksIE0+LFxuICB3cmFwTmV4dDogV3JhcE5leHRcbik6IE5leHQ8SSwgTT4ge1xuICBsZXQgY29tcG9zZWROZXh0OiBhbnkgPSBuZXh0O1xuICBmb3IgKGxldCBpID0gaW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcnNbaV07XG4gICAgaWYgKGludGVyY2VwdG9yPy5bbWV0aG9kXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcmV2ID0gd3JhcE5leHQoY29tcG9zZWROZXh0KTtcbiAgICAgIC8vIFdlIGxvc2UgdHlwZSBzYWZldHkgaGVyZSBiZWNhdXNlIFR5cGVzY3JpcHQgY2FuJ3QgZGVkdWNlIHRoYXQgaW50ZXJjZXB0b3JbbWV0aG9kXSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAgLy8gdGhlIHNhbWUgdHlwZSBhcyBOZXh0PEksIE0+XG4gICAgICBjb21wb3NlZE5leHQgPSAoKGlucHV0OiBhbnkpID0+IChpbnRlcmNlcHRvclttZXRob2RdIGFzIGFueSkoaW5wdXQsIHByZXYpKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wb3NlZE5leHQ7XG59XG5cbi8qKlxuICogQ29tcG9zZSBhbGwgaW50ZXJjZXB0b3IgbWV0aG9kcyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIENhbGxpbmcgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uIHJlc3VsdHMgaW4gY2FsbGluZyBlYWNoIG9mIHRoZSBwcm92aWRlZCBpbnRlcmNlcHRvciwgaW4gb3JkZXIgKGZyb20gdGhlIGZpcnN0IHRvXG4gKiB0aGUgbGFzdCksIGZvbGxvd2VkIGJ5IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBwcm92aWRlZCBhcyBhcmd1bWVudCB0byBgY29tcG9zZUludGVyY2VwdG9ycygpYC5cbiAqXG4gKiBAcGFyYW0gaW50ZXJjZXB0b3JzIGEgbGlzdCBvZiBpbnRlcmNlcHRvcnNcbiAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIG1ldGhvZCB0byBjb21wb3NlXG4gKiBAcGFyYW0gbmV4dCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW50ZXJjZXB0aW9uIGNoYWluXG4gKi9cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0IChpbXBvcnRlZCB2aWEgbGliL2ludGVyY2VwdG9ycylcbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIHJldHVybiBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aChpbnRlcmNlcHRvcnMsIG1ldGhvZCwgbmV4dCwgKCh3cmFwcGVkTmV4dCkgPT4gd3JhcHBlZE5leHQpIGFzIFdyYXBOZXh0KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbmV4cG9ydCB0eXBlIFBheWxvYWQgPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQYXlsb2FkO1xuXG4vKiogVHlwZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tIGEgV29ya2Zsb3cgYGV4ZWN1dGVgIGZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JldHVyblR5cGUgPSBQcm9taXNlPGFueT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZVR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55PiB8IGFueTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSA9IHtcbiAgaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgdmFsaWRhdG9yPzogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbFR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1NpZ25hbFR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5VHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGUgPSB7IGhhbmRsZXI6IFdvcmtmbG93UXVlcnlUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEJyb2FkIFdvcmtmbG93IGZ1bmN0aW9uIGRlZmluaXRpb24sIHNwZWNpZmljIFdvcmtmbG93cyB3aWxsIHR5cGljYWxseSB1c2UgYSBuYXJyb3dlciB0eXBlIGRlZmluaXRpb24sIGUuZzpcbiAqIGBgYHRzXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyhhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvdyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlO1xuXG5kZWNsYXJlIGNvbnN0IGFyZ3NCcmFuZDogdW5pcXVlIHN5bWJvbDtcbmRlY2xhcmUgY29uc3QgcmV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHVwZGF0ZSBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVVcGRhdGV9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSB1cGRhdGUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3VwZGF0ZSc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHNpZ25hbCBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWZpbml0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICdzaWduYWwnO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgU2lnbmFsRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyBxdWVyeSBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVF1ZXJ5fVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBhbmQgYFJldGAgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHF1ZXJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3F1ZXJ5JztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKiBHZXQgdGhlIFwidW53cmFwcGVkXCIgcmV0dXJuIHR5cGUgKHdpdGhvdXQgUHJvbWlzZSkgb2YgdGhlIGV4ZWN1dGUgaGFuZGxlciBmcm9tIFdvcmtmbG93IHR5cGUgYFdgICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdFR5cGU8VyBleHRlbmRzIFdvcmtmbG93PiA9IFJldHVyblR5cGU8Vz4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFI+ID8gUiA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RnVuY3Rpb248UCBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+IHtcbiAgKC4uLmFyZ3M6IFApOiBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICogQGRlcHJlY2F0ZWQgbm90IHJlcXVpcmVkIGFueW1vcmUsIGZvciB1bnR5cGVkIGFjdGl2aXRpZXMgdXNlIHtAbGluayBVbnR5cGVkQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2UgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVW50eXBlZEFjdGl2aXRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBBIHdvcmtmbG93J3MgaGlzdG9yeSBhbmQgSUQuIFVzZWZ1bCBmb3IgcmVwbGF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBbmRXb3JrZmxvd0lkIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBoaXN0b3J5OiB0ZW1wb3JhbC5hcGkuaGlzdG9yeS52MS5IaXN0b3J5IHwgdW5rbm93biB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZGVmaW5pbmcgYWN0aW9ucyB0YWtlbiB3aGVuIGEgd29ya2Zsb3cgZXhpdHMgd2hpbGUgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVubmluZy5cbiAqIFRoZSB3b3JrZmxvdyBleGl0IG1heSBiZSBkdWUgdG8gc3VjY2Vzc2Z1bCByZXR1cm4sIGZhaWx1cmUsIGNhbmNlbGxhdGlvbiwgb3IgY29udGludWUtYXMtbmV3LlxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaW4gYWRkaXRpb24gdG8gYWJhbmRvbmluZyB0aGUgaGFuZGxlciBleGVjdXRpb24uIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiB0aGUgd29ya2Zsb3cgZmFpbHMuXG4gICAqL1xuICBXQVJOX0FORF9BQkFORE9OOiAnV0FSTl9BTkRfQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIEFiYW5kb24gdGhlIGhhbmRsZXIgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBhbiB1cGRhdGUgaGFuZGxlciB0aGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW5cbiAgICogdGhlIHVwZGF0ZSByZXN1bHQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSAodHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5KVtrZXlvZiB0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ldO1xuIiwiaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEV4YWN0LCBSZW1vdmVQcmVmaXgsIFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgbnVtZXJpYyBgZW51bWAgdHlwZXMgcHJvZHVjZWQgYnkgb3VyXG4gKiBQcm90b2J1ZiBjb21waWxlciBhbmQgXCJjb25zdCBvYmplY3Qgb2Ygc3RyaW5nc1wiIGVudW0gdmFsdWVzIHRoYXQgd2UgZXhwb3NlIGluIG91ciBwdWJsaWMgQVBJcy5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBOZXdseSBpbnRyb2R1Y2VkIGVudW1zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gKiAgICAgICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuICogICAgICAgQUJBTkRPTjogJ0FCQU5ET04nLFxuICogICAgICAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG4gKiAgICAgfSBhcyBjb25zdDtcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqXG4gKiAgICAgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSAvL1xuICogICAgICAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gKiAgICAgICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nICAvLyBUaGlzIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3RvIGVudW0gZG9lc24ndCBhZGQgYSByZXBlYXRlZCBwcmVmaXggb24gdmFsdWVzXG4gKiAgICAgICA+KFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsIC8vIFRoZXNlIG51bWJlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBpbiB0aGUgcHJvdG8gZW51bVxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICpcbiAqICAgICAgICAgICBVTlNQRUNJRklFRDogMCxcbiAqICAgICAgICAgfSBhcyBjb25zdCxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuICogICAgICAgKTtcbiAqIGBgYFxuICpcbiAqIGBtYWtlUHJvdG9FbnVtQ29udmVydGVyc2Agc3VwcG9ydHMgb3RoZXIgdXNhZ2UgcGF0dGVybnMsIGJ1dCB0aGV5IGFyZSBvbmx5IG1lYW50IGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGZvcm1lciBlbnVtIGRlZmluaXRpb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBlbnVtcy5cbiAqXG4gKiAjIyMgQ29udGV4dFxuICpcbiAqIFRlbXBvcmFsJ3MgUHJvdG9idWYgQVBJcyBkZWZpbmUgc2V2ZXJhbCBgZW51bWAgdHlwZXM7IG91ciBQcm90b2J1ZiBjb21waWxlciB0cmFuc2Zvcm1zIHRoZXNlIHRvXG4gKiB0cmFkaXRpb25hbCAoaS5lLiBub24tY29uc3QpIFtUeXBlU2NyaXB0IG51bWVyaWMgYGVudW1gc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNudW1lcmljLWVudW1zKS5cbiAqXG4gKiBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIGZhciBmcm9tIGlkZWFsOlxuICpcbiAqICAtIER1ZSB0byB0aGUgZHVhbCBuYXR1cmUgb2Ygbm9uLWNvbnN0IFR5cGVTY3JpcHQgYGVudW1gcyAodGhleSBhcmUgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUpLFxuICogICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlZmVyIHRvIGFuIGVudW0gdmFsdWUgZnJvbSBjb2RlIHdpdGhvdXQgYSBcInJlYWxcIiBpbXBvcnQgb2YgdGhlIGVudW0gdHlwZVxuICogICAgKGkuZS4gY2FuJ3Qgc2ltcGx5IGRvIGBpbXBvcnQgdHlwZSAuLi5gKS4gSW4gV29ya2Zsb3cgY29kZSwgc3VjaCBhbiBpbXBvcnQgd291bGQgcmVzdWx0IGluXG4gKiAgICBsb2FkaW5nIG91ciBlbnRpcmUgUHJvdG9idWYgZGVmaW5pdGlvbnMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgYWRkaW5nIHNldmVyYWwgbWVnYWJ5dGVzIHRvXG4gKiAgICB0aGUgcGVyLXdvcmtmbG93IG1lbW9yeSBmb290cHJpbnQsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZTsgdG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBtYWludGFpblxuICogICAgYSBtaXJyb3IgY29weSBvZiBlYWNoIGVudW0gdHlwZXMgdXNlZCBieSBpbi13b3JrZmxvdyBBUElzLCBhbmQgZXhwb3J0IHRoZXNlIGZyb20gZWl0aGVyXG4gKiAgICBgQHRlbXBvcmFsaW8vY29tbW9uYCBvciBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgLlxuICogIC0gSXQgaXMgbm90IGRlc2lyYWJsZSBmb3IgdXNlcnMgdG8gbmVlZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGBAdGVtcG9yYWxpby9wcm90b2AganVzdCB0b1xuICogICAgZ2V0IGFjY2VzcyB0byB0aGVzZSBlbnVtIHR5cGVzOyB3ZSB0aGVyZWZvcmUgbWFkZSBpdCBhIGNvbW1vbiBwcmFjdGljZSB0byByZWV4cG9ydCB0aGVzZSBlbnVtc1xuICogICAgZnJvbSBvdXIgcHVibGljIGZhY2luZyBwYWNrYWdlcy4gSG93ZXZlciwgZXhwZXJpZW5jZSBkZW1vbnRyYXRlZCB0aGF0IHRoZXNlIHJlZXhwb3J0cyBlZmZlY3RpdmVseVxuICogICAgcmVzdWx0ZWQgaW4gcG9vciBhbmQgaW5jb25zaXN0ZW50IGRvY3VtZW50YXRpb24gY292ZXJhZ2UgY29tcGFyZWQgdG8gbWlycm9yZWQgZW51bXMgdHlwZXMuXG4gKiAgLSBPdXIgUHJvdG9idWYgZW51bSB0eXBlcyB0ZW5kIHRvIGZvbGxvdyBhIHZlcmJvc2UgYW5kIHJlZHVuZGFudCBuYW1pbmcgY29udmVudGlvbiwgd2hpY2ggZmVlbHNcbiAqICAgIHVuYXR1cmFsIGFuZCBleGNlc3NpdmUgYWNjb3JkaW5nIHRvIG1vc3QgVHlwZVNjcmlwdCBzdHlsZSBndWlkZXM7IGUuZy4gaW5zdGVhZCBvZlxuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYCxcbiAqICAgIGEgVHlwZVNjcmlwdCBkZXZlbG9wZXIgd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWV0aGluZyBzaW1pbGFyIHRvXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiAnUkVKRUNUX0RVUExJQ0FURSdgLlxuICogIC0gQmVjYXVzZSBvZiB0aGUgd2F5IFByb3RvYnVmIHdvcmtzLCBtYW55IG9mIG91ciBlbnVtIHR5cGVzIGNvbnRhaW4gYW4gYFVOU1BFQ0lGSUVEYCB2YWx1ZSwgd2hpY2hcbiAqICAgIGlzIHVzZWQgdG8gZXhwbGljaXRseSBpZGVudGlmeSBhIHZhbHVlIHRoYXQgaXMgdW5zZXQuIEluIFR5cGVTY3JpcHQgY29kZSwgdGhlIGB1bmRlZmluZWRgIHZhbHVlXG4gKiAgICBhbHJlYWR5IHNlcnZlcyB0aGF0IHB1cnBvc2UsIGFuZCBpcyBkZWZpbml0ZWx5IG1vcmUgaWRpb21hdGljIHRvIFRTIGRldmVsb3BlcnMsIHdoZXJlYXMgdGhlc2VcbiAqICAgIGBVTlNQRUNJRklFRGAgdmFsdWVzIGNyZWF0ZSBub2lzZSBhbmQgY29uZnVzaW9uIGluIG91ciBBUElzLlxuICogIC0gVHlwZVNjcmlwdCBlZGl0b3JzIGdlbmVyYWxseSBkbyBhIHZlcnkgYmFkIGpvYiBhdCBwcm92aWRpbmcgYXV0b2NvbXBsZXRpb24gdGhhdCBpbXBsaWVzIHJlYWNoaW5nXG4gKiAgICBmb3IgdmFsdWVzIG9mIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUsIGZvcmNpbmcgZGV2ZWxvcGVycyB0byBleHBsaWNpdGx5IHR5cGUgaW4gYXQgbGVhc3QgcGFydFxuICogICAgb2YgdGhlIG5hbWUgb2YgdGhlIGVudW0gdHlwZSBiZWZvcmUgdGhleSBjYW4gZ2V0IGF1dG9jb21wbGV0aW9uIGZvciBpdHMgdmFsdWVzLiBPbiB0aGUgb3RoZXJcbiAqICAgIGhhbmQsIGFsbCBUUyBlZGl0b3JzIGltbWVkaWF0ZWx5IHByb3ZpZGUgYXV0b2NvbXBsZXRpb24gZm9yIHN0cmluZyB1bmlvbiB0eXBlcy5cbiAqICAtIFRoZSBbVHlwZVNjcmlwdCdzIG9mZmljaWFsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjb2JqZWN0cy12cy1lbnVtcylcbiAqICAgIGl0c2VsZiBzdWdnZXN0cyB0aGF0LCBpbiBtb2Rlcm4gVHlwZVNjcmlwdCwgdGhlIHVzZSBvZiBgYXMgY29uc3RgIG9iamVjdHMgbWF5IGdlbmVyYWxseSBzdWZmaWNlXG4gKiAgICBhbmQgbWF5IGJlIGFkdmFudGFnZW91cyBvdmVyIHRoZSB1c2Ugb2YgYGVudW1gIHR5cGVzLlxuICpcbiAqIEEgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MsIGNvbWJpbmVkIHdpdGggYSB1bmlvbiB0eXBlIG9mIHBvc3NpYmxlIHN0cmluZyB2YWx1ZXMsIHByb3ZpZGVzIGEgbXVjaFxuICogbW9yZSBpZGlvbWF0aWMgc3ludGF4IGFuZCBhIGJldHRlciBEWCBmb3IgVHlwZVNjcmlwdCBkZXZlbG9wZXJzLiBUaGlzIGhvd2V2ZXIgcmVxdWlyZXMgYSB3YXkgdG9cbiAqIGNvbnZlcnQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgYGVudW1gIHZhbHVlcyBwcm9kdWNlZCBieSB0aGUgUHJvdG9idWYgY29tcGlsZXIgYW5kIHRoZVxuICogZXF1aXZhbGVudCBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFRoaXMgaGVscGVyIGR5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gUHJvdG9idWYgZW51bSB0eXBlLFxuICogc3Ryb25nbHkgYnVpbGRpbmcgdXBvbiBzcGVjaWZpYyBjb252ZW50aW9ucyB0aGF0IHdlIGhhdmUgYWRvcHRlZCBpbiBvdXIgUHJvdG9idWYgZGVmaW5pdGlvbnMuXG4gKlxuICogIyMjIFZhbGlkYXRpb25zXG4gKlxuICogVGhlIGNvbXBsZXggdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBoZWxwZXIgaXMgdGhlcmUgdG8gcHJldmVudCBtb3N0IHBvdGVudGlhbCBpbmNvaGVyZW5jaWVzXG4gKiB0aGF0IGNvdWxkIHJlc3VsdCBmcm9tIGhhdmluZyB0byBtYW51YWxseSBzeW5jaHJvbml6ZSB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBhbmQgdGhlXG4gKiBjb252ZXJzaW9uIHRhYmxlIHdpdGggdGhlIHByb3RvIGVudW0sIHdoaWxlIG5vdCByZXF1aXJpbmcgYSByZWd1bGFyIGltcG9ydCBvbiB0aGUgUHJvdG9idWYgZW51bVxuICogaXRzZWxmIChzbyBpdCBjYW4gYmUgdXNlZCBzYWZlbHkgZm9yIGVudW1zIG1lYW50IHRvIGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb2RlKS5cbiAqXG4gKiBJbiBwYXJ0aWN1bGFyLCBmYWlsaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgd2lsbCByZXN1bHQgaW4gYnVpbGQgdGltZSBlcnJvcnM6XG4gKlxuICogLSBGb3IgZXZlcnkga2V5IG9mIHRoZSBmb3JtIGBQUkVGSVhfS0VZOiBudW1iZXJgIGluIHRoZSBwcm90byBlbnVtLCBleGNsdWRpbmcgdGhlIGBVTlNQRUNJRklFRGAga2V5OlxuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6ICdLRVknYCBlbnRyeSBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bTtcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfS0VZOiAnS0VZJ2AgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqICAgICAodGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHN1Y2ggYWxpYXNlcyBzaG91bGRcbiAqICAgICBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBhbmQgZW51bSBlbnRyaWVzIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZCk7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogbnVtYmVyYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gSWYgdGhlIHByb3RvIGVudW0gY29udGFpbnMgYSBgUFJFRklYX1VOU1BFQ0lGSUVEYCBlbnRyeSwgdGhlbjpcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGAgYW5kL29yIGBVTlNQRUNJRklFRDogdW5kZWZpbmVkYFxuICogICAgIGVudHJpZXMgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0g4oCUIHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogICAgIHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHRoaXMgYWxpYXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZDtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGFuIGBVTlNQRUNJRklFRDogMGAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIFRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBvclxuICogICBvcHRpb25hbGx5IGFsbG93ZWQgYmUgdGhlIHByZWNlZWRpbmcgcnVsZXMuXG4gKiAtIFRoZSBtYXBwaW5nIHRhYmxlIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBhYm92ZS5cbiAqXG4gKiBUaGVzZSBydWxlcyBub3RhYmx5IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIFByb3RvIGVudW0sIHRoZSBjb2RlXG4gKiB3aWxsIGZhaWwgdG8gY29tcGlsZSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpcyBhZGRlZCBvbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogYW5kIHRoZSBtYXBwaW5nIHRhYmxlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBTdHJpbmdFbnVtVHlwZUFjdHVhbCBleHRlbmRzIEV4YWN0PFN0cmluZ0VudW1UeXBlLCBTdHJpbmdFbnVtVHlwZUFjdHVhbD4sXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgLy9cbiAgLy8gUGFyYW1ldGVycyBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgaW5mZXJyZWQ7IHRoZXkncmUgbm90IG1lYW50IG5vdCB0byBiZSBzcGVjaWZpZWQgYnkgZGV2ZWxvcGVyc1xuICBVbnNwZWNpZmllZCA9IFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH1VTlNQRUNJRklFRGAgPyAnVU5TUEVDSUZJRUQnIDogbmV2ZXIsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4gPSBFeGNsdWRlPFxuICAgIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4gICAgVW5zcGVjaWZpZWRcbiAgPixcbiAgU3RyaW5nRW51bVR5cGUgZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkXG4gID4gPSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBNYXBUYWJsZSBleHRlbmRzIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+ID0gUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4sXG4+KFxuICBtYXBUYWJsZTogTWFwVGFibGUsXG4gIHByZWZpeDogUHJlZml4XG4pOiBbXG4gIChcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSA9PiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCwgLy9cbiAgKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpID0+IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCwgLy9cbl0ge1xuICBjb25zdCByZXZlcnNlVGFibGU6IFJlY29yZDxQcm90b0VudW1WYWx1ZSwgU2hvcnRTdHJpbmdFbnVtS2V5PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBUYWJsZSkubWFwKChbaywgdl0pID0+IFt2LCBrXSlcbiAgKTtcbiAgY29uc3QgaGFzVW5zcGVjaWZpZWQgPSAobWFwVGFibGUgYXMgYW55KVsnVU5TUEVDSUZJRUQnXSA9PT0gMCB8fCAobWFwVGFibGUgYXMgYW55KVtgJHtwcmVmaXh9VU5TUEVDSUZJRURgXSA9PT0gMDtcblxuICBmdW5jdGlvbiBpc1Nob3J0U3RyaW5nRW51bUtleXMoeDogdW5rbm93bik6IHggaXMgU2hvcnRTdHJpbmdFbnVtS2V5IHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHggaW4gbWFwVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc051bWVyaWNFbnVtVmFsdWUoeDogdW5rbm93bik6IHggaXMgUHJvdG9FbnVtW2tleW9mIFByb3RvRW51bV0ge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCBpbiByZXZlcnNlVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGUoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBzaG9ydGVuOiBzdHJpbmcgPSBpbnB1dDtcbiAgICAgIGlmIChzaG9ydGVuLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBzaG9ydGVuID0gc2hvcnRlbi5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3J0U3RyaW5nRW51bUtleXMoc2hvcnRlbikpIHtcbiAgICAgICAgcmV0dXJuIG1hcFRhYmxlW3Nob3J0ZW5dO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9J2ApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGhhc1Vuc3BlY2lmaWVkICYmIGlucHV0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc051bWVyaWNFbnVtVmFsdWUoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlVGFibGVbaW5wdXRdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBnb3QgYSBwcm90byBlbnVtIHZhbHVlIHRoYXQgd2UgZG9uJ3QgeWV0IGtub3cgYWJvdXQgKGkuZS4gaXQgZGlkbid0IGV4aXN0IHdoZW4gdGhpcyBjb2RlXG4gICAgICAvLyB3YXMgY29tcGlsZWQpLiBUaGlzIGlzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgZ2l2ZW4gaG93IG91ciBBUElzIGV2b2x2ZSwgdGhpcyBpcyBpc1xuICAgICAgLy8gdW5saWtlbHkgdG8gYmUgYSB0ZXJyaWJseSBiYWQgdGhpbmcgYnkgaXRzZWxmICh3ZSBhdm9pZCBhZGRpbmcgbmV3IGVudW0gdmFsdWVzIGluIHBsYWNlc1xuICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgZGVwbG95ZWQgY29kZSkuIFRoZXJlZm9yZSwgdGhyb3dpbmdcbiAgICAgIC8vIG9uIFwidW5leHBlY3RlZFwiIHZhbHVlcyBpcyBsaWtlbHkgdG8gZW5kIHVwIGNhdXNpbmcgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IG1pZ2h0IGF2b2lkLFxuICAgICAgLy8gZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoZSBkZWNvZGVkIHZhbHVlIG1heSBhY3R1YWxseSBuZXZlciBnZXQgcmVhZCBhbnd5YXkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0ZWFkIGNoZWF0IG9uIHR5cGUgY29uc3RyYWludHMgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBcInVua25vd25fMjNcIi5cbiAgICAgIC8vIFRoYXQgc29tZXdoYXQgbWlycm9ycyB0aGUgYmVoYXZpb3Igd2UnZCBnZXQgd2l0aCB0aGUgcHVyZSBudW1lcmljYWwgYXBwcm9hY2guXG4gICAgICByZXR1cm4gYHVua25vd25fJHtpbnB1dH1gIGFzIFNob3J0U3RyaW5nRW51bUtleTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBwcm90byBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gIH1cblxuICByZXR1cm4gW2VuY29kZSwgZGVjb2RlXSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSxcbiAqIGUuZy4gdGhlIHR5cGUgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCI7XG4gKiAgIEFCQU5ET046IFwiQUJBTkRPTlwiO1xuICogICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU/OiBcIlRFUk1JTkFURVwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET04/OiBcIkFCQU5ET05cIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTD86IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ/OiB1bmRlZmluZWQ7XG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIHN0cmluZyxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCwgLy8gZS5nLiAnVU5TUEVDSUZJRUQnXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAgfCB7XG4gICAgICAvLyBlLmcuOiBcIlRFUk1JTkFURVwiOiBcIlRFUk1JTkFURVwiXG4gICAgICByZWFkb25seSBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBrO1xuICAgIH1cbiAgfCB7XG4gICAgICBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBQcmVmaXggZXh0ZW5kcyAnJ1xuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcIj86IFwiVEVSTUlOQVRFXCJcbiAgICAgICAgICAgIHJlYWRvbmx5IFtrayBpbiBgJHtQcmVmaXh9JHtrfWBdPzogaztcbiAgICAgICAgICB9O1xuICAgIH1bU2hvcnRTdHJpbmdFbnVtS2V5XVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtQcmVmaXh9JHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlVOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4+O1xuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXBwaW5nIHRhYmxlIHRoYXQgdGhlIHVzZXIgaXNcbiAqIGV4cGVjdGVkIHRvIHByb3ZpZGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgVEVSTUlOQVRFOiAxLFxuICogIEFCQU5ET046IDIsXG4gKiAgUkVRVUVTVF9DQU5DRUw6IDMsXG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gIF9TdHJpbmdFbnVtIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAge1xuICAgIFtrIGluIFByb3RvRW51bUtleV06IHtcbiAgICAgIFtrayBpbiBSZW1vdmVQcmVmaXg8UHJlZml4LCBrPl06IFByb3RvRW51bVtrXSBleHRlbmRzIG51bWJlciA/IFByb3RvRW51bVtrXSA6IG5ldmVyO1xuICAgIH07XG4gIH1bUHJvdG9FbnVtS2V5XVxuPjtcbiIsImV4cG9ydCAqIGZyb20gJy4vZW51bXMtaGVscGVycyc7XG5leHBvcnQge1xuICBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLFxuICBtZXJnZU9iamVjdHMsXG4gIC8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG4gIGRlZXBNZXJnZSxcbn0gZnJvbSAnLi9vYmplY3RzLWhlbHBlcnMnO1xuIiwiLyoqXG4gKiBIZWxwZXIgdG8gcHJldmVudCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHZhbHVlcyBvdmVycmlkaW5nIGRlZmF1bHRzIHdoZW4gbWVyZ2luZyBtYXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT0gbnVsbCkpIGFzIGFueTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb2JqZWN0cywgcG9zc2libHkgcmVtb3Zpbmcga2V5cy5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseTpcbiAqIC0gQW55IGtleS92YWx1ZSBwYWlyIGluIGBkZWx0YWAgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGtleS92YWx1ZSBwYWlyIGluIGBvcmlnaW5hbGA7XG4gKiAtIEEga2V5IHByZXNlbnQgaW4gYGRlbHRhYCB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIHJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByZXN1bHRpbmcgb2JqZWN0O1xuICogLSBJZiBgb3JpZ2luYWxgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYGRlbHRhYDtcbiAqIC0gSWYgYGRlbHRhYCBpcyBgdW5kZWZpbmVkYCBvciBlbXB0eSwgcmV0dXJuIGBvcmlnaW5hbGAgKG9yIHVuZGVmaW5lZCBpZiBgb3JpZ2luYWxgIGlzIGFsc28gdW5kZWZpbmVkKTtcbiAqIC0gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMsIHRoZW4gcmV0dXJuIGBvcmlnaW5hbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9yaWdpbmFsOiBULCBkZWx0YTogVCB8IHVuZGVmaW5lZCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWw6IFQgfCB1bmRlZmluZWQsXG4gIGRlbHRhOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybiBkZWx0YTtcbiAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybiBvcmlnaW5hbDtcblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLm9yaWdpbmFsIH07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgIGlmICh2ICE9PSBtZXJnZWRba10pIHtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSBtZXJnZWRba107XG4gICAgICBlbHNlIG1lcmdlZFtrXSA9IHY7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IChtZXJnZWQgYXMgVCkgOiBvcmlnaW5hbDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBQcm9wZXJ0aWVzIGZyb20gYHNvdXJjZWAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiBgdGFyZ2V0YC5cbiAqIE5lc3RlZCBvYmplY3RzIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuXG4gKlxuICogT2JqZWN0IGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFyZSByZWZlcmVuY2VzLCBhcyBpbixcbiAqIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBQYXJ0aWFsPFQ+KTogVCB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpICYmIGtleSBpbiB0YXJnZXQgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0gYXMgYW55KSkge1xuICAgICAgICBvdXRwdXRba2V5IGFzIGtleW9mIFRdID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAob3V0cHV0IGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIE5leHVzIE9wZXJhdGlvbiBIYW5kbGVyLCB1c2luZyB0aGUgTmV4dXMgY29udGV4dCBsb2dnZXIuXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBuZXh1cyA9ICduZXh1cycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBMb2dNZXRhT3JGdW5jID0gTG9nTWV0YWRhdGEgfCAoKCkgPT4gTG9nTWV0YWRhdGEpO1xuXG4vKipcbiAqIEEgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTG9nZ2VyfSB0aGF0IGFkZHMgbWV0YWRhdGEgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbG9nZ2VyLlxuICAgKlxuICAgKiBOZXcgbWV0YWRhdGEgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIGxvZyBpcyBlbWl0dGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIG1ldGFkYXRhIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShsb2dnZXI6IExvZ2dlciwgbWV0YU9yRnVuYzogTG9nTWV0YU9yRnVuYyk6IExvZ2dlciB7XG4gICAgLy8gRmxhdHRlbiByZWN1cnNpdmUgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEgaW5zdGFuY2VzXG4gICAgaWYgKGxvZ2dlciBpbnN0YW5jZW9mIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKGxvZ2dlci5jb250cmlidXRvcnMsIG1ldGFPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbG9nZ2VyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiBsb2dnZXI7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKGxvZ2dlci5wYXJlbnRMb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCBtZXRhT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLCBjb250cmlidXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXVxuICApIHt9XG5cbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci50cmFjZShtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5pbmZvKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci53YXJuKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZXJyb3IobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWV0YWRhdGEoY29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10sIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogTG9nTWV0YWRhdGEge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFNZXRhKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIG1ldGFkYXRhIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvQ2hhaW4oXG4gIGV4aXN0aW5nQ29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQsXG4gIG5ld0NvbnRyaWJ1dG9yOiBMb2dNZXRhT3JGdW5jXG4pOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIGFuIGVtcHR5IG9iamVjdCwgdGhlbiBpdCByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluXG4gIGlmICh0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG5ld0NvbnRyaWJ1dG9yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gIH1cblxuICAvLyBJZiBleGlzdGluZyBjaGFpbiBpcyBlbXB0eSwgdGhlbiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIHRoZSBjaGFpblxuICBpZiAoZXhpc3RpbmdDb250cmlidXRvcnMgPT0gbnVsbCB8fCBleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW25ld0NvbnRyaWJ1dG9yXTtcbiAgfVxuXG4gIC8vIElmIGJvdGggbGFzdCBjb250cmlidXRvciBhbmQgbmV3IGNvbnRyaWJ1dG9yIGFyZSBwbGFpbiBvYmplY3RzLCBtZXJnZSB0aGVtIHRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29uc3QgbGFzdCA9IGV4aXN0aW5nQ29udHJpYnV0b3JzW2V4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU9iamVjdHMobGFzdCwgbmV3Q29udHJpYnV0b3IpO1xuICAgIGlmIChtZXJnZWQgPT09IGxhc3QpIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgICByZXR1cm4gWy4uLmV4aXN0aW5nQ29udHJpYnV0b3JzLnNsaWNlKDAsIC0xKSwgbWVyZ2VkXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIEEgbWV0ZXIgZm9yIGNyZWF0aW5nIG1ldHJpY3MgdG8gcmVjb3JkIHZhbHVlcyBvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gcmVjb3JkLiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdhdWdlIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgZ2F1Z2UgbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVHYXVnZShuYW1lOiBzdHJpbmcsIHZhbHVlVHlwZT86IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljR2F1Z2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1cC1kb3duIGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHNpZ25lZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSB1cC1kb3duIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgdXAtZG93biBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIHVwLWRvd24gY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKi9cbiAgY3JlYXRlVXBEb3duQ291bnRlcj8obmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgbWV0ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLiBBbGwgbWV0cmljcyBjcmVhdGVkIG9mZiB0aGUgbWV0ZXIgd2lsbFxuICAgKiBoYXZlIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZC5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIG1ldHJpY3MuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pdCBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICB1bml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldHJpYywgaWYgYW55LlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBtZXRyaWMgKGUuZy4gYGNvdW50ZXJgLCBgaGlzdG9ncmFtYCwgYGdhdWdlYCkuXG4gICAqL1xuICBraW5kOiBNZXRyaWNLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB2YWx1ZSByZWNvcmRlZCBieSB0aGUgbWV0cmljLiBFaXRoZXIgYGludGAgb3IgYGZsb2F0YC5cbiAgICovXG4gIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBUYWdzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWUgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIG9mIG51bWVyaWNhbCB2YWx1ZXMgcmVjb3JkZWQgYnkgYSBtZXRyaWMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgcmVwcmVzZW50cyB0aGUgX2NvbmZpZ3VyYXRpb25fIG9mIHRoZSBtZXRyaWM7IGhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZG9lc24ndFxuICogaGF2ZSBkaWZmZXJlbnQgcnVudGltZSByZXByZXNlbnRhdGlvbiBmb3IgaW50ZWdlcnMgYW5kIGZsb2F0cywgdGhlIGFjdHVhbCB2YWx1ZSB0eXBlIGlzIGFsd2F5c1xuICogYSBKUyAnbnVtYmVyJy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyB8ICdmbG9hdCc7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYSBtZXRyaWMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSBNZXRyaWNLaW5kID0gJ2NvdW50ZXInIHwgJ2hpc3RvZ3JhbScgfCAnZ2F1Z2UnIHwgJ3VwLWRvd24tY291bnRlcic7XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgdmFsdWVzIGFzIGEgY291bnRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljQ291bnRlciBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBjb3VudGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYWRkLlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGNvdW50ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0NvdW50ZXI7XG5cbiAga2luZDogJ2NvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgcmVjb3JkaW5nIHZhbHVlcyBvbiBhIGhpc3RvZ3JhbS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljSGlzdG9ncmFtIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGhpc3RvZ3JhbS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHJlY29yZC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFZhbHVlIHdpbGwgYmUgY2FzdGVkIHRvIHRoZSBnaXZlblxuICAgKiAgICAgICAgICAgICAge0BsaW5rIHZhbHVlVHlwZX0uIExvc3Mgb2YgcHJlY2lzaW9uIG1heSBvY2N1ciBpZiB0aGUgdmFsdWUgaXMgbm90IGFscmVhZHkgb2YgdGhlXG4gICAqICAgICAgICAgICAgICBjb3JyZWN0IHR5cGUuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgaGlzdG9ncmFtLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW07XG5cbiAga2luZDogJ2hpc3RvZ3JhbSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBzZXR0aW5nIHZhbHVlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljR2F1Z2UgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgZ2F1Z2UuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXQuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBzZXQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgZ2F1Z2UsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlO1xuXG4gIGtpbmQ6ICdnYXVnZSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgc2lnbmVkIHZhbHVlcyBhcyBhbiB1cC1kb3duIGNvdW50ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1VwRG93bkNvdW50ZXIgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgdXAtZG93biBjb3VudGVyLiBWYWx1ZSBtYXkgYmUgbmVnYXRpdmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQgKGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgdXAtZG93biBjb3VudGVyLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNVcERvd25Db3VudGVyO1xuXG4gIGtpbmQ6ICd1cC1kb3duLWNvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuY2xhc3MgTm9vcE1ldHJpY01ldGVyIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2NvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2hpc3RvZ3JhbScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHJlY29yZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnZ2F1Z2UnLFxuICAgICAgdmFsdWVUeXBlLFxuXG4gICAgICBzZXQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAndXAtZG93bi1jb3VudGVyJyxcbiAgICAgIHZhbHVlVHlwZTogJ2ludCcsXG5cbiAgICAgIGFkZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgd2l0aFRhZ3MoX2V4dHJhVGFnczogTWV0cmljVGFncyk6IE1ldHJpY01ldGVyIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgbm9vcE1ldHJpY01ldGVyID0gbmV3IE5vb3BNZXRyaWNNZXRlcigpO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3NPckZ1bmMgPSBNZXRyaWNUYWdzIHwgKCgpID0+IE1ldHJpY1RhZ3MpO1xuXG4vKipcbiAqIEEgbWV0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhZGRzIHRhZ3MgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbWV0ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTWV0cmljTWV0ZXJ9IHRoYXQgYWRkcyB0YWdzIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IG1ldGVyLlxuICAgKlxuICAgKiBOZXcgdGFncyBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uIGV2YWx1YXRlZFxuICAgKiBldmVyeSB0aW1lIGEgbWV0cmljIGlzIHJlY29yZGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIHRhZ3MgYXMgbG93IGFzIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0ZXIgVGhlIHBhcmVudCBtZXRlciB0byBkZWxlZ2F0ZSBjYWxscyB0by5cbiAgICogQHBhcmFtIHRhZ3NPckZ1bmMgTmV3IHRhZ3MgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyByZWNvcmRlZCB0aGF0IHdpbGwgcmV0dXJuIGEgZGVsdGEgb2JqZWN0LlxuICAgKiBAcGFyYW0gZm9yY2UgaWYgYHRydWVgLCB0aGVuIGEgYE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFnc2Agd2lsbCBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlcmVcbiAgICogICAgICAgICAgICAgIGlzIG5vIHRhZ3MgdG8gYWRkLiBUaGlzIGlzIHVzZWZ1bCB0byBhZGQgdGFncyBzdXBwb3J0IHRvIGFuIHVuZGVybHlpbmcgbWV0ZXJcbiAgICogICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb21wb3NlKG1ldGVyOiBNZXRyaWNNZXRlciwgdGFnc09yRnVuYzogTWV0cmljVGFnc09yRnVuYywgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IE1ldHJpY01ldGVyIHtcbiAgICBpZiAobWV0ZXIgaW5zdGFuY2VvZiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MpIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4obWV0ZXIuY29udHJpYnV0b3JzLCB0YWdzT3JGdW5jKTtcbiAgICAgIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpbiwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3IG1ldGVyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gbWV0ZXI7XG4gICAgICByZXR1cm4gbmV3IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyhtZXRlci5wYXJlbnRNZXRlciwgY29udHJpYnV0b3JzID8/IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih1bmRlZmluZWQsIHRhZ3NPckZ1bmMpO1xuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIG1ldGVyO1xuICAgICAgcmV0dXJuIG5ldyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MobWV0ZXIsIGNvbnRyaWJ1dG9ycyA/PyBbXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1ldGVyOiBNZXRyaWNNZXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBwYXJlbnRDb3VudGVyID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVDb3VudGVyKG5hbWUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0NvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHBhcmVudENvdW50ZXIsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIGNvbnN0IHBhcmVudEhpc3RvZ3JhbSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlSGlzdG9ncmFtKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyhwYXJlbnRIaXN0b2dyYW0sIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBjb25zdCBwYXJlbnRHYXVnZSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlR2F1Z2UobmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNHYXVnZVdpdGhDb21wb3NlZFRhZ3MocGFyZW50R2F1Z2UsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBndWFyZCBvbmNlIHVwLWRvd24tY291bnRlciBzdXBwb3J0IGlzIGNvbXBsZXRlIG9uIGFsbCBNZXRyaWNNZXRlclxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBhbmQgYGNyZWF0ZVVwRG93bkNvdW50ZXJgIGlzIG5vIGxvbmdlciBvcHRpb25hbCBvbiBNZXRyaWNNZXRlci5cbiAgICBpZiAoIXRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVVcERvd25Db3VudGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgbWV0ZXInKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q291bnRlciA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyhwYXJlbnRDb3VudGVyLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MuY29tcG9zZSh0aGlzLCB0YWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY0NvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRIaXN0b2dyYW06IE1ldHJpY0hpc3RvZ3JhbSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50SGlzdG9ncmFtLnJlY29yZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50SGlzdG9ncmFtLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0ubmFtZTtcbiAgfVxuXG4gIGdldCB2YWx1ZVR5cGUoKTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0uZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRHYXVnZTogTWV0cmljR2F1Z2UsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEdhdWdlLnNldCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudEdhdWdlLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS52YWx1ZVR5cGU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5jbGFzcyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICd1cC1kb3duLWNvdW50ZXInO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlID0gJ2ludCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRDb3VudGVyOiBNZXRyaWNVcERvd25Db3VudGVyLFxuICAgIHByaXZhdGUgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRDb3VudGVyLmFkZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKTtcbiAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBuZXcgTWV0cmljVXBEb3duQ291bnRlcldpdGhDb21wb3NlZFRhZ3ModGhpcy5wYXJlbnRDb3VudGVyLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLm5hbWU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIudW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIuZGVzY3JpcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ3MoY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW10sIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiBNZXRyaWNUYWdzIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7fTtcbiAgZm9yIChjb25zdCBjb250cmlidXRvciBvZiBjb250cmlidXRvcnMpIHtcbiAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkLCB0eXBlb2YgY29udHJpYnV0b3IgPT09ICdmdW5jdGlvbicgPyBjb250cmlidXRvcigpIDogY29udHJpYnV0b3IpO1xuICB9XG4gIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIGV4dHJhVGFncyk7XG4gIHJldHVybiBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkKHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBBcHBlbmQgYSB0YWdzIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBwb3NzaWJsZS5cbiAqXG4gKiBJZiBhcHBlbmRpbmcgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluIG9mIGNvbnRyaWJ1dG9ycywgcmV0dXJuXG4gKiBgZXhpc3RpbmdDb250cmlidXRvcnNgOyBpbiB0aGF0IGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBpZiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9DaGFpbihcbiAgZXhpc3RpbmdDb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCxcbiAgbmV3Q29udHJpYnV0b3I6IE1ldHJpY1RhZ3NPckZ1bmNcbik6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCB7XG4gIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgYW4gZW1wdHkgb2JqZWN0LCB0aGVuIGl0IHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW5cbiAgaWYgKHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobmV3Q29udHJpYnV0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgfVxuXG4gIC8vIElmIGV4aXN0aW5nIGNoYWluIGlzIGVtcHR5LCB0aGVuIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgdGhlIGNoYWluXG4gIGlmIChleGlzdGluZ0NvbnRyaWJ1dG9ycyA9PSBudWxsIHx8IGV4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbbmV3Q29udHJpYnV0b3JdO1xuICB9XG5cbiAgLy8gSWYgYm90aCBsYXN0IGNvbnRyaWJ1dG9yIGFuZCBuZXcgY29udHJpYnV0b3IgYXJlIHBsYWluIG9iamVjdHMsIG1lcmdlIHRoZW0gdG8gYSBzaW5nbGUgb2JqZWN0LlxuICBjb25zdCBsYXN0ID0gZXhpc3RpbmdDb250cmlidXRvcnNbZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoIC0gMV07XG4gIGlmICh0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlT2JqZWN0cyhsYXN0LCBuZXdDb250cmlidXRvcik7XG4gICAgaWYgKG1lcmdlZCA9PT0gbGFzdCkgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICAgIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMuc2xpY2UoMCwgLTEpLCBtZXJnZWQhXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogUHJpb3JpdHkgY29udGFpbnMgbWV0YWRhdGEgdGhhdCBjb250cm9scyByZWxhdGl2ZSBvcmRlcmluZyBvZiB0YXNrIHByb2Nlc3Npbmcgd2hlbiB0YXNrcyBhcmVcbiAqIGJhY2tsb2dnZWQgaW4gYSBxdWV1ZS4gSW5pdGlhbGx5LCBQcmlvcml0eSB3aWxsIGJlIHVzZWQgaW4gYWN0aXZpdHkgYW5kIHdvcmtmbG93IHRhc2sgcXVldWVzLFxuICogd2hpY2ggYXJlIHR5cGljYWxseSB3aGVyZSBiYWNrbG9ncyBleGlzdC5cbiAqIFByaW9yaXR5IGlzIChmb3Igbm93KSBhdHRhY2hlZCB0byB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuIEFjdGl2aXRpZXMgYW5kIGNoaWxkIHdvcmtmbG93c1xuICogaW5oZXJpdCBQcmlvcml0eSBmcm9tIHRoZSB3b3JrZmxvdyB0aGF0IGNyZWF0ZWQgdGhlbSwgYnV0IG1heSBvdmVycmlkZSBmaWVsZHMgd2hlbiB0aGV5IGFyZVxuICogc3RhcnRlZCBvciBtb2RpZmllZC4gRm9yIGVhY2ggZmllbGQgb2YgYSBQcmlvcml0eSBvbiBhbiBhY3Rpdml0eS93b3JrZmxvdywgbm90IHByZXNlbnQgb3IgZXF1YWxcbiAqIHRvIHplcm8vZW1wdHkgc3RyaW5nIG1lYW5zIHRvIGluaGVyaXQgdGhlIHZhbHVlIGZyb20gdGhlIGNhbGxpbmcgd29ya2Zsb3csIG9yIGlmIHRoZXJlIGlzIG5vXG4gKiBjYWxsaW5nIHdvcmtmbG93LCB0aGVuIHVzZSB0aGUgZGVmYXVsdCAoZG9jdW1lbnRlZCBvbiB0aGUgZmllbGQpLlxuICogVGhlIG92ZXJhbGwgc2VtYW50aWNzIG9mIFByaW9yaXR5IGFyZTpcbiAqIDEuIEZpcnN0LCBjb25zaWRlciBcInByaW9yaXR5X2tleVwiOiBsb3dlciBudW1iZXIgZ29lcyBmaXJzdC5cbiAqIDIuIFRoZW4sIGNvbnNpZGVyIGZhaXJuZXNzOiB0aGUgZmFpcm5lc3MgbWVjaGFuaXNtIGF0dGVtcHRzIHRvIGRpc3BhdGNoIHRhc2tzIGZvciBhIGdpdmVuIGtleSBpblxuICogICAgcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW9yaXR5IHtcbiAgLyoqXG4gICAqIFByaW9yaXR5IGtleSBpcyBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSAxIHRvIG4sIHdoZXJlIHNtYWxsZXIgaW50ZWdlcnNcbiAgICogY29ycmVzcG9uZCB0byBoaWdoZXIgcHJpb3JpdGllcyAodGFza3MgcnVuIHNvb25lcikuIEluIGdlbmVyYWwsIHRhc2tzIGluXG4gICAqIGEgcXVldWUgc2hvdWxkIGJlIHByb2Nlc3NlZCBpbiBjbG9zZSB0byBwcmlvcml0eSBvcmRlciwgYWx0aG91Z2ggc21hbGxcbiAgICogZGV2aWF0aW9ucyBhcmUgcG9zc2libGUuXG4gICAqXG4gICAqIFRoZSBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIChtaW5pbXVtIHByaW9yaXR5KSBpcyBkZXRlcm1pbmVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmRcbiAgICogZGVmYXVsdHMgdG8gNS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgKG1pbittYXgpLzIuIFdpdGggdGhlIGRlZmF1bHQgbWF4IG9mIDUgYW5kIG1pbiBvZiAxLCB0aGF0IGNvbWVzIG91dCB0byAzLlxuICAgKi9cbiAgcHJpb3JpdHlLZXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzS2V5IGlzIGEgc2hvcnQgc3RyaW5nIHRoYXQncyB1c2VkIGFzIGEga2V5IGZvciBhIGZhaXJuZXNzXG4gICAqIGJhbGFuY2luZyBtZWNoYW5pc20uIEl0IG1heSBjb3JyZXNwb25kIHRvIGEgdGVuYW50IGlkLCBvciB0byBhIGZpeGVkXG4gICAqIHN0cmluZyBsaWtlIFwiaGlnaFwiIG9yIFwibG93XCIuIFRoZSBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gICAqIHByb3BvcnRpb24gdG8gaXRzIHdlaWdodC4gRm9yIGV4YW1wbGUsIHVzaW5nIGEgdGhvdXNhbmQgZGlzdGluY3QgdGVuYW50XG4gICAqIGlkcywgZWFjaCB3aXRoIGEgd2VpZ2h0IG9mIDEuMCAodGhlIGRlZmF1bHQpIHdpbGwgcmVzdWx0IGluIGVhY2ggdGVuYW50XG4gICAqIGdldHRpbmcgYSByb3VnaGx5IGVxdWFsIHNoYXJlIG9mIHRhc2sgZGlzcGF0Y2ggdGhyb3VnaHB1dC5cbiAgICpcbiAgICogRmFpcm5lc3Mga2V5cyBhcmUgbGltaXRlZCB0byA2NCBieXRlcy5cbiAgICovXG4gIGZhaXJuZXNzS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlybmVzc1dlaWdodCBmb3IgYSB0YXNrIGNhbiBjb21lIGZyb20gbXVsdGlwbGUgc291cmNlcyBmb3JcbiAgICogZmxleGliaWxpdHkuIEZyb20gaGlnaGVzdCB0byBsb3dlc3QgcHJlY2VkZW5jZTpcbiAgICogMS4gV2VpZ2h0cyBmb3IgYSBzbWFsbCBzZXQgb2Yga2V5cyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0YXNrIHF1ZXVlXG4gICAqICAgIGNvbmZpZ3VyYXRpb24gd2l0aCBhbiBBUEkuXG4gICAqIDIuIEl0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgd29ya2Zsb3cvYWN0aXZpdHkgaW4gdGhpcyBmaWVsZC5cbiAgICogMy4gVGhlIGRlZmF1bHQgd2VpZ2h0IG9mIDEuMCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFdlaWdodCB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gdGhlIHJhbmdlIFswLjAwMSwgMTAwMF0uXG4gICAqL1xuICBmYWlybmVzc1dlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUdXJuIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eSBpbnRvIGEgVFMgUHJpb3JpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVByaW9yaXR5KHByaW9yaXR5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkgfCBudWxsKTogUHJpb3JpdHkge1xuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eT8ucHJpb3JpdHlLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eT8uZmFpcm5lc3NLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzV2VpZ2h0OiBwcmlvcml0eT8uZmFpcm5lc3NXZWlnaHQgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBQcmlvcml0eSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByaW9yaXR5KHByaW9yaXR5OiBQcmlvcml0eSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVByaW9yaXR5IHtcbiAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5ICE9PSB1bmRlZmluZWQgJiYgcHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IG51bGwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocHJpb3JpdHkucHJpb3JpdHlLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmlvcml0eUtleSBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcmlvcml0eUtleTogcHJpb3JpdHkucHJpb3JpdHlLZXkgPz8gMCxcbiAgICBmYWlybmVzc0tleTogcHJpb3JpdHkuZmFpcm5lc3NLZXkgPz8gJycsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5LmZhaXJuZXNzV2VpZ2h0ID8/IDAsXG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYID0gJ19fdGVtcG9yYWxfJztcbmV4cG9ydCBjb25zdCBTVEFDS19UUkFDRV9RVUVSWV9OQU1FID0gJ19fc3RhY2tfdHJhY2UnO1xuZXhwb3J0IGNvbnN0IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19lbmhhbmNlZF9zdGFja190cmFjZSc7XG5cbi8qKlxuICogVmFsaWQgZW50aXR5IHR5cGVzIHRoYXQgY2FuIGJlIGNoZWNrZWQgZm9yIHJlc2VydmVkIG5hbWUgdmlvbGF0aW9uc1xuICovXG5leHBvcnQgdHlwZSBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlID0gJ3F1ZXJ5JyB8ICdzaWduYWwnIHwgJ3VwZGF0ZScgfCAnYWN0aXZpdHknIHwgJ3Rhc2sgcXVldWUnIHwgJ3NpbmsnIHwgJ3dvcmtmbG93JztcblxuLyoqXG4gKiBXaXJlIGlkZW50aWZpZXJzIHVzZWQgYnkgZmlyc3QtcGFydHkgU0RLIGNvbnRyaWIgcGFja2FnZXMuIEVhY2ggZW50cnkgcGFpcnNcbiAqIGEgbmFtZSB3aXRoIHRoZSBlbnRpdHkgdHlwZSBpdCdzIGFsbG93ZWQgdG8gcmVnaXN0ZXIgYXM7IHRoYXQgcGFpciBieXBhc3Nlc1xuICogdGhlIHtAbGluayBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9IGNoZWNrIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiBSZWdpc3RlcmluZ1xuICogdGhlIHNhbWUgbmFtZSBhcyBhIGRpZmZlcmVudCBlbnRpdHkgdHlwZSBpcyBzdGlsbCByZWplY3RlZC5cbiAqL1xuY29uc3QgSU5URVJOQUxfSEFORExFUl9OQU1FX0FMTE9XTElTVDogUmVhZG9ubHlNYXA8c3RyaW5nLCBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlPiA9IG5ldyBNYXAoW1xuICAvLyBAdGVtcG9yYWxpby93b3JrZmxvdy1zdHJlYW1zXG4gIFsnX190ZW1wb3JhbF93b3JrZmxvd19zdHJlYW1fcHVibGlzaCcsICdzaWduYWwnXSxcbiAgWydfX3RlbXBvcmFsX3dvcmtmbG93X3N0cmVhbV9wb2xsJywgJ3VwZGF0ZSddLFxuICBbJ19fdGVtcG9yYWxfd29ya2Zsb3dfc3RyZWFtX29mZnNldCcsICdxdWVyeSddLFxuXSk7XG5cbi8qKlxuICogVmFsaWRhdGVzIGlmIHRoZSBwcm92aWRlZCBuYW1lIGNvbnRhaW5zIGFueSByZXNlcnZlZCBwcmVmaXhlcyBvciBtYXRjaGVzIGFueSByZXNlcnZlZCBuYW1lcy5cbiAqIFRocm93cyBhIFR5cGVFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLCB3aXRoIGEgc3BlY2lmaWMgbWVzc2FnZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGlzc3VlXG4gKiBpcyB3aXRoIGEgcmVzZXJ2ZWQgcHJlZml4IG9yIGFuIGV4YWN0IG1hdGNoIHRvIGEgcmVzZXJ2ZWQgbmFtZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUaGUgZW50aXR5IHR5cGUgYmVpbmcgY2hlY2tlZFxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gY2hlY2sgYWdhaW5zdCByZXNlcnZlZCBwcmVmaXhlcy9uYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZlJlc2VydmVkTmFtZSh0eXBlOiBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmIElOVEVSTkFMX0hBTkRMRVJfTkFNRV9BTExPV0xJU1QuZ2V0KG5hbWUpICE9PSB0eXBlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSAke3R5cGV9IG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gIH1cblxuICBpZiAobmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fCBuYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSAke3R5cGV9IG5hbWU6ICcke25hbWV9Jywgd2hpY2ggaXMgYSByZXNlcnZlZCBuYW1lYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9OdW1iZXIsIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIG9wdGlvbmFsVHNUb01zIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXRyeWluZyBXb3JrZmxvd3MgYW5kIEFjdGl2aXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBDb2VmZmljaWVudCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV4dCByZXRyeSBpbnRlcnZhbC5cbiAgICogVGhlIG5leHQgcmV0cnkgaW50ZXJ2YWwgaXMgcHJldmlvdXMgaW50ZXJ2YWwgbXVsdGlwbGllZCBieSB0aGlzIGNvZWZmaWNpZW50LlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIGJhY2tvZmZDb2VmZmljaWVudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludGVydmFsIG9mIHRoZSBmaXJzdCByZXRyeS5cbiAgICogSWYgY29lZmZpY2llbnQgaXMgMSB0aGVuIGl0IGlzIHVzZWQgZm9yIGFsbCByZXRyaWVzXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiBAZGVmYXVsdCAxIHNlY29uZFxuICAgKi9cbiAgaW5pdGlhbEludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cy4gV2hlbiBleGNlZWRlZCwgcmV0cmllcyBzdG9wIChldmVuIGlmIHtAbGluayBBY3Rpdml0eU9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dH1cbiAgICogaGFzbid0IGJlZW4gcmVhY2hlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEluZmluaXR5XG4gICAqL1xuICBtYXhpbXVtQXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGludGVydmFsIGJldHdlZW4gcmV0cmllcy5cbiAgICogRXhwb25lbnRpYWwgYmFja29mZiBsZWFkcyB0byBpbnRlcnZhbCBpbmNyZWFzZS5cbiAgICogVGhpcyB2YWx1ZSBpcyB0aGUgY2FwIG9mIHRoZSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAweCBvZiB7QGxpbmsgaW5pdGlhbEludGVydmFsfVxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIG1heGltdW1JbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFwcGxpY2F0aW9uIGZhaWx1cmVzIHR5cGVzIHRvIG5vdCByZXRyeS5cbiAgICovXG4gIG5vblJldHJ5YWJsZUVycm9yVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgVFMgUmV0cnlQb2xpY3kgaW50byBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVSZXRyeVBvbGljeShyZXRyeVBvbGljeTogUmV0cnlQb2xpY3kpOiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB7XG4gIGlmIChyZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgIT0gbnVsbCAmJiByZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICB9XG4gIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgIT0gbnVsbCkge1xuICAgIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgLy8gZHJvcCBmaWVsZCAoSW5maW5pdHkgaXMgdGhlIGRlZmF1bHQpXG4gICAgICBjb25zdCB7IG1heGltdW1BdHRlbXB0czogXywgLi4ud2l0aG91dCB9ID0gcmV0cnlQb2xpY3k7XG4gICAgICByZXRyeVBvbGljeSA9IHdpdGhvdXQ7XG4gICAgfSBlbHNlIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIocmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF4aW11bUludGVydmFsID0gbXNPcHRpb25hbFRvTnVtYmVyKHJldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCk7XG4gIGNvbnN0IGluaXRpYWxJbnRlcnZhbCA9IG1zVG9OdW1iZXIocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsID8/IDEwMDApO1xuICBpZiAobWF4aW11bUludGVydmFsID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgMCcpO1xuICB9XG4gIGlmIChpbml0aWFsSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKG1heGltdW1JbnRlcnZhbCAhPSBudWxsICYmIG1heGltdW1JbnRlcnZhbCA8IGluaXRpYWxJbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwgY2Fubm90IGJlIGxlc3MgdGhhbiBpdHMgaW5pdGlhbEludGVydmFsJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG1zVG9Ucyhpbml0aWFsSW50ZXJ2YWwpLFxuICAgIG1heGltdW1JbnRlcnZhbDogbXNPcHRpb25hbFRvVHMobWF4aW11bUludGVydmFsKSxcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFJldHJ5UG9saWN5IGludG8gYSBUUyBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb21waWxlUmV0cnlQb2xpY3koXG4gIHJldHJ5UG9saWN5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUmV0cnlQb2xpY3kgfCBudWxsXG4pOiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmV0cnlQb2xpY3kpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUF0dGVtcHRzOiByZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPz8gdW5kZWZpbmVkLFxuICAgIG1heGltdW1JbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKSxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG9wdGlvbmFsVHNUb01zKHJldHJ5UG9saWN5LmluaXRpYWxJbnRlcnZhbCksXG4gICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogcmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlcyA/PyB1bmRlZmluZWQsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5ID0gU2VhcmNoQXR0cmlidXRlVmFsdWUgfCBSZWFkb25seTxTZWFyY2hBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVzID0gUmVjb3JkPHN0cmluZywgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5Pjtcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVbXTtcblxuZXhwb3J0IGNvbnN0IFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSB7XG4gIFRFWFQ6ICdURVhUJyxcbiAgS0VZV09SRDogJ0tFWVdPUkQnLFxuICBJTlQ6ICdJTlQnLFxuICBET1VCTEU6ICdET1VCTEUnLFxuICBCT09MOiAnQk9PTCcsXG4gIERBVEVUSU1FOiAnREFURVRJTUUnLFxuICBLRVlXT1JEX0xJU1Q6ICdLRVlXT1JEX0xJU1QnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSAodHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGUpW2tleW9mIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuLy8gTm90ZTogZW5jb2RlU2VhcmNoQXR0cmlidXRlSW5kZXhlZFZhbHVlVHlwZSBleHBvcnRlZCBmb3IgdXNlIGluIHRlc3RzIHRvIHJlZ2lzdGVyIHNlYXJjaCBhdHRyaWJ1dGVzXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVTZWFyY2hBdHRyaWJ1dGVJbmRleGVkVmFsdWVUeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICAnSU5ERVhFRF9WQUxVRV9UWVBFXydcbj4oXG4gIHtcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUXTogMSxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEXTogMixcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5JTlRdOiAzLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRV06IDQsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTF06IDUsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUVdOiA2LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdJTkRFWEVEX1ZBTFVFX1RZUEVfJ1xuKTtcblxuaW50ZXJmYWNlIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nIHtcbiAgVEVYVDogc3RyaW5nO1xuICBLRVlXT1JEOiBzdHJpbmc7XG4gIElOVDogbnVtYmVyO1xuICBET1VCTEU6IG51bWJlcjtcbiAgQk9PTDogYm9vbGVhbjtcbiAgREFURVRJTUU6IERhdGU7XG4gIEtFWVdPUkRfTElTVDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVmFsdWVGb3JUeXBlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihcbiAgdHlwZTogVCxcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUU6XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEF0dHJpYnV0ZUtleTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZWFyY2hBdHRyaWJ1dGVLZXk8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KG5hbWU6IHN0cmluZywgdHlwZTogVCk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPiB7XG4gIHJldHVybiB7IG5hbWUsIHR5cGUgfTtcbn1cblxuY2xhc3MgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlLCBWID0gSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZTogVDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFY7XG5cbiAgY29uc3RydWN0b3IodHlwZTogVCwgdmFsdWU6IFYpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogViB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG59XG5cbi8vIEludGVybmFsIHR5cGUgZm9yIGNsYXNzIHByaXZhdGUgZGF0YS5cbi8vIEV4cG9ydGVkIGZvciB1c2UgaW4gcGF5bG9hZCBjb252ZXJzaW9uLlxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQ+IHt9XG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFxuICBULFxuICBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGxcbj4ge31cblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB9O1xufVtTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGwgfTtcbn1bU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICBwcml2YXRlIHNlYXJjaEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10pIHtcbiAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcGFpciBvZiBpbml0aWFsQXR0cmlidXRlcykge1xuICAgICAgaWYgKHBhaXIua2V5Lm5hbWUgaW4gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHNlYXJjaCBhdHRyaWJ1dGUga2V5OiAke3BhaXIua2V5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQ8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+KTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNba2V5Lm5hbWVdO1xuICAgIC8vIEtleSBub3QgZm91bmQgb3IgdHlwZSBtaXNtYXRjaC5cbiAgICBpZiAoYXR0ciA9PT0gdW5kZWZpbmVkIHx8ICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGtleS50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHIudmFsdWU7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIGluc3RhbmNlICovXG4gIGNvcHkoKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgbGV0IHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIC8vIEZvciBub24tcHJpbWl0aXZlIHR5cGVzLCBjcmVhdGUgYSBkZWVwIGNvcHlcbiAgICAgIGlmIChhdHRyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKGF0dHIudmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGF0dHIudmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gWy4uLmF0dHIudmFsdWVdO1xuICAgICAgfVxuICAgICAgc3RhdGVba2V5XSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKGF0dHIudHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXR1cm4gdmFsdWUgd2l0aCBtYW51YWxseSBhc3NpZ25lZCBzdGF0ZS5cbiAgICBjb25zdCByZXMgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKCk7XG4gICAgcmVzLnNlYXJjaEF0dHJpYnV0ZXMgPSBzdGF0ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICogUmV0dXJuIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBhcyBTZWFyY2hBdHRyaWJ1dGVQYWlyW11cbiAgICogRGVmYXVsdCB0b0pTT04gbWV0aG9kIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQncyBKU09OIHJlcHJlc2VudGF0aW9uIGluY2x1ZGVzIHByaXZhdGUgc3RhdGUuXG4gICAqL1xuICB0b0pTT04oKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgaW5zdGFuY2Ugd2l0aCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGVzLiAqL1xuICB1cGRhdGVDb3B5KHVwZGF0ZXM6IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgIGNvbnN0IHJlcyA9IHRoaXMuY29weSgpO1xuICAgIC8vIEFwcGx5IHVwZGF0ZXMuXG4gICAgcmVzLnVwZGF0ZSh1cGRhdGVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gUGVyZm9ybXMgZGlyZWN0IG11dGF0aW9uIG9uIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICBwcml2YXRlIHVwZGF0ZSh1cGRhdGVzOiBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pIHtcbiAgICAvLyBBcHBseSB1cGRhdGVzLlxuICAgIGZvciAoY29uc3QgcGFpciBvZiB1cGRhdGVzKSB7XG4gICAgICAvLyBEZWxldGUgYXR0cmlidXRlLlxuICAgICAgaWYgKHBhaXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRGVsZXRlIG9ubHkgaWYgdGhlIHVwZGF0ZSBtYXRjaGVzIGEga2V5IGFuZCB0eXBlLlxuICAgICAgICBjb25zdCBhdHRyVmFsID0gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbCAmJiBhdHRyVmFsLnR5cGUgPT09IHBhaXIua2V5LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSBhdHRyaWJ1dGUuXG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwoKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICBjb25zdCByZXM6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cktleSA9IHsgbmFtZToga2V5LCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIFNhbml0eSBjaGVjaywgc2hvdWxkIGFsd2F5cyBiZSBsZWdhbC5cbiAgICAgIGlmIChpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHJLZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgcmVzLnB1c2goeyBrZXk6IGF0dHJLZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0S2V5RnJvbVVudHlwZWQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seVxuICApOiBTZWFyY2hBdHRyaWJ1dGVLZXk8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5wYWNrIHNpbmdsZS1lbGVtZW50IGFycmF5cy5cbiAgICBjb25zdCB2YWwgPSB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbCkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgLy8gQ2hlY2sgaWYgdmFsIGlzIGFuIElTTyBzdHJpbmcsIGlmIHNvLCByZXR1cm4gYSBEQVRFVElNRSBrZXkuXG4gICAgICAgIGlmICghaXNOYU4oRGF0ZS5wYXJzZSh2YWwpKSAmJiBEYXRlLnBhcnNlKHZhbCkgPT09IG5ldyBEYXRlKHZhbCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQgfTtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHR5cGU6IE51bWJlci5pc0ludGVnZXIodmFsKSA/IFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UIDogU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEUsXG4gICAgICAgIH07XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0wgfTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b01ldGFkYXRhVHlwZSh0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUOlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICAgIHJldHVybiAnS2V5d29yZCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgICByZXR1cm4gJ0ludCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFOlxuICAgICAgICByZXR1cm4gJ0RvdWJsZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgICAgcmV0dXJuICdCb29sJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTpcbiAgICAgICAgcmV0dXJuICdEYXRldGltZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUOlxuICAgICAgICByZXR1cm4gJ0tleXdvcmRMaXN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWFyY2ggYXR0cmlidXRlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdG9TZWFyY2hBdHRyaWJ1dGVUeXBlKHR5cGU6IHN0cmluZyk6IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIFRoZSB0eXBlIG1ldGFkYXRhIGlzIHVzdWFsbHkgaW4gUGFzY2FsQ2FzZSAoZS5nLiBcIktleXdvcmRMaXN0XCIpIGJ1dCBpblxuICAgIC8vIHJhcmUgY2FzZXMgbWF5IGJlIGluIFNDUkVBTUlOR19TTkFLRV9DQVNFIChlLmcuIFwiSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVFwiKS5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ1RleHQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX1RFWFQnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUO1xuICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ7XG4gICAgICBjYXNlICdJbnQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0lOVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLklOVDtcbiAgICAgIGNhc2UgJ0RvdWJsZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfRE9VQkxFJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFO1xuICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfQk9PTCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0w7XG4gICAgICBjYXNlICdEYXRldGltZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfREFURVRJTUUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTtcbiAgICAgIGNhc2UgJ0tleXdvcmRMaXN0JzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEX0xJU1QnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5pbXBvcnQgbXMgZnJvbSAnbXMnO1xuaW1wb3J0IHR5cGUgeyBnb29nbGUgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBOT1RFOiB0aGVzZSBhcmUgdGhlIHNhbWUgaW50ZXJmYWNlIGluIEpTXG4vLyBnb29nbGUucHJvdG9idWYuSUR1cmF0aW9uO1xuLy8gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG4vLyBUaGUgY29udmVyc2lvbiBmdW5jdGlvbnMgYmVsb3cgc2hvdWxkIHdvcmsgZm9yIGJvdGhcblxuZXhwb3J0IHR5cGUgVGltZXN0YW1wID0gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG5cbi8qKlxuICogQSBkdXJhdGlvbiwgZXhwcmVzc2VkIGVpdGhlciBhcyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIG9yIGFzIGEge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uID0gU3RyaW5nVmFsdWUgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCwgdGhyb3dzIGEgVHlwZUVycm9yLCB3aXRoIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJHtmaWVsZE5hbWV9IHRvIGJlIGEgdGltZXN0YW1wLCBnb3QgJHt0c31gKTtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIGNvbnN0IHsgc2Vjb25kcywgbmFub3MgfSA9IHRzO1xuICByZXR1cm4gKHNlY29uZHMgfHwgTG9uZy5VWkVSTylcbiAgICAubXVsKDEwMDApXG4gICAgLmFkZChNYXRoLmZsb29yKChuYW5vcyB8fCAwKSAvIDEwMDAwMDApKVxuICAgIC50b051bWJlcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7XG4gIGNvbnN0IG5hbm9zID0gKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMDtcbiAgaWYgKE51bWJlci5pc05hTihzZWNvbmRzKSB8fCBOdW1iZXIuaXNOYU4obmFub3MpKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgbWlsbGlzICR7bWlsbGlzfWApO1xuICB9XG4gIHJldHVybiB7IHNlY29uZHM6IExvbmcuZnJvbU51bWJlcihzZWNvbmRzKSwgbmFub3MgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIG1zTnVtYmVyVG9Ucyhtc1RvTnVtYmVyKHN0cikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyID8gbXNUb1RzKHN0cikgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1zVG9OdW1iZXIodmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcmV0dXJuIG1zV2l0aFZhbGlkYXRpb24odmFsKTtcbn1cblxuZnVuY3Rpb24gbXNXaXRoVmFsaWRhdGlvbihzdHI6IFN0cmluZ1ZhbHVlKTogbnVtYmVyIHtcbiAgY29uc3QgbWlsbGlzID0gbXMoc3RyKTtcbiAgaWYgKG1pbGxpcyA9PSBudWxsIHx8IGlzTmFOKG1pbGxpcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGR1cmF0aW9uIHN0cmluZzogJyR7c3RyfSdgKTtcbiAgfVxuICByZXR1cm4gbWlsbGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUodHNUb01zKHRzKSk7XG59XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHJlcXVpcmVkVHNUb01zKHRzLCBmaWVsZE5hbWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHQgKGltcG9ydGVkIHZpYSBzY2hlZHVsZS1oZWxwZXJzLnRzKVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRGF0ZVRvVHMoZGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICBpZiAoZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IGRhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBtc1RvVHMoZGF0ZS5nZXRUaW1lKCkpO1xufVxuIiwiZXhwb3J0IHR5cGUgTm9uTnVsbGFibGVPYmplY3Q8VD4gPSB7IFtQIGluIGtleW9mIFRdLT86IE5vbk51bGxhYmxlPFRbUF0+IH07XG5cbi8qKiBTaG9ydGhhbmQgYWxpYXMgKi9cbmV4cG9ydCB0eXBlIEFueUZ1bmMgPSAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuLyoqIEEgdHVwbGUgd2l0aG91dCBpdHMgbGFzdCBlbGVtZW50ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdDxUPiA9IFQgZXh0ZW5kcyBbLi4uaW5mZXIgUkVTVCwgYW55XSA/IFJFU1QgOiBuZXZlcjtcblxuLyoqIEYgd2l0aCBhbGwgYXJndW1lbnRzIGJ1dCB0aGUgbGFzdCAqL1xuZXhwb3J0IHR5cGUgT21pdExhc3RQYXJhbTxGIGV4dGVuZHMgQW55RnVuYz4gPSAoLi4uYXJnczogT21pdExhc3Q8UGFyYW1ldGVyczxGPj4pID0+IFJldHVyblR5cGU8Rj47XG5cbmV4cG9ydCB0eXBlIE9taXRGaXJzdDxUPiA9IFQgZXh0ZW5kcyBbYW55LCAuLi5pbmZlciBSRVNUXSA/IFJFU1QgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgT21pdEZpcnN0UGFyYW08VD4gPSBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgPyAoLi4uYXJnczogT21pdEZpcnN0PFBhcmFtZXRlcnM8VD4+KSA9PiBSZXR1cm5UeXBlPFQ+XG4gIDogbmV2ZXI7XG5cbi8qKiBSZXF1aXJlIHRoYXQgVCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGRlZmluZWQgKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVBdExlYXN0T25lPFQsIEtleXMgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4gPSBQaWNrPFQsIEV4Y2x1ZGU8a2V5b2YgVCwgS2V5cz4+ICZcbiAge1xuICAgIFtLIGluIEtleXNdLT86IFJlcXVpcmVkPFBpY2s8VCwgSz4+ICYgUGFydGlhbDxQaWNrPFQsIEV4Y2x1ZGU8S2V5cywgSz4+PjtcbiAgfVtLZXlzXTtcblxuLyoqIFZlcmlmeSB0aGF0IGFuIHR5cGUgX0NvcHkgZXh0ZW5kcyBfT3JpZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRXh0ZW5kczxfT3JpZywgX0NvcHkgZXh0ZW5kcyBfT3JpZz4oKTogdm9pZCB7XG4gIC8vIG5vb3AsIGp1c3QgdHlwZSBjaGVja1xufVxuXG5leHBvcnQgdHlwZSBSZXBsYWNlPEJhc2UsIE5ldz4gPSBPbWl0PEJhc2UsIGtleW9mIE5ldz4gJiBOZXc7XG5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS91bmlvbi10by1pbnRlcnNlY3Rpb24uZC50c1xuLy8gTUlUIG9yIENDMC0xLjAg4oCUIEl0IGlzIG1lYW50IHRvIGJlIGNvcGllZCBpbnRvIHlvdXIgY29kZWJhc2UgcmF0aGVyIHRoYW4gYmVpbmcgdXNlZCBhcyBhIGRlcGVuZGVuY3kuXG5leHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9XG4gIC8vIGBleHRlbmRzIHVua25vd25gIGlzIGFsd2F5cyBnb2luZyB0byBiZSB0aGUgY2FzZSBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBgVW5pb25gIGludG8gYVxuICAvLyBbZGlzdHJpYnV0aXZlIGNvbmRpdGlvbmFsIHR5cGVdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3JlbGVhc2Utbm90ZXMvdHlwZXNjcmlwdC0yLTguaHRtbCNkaXN0cmlidXRpdmUtY29uZGl0aW9uYWwtdHlwZXMpLlxuICAoXG4gICAgVW5pb24gZXh0ZW5kcyB1bmtub3duXG4gICAgICA/IC8vIFRoZSB1bmlvbiB0eXBlIGlzIHVzZWQgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gYSBmdW5jdGlvbiBzaW5jZSB0aGUgdW5pb25cbiAgICAgICAgLy8gb2YgZnVuY3Rpb24gYXJndW1lbnRzIGlzIGFuIGludGVyc2VjdGlvbi5cbiAgICAgICAgKGRpc3RyaWJ1dGVkVW5pb246IFVuaW9uKSA9PiB2b2lkXG4gICAgICA6IC8vIFRoaXMgd29uJ3QgaGFwcGVuLlxuICAgICAgICBuZXZlclxuICApIGV4dGVuZHMgLy8gSW5mZXIgdGhlIGBJbnRlcnNlY3Rpb25gIHR5cGUgc2luY2UgVHlwZVNjcmlwdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbmFsXG4gIC8vIGFyZ3VtZW50cyBvZiB1bmlvbnMgb2YgZnVuY3Rpb25zIGFzIGFuIGludGVyc2VjdGlvbiBvZiB0aGUgdW5pb24uXG4gIChtZXJnZWRJbnRlcnNlY3Rpb246IGluZmVyIEludGVyc2VjdGlvbikgPT4gdm9pZFxuICAgID8gLy8gVGhlIGAmIFVuaW9uYCBpcyB0byBhbGxvdyBpbmRleGluZyBieSB0aGUgcmVzdWx0aW5nIHR5cGVcbiAgICAgIEludGVyc2VjdGlvbiAmIFVuaW9uXG4gICAgOiBuZXZlcjtcblxudHlwZSBJc0VxdWFsPEEsIEI+ID0gKDxHPigpID0+IEcgZXh0ZW5kcyBBID8gMSA6IDIpIGV4dGVuZHMgPEc+KCkgPT4gRyBleHRlbmRzIEIgPyAxIDogMiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN5bWJvbCB8IGJpZ2ludDtcblxudHlwZSBJc051bGw8VD4gPSBbVF0gZXh0ZW5kcyBbbnVsbF0gPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNVbmtub3duPFQ+ID0gdW5rbm93biBleHRlbmRzIFQgLy8gYFRgIGNhbiBiZSBgdW5rbm93bmAgb3IgYGFueWBcbiAgPyBJc051bGw8VD4gZXh0ZW5kcyBmYWxzZSAvLyBgYW55YCBjYW4gYmUgYG51bGxgLCBidXQgYHVua25vd25gIGNhbid0IGJlXG4gICAgPyB0cnVlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG50eXBlIE9iamVjdFZhbHVlPFQsIEs+ID0gSyBleHRlbmRzIGtleW9mIFRcbiAgPyBUW0tdXG4gIDogVG9TdHJpbmc8Sz4gZXh0ZW5kcyBrZXlvZiBUXG4gICAgPyBUW1RvU3RyaW5nPEs+XVxuICAgIDogSyBleHRlbmRzIGAke2luZmVyIE51bWJlcksgZXh0ZW5kcyBudW1iZXJ9YFxuICAgICAgPyBOdW1iZXJLIGV4dGVuZHMga2V5b2YgVFxuICAgICAgICA/IFRbTnVtYmVyS11cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBuZXZlcjtcblxudHlwZSBUb1N0cmluZzxUPiA9IFQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgPyBgJHtUfWAgOiBuZXZlcjtcblxudHlwZSBLZXlzT2ZVbmlvbjxPYmplY3RUeXBlPiA9IE9iamVjdFR5cGUgZXh0ZW5kcyB1bmtub3duID8ga2V5b2YgT2JqZWN0VHlwZSA6IG5ldmVyO1xuXG50eXBlIEFycmF5RWxlbWVudDxUPiA9IFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gPyBUWzBdIDogbmV2ZXI7XG5cbnR5cGUgRXhhY3RPYmplY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9IHtcbiAgW0tleSBpbiBrZXlvZiBQYXJhbWV0ZXJUeXBlXTogRXhhY3Q8UGFyYW1ldGVyVHlwZVtLZXldLCBPYmplY3RWYWx1ZTxJbnB1dFR5cGUsIEtleT4+O1xufSAmIFJlY29yZDxFeGNsdWRlPGtleW9mIElucHV0VHlwZSwgS2V5c09mVW5pb248UGFyYW1ldGVyVHlwZT4+LCBuZXZlcj47XG5cbmV4cG9ydCB0eXBlIEV4YWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gPVxuICAvLyBCZWZvcmUgZGlzdHJpYnV0aW5nLCBjaGVjayBpZiB0aGUgdHdvIHR5cGVzIGFyZSBlcXVhbCBhbmQgaWYgc28sIHJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGUgaW1tZWRpYXRlbHlcbiAgSXNFcXVhbDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGFyYW1ldGVyVHlwZVxuICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIHByaW1pdGl2ZSwgcmV0dXJuIGl0IGFzIGlzIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGl0IGJlaW5nIGNvbnZlcnRlZCB0byBhIGNvbXBsZXggdHlwZVxuICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIFByaW1pdGl2ZVxuICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gdW5rbm93biwgcmV0dXJuIGl0IGFzIGlzIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGl0IGJlaW5nIGNvbnZlcnRlZCB0byBhIGNvbXBsZXggdHlwZVxuICAgICAgICBJc1Vua25vd248UGFyYW1ldGVyVHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgICAgID8gdW5rbm93blxuICAgICAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBGdW5jdGlvbiwgcmV0dXJuIGl0IGFzIGlzIGJlY2F1c2UgdGhpcyB0eXBlIGlzIG5vdCBjYXBhYmxlIG9mIGhhbmRsaW5nIGZ1bmN0aW9uLCBsZWF2ZSBpdCB0byBUeXBlU2NyaXB0XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBGdW5jdGlvblxuICAgICAgICAgID8gUGFyYW1ldGVyVHlwZVxuICAgICAgICAgIDogLy8gQ29udmVydCB1bmlvbiBvZiBhcnJheSB0byBhcnJheSBvZiB1bmlvbjogQVtdICYgQltdID0+IChBICYgQilbXVxuICAgICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIHVua25vd25bXVxuICAgICAgICAgICAgPyBBcnJheTxFeGFjdDxBcnJheUVsZW1lbnQ8UGFyYW1ldGVyVHlwZT4sIEFycmF5RWxlbWVudDxJbnB1dFR5cGU+Pj5cbiAgICAgICAgICAgIDogLy8gSW4gVHlwZVNjcmlwdCwgQXJyYXkgaXMgYSBzdWJ0eXBlIG9mIFJlYWRvbmx5QXJyYXksIHNvIGFsd2F5cyB0ZXN0IEFycmF5IGJlZm9yZSBSZWFkb25seUFycmF5LlxuICAgICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdXG4gICAgICAgICAgICAgID8gUmVhZG9ubHlBcnJheTxFeGFjdDxBcnJheUVsZW1lbnQ8UGFyYW1ldGVyVHlwZT4sIEFycmF5RWxlbWVudDxJbnB1dFR5cGU+Pj5cbiAgICAgICAgICAgICAgOiBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+O1xuLy8gRW5kIG9mIGJvcnJvdyBmcm9tICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG5cbmV4cG9ydCB0eXBlIFJlbW92ZVByZWZpeDxQcmVmaXggZXh0ZW5kcyBzdHJpbmcsIEtleXMgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBbayBpbiBLZXlzXTogayBleHRlbmRzIGAke1ByZWZpeH0ke2luZmVyIFN1ZmZpeH1gID8gU3VmZml4IDogbmV2ZXI7XG59W0tleXNdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICByZWNvcmQ6IFgsXG4gIHByb3A6IFlcbik6IHJlY29yZCBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIHByb3AgaW4gcmVjb3JkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydGllczxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcHM6IFlbXVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcHMuZXZlcnkoKHByb3ApID0+IHByb3AgaW4gcmVjb3JkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciB7XG4gIHJldHVybiAoXG4gICAgaXNSZWNvcmQoZXJyb3IpICYmXG4gICAgdHlwZW9mIGVycm9yLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgKGVycm9yLnN0YWNrID09IG51bGwgfHwgdHlwZW9mIGVycm9yLnN0YWNrID09PSAnc3RyaW5nJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yICYgeyBuYW1lOiAnQWJvcnRFcnJvcicgfSB7XG4gIHJldHVybiBpc0Vycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcic7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5tZXNzYWdlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBFcnJvcldpdGhDb2RlIHtcbiAgY29kZTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvcldpdGhDb2RlIHtcbiAgcmV0dXJuIGlzUmVjb3JkKGVycm9yKSAmJiB0eXBlb2YgZXJyb3IuY29kZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5jb2RlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgc29tZSB0eXBlIGlzIHRoZSBuZXZlciB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROZXZlcihtc2c6IHN0cmluZywgeDogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IobXNnICsgJzogJyArIHgpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzczxFIGV4dGVuZHMgRXJyb3I+ID0ge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogRTtcbiAgcHJvdG90eXBlOiBFO1xufTtcblxuLyoqXG4gKiBBIGRlY29yYXRvciB0byBiZSB1c2VkIG9uIGVycm9yIGNsYXNzZXMuIEl0IGFkZHMgdGhlICduYW1lJyBwcm9wZXJ0eSBBTkQgcHJvdmlkZXMgYSBjdXN0b21cbiAqICdpbnN0YW5jZW9mJyBoYW5kbGVyIHRoYXQgd29ya3MgY29ycmVjdGx5IGFjcm9zcyBleGVjdXRpb24gY29udGV4dHMuXG4gKlxuICogIyMjIERldGFpbHMgIyMjXG4gKlxuICogQWNjb3JkaW5nIHRvIHRoZSBFY21hU2NyaXB0J3Mgc3BlYywgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSmF2YVNjcmlwdCdzIGB4IGluc3RhbmNlb2YgWWAgb3BlcmF0b3IgaXMgdG8gd2FsayB1cCB0aGVcbiAqIHByb3RvdHlwZSBjaGFpbiBvZiBvYmplY3QgJ3gnLCBjaGVja2luZyBpZiBhbnkgY29uc3RydWN0b3IgaW4gdGhhdCBoaWVyYXJjaHkgaXMgX2V4YWN0bHkgdGhlIHNhbWUgb2JqZWN0XyBhcyB0aGVcbiAqIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICdZJy5cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCBpdCBoYXBwZW5zIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGF0IGRpZmZlcmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBvYmplY3RzIGdldCBjcmVhdGVkIGZvciB3aGF0XG4gKiBhcHBlYXJzIHRvIGJlIHRoZSB2ZXJ5IHNhbWUgY2xhc3MuIFRoaXMgbGVhZHMgdG8gc3VycHJpc2luZyBiZWhhdmlvciB3aGVyZSBgaW5zdGFuY2VvZmAgcmV0dXJucyBmYWxzZSB0aG91Z2ggaXQgaXNcbiAqIGtub3duIHRoYXQgdGhlIG9iamVjdCBpcyBpbmRlZWQgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4gT25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgd2hlbiBjb25zdHJ1Y3RvclxuICogJ1knIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGUgY29uc3R1Y3RvciB3aXRoIHdoaWNoICd4JyB3YXMgaW5zdGFudGlhdGVkLiBBbm90aGVyIGNhc2UgaXMgd2hlbiB0d28gY29waWVzXG4gKiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGdldHMgbG9hZGVkIGluIHRoZSBzYW1lIHJlYWxtLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIHRlbmRzIHRvIGNhdXNlIGlzc3VlcyB3aGVuIGNyb3NzaW5nIHRoZSB3b3JrZmxvdy1zYW5kYm94aW5nIGJvdW5kYXJ5IChzaW5jZSBOb2RlJ3Mgdm0gbW9kdWxlXG4gKiByZWFsbHkgY3JlYXRlcyBuZXcgZXhlY3V0aW9uIHJlYWxtcyksIGFzIHdlbGwgYXMgd2hlbiBydW5uaW5nIHRlc3RzIHVzaW5nIEplc3QgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdGpzL2plc3QvaXNzdWVzLzI1NDlcbiAqIGZvciBzb21lIGRldGFpbHMgb24gdGhhdCBvbmUpLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW5qZWN0cyBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBpbnRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6Jywgd2hpY2ggaXMgYm90aCBjcm9zcy1yZWFsbSBzYWZlIGFuZFxuICogY3Jvc3MtY29waWVzLW9mLXRoZS1zYW1lLWxpYiBzYWZlLiBJdCB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIHN5bWJvbCBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIGFuZCB0aGVuXG4gKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoYXQgc3ltYm9sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3I8RSBleHRlbmRzIEVycm9yPihtYXJrZXJOYW1lOiBzdHJpbmcpOiAoY2xheno6IENsYXNzPEU+KSA9PiB2b2lkIHtcbiAgcmV0dXJuIChjbGF6ejogQ2xhc3M8RT4pOiB2b2lkID0+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBTeW1ib2wuZm9yKGBfX3RlbXBvcmFsX2lzJHttYXJrZXJOYW1lfWApO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgJ25hbWUnLCB7IHZhbHVlOiBtYXJrZXJOYW1lLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYmplY3Qtc2hvcnRoYW5kXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKHRoaXM6IGFueSwgZXJyb3I6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcyA9PT0gY2xhenopIHtcbiAgICAgICAgICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIChlcnJvciBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gJ3RoaXMnIG11c3QgYmUgYSBfc3ViY2xhc3NfIG9mIGNsYXp6IHRoYXQgZG9lc24ndCByZWRlZmluZWQgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIHNvIHRoYXQgaXQgaW5oZXJpdGVkXG4gICAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAgIC8vIGB4IGluc3RhbmNlb2YgU3ViY2xhc3NPZlBhcmVudGAgd291bGQgcmV0dXJuIHRydWUgZm9yIGFueSBpbnN0YW5jZSBvZiAnUGFyZW50Jywgd2hpY2ggaXMgY2xlYXJseSB3cm9uZy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAgIC8vIHJlZGVmaW5lIFtTeW1ib2wuaGFzSW5zdGFuY2VdLCBidXQgd2UgY2FuJ3QgZW5mb3JjZSB0aGF0LiBXZSB0aGVyZWZvcmUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2VvZlxuICAgICAgICAgIC8vIGJlaGF2aW9yICh3aGljaCBpcyBOT1QgY3Jvc3MtcmVhbG0gc2FmZSkuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZXJyb3IpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZCB9IGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL2NvbnZlcnRlci9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuXG4vKipcbiAqIFVzZXIgbWV0YWRhdGEgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gd29ya2Zsb3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1ldGFkYXRhIHtcbiAgLyoqIEBleHBlcmltZW50YWwgQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2UgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcbiAgLyoqIEBleHBlcmltZW50YWwgRml4ZWQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjb21tYW5kIGZvciBsb25nZXItdGV4dCBkZXNjcmlwdGlvbiwgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJNZXRhZGF0YVRvUGF5bG9hZChcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgc3RhdGljU3VtbWFyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdGF0aWNEZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuKTogdGVtcG9yYWwuYXBpLnNkay52MS5JVXNlck1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN0YXRpY1N1bW1hcnkgPT0gbnVsbCAmJiBzdGF0aWNEZXRhaWxzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3VtbWFyeSA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNTdW1tYXJ5LCBjb250ZXh0KTtcbiAgY29uc3QgZGV0YWlscyA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNEZXRhaWxzLCBjb250ZXh0KTtcblxuICBpZiAoc3VtbWFyeSA9PSBudWxsICYmIGRldGFpbHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBzdW1tYXJ5LCBkZXRhaWxzIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgYXMgVmVyc2lvbmluZ0ludGVudFN0cmluZyB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGNoZWNrRXh0ZW5kcyB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLy8gQXZvaWQgaW1wb3J0aW5nIHRoZSBwcm90byBpbXBsZW1lbnRhdGlvbiB0byByZWR1Y2Ugd29ya2Zsb3cgYnVuZGxlIHNpemVcbi8vIENvcGllZCBmcm9tIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnRcbi8qKlxuICogUHJvdG9idWYgZW51bSByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgVmVyc2lvbmluZ0ludGVudFN0cmluZ30uXG4gKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25pbmdJbnRlbnQge1xuICBVTlNQRUNJRklFRCA9IDAsXG4gIENPTVBBVElCTEUgPSAxLFxuICBERUZBVUxUID0gMixcbn1cblxuY2hlY2tFeHRlbmRzPGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQsIFZlcnNpb25pbmdJbnRlbnQ+KCk7XG5jaGVja0V4dGVuZHM8VmVyc2lvbmluZ0ludGVudCwgY29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudD4oKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKGludGVudDogVmVyc2lvbmluZ0ludGVudFN0cmluZyB8IHVuZGVmaW5lZCk6IFZlcnNpb25pbmdJbnRlbnQge1xuICBzd2l0Y2ggKGludGVudCkge1xuICAgIGNhc2UgJ0RFRkFVTFQnOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuREVGQVVMVDtcbiAgICBjYXNlICdDT01QQVRJQkxFJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkNPTVBBVElCTEU7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5VTlNQRUNJRklFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIoJ1VuZXhwZWN0ZWQgVmVyc2lvbmluZ0ludGVudCcsIGludGVudCk7XG4gIH1cbn1cbiIsIi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaW50ZW5kcyBjZXJ0YWluIGNvbW1hbmRzIHRvIGJlIHJ1biBvbiBhIGNvbXBhdGlibGUgd29ya2VyIEJ1aWxkIElkIHZlcnNpb24gb3Igbm90LlxuICpcbiAqIGBDT01QQVRJQkxFYCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcnVuIG9uIGEgd29ya2VyIHdpdGggY29tcGF0aWJsZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLiBJdCBtYXkgbm90IGJlXG4gKiBwb3NzaWJsZSBpZiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUgZG9lcyBub3QgYWxzbyBoYXZlIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCB3b3JrZXIncyBCdWlsZCBJZC5cbiAqXG4gKiBgREVGQVVMVGAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUncyBjdXJyZW50IG92ZXJhbGwtZGVmYXVsdCBCdWlsZCBJZC5cbiAqXG4gKiBXaGVyZSB0aGlzIHR5cGUgaXMgYWNjZXB0ZWQgb3B0aW9uYWxseSwgYW4gdW5zZXQgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIFNESyBzaG91bGQgY2hvb3NlIHRoZSBtb3N0IHNlbnNpYmxlIGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGUgdHlwZSBvZiBjb21tYW5kLCBhY2NvdW50aW5nIGZvciB3aGV0aGVyIHRoZSBjb21tYW5kIHdpbGwgYmUgcnVuIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgdGhlXG4gKiBjdXJyZW50IHdvcmtlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHN0YXJ0aW5nIFdvcmtmbG93cyBpcyBgREVGQVVMVGAuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBXb3JrZmxvd3Mgc3RhcnRpbmdcbiAqIEFjdGl2aXRpZXMsIHN0YXJ0aW5nIENoaWxkIFdvcmtmbG93cywgb3IgQ29udGludWluZyBBcyBOZXcgaXMgYENPTVBBVElCTEVgLlxuICpcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nSW50ZW50ID0gJ0NPTVBBVElCTEUnIHwgJ0RFRkFVTFQnO1xuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBhIHNwZWNpZmljIHdvcmtlciBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICByZWFkb25seSBkZXBsb3ltZW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkZXBsb3ltZW50IHZlcnNpb24sIHdoaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXRcbiAqIGBkZXBsb3ltZW50TmFtZS5idWlsZElkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsU3RyaW5nKHZlcnNpb246IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3ZlcnNpb24uZGVwbG95bWVudE5hbWV9LiR7dmVyc2lvbi5idWlsZElkfWA7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHdoZW4gYSB3b3JrZmxvdyBtaWdodCBtb3ZlIGZyb20gYSB3b3JrZXIgb2Ygb25lIEJ1aWxkIElkIHRvIGFub3RoZXIuXG4gKlxuICogKiAnUElOTkVEJyAtIFRoZSB3b3JrZmxvdyB3aWxsIGJlIHBpbm5lZCB0byB0aGUgY3VycmVudCBCdWlsZCBJRCB1bmxlc3MgbWFudWFsbHkgbW92ZWQuXG4gKiAqICdBVVRPX1VQR1JBREUnIC0gVGhlIHdvcmtmbG93IHdpbGwgYXV0b21hdGljYWxseSBtb3ZlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiAoZGVmYXVsdCBCdWlsZCBJRFxuICogICAgb2YgdGhlIHRhc2sgcXVldWUpIHdoZW4gdGhlIG5leHQgdGFzayBpcyBkaXNwYXRjaGVkLlxuICovXG5leHBvcnQgY29uc3QgVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBQSU5ORUQ6ICdQSU5ORUQnLFxuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yKVtrZXlvZiB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZVZlcnNpb25pbmdCZWhhdmlvcl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW1ZlcnNpb25pbmdCZWhhdmlvci5QSU5ORURdOiAxLFxuICAgIFtWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHZlcnNpb25pbmcgb3ZlcnJpZGVzLiBGb3IgZXhhbXBsZSwgd2hlbiBzdGFydGluZyB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdPdmVycmlkZSA9IFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB8ICdBVVRPX1VQR1JBREUnO1xuXG4vKipcbiAqIFdvcmtmbG93IHdpbGwgYmUgcGlubmVkIHRvIGEgc3BlY2lmaWMgZGVwbG95bWVudCB2ZXJzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2VyIGRlcGxveW1lbnQgdmVyc2lvbiB0byBwaW4gdGhlIHdvcmtmbG93IHRvLlxuICAgKi9cbiAgcGlubmVkVG86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdyB3aWxsIGF1dG8tdXBncmFkZSB0byB0aGUgY3VycmVudCBkZXBsb3ltZW50IHZlcnNpb24gb24gdGhlIG5leHQgd29ya2Zsb3cgdGFzay5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b1VwZ3JhZGVWZXJzaW9uaW5nT3ZlcnJpZGUgPSAnQVVUT19VUEdSQURFJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2ZXJzaW9uaW5nIGJlaGF2aW9yIHRvIGJlIHVzZWQgYnkgdGhlIGZpcnN0IHRhc2sgb2YgYSBuZXcgd29ya2Zsb3cgcnVuIGluIGEgY29udGludWUtYXMtbmV3IGNoYWluLlxuICpcbiAqIEFVVE9fVVBHUkFERSAtIFN0YXJ0IHRoZSBuZXcgcnVuIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IuIFVzZSB0aGUgVGFyZ2V0IFZlcnNpb24gb2YgdGhlIHdvcmtmbG93J3MgdGFzayBxdWV1ZSBhdFxuICogICBzdGFydC10aW1lLCBhcyBBdXRvVXBncmFkZSB3b3JrZmxvd3MgZG8uIEFmdGVyIHRoZSBmaXJzdCB3b3JrZmxvdyB0YXNrIGNvbXBsZXRlcywgdXNlIHdoYXRldmVyXG4gKiAgIFZlcnNpb25pbmcgQmVoYXZpb3IgdGhlIHdvcmtmbG93IGlzIGFubm90YXRlZCB3aXRoIGluIHRoZSB3b3JrZmxvdyBjb2RlLlxuICpcbiAqICAgTm90ZSB0aGF0IGlmIHRoZSBwcmV2aW91cyB3b3JrZmxvdyBoYWQgYSBQaW5uZWQgb3ZlcnJpZGUsIHRoYXQgb3ZlcnJpZGUgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlXG4gKiAgIG5ldyB3b3JrZmxvdyBydW4gcmVnYXJkbGVzcyBvZiB0aGUgQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvciBzcGVjaWZpZWQgaW4gdGhlIGNvbnRpbnVlLWFzLW5ld1xuICogICBjb21tYW5kLiBJZiBhIFBpbm5lZCBvdmVycmlkZSBpcyBpbmhlcml0ZWQgYnkgdGhlIG5ldyBydW4sIGFuZCB0aGUgbmV3IHJ1biBzdGFydHMgd2l0aCBBdXRvVXBncmFkZVxuICogICBiZWhhdmlvciwgdGhlIGJhc2UgdmVyc2lvbiBvZiB0aGUgbmV3IHJ1biB3aWxsIGJlIHRoZSBUYXJnZXQgVmVyc2lvbiBhcyBkZXNjcmliZWQgYWJvdmUsIGJ1dCB0aGVcbiAqICAgZWZmZWN0aXZlIHZlcnNpb24gd2lsbCBiZSB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIFZlcnNpb25pbmcgT3ZlcnJpZGUgdW50aWwgdGhlIG92ZXJyaWRlIGlzIHJlbW92ZWQuXG4gKlxuICogVVNFX1JBTVBJTkdfVkVSU0lPTiAtIFVzZSB0aGUgUmFtcGluZyBWZXJzaW9uIG9mIHRoZSB3b3JrZmxvdydzIHRhc2sgcXVldWUgYXQgc3RhcnQgdGltZSwgcmVnYXJkbGVzcyBvZiB0aGUgd29ya2Zsb3cnc1xuICogICBUYXJnZXQgVmVyc2lvbiAoYWNjb3JkaW5nIHRvIGYod29ya2Zsb3dfaWQsIHJhbXBfcGVyY2VudGFnZSkpLiBBZnRlciB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBjb21wbGV0ZXMsXG4gKiAgIHRoZSB3b3JrZmxvdyB3aWxsIHVzZSB3aGF0ZXZlciBWZXJzaW9uaW5nIEJlaGF2aW9yIGl0IGlzIGFubm90YXRlZCB3aXRoLiBJZiB0aGVyZSBpcyBubyBSYW1waW5nXG4gKiAgIFZlcnNpb24gYnkgdGhlIHRpbWUgdGhhdCB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBpcyBkaXNwYXRjaGVkLCBpdCB3aWxsIGJlIHNlbnQgdG8gdGhlIEN1cnJlbnQgVmVyc2lvbi5cbiAqXG4gKiAgIEl0IGlzIGhpZ2hseSBkaXNjb3VyYWdlZCB0byB1c2UgdGhpcyBpZiB0aGUgd29ya2Zsb3cgaXMgYW5ub3RhdGVkIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IsIGJlY2F1c2VcbiAqICAgdGhpcyBzZXR0aW5nIE9OTFkgYXBwbGllcyB0byB0aGUgZmlyc3QgdGFzayBvZiB0aGUgd29ya2Zsb3cuIElmLCBhZnRlciB0aGUgZmlyc3QgdGFzaywgdGhlIHdvcmtmbG93XG4gKiAgIGlzIEF1dG9VcGdyYWRlLCBpdCB3aWxsIGJlaGF2ZSBsaWtlIGEgbm9ybWFsIEF1dG9VcGdyYWRlIHdvcmtmbG93IGFuZCBnbyB0byB0aGUgVGFyZ2V0IFZlcnNpb24sIHdoaWNoXG4gKiAgIG1heSBiZSB0aGUgQ3VycmVudCBWZXJzaW9uIGluc3RlYWQgb2YgdGhlIFJhbXBpbmcgVmVyc2lvbi5cbiAqXG4gKiAgIE5vdGUgdGhhdCBpZiB0aGUgd29ya2Zsb3cgYmVpbmcgY29udGludWVkIGhhcyBhIFBpbm5lZCBvdmVycmlkZSwgdGhhdCBvdmVycmlkZSB3aWxsIGJlIGluaGVyaXRlZCBieSB0aGVcbiAqICAgbmV3IHdvcmtmbG93IHJ1biByZWdhcmRsZXNzIG9mIHRoZSBDb250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yIHNwZWNpZmllZCBpbiB0aGUgY29udGludWUtYXMtbmV3XG4gKiAgIGNvbW1hbmQuIFZlcnNpb25pbmcgT3ZlcnJpZGUgYWx3YXlzIHRha2VzIHByZWNlZGVuY2UgdW50aWwgaXQncyByZW1vdmVkIG1hbnVhbGx5IHZpYSBVcGRhdGVXb3JrZmxvd0V4ZWN1dGlvbk9wdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxuICBVU0VfUkFNUElOR19WRVJTSU9OOiAnVVNFX1JBTVBJTkdfVkVSU0lPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcilba2V5b2YgdHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3JdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gICdDT05USU5VRV9BU19ORVdfVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW0luaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMSxcbiAgICBbSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvci5VU0VfUkFNUElOR19WRVJTSU9OXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0NPTlRJTlVFX0FTX05FV19WRVJTSU9OSU5HX0JFSEFWSU9SXydcbik7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGVwbG95bWVudFZlcnNpb24oXG4gIHY6IGNvcmVzZGsuY29tbW9uLklXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB8IG51bGwgfCB1bmRlZmluZWRcbik6IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2IHx8ICF2LmJ1aWxkSWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBidWlsZElkOiB2LmJ1aWxkSWQsXG4gICAgZGVwbG95bWVudE5hbWU6IHYuZGVwbG95bWVudE5hbWUgPz8gJycsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdCZWhhdmlvciB9IGZyb20gJy4vd29ya2VyLWRlcGxveW1lbnRzJztcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBkZWZpbmluZyBhIHdvcmtmbG93IHZpYSB7QGxpbmsgc2V0V29ya2Zsb3dPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIHtcbiAgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZXMgb2YgZXJyb3JzIHRoYXQsIGlmIHRocm93biBieSB0aGUgV29ya2Zsb3cgZnVuY3Rpb24sIGEgc2lnbmFsIGhhbmRsZXIsIG9yIGFuIHVwZGF0ZVxuICAgKiBoYW5kbGVyLCB3aWxsIGNhdXNlIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gb3IgdGhlIFVwZGF0ZSB0byBmYWlsIGluc3RlYWQgb2YgZmFpbGluZyB0aGVcbiAgICogV29ya2Zsb3cgVGFzayAod2hpY2ggd291bGQgcmVzdWx0IGluIHJldHJ5aW5nIHRoZSBXb3JrZmxvdyBUYXNrIHVudGlsIGl0IGV2ZW50dWFsbHkgc3VjY2VlZHMpLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgcGVyLVdvcmtmbG93LXR5cGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfS5cbiAgICogQm90aCBzZXR0aW5ncyBhcmUgZXZhbHVhdGVkOyBhbiBlcnJvciBtYXRjaGluZyBlaXRoZXIgd2lsbCBjYXVzZSBXb3JrZmxvdyBmYWlsdXJlLlxuICAgKiBVbmxpa2UgdGhlIHN0cmluZy1iYXNlZCB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSwgdGhpcyBhY2NlcHRzXG4gICAqIGFjdHVhbCBjbGFzcyByZWZlcmVuY2VzLCBlbmFibGluZyBzdWJjbGFzcyBtYXRjaGluZyB2aWEgYGluc3RhbmNlb2ZgLCBidXQgZG9lc24ndCBhbGxvd1xuICAgKiBmYWlsaW5nIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gb24gX25vbi1kZXRlcm1pbmlzbSBlcnJvcnNfLiBGYWlsaW5nIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gb25cbiAgICogbm9uLWRldGVybWluaXNtIGVycm9ycyBjYW4gb25seSBiZSBzZXQgdmlhIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9LlxuICAgKlxuICAgKiBQYXNzaW5nIHRoZSBgRXJyb3JgIGNsYXNzIHRvIHRoaXMgc2V0dGluZyB3aWxsIGZhaWwgdGhlIFdvcmtmbG93IG9uIGFueSBlcnJvciwgZXhjZXB0XG4gICAqIG5vbi1kZXRlcm1pbmlzbSBlcnJvcnMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSBzdWJjbGFzc2VzIGFuZCBjYW5jZWxsYXRpb24gZXJyb3JzIHRoYXQgYnViYmxlcyBvdXRcbiAgICogb2YgdGhlIFdvcmtmbG93IGFsd2F5cyBmYWlsIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgZWl0aGVyIHRoaXMgYW5kIHRoZVxuICAgKiB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzPzogQXJyYXk8bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gRXJyb3I+O1xufVxuXG50eXBlIEFzeW5jRnVuY3Rpb248QXJncyBleHRlbmRzIGFueVtdLCBSZXR1cm5UeXBlPiA9ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJldHVyblR5cGU+O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyID0gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyB8ICgoKSA9PiBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zKTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqIEEgd29ya2Zsb3cgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiBkZWZpbmVkIHdpdGggb3B0aW9ucyBmcm9tIHtAbGluayBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdLCBSZXR1cm5UeXBlPiBleHRlbmRzIEFzeW5jRnVuY3Rpb248QXJncywgUmV0dXJuVHlwZT4ge1xuICB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zOiBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zT3JHZXR0ZXI7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93LCBXb3JrZmxvd1Jlc3VsdFR5cGUsIFNpZ25hbERlZmluaXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEJhc2UgV29ya2Zsb3dIYW5kbGUgaW50ZXJmYWNlLCBleHRlbmRlZCBpbiB3b3JrZmxvdyBhbmQgY2xpZW50IGxpYnMuXG4gKlxuICogVHJhbnNmb3JtcyBhIHdvcmtmbG93IGludGVyZmFjZSBgVGAgaW50byBhIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVdvcmtmbG93SGFuZGxlPFQgZXh0ZW5kcyBXb3JrZmxvdz4ge1xuICAvKipcbiAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlc1xuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuICAvKipcbiAgICogU2lnbmFsIGEgcnVubmluZyBXb3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGRlZiBhIHNpZ25hbCBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogYXdhaXQgaGFuZGxlLnNpZ25hbChpbmNyZW1lbnRTaWduYWwsIDMpO1xuICAgKiBgYGBcbiAgICovXG4gIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHwgc3RyaW5nLFxuICAgIC4uLmFyZ3M6IEFyZ3NcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIHdvcmtmbG93SWQgb2YgdGhlIGN1cnJlbnQgV29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZztcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEF0dHJpYnV0ZVBhaXIsIFNlYXJjaEF0dHJpYnV0ZXMsIFR5cGVkU2VhcmNoQXR0cmlidXRlcyB9IGZyb20gJy4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBQcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMgfSBmcm9tICcuL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucyc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGFcbiAqIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogQ29uY2VwdDoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvdy1leGVjdXRpb24vd29ya2Zsb3dpZC1ydW5pZCN3b3JrZmxvdy1pZC1yZXVzZS1wb2xpY3kgfCBXb3JrZmxvdyBJZCBSZXVzZSBQb2xpY3l9XG4gKlxuICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlLlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZSB0aGF0IGlzIG5vdCBDb21wbGV0ZWQuXG4gICAqL1xuICBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2Fubm90IGJlIHN0YXJ0ZWQuXG4gICAqL1xuICBSRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBXb3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nOyBvdGhlcndpc2UgYWxsb3cgcmV1c2luZyB0aGUgV29ya2Zsb3cgSUQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURX0gaW5zdGVhZCwgYW5kXG4gICAqICAgICAgICAgICAgIHNldCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgdG9cbiAgICogICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVEVSTUlOQVRFX0VYSVNUSU5HfS5cbiAgICogICAgICAgICAgICAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIG11c3QgYmUgbGVmdCB1bnNwZWNpZmllZC5cbiAgICovXG4gIFRFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBObyBuZWVkIHRvIHVzZSB0aGlzLiBJZiBhIGBXb3JrZmxvd0lkUmV1c2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFl9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFSkVDVF9EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVEVSTUlOQVRFX0lGX1JVTk5JTkd9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9URVJNSU5BVEVfSUZfUlVOTklORzogJ1RFUk1JTkFURV9JRl9SVU5OSU5HJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSAodHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSlba2V5b2YgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVdOiAxLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZXTogMixcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlJFSkVDVF9EVVBMSUNBVEVdOiAzLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuVEVSTUlOQVRFX0lGX1JVTk5JTkddOiA0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuKTtcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3dcbiAqIHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiAqTm90ZTogSXQgaXMgbmV2ZXIgcG9zc2libGUgdG8gaGF2ZSB0d28gX2FjdGl2ZWx5IHJ1bm5pbmdfIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByYWlzZSBhIGBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3JgLlxuICAgKi9cbiAgRkFJTDogJ0ZBSUwnLFxuXG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmV0dXJuIGEgV29ya2Zsb3cgSGFuZGxlIGZvciB0aGUgYWxyZWFkeSBSdW5uaW5nIFdvcmtmbG93LlxuICAgKi9cbiAgVVNFX0VYSVNUSU5HOiAnVVNFX0VYSVNUSU5HJyxcblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgV29ya2Zsb3csIHRlcm1pbmF0aW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqL1xuICBURVJNSU5BVEVfRVhJU1RJTkc6ICdURVJNSU5BVEVfRVhJU1RJTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LkZBSUxdOiAxLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVVNFX0VYSVNUSU5HXTogMixcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlRFUk1JTkFURV9FWElTVElOR106IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICAgKlxuICAgKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICAgKlxuICAgKiBAZGVmYXVsdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURVxuICAgKi9cbiAgd29ya2Zsb3dJZFJldXNlUG9saWN5PzogV29ya2Zsb3dJZFJldXNlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVU5TUEVDSUZJRURcbiAgICovXG4gIHdvcmtmbG93SWRDb25mbGljdFBvbGljeT86IFdvcmtmbG93SWRDb25mbGljdFBvbGljeTtcblxuICAvKipcbiAgICogQ29udHJvbHMgaG93IGEgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIHJldHJpZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFdvcmtmbG93IEV4ZWN1dGlvbnMgYXJlIG5vdCByZXRyaWVkLiBEbyBub3Qgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZW5jeWNsb3BlZGlhL3JldHJ5LXBvbGljaWVzIHwgTW9yZSBpbmZvcm1hdGlvbn0uXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjcm9uIHNjaGVkdWxlIGZvciBXb3JrZmxvdy4gSWYgYSBjcm9uIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIFdvcmtmbG93IHdpbGwgcnVuIGFzIGEgY3JvbiBiYXNlZCBvbiB0aGVcbiAgICogc2NoZWR1bGUuIFRoZSBzY2hlZHVsaW5nIHdpbGwgYmUgYmFzZWQgb24gVVRDIHRpbWUuIFRoZSBzY2hlZHVsZSBmb3IgdGhlIG5leHQgcnVuIG9ubHkgaGFwcGVucyBhZnRlciB0aGUgY3VycmVudFxuICAgKiBydW4gaXMgY29tcGxldGVkL2ZhaWxlZC90aW1lb3V0LiBJZiBhIFJldHJ5UG9saWN5IGlzIGFsc28gc3VwcGxpZWQsIGFuZCB0aGUgV29ya2Zsb3cgZmFpbGVkIG9yIHRpbWVkIG91dCwgdGhlXG4gICAqIFdvcmtmbG93IHdpbGwgYmUgcmV0cmllZCBiYXNlZCBvbiB0aGUgcmV0cnkgcG9saWN5LiBXaGlsZSB0aGUgV29ya2Zsb3cgaXMgcmV0cnlpbmcsIGl0IHdvbid0IHNjaGVkdWxlIGl0cyBuZXh0IHJ1bi5cbiAgICogSWYgdGhlIG5leHQgc2NoZWR1bGUgaXMgZHVlIHdoaWxlIHRoZSBXb3JrZmxvdyBpcyBydW5uaW5nIChvciByZXRyeWluZyksIHRoZW4gaXQgd2lsbCBza2lwIHRoYXQgc2NoZWR1bGUuIENyb25cbiAgICogV29ya2Zsb3cgd2lsbCBub3Qgc3RvcCB1bnRpbCBpdCBpcyB0ZXJtaW5hdGVkIG9yIGNhbmNlbGxlZCAoYnkgcmV0dXJuaW5nIHRlbXBvcmFsLkNhbmNlbGVkRXJyb3IpLlxuICAgKiBodHRwczovL2Nyb250YWIuZ3VydS8gaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHlvdXIgY3JvbiBleHByZXNzaW9ucy5cbiAgICovXG4gIGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgbm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIFRoZSB2YWx1ZXMgY2FuIGJlIGFueXRoaW5nIHRoYXRcbiAgICogaXMgc2VyaWFsaXphYmxlIGJ5IHtAbGluayBEYXRhQ29udmVydGVyfS5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIEdlbmVyYWwgZml4ZWQgZGV0YWlscyBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0IGFuZCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgc2luZ2xlLWxpbmUgZml4ZWQgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgYSB3b3JrZmxvd1xuICAgKi9cbiAgcHJpb3JpdHk/OiBQcmlvcml0eTtcbn1cblxuZXhwb3J0IHR5cGUgV2l0aFdvcmtmbG93QXJnczxXIGV4dGVuZHMgV29ya2Zsb3csIFQ+ID0gVCAmXG4gIChQYXJhbWV0ZXJzPFc+IGV4dGVuZHMgW2FueSwgLi4uYW55W11dXG4gICAgPyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M6IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBXb3JrZmxvd1xuICAgICAgICAgKi9cbiAgICAgICAgYXJncz86IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdvcmtmbG93IHJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90XG4gICAqIHJlbHkgb24gcnVuIHRpbWVvdXQgZm9yIGJ1c2luZXNzIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVyc1xuICAgKiBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBleGVjdXRpb24gKHdoaWNoIGluY2x1ZGVzIHJ1biByZXRyaWVzIGFuZCBjb250aW51ZSBhcyBuZXcpIGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBzZXJ2aWNlLiBEbyBub3QgcmVseSBvbiBleGVjdXRpb24gdGltZW91dCBmb3IgYnVzaW5lc3NcbiAgICogbGV2ZWwgdGltZW91dHMuIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgaW4gd29ya2Zsb3cgdGltZXJzIGZvciB0aGlzIHB1cnBvc2UuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgb2YgYSBzaW5nbGUgd29ya2Zsb3cgdGFzay4gRGVmYXVsdCBpcyAxMCBzZWNvbmRzLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93VGFza1RpbWVvdXQ/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tbW9uV29ya2Zsb3dPcHRpb25zID0gQmFzZVdvcmtmbG93T3B0aW9ucyAmIFdvcmtmbG93RHVyYXRpb25PcHRpb25zO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFdvcmtmbG93VHlwZTxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT5cbik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnc3RyaW5nJykgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYyBhcyBzdHJpbmc7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHdvcmtmbG93VHlwZU9yRnVuYz8ubmFtZSkgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYy5uYW1lO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd29ya2Zsb3cgdHlwZTogdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGFub255bW91cycpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYEludmFsaWQgd29ya2Zsb3cgdHlwZTogZXhwZWN0ZWQgZWl0aGVyIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24sIGdvdCAnJHt0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jfSdgXG4gICk7XG59XG4iLCIvLyBBIHBvcnQgb2YgYW4gYWxnb3JpdGhtIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxuLy8gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25xdWlubGFuL2JldHRlci1yYW5kb20tbnVtYmVycy1mb3ItamF2YXNjcmlwdC1taXJyb3Jcbi8vIE9yaWdpbmFsIHdvcmsgaXMgdW5kZXIgTUlUIGxpY2Vuc2UgLVxuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5vcmc+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLy8gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkYmF1L3NlZWRyYW5kb20vYmxvYi9yZWxlYXNlZC9saWIvYWxlYS5qc1xuXG5jbGFzcyBBbGVhIHtcbiAgcHVibGljIGM6IG51bWJlcjtcbiAgcHVibGljIHMwOiBudW1iZXI7XG4gIHB1YmxpYyBzMTogbnVtYmVyO1xuICBwdWJsaWMgczI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZWVkOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG1hc2ggPSBuZXcgTWFzaCgpO1xuICAgIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgICB0aGlzLmMgPSAxO1xuICAgIHRoaXMuczAgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMSA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMyID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczAgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMwIDwgMCkge1xuICAgICAgdGhpcy5zMCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnMxIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMSA8IDApIHtcbiAgICAgIHRoaXMuczEgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMiAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczIgPCAwKSB7XG4gICAgICB0aGlzLnMyICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ID0gMjA5MTYzOSAqIHRoaXMuczAgKyB0aGlzLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIHRoaXMuczAgPSB0aGlzLnMxO1xuICAgIHRoaXMuczEgPSB0aGlzLnMyO1xuICAgIHJldHVybiAodGhpcy5zMiA9IHQgLSAodGhpcy5jID0gdCB8IDApKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSTkcgPSAoKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGVhKHNlZWQ6IG51bWJlcltdKTogUk5HIHtcbiAgY29uc3QgeGcgPSBuZXcgQWxlYShzZWVkKTtcbiAgcmV0dXJuIHhnLm5leHQuYmluZCh4Zyk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXNoIHtcbiAgcHJpdmF0ZSBuID0gMHhlZmM4MjQ5ZDtcblxuICBwdWJsaWMgbWFzaChkYXRhOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgbGV0IHsgbiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG4gKz0gZGF0YVtpXSE7XG4gICAgICBsZXQgaCA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBoICo9IG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXG4gICAgfVxuICAgIHRoaXMubiA9IG47XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IENhbmNlbGxlZEZhaWx1cmUsIElsbGVnYWxTdGF0ZUVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb051bWJlciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFNka0ZsYWdzIH0gZnJvbSAnLi9mbGFncyc7XG5cbi8vIEFzeW5jTG9jYWxTdG9yYWdlIGlzIGluamVjdGVkIHZpYSB2bSBtb2R1bGUgaW50byBnbG9iYWwgc2NvcGUuXG4vLyBJbiBjYXNlIFdvcmtmbG93IGNvZGUgaXMgaW1wb3J0ZWQgaW4gTm9kZS5qcyBjb250ZXh0LCByZXBsYWNlIHdpdGggYW4gZW1wdHkgY2xhc3MuXG5leHBvcnQgY29uc3QgQXN5bmNMb2NhbFN0b3JhZ2U6IG5ldyA8VD4oKSA9PiBBTFM8VD4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLkFzeW5jTG9jYWxTdG9yYWdlID8/IGNsYXNzIHt9O1xuXG4vKiogTWFnaWMgc3ltYm9sIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IHNjb3BlIC0gaW50ZW50aW9uYWxseSBub3QgZXhwb3J0ZWQgKi9cbmNvbnN0IE5PX1BBUkVOVCA9IFN5bWJvbCgnTk9fUEFSRU5UJyk7XG5cbi8qKlxuICogT3B0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBDYW5jZWxsYXRpb25TY29wZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgcHJldmVudCBvdXRlciBjYW5jZWxsYXRpb24gZnJvbSBwcm9wYWdhdGluZyB0byBpbm5lciBzY29wZXMsIEFjdGl2aXRpZXMsIHRpbWVycywgYW5kIFRyaWdnZXJzLCBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiAoU2NvcGUgc3RpbGwgcHJvcGFnYXRlcyBDYW5jZWxsZWRGYWlsdXJlIHRocm93biBmcm9tIHdpdGhpbikuXG4gICAqL1xuICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENhbmNlbGxhdGlvblNjb3BlICh1c2VmdWwgZm9yIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrcykuXG4gICAqIFRoZSBgTk9fUEFSRU5UYCBzeW1ib2wgaXMgcmVzZXJ2ZWQgZm9yIHRoZSByb290IHNjb3BlLlxuICAgKi9cbiAgcGFyZW50PzogQ2FuY2VsbGF0aW9uU2NvcGUgfCB0eXBlb2YgTk9fUEFSRU5UO1xufVxuXG4vKipcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgcHJvdmlkZSB0aGUgbWVjaGFuaWMgYnkgd2hpY2ggYSBXb3JrZmxvdyBtYXkgZ3JhY2VmdWxseSBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMgZm9yIGNhbmNlbGxhdGlvblxuICogKGUuZy4gaW4gcmVzcG9uc2UgdG8ge0BsaW5rIFdvcmtmbG93SGFuZGxlLmNhbmNlbH0gb3IgdGhyb3VnaCB0aGUgVUkgb3IgQ0xJKSwgYXMgd2VsbCBhcyByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZlxuICogY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBpdCBvd25zIChlLmcuIEFjdGl2aXRpZXMsIFRpbWVycywgQ2hpbGQgV29ya2Zsb3dzLCBldGMpLlxuICpcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgZm9ybSBhIHRyZWUsIHdpdGggdGhlIFdvcmtmbG93J3MgbWFpbiBmdW5jdGlvbiBydW5uaW5nIGluIHRoZSByb290IHNjb3BlIG9mIHRoYXQgdHJlZS5cbiAqIEJ5IGRlZmF1bHQsIGNhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIGRvd24gZnJvbSBhIHBhcmVudCBzY29wZSB0byBpdHMgY2hpbGRyZW4gYW5kIGl0cyBjYW5jZWxsYWJsZSBvcGVyYXRpb25zLlxuICogQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIHJlY2VpdmUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLCBidXQgaXMgbmV2ZXIgZWZmZWN0aXZlbHkgY29uc2lkZXJlZCBhcyBjYW5jZWxsZWQsXG4gKiB0aHVzIHNoaWVsZGRpbmcgaXRzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGl0IHJlY2VpdmVzLlxuICpcbiAqIFNjb3BlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBjb25zdHJ1Y3RvciBvciB0aGUgc3RhdGljIGhlbHBlciBtZXRob2RzIHtAbGluayBjYW5jZWxsYWJsZX0sXG4gKiB7QGxpbmsgbm9uQ2FuY2VsbGFibGV9IGFuZCB7QGxpbmsgd2l0aFRpbWVvdXR9LiBgd2l0aFRpbWVvdXRgIGNyZWF0ZXMgYSBzY29wZSB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGYgYWZ0ZXJcbiAqIHNvbWUgZHVyYXRpb24uXG4gKlxuICogQ2FuY2VsbGF0aW9uIG9mIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVzdWx0cyBpbiBhbGwgb3BlcmF0aW9ucyBjcmVhdGVkIGRpcmVjdGx5IGluIHRoYXQgc2NvcGUgdG8gdGhyb3cgYVxuICoge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IChlaXRoZXIgZGlyZWN0bHksIG9yIGFzIHRoZSBgY2F1c2VgIG9mIGFuIHtAbGluayBBY3Rpdml0eUZhaWx1cmV9IG9yIGFcbiAqIHtAbGluayBDaGlsZFdvcmtmbG93RmFpbHVyZX0pLiBGdXJ0aGVyIGF0dGVtcHQgdG8gY3JlYXRlIG5ldyBjYW5jZWxsYWJsZSBzY29wZXMgb3IgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyB3aXRoaW4gYVxuICogc2NvcGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZCB3aWxsIGFsc28gaW1tZWRpYXRlbHkgdGhyb3cgYSB7QGxpbmsgQ2FuY2VsbGVkRmFpbHVyZX0gZXhjZXB0aW9uLiBJdCBpcyBob3dldmVyXG4gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgYXQgdGhhdCBwb2ludDsgdGhpcyBpcyBvZnRlbiB1c2VkIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb3IgY2xlYW51cFxuICogb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coLi4uKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIHRyeSB7XG4gKiAgICAgLy8gVGhpcyBhY3Rpdml0eSBydW5zIGluIHRoZSByb290IGNhbmNlbGxhdGlvbiBzY29wZS4gVGhlcmVmb3JlLCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IG9uXG4gKiAgICAgLy8gdGhlIFdvcmtmbG93IGV4ZWN1dGlvbiAoZS5nLiB0aHJvdWdoIHRoZSBVSSBvciBDTEkpIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlcyB0byB0aGlzXG4gKiAgICAgLy8gYWN0aXZpdHkuIEFzc3VtaW5nIHRoYXQgdGhlIGFjdGl2aXR5IHByb3Blcmx5IGhhbmRsZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIHRoZW4gdGhlXG4gKiAgICAgLy8gY2FsbCBiZWxvdyB3aWxsIHRocm93IGFuIGBBY3Rpdml0eUZhaWx1cmVgIGV4Y2VwdGlvbiwgd2l0aCBgY2F1c2VgIHNldHMgdG8gYW5cbiAqICAgICAvLyBpbnN0YW5jZSBvZiBgQ2FuY2VsbGVkRmFpbHVyZWAuXG4gKiAgICAgYXdhaXQgc29tZUFjdGl2aXR5KCk7XG4gKiAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZSkpIHtcbiAqICAgICAgIC8vIFJ1biBjbGVhbnVwIGFjdGl2aXR5IGluIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlXG4gKiAgICAgICBhd2FpdCBDYW5jZWxsYXRpb25TY29wZS5ub25DYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gKiAgICAgICAgIGF3YWl0IGNsZWFudXBBY3Rpdml0eSgpO1xuICogICAgICAgfVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aHJvdyBlO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQSBjYW5jZWxsYWJsZSBzY29wZSBtYXkgYmUgcHJvZ3JhbWF0aWNhbGx5IGNhbmNlbGxlZCBieSBjYWxsaW5nIHtAbGluayBjYW5jZWx8YHNjb3BlLmNhbmNlbCgpYH1gLiBUaGlzIG1heSBiZSB1c2VkLFxuICogZm9yIGV4YW1wbGUsIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gQWN0aXZpdHkgb3IgQ2hpbGQgV29ya2Zsb3c6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICogY29uc3QgYWN0aXZpdHlQcm9taXNlID0gY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlLnJ1bigoKSA9PiBzb21lQWN0aXZpdHkoKSk7XG4gKiBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUuY2FuY2VsKCk7IC8vIENhbmNlbHMgdGhlIGFjdGl2aXR5XG4gKiBhd2FpdCBhY3Rpdml0eVByb21pc2U7IC8vIFRocm93cyBgQWN0aXZpdHlGYWlsdXJlYCB3aXRoIGBjYXVzZWAgc2V0IHRvIGBDYW5jZWxsZWRGYWlsdXJlYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCB0aGVuIHRoaXMgc2NvcGUgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIGNhbmNlbGxlZCwgZXZlbiBpZiBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGlzIHJlY2VpdmVkIChlaXRoZXJcbiAgICogZGlyZWN0bHkgYnkgY2FsbGluZyBgc2NvcGUuY2FuY2VsKClgIG9yIGluZGlyZWN0bHkgYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuIFRoaXMgZWZmZWN0aXZlbHlcbiAgICogc2hpZWxkcyB0aGUgc2NvcGUncyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBtYWRlIG9uIHRoZVxuICAgKiBub24tY2FuY2VsbGFibGUgc2NvcGUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgUHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYHJ1bmAgZnVuY3Rpb24gb2Ygbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSBzdGlsbCB0aHJvdyBhIGBDYW5jZWxsZWRGYWlsdXJlYFxuICAgKiBpZiBzdWNoIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB3aXRoaW4gdGhhdCBzY29wZSAoZS5nLiBieSBkaXJlY3RseSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgY2hpbGQgc2NvcGUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbGxhYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLCBkZWZhdWx0cyB0byB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudH0oKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlO1xuXG4gIC8qKlxuICAgKiBBIFByb21pc2UgdGhhdCB0aHJvd3Mgd2hlbiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlY2VpdmVzIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIGVpdGhlciBkaXJlY3RseVxuICAgKiAoaS5lLiBgc2NvcGUuY2FuY2VsKClgKSwgb3IgaW5kaXJlY3RseSAoYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBtYXkgcmVjZWl2ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMsIHJlc3VsdGluZyBpbiB0aGUgYGNhbmNlbFJlcXVlc3RlZGAgcHJvbWlzZSBmb3JcbiAgICogdGhhdCBzY29wZSB0byB0aHJvdywgdGhvdWdoIHRoZSBzY29wZSB3aWxsIG5vdCBlZmZlY3RpdmVseSBnZXQgY2FuY2VsbGVkIChpLmUuIGBjb25zaWRlcmVkQ2FuY2VsbGVkYCB3aWxsIHN0aWxsXG4gICAqIHJldHVybiBgZmFsc2VgLCBhbmQgY2FuY2VsbGF0aW9uIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gY2hpbGQgc2NvcGVzIGFuZCBjb250YWluZWQgb3BlcmF0aW9ucykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBQcm9taXNlPG5ldmVyPjtcblxuICAjY2FuY2VsUmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gbXNPcHRpb25hbFRvTnVtYmVyKG9wdGlvbnM/LnRpbWVvdXQpO1xuICAgIHRoaXMuY2FuY2VsbGFibGUgPSBvcHRpb25zPy5jYW5jZWxsYWJsZSA/PyB0cnVlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUU0MgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5XG4gICAgICB0aGlzLnJlamVjdCA9IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkKTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICAgIGlmIChvcHRpb25zPy5wYXJlbnQgIT09IE5PX1BBUkVOVCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zPy5wYXJlbnQgfHwgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxsYWJsZSB8fFxuICAgICAgICAodGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZCAmJlxuICAgICAgICAgICFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCA9IHRoaXMucGFyZW50LiNjYW5jZWxSZXF1ZXN0ZWQ7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdChlcnIpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2NvcGUgd2FzIGVmZmVjdGl2ZWx5IGNhbmNlbGxlZC4gQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25zaWRlcmVkQ2FuY2VsbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgJiYgdGhpcy5jYW5jZWxsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc2NvcGUgYXMgY3VycmVudCBhbmQgcnVuICBgZm5gXG4gICAqXG4gICAqIEFueSB0aW1lcnMsIEFjdGl2aXRpZXMsIFRyaWdnZXJzIGFuZCBDYW5jZWxsYXRpb25TY29wZXMgY3JlYXRlZCBpbiB0aGUgYm9keSBvZiBgZm5gXG4gICAqIGF1dG9tYXRpY2FsbHkgbGluayB0aGVpciBjYW5jZWxsYXRpb24gdG8gdGhpcyBzY29wZS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCB0aGlzLnJ1bkluQ29udGV4dC5iaW5kKHRoaXMsIGZuKSBhcyAoKSA9PiBQcm9taXNlPFQ+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdGhhdCBydW5zIGEgZnVuY3Rpb24gaW4gQXN5bmNMb2NhbFN0b3JhZ2UgY29udGV4dC5cbiAgICpcbiAgICogQ291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gYXMgYW5vbnltb3VzIGZ1bmN0aW9uLCBtYWRlIGludG8gYSBtZXRob2QgZm9yIGltcHJvdmVkIHN0YWNrIHRyYWNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBydW5JbkNvbnRleHQ8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGltZXJTY29wZTogQ2FuY2VsbGF0aW9uU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHRpbWVyU2NvcGVcbiAgICAgICAgICAucnVuKCgpID0+IHNsZWVwKHRoaXMudGltZW91dCBhcyBudW1iZXIpKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5jYW5jZWwoKSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gc2NvcGUgd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBpZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGltZXJTY29wZSAmJlxuICAgICAgICAhdGltZXJTY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkICYmXG4gICAgICAgIGdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aW1lclNjb3BlLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIGNhbmNlbCB0aGUgc2NvcGUgYW5kIGxpbmtlZCBjaGlsZHJlblxuICAgKi9cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdDYW5jZWxsYXRpb24gc2NvcGUgY2FuY2VsbGVkJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHNjb3BlXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpOiBDYW5jZWxsYXRpb25TY29wZSB7XG4gICAgLy8gVXNpbmcgZ2xvYmFscyBkaXJlY3RseSBpbnN0ZWFkIG9mIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydFxuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCkgPz8gKGdsb2JhbFRoaXMgYXMgYW55KS5fX1RFTVBPUkFMX0FDVElWQVRPUl9fLnJvb3RTY29wZTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIGNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyBub25DYW5jZWxsYWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiBmYWxzZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgd2l0aFRpbWVvdXQ8VD4odGltZW91dDogRHVyYXRpb24sIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUsIHRpbWVvdXQgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlOiBBTFM8Q2FuY2VsbGF0aW9uU2NvcGU+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbmV4cG9ydCBjbGFzcyBSb290Q2FuY2VsbGF0aW9uU2NvcGUgZXh0ZW5kcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgY2FuY2VsbGFibGU6IHRydWUsIHBhcmVudDogTk9fUEFSRU5UIH0pO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdXb3JrZmxvdyBjYW5jZWxsZWQnKSk7XG4gIH1cbn1cblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGlzIG1vZHVsZSBhbmQgd29ya2Zsb3cudHMgKi9cbmxldCBzbGVlcCA9IChfOiBEdXJhdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGhhcyBub3QgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZCcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbihmbjogdHlwZW9mIHNsZWVwKTogdm9pZCB7XG4gIHNsZWVwID0gZm47XG59XG4iLCJpbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFJhbmRvbSgpOiBudW1iZXIge1xuICByZXR1cm4gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93IHJhbmRvbSBBUElzIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpLmN1cnJlbnRSYW5kb20oKTtcbn1cbiIsImltcG9ydCB7IEFjdGl2aXR5RmFpbHVyZSwgQ2FuY2VsbGVkRmFpbHVyZSwgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsIE5leHVzT3BlcmF0aW9uRmFpbHVyZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgd29ya2Zsb3cgZXJyb3JzXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIGluIHdvcmtmbG93IHdoZW4gaXQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIHRoYXQgbm9uLWRldGVybWluaXN0aWMgc3VjaCBhcyBjb25zdHJ1Y3QgYSBXZWFrUmVmKClcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yJylcbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7fVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgbWFya2VyIGZvciB0aGlzIHNwZWNpYWwgcmVzdWx0IHR5cGVcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmJylcbmV4cG9ydCBjbGFzcyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmFja29mZjogY29yZXNkay5hY3Rpdml0eV9yZXN1bHQuSURvQmFja29mZikge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgcHJvdmlkZWQgYGVycmAgaXMgY2F1c2VkIGJ5IGNhbmNlbGxhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb24oZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSB8fFxuICAgICgoZXJyIGluc3RhbmNlb2YgQWN0aXZpdHlGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIE5leHVzT3BlcmF0aW9uRmFpbHVyZSkgJiZcbiAgICAgIGVyci5jYXVzZSBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUpXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIFNka0ZsYWcgPSB7XG4gIGdldCBpZCgpOiBudW1iZXI7XG4gIGdldCBkZWZhdWx0KCk6IGJvb2xlYW47XG4gIGdldCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnMoKTogQWx0Q29uZGl0aW9uRm5bXSB8IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGZsYWdzUmVnaXN0cnk6IE1hcDxudW1iZXIsIFNka0ZsYWc+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgY29uc3QgU2RrRmxhZ3MgPSB7XG4gIC8qKlxuICAgKiBUaGlzIGZsYWcgZ2F0ZXMgbXVsdGlwbGUgZml4ZXMgcmVsYXRlZCB0byBjYW5jZWxsYXRpb24gc2NvcGVzIGFuZCB0aW1lcnMgaW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wOlxuICAgKiAtIENhbmNlbGxhdGlvbiBvZiBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBubyBsb25nZXIgcHJvcGFnYXRlcyB0byBjaGlsZHJlbiBzY29wZXNcbiAgICogICAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW1wb3JhbGlvL3Nkay10eXBlc2NyaXB0L2lzc3Vlcy8xNDIzKS5cbiAgICogLSBDYW5jZWxsYXRpb25TY29wZS53aXRoVGltZW91dChmbikgbm93IGNhbmNlbCB0aGUgdGltZXIgaWYgYGZuYCBjb21wbGV0ZXMgYmVmb3JlIGV4cGlyYXRpb25cbiAgICogICBvZiB0aGUgdGltZW91dCwgc2ltaWxhciB0byBob3cgYGNvbmRpdGlvbihmbiwgdGltZW91dClgIHdvcmtzLlxuICAgKiAtIFRpbWVycyBjcmVhdGVkIHVzaW5nIHNldFRpbWVvdXQgY2FuIG5vdyBiZSBpbnRlcmNlcHRlZC5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMC4yLzEuMTEuMC4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3MgdjEuMTEuMCBhbmQgdjEuMTEuMSB3ZXJlIG5vdFxuICAgKiAgICAgICAgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmcgaW4gTkRFIG9uIHJlcGxheS4gV2UgdGhlcmVmb3JlXG4gICAqICAgICAgICBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMSB0byBpbXBsaWNpdGx5IGhhdmUgdGhpcyBmbGFnIG9uLlxuICAgKi9cbiAgTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbjogZGVmaW5lRmxhZygxLCB0cnVlLCBbYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKC8xXFwuMTFcXC5bMDFdLyldKSxcblxuICAvKipcbiAgICogUHJpb3IgdG8gMS4xMS4wLCB3aGVuIHByb2Nlc3NpbmcgYSBXb3JrZmxvdyBhY3RpdmF0aW9uLCB0aGUgU0RLIHdvdWxkIGV4ZWN1dGUgYG5vdGlmeUhhc1BhdGNoYFxuICAgKiBhbmQgYHNpZ25hbFdvcmtmbG93YCBqb2JzIGluIGRpc3RpbmN0IHBoYXNlcywgYmVmb3JlIG90aGVyIHR5cGVzIG9mIGpvYnMuIFRoZSBwcmltYXJ5IHJlYXNvblxuICAgKiBiZWhpbmQgdGhhdCBtdWx0aS1waGFzZSBhbGdvcml0aG0gd2FzIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGEgV29ya2Zsb3cgZXhlY3V0aW9uIG1pZ2h0XG4gICAqIGNvbXBsZXRlIGJlZm9yZSBhbGwgaW5jb21pbmcgc2lnbmFscyBoYXZlIGJlZW4gZGlzcGF0Y2hlZCAoYXQgbGVhc3QgdG8gdGhlIHBvaW50IHRoYXQgdGhlXG4gICAqIF9zeW5jaHJvbm91c18gcGFydCBvZiB0aGUgaGFuZGxlciBmdW5jdGlvbiBoYXMgYmVlbiBleGVjdXRlZCkuXG4gICAqXG4gICAqIFRoaXMgZmxhZyByZXBsYWNlcyB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3aXRoIGEgc2ltcGxlciBvbmUgd2hlcmUgam9icyBhcmUgc2ltcGx5IHNvcnRlZCBhc1xuICAgKiBgKHNpZ25hbHMgYW5kIHVwZGF0ZXMpIC0+IG90aGVyc2AsIGJ1dCB3aXRob3V0IHByb2Nlc3NpbmcgdGhlbSBhcyBkaXN0aW5jdCBiYXRjaGVzIChpLmUuIHdpdGhvdXRcbiAgICogbGVhdmluZy9yZWVudGVyaW5nIHRoZSBWTSBjb250ZXh0IGJldHdlZW4gZWFjaCBncm91cCwgd2hpY2ggYXV0b21hdGljYWxseSB0cmlnZ2VycyB0aGUgZXhlY3V0aW9uXG4gICAqIG9mIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzKS4gVGhhdCBzaW5nbGUtcGhhc2UgYXBwcm9hY2ggcmVzb2x2ZXMgYSBudW1iZXIgb2YgcXVpcmtzIG9mIHRoZVxuICAgKiBmb3JtZXIgYWxnb3JpdGhtLCBhbmQgeWV0IHN0aWxsIHNhdGlzZmllcyB0byB0aGUgb3JpZ2luYWwgcmVxdWlyZW1lbnQgb2YgZW5zdXJpbmcgdGhhdCBldmVyeVxuICAgKiBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgLSBhbmQgbm93IGBkb1VwZGF0ZWAgam9icyBhcyB3ZWxsIC0gaGF2ZSBiZWVuIGdpdmVuIGEgcHJvcGVyIGNoYW5jZSB0b1xuICAgKiBleGVjdXRlIGJlZm9yZSB0aGUgV29ya2Zsb3cgbWFpbiBmdW5jdGlvbiBtaWdodCBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTEuMC4gVGhpcyBjaGFuZ2UgaXMgbm90IHJvbGxiYWNrLXNhZmUuIEhvd2V2ZXIsIGR1ZSB0byBhbiBTREsgYnVnLCBTREtzXG4gICAqICAgICAgICB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90IHByb3Blcmx5IHdyaXRpbmcgYmFjayB0aGUgZmxhZ3MgdG8gaGlzdG9yeSwgcG9zc2libHkgcmVzdWx0aW5nXG4gICAqICAgICAgICBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmUgY29uc2lkZXIgdGhhdCBhIFdGVCBlbWl0dGVkIGJ5IFdvcmtlciB2MS4xMS4wIG9yIHYxLjExLjFcbiAgICogICAgICAgIHRvIGltcGxpY2l0ZWx5IGhhdmUgdGhpcyBmbGFnIG9uLlxuICAgKi9cbiAgUHJvY2Vzc1dvcmtmbG93QWN0aXZhdGlvbkpvYnNBc1NpbmdsZUJhdGNoOiBkZWZpbmVGbGFnKDIsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjExLjUgdGhlIGBoYW5kbGVTaWduYWxgIGludGVyY2VwdG9yIHdhcyBhZGRlZCB0byBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeVxuICAgKiB3aGljaCBhZGRlZCBhIHlpZWxkIHBvaW50LiBUaGUgYWRkZWQgeWllbGQgcG9pbnQgY2FuIGNhdXNlIE5ERSBpZiB0aGVyZSB3YXMgYSBzaWduYWwgaGFuZGxlciBhbmRcbiAgICogdGhlIHdvcmtmbG93IHdhcyBzdGFydGVkIHdpdGggYSBzaWduYWwuXG4gICAqXG4gICAqIFRoaXMgeWllbGQgcG9pbnQgd2FzIHJlbW92ZWQgaW4gMS4xMy4yLCBidXQgaW4gb3JkZXIgdG8gcHJldmVudCB3b3JrZmxvd3MgZnJvbSB0aGVcbiAgICogYWZmZWN0ZWQgdmVyc2lvbnMgcmVzdWx0aW5nIGluIE5ERSwgd2UgaGF2ZSB0byBpbmplY3QgdGhlIHlpZWxkIHBvaW50IG9uIHJlcGxheS5cbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yLlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc1RyYWNlc0luYm91bmRTaWduYWxzOiBkZWZpbmVGbGFnKDMsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDExLCBwYXRjaDogNSB9KV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjExLjYsIHRoZSBgc2NoZWR1bGVMb2NhbEFjdGl2aXR5YCBpbnRlcmNlcHRvciB3YXMgYWRkZWQgdG9cbiAgICogYEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5YCB3aGljaCBhZGRlZCBhIHlpZWxkIHBvaW50IHRvIHRoZVxuICAgKiBvdXRib3VuZCBpbnRlcmNlcHRvci4gVGhpcyB5aWVsZCBwb2ludCB3YXMgcmVtb3ZlZCBpbiAxLjEzLjIuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuMlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc1RyYWNlc0xvY2FsQWN0aXZpdGllczogZGVmaW5lRmxhZyg0LCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMSwgcGF0Y2g6IDYgfSldKSxcblxuICAvKipcbiAgICogVGhlIGludGVyY2VwdG9ycyBwcm92aWRlZCBieSBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeSBpbml0aWFsbHkgaGFkIHVubmVjZXNzYXJ5XG4gICAqIHlpZWxkIHBvaW50cyBvbiBjYWxsaW5nIHRvIGBleHRyYWN0Q29udGV4dEZyb21IZWFkZXJzYC5cbiAgICogSWYgcmVwbGF5aW5nIGEgd29ya2Zsb3cgY3JlYXRlZCBmcm9tIHRoZXNlIHZlcnNpb25zIGEgeWllbGQgcG9pbnQgaXMgaW5qZWN0ZWQgdG8gcHJldmVudCBhbnkgTkRFLlxuICAgKlxuICAgKiBJZiB0aGUgaGlzdG9yeSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBTREsgdmVyc2lvbiwgZGVmYXVsdCB0byBleHRyYSB5aWVsZHMgc2luY2UgdGhlIHlpZWxkcyB3ZXJlIHByZXNlbnQgc2luY2UgdGhlIE9URUxcbiAgICogcGFja2FnZSB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXBvcnNBdm9pZHNFeHRyYVlpZWxkczogZGVmaW5lRmxhZyg1LCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgcGF0Y2g6IDIgfSldKSxcblxuICAvKipcbiAgICogSW4gMS4xMy4zLCBhbGwgcmVtYWluaW5nIGludGVyY2VwdG9yIG1ldGhvZHMgd2VyZSBpbXBsZW1lbnRlZCBpbiBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeVxuICAgKiBpbmNsdWRpbmcgYGhhbmRsZVVwZGF0ZWAsIGB2YWxpZGF0ZVVwZGF0ZWAsIGBoYW5kbGVRdWVyeWAsIGBzdGFydFRpbWVyYCwgYW5kIGBzdGFydE5leHVzT3BlcmF0aW9uYC5cbiAgICogVGhlc2UgYWRkIGluc3RydW1lbnRhdGlvbiBhbmQgeWllbGQgcG9pbnRzIHRoYXQgd2VyZSBub3QgcHJlc2VudCBpbiBlYXJsaWVyIHZlcnNpb25zLlxuICAgKiBUaGlzIGZsYWcgZ2F0ZXMgdGhlc2UgbmV3IGludGVyY2VwdG9yIG1ldGhvZHMgdG8gcHJldmVudCBOREUgb24gcmVwbGF5IG9mIHdvcmtmbG93cyBmcm9tIGVhcmxpZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuM1xuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc0luc3RydW1lbnRzQWxsTWV0aG9kczogZGVmaW5lRmxhZyg2LCB0cnVlKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGRlZmluZUZsYWcoaWQ6IG51bWJlciwgZGVmOiBib29sZWFuLCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnM/OiBBbHRDb25kaXRpb25GbltdKTogU2RrRmxhZyB7XG4gIGNvbnN0IGZsYWcgPSB7IGlkLCBkZWZhdWx0OiBkZWYsIGFsdGVybmF0aXZlQ29uZGl0aW9ucyB9O1xuICBmbGFnc1JlZ2lzdHJ5LnNldChpZCwgZmxhZyk7XG4gIHJldHVybiBmbGFnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRGbGFnKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFmbGFnc1JlZ2lzdHJ5LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gU0RLIGZsYWc6ICR7aWR9YCk7XG59XG5cbi8qKlxuICogQW4gU0RLIEZsYWcgQWx0ZXJuYXRlIENvbmRpdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZsYWdcbiAqIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREtcbiAqIHRoYXQgZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVFxuICogZW1pdHRlZCBieSBwcmV2aW91cyBTREtzIHRoYXQgY29udGFpbmVkIGEgYnVnLlxuICpcbiAqIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcsIGFuZCBvbmx5IGlmIHRoZSBjb3JyZXNwb25pbmcgZmxhZyBpc1xuICogbm90IGFscmVhZHkgc2V0LiBBbHNvLCBhbHRlcm5hdGUgY29uZGl0aW9ucyB3aWxsIG5vdCBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlXG4gKiBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrcyBtYXkgbm90IHJlZmxlY3QgdGhpcyBmbGFnIGlmIHRoZVxuICogY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3QgYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvd1xuICogRXhlY3V0aW9uIGhhcyBnb25lIHRocm91Z2ggYSBuZXdlciBTREsgdmVyc2lvbiB0aGVuIGFnYWluIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICovXG50eXBlIEFsdENvbmRpdGlvbkZuID0gKGN0eDogeyBpbmZvOiBXb3JrZmxvd0luZm87IHNka1ZlcnNpb24/OiBzdHJpbmcgfSkgPT4gYm9vbGVhbjtcblxuZnVuY3Rpb24gYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKHZlcnNpb246IFJlZ0V4cCk6IEFsdENvbmRpdGlvbkZuIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeQHRlbXBvcmFsaW8vd29ya2VyQCgke3ZlcnNpb24uc291cmNlfSlbK11gKTtcbiAgcmV0dXJuICh7IGluZm8gfSkgPT4gaW5mby5jdXJyZW50QnVpbGRJZCAhPSBudWxsICYmIHJlZ2V4LnRlc3QoaW5mby5jdXJyZW50QnVpbGRJZCk7XG59XG5cbnR5cGUgU2VtVmVyID0ge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGBBbHRDb25kaXRpb25GbmAgdGhhdCBjaGVja3MgaWYgdGhlIFNESyB2ZXJzaW9uIGlzIGVxdWFsIHRvIG9yIGFmdGVyIHRoZSBwcm92aWRlZCB2ZXJzaW9uLlxuICogQW4gb3B0aW9uYWwgZGVmYXVsdCBjYW4gYmUgcHJvdmlkZWQgaW4gY2FzZSB0aGUgU0RLIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNBdExlYXN0KGNvbXBhcmU6IFNlbVZlciwgbWlzc2luZ0RlZmF1bHQ/OiBib29sZWFuKTogQWx0Q29uZGl0aW9uRm4ge1xuICByZXR1cm4gKGN0eCkgPT4ge1xuICAgIHJldHVybiBpc0NvbXBhcmVkKGNvbXBhcmUsIC0xLCBtaXNzaW5nRGVmYXVsdCkoY3R4KSB8fCBpc0NvbXBhcmVkKGNvbXBhcmUsIDAsIG1pc3NpbmdEZWZhdWx0KShjdHgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc0NvbXBhcmVkKGNvbXBhcmU6IFNlbVZlciwgY29tcGFyaXNvbjogLTEgfCAwIHwgMSwgbWlzc2luZ0RlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IEFsdENvbmRpdGlvbkZuIHtcbiAgcmV0dXJuICh7IHNka1ZlcnNpb24gfSkgPT4ge1xuICAgIGlmICghc2RrVmVyc2lvbikgcmV0dXJuIG1pc3NpbmdEZWZhdWx0O1xuICAgIGNvbnN0IHZlcnNpb24gPSBwYXJzZVNlbXZlcihzZGtWZXJzaW9uKTtcbiAgICBpZiAoIXZlcnNpb24pIHJldHVybiBtaXNzaW5nRGVmYXVsdDtcbiAgICByZXR1cm4gY29tcGFyZVNlbXZlcihjb21wYXJlLCB2ZXJzaW9uKSA9PT0gY29tcGFyaXNvbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTZW12ZXIodmVyc2lvbjogc3RyaW5nKTogU2VtVmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBbXywgbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uLm1hdGNoKC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvKSE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBOdW1iZXIucGFyc2VJbnQobWFqb3IhKSxcbiAgICAgIG1pbm9yOiBOdW1iZXIucGFyc2VJbnQobWlub3IhKSxcbiAgICAgIHBhdGNoOiBOdW1iZXIucGFyc2VJbnQocGF0Y2ghKSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogU2VtVmVyLCBiOiBTZW1WZXIpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEubWFqb3IgPCBiLm1ham9yKSByZXR1cm4gLTE7XG4gIGlmIChhLm1ham9yID4gYi5tYWpvcikgcmV0dXJuICsxO1xuICBpZiAoYS5taW5vciA8IGIubWlub3IpIHJldHVybiAtMTtcbiAgaWYgKGEubWlub3IgPiBiLm1pbm9yKSByZXR1cm4gKzE7XG4gIGlmIChhLnBhdGNoIDwgYi5wYXRjaCkgcmV0dXJuIC0xO1xuICBpZiAoYS5wYXRjaCA+IGIucGF0Y2gpIHJldHVybiArMTtcbiAgcmV0dXJuIDA7XG59XG4iLCJpbXBvcnQgeyBJbGxlZ2FsU3RhdGVFcnJvciwgdHlwZSBXb3JrZmxvdyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoZSBfX1RFTVBPUkFMX18gb2JqZWN0IHdpbGwgYmUgYXNzaWduZWQgYnkgV2VicGFjayB0byB0aGUgZXhwb3J0cyBvZiB0aGUgZW50cnlwb2ludCBtb2R1bGVcbiAgLy8gZmlsZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGJ1bmRsZXIgKHNlZSB3b3JrZmxvdy9idW5kbGVyLnRzI2dlbkVudHJ5cG9pbnQoKSkuXG4gIC8vXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLiBJIHByZXNlcnZlZCB0aGUgdXBwZXJjYXNlIG5hbWUgZm9yIGJhY2t3YXJkXG4gIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBidW5kbGVzIGdlbmVyYXRlZCBieSAxLjE0LjAuIFdlIGdlbmVyYWxseSBkbyBub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgb2ZcbiAgLy8gYnVuZGxlcyB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgU0RLLCBidXQgaW4gdGhpcyBzcGVjaWZpYyBjYXNlLCB0aGVyZSdzIHJlYWxseSBub1xuICAvLyB1c2VyLXNpZGUgdmFsdWUgaW4gcmVuYW1pbmcgdGhpcywgc28gbWFraW5nIGEgYnJlYWtpbmcgY2hhbmdlIGZvciB0aGF0IHdvdWxkIG5vdCBiZSBqdXN0aWZpZWQuXG4gIC8vXG5cbiAgdmFyIF9fVEVNUE9SQUxfXzoge1xuICAgIGFwaTogdHlwZW9mIGltcG9ydCgnLi93b3JrZXItaW50ZXJmYWNlLnRzJyk7XG4gICAgcHJlbG9hZE1vZHVsZXM/OiAoKSA9PiB2b2lkO1xuICAgIGltcG9ydFdvcmtmbG93czogKCkgPT4gUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+O1xuICAgIGltcG9ydEludGVyY2VwdG9yczogKCkgPT4gW3sgaW50ZXJjZXB0b3JzOiBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfV07XG4gIH07XG5cbiAgLy8gRGVzdHJ1Y3RvcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNoYXJlZCBzYW5kYm94IGlzIGRlc3Ryb3llZC5cblxuICB2YXIgX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM6ICgoKSA9PiB2b2lkKVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLlxuXG4gIHZhciBfX1RFTVBPUkFMX0FDVElWQVRPUl9fOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX0FDVElWQVRPUl9fID0gYWN0aXZhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF5YmVHZXRBY3RpdmF0b3IoKTogQWN0aXZhdG9yIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuX19URU1QT1JBTF9BQ1RJVkFUT1JfXztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyk6IEFjdGl2YXRvciB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UpO1xuICByZXR1cm4gYWN0aXZhdG9yO1xufVxuXG4vLyBUaGlzIGlzIHJlYWxseSBqdXN0IGFuIGFsaWFzIGZvciBgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHRgIHdpdGggYSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UsXG4vLyBiZWNhdXNlIHRoYXQgbmFtZSBiZXR0ZXIgY29udmV5cyB0aGUgaW50ZW50IGluIHNvbWUgdmVyeSBjb21tb24gdXNlIGNhc2VzLlxuZXhwb3J0IGNvbnN0IGdldEFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LmJpbmQobnVsbCwgJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiIsIi8qKlxuICogT3ZlcnJpZGVzIHNvbWUgZ2xvYmFsIG9iamVjdHMgdG8gbWFrZSB0aGVtIGRldGVybWluaXN0aWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtc1RvVHMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBjdXJyZW50UmFuZG9tIH0gZnJvbSAnLi9jdXJyZW50LXJhbmRvbSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5jb25zdCBPcmlnaW5hbERhdGUgPSBnbG9iYWxUaGlzLkRhdGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUdsb2JhbHMoKTogdm9pZCB7XG4gIC8vIE1vY2sgYW55IHdlYWsgcmVmZXJlbmNlIGJlY2F1c2UgR0MgaXMgbm9uLWRldGVybWluaXN0aWMgYW5kIHRoZSBlZmZlY3QgaXMgb2JzZXJ2YWJsZSBmcm9tIHRoZSBXb3JrZmxvdy5cbiAgLy8gV29ya2Zsb3cgZGV2ZWxvcGVyIHdpbGwgZ2V0IGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaWYgdGhleSB0cnkgdG8gdXNlIHRoZXNlLlxuICBnbG9iYWwuV2Vha1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcignV2Vha1JlZiBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYycpO1xuICB9O1xuICBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoXG4gICAgICAnRmluYWxpemF0aW9uUmVnaXN0cnkgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnXG4gICAgKTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IChPcmlnaW5hbERhdGUgYXMgYW55KSguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5hbERhdGUoZ2V0QWN0aXZhdG9yKCkubm93KTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEFjdGl2YXRvcigpLm5vdztcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5wYXJzZSA9IE9yaWdpbmFsRGF0ZS5wYXJzZS5iaW5kKE9yaWdpbmFsRGF0ZSk7XG4gIGdsb2JhbC5EYXRlLlVUQyA9IE9yaWdpbmFsRGF0ZS5VVEMuYmluZChPcmlnaW5hbERhdGUpO1xuXG4gIGdsb2JhbC5EYXRlLnByb3RvdHlwZSA9IE9yaWdpbmFsRGF0ZS5wcm90b3R5cGU7XG5cbiAgY29uc3QgdGltZW91dENhbmNlbGxhdGlvblNjb3BlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW5jZWxsYXRpb25TY29wZT4oKTtcblxuICAvKipcbiAgICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICAgKi9cbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoY2I6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtczogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IG51bWJlciB7XG4gICAgbXMgPSBNYXRoLm1heCgxLCBtcyk7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gICAgaWYgKGFjdGl2YXRvci5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAvLyBDYXB0dXJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgdGhhdCBzbGVlcCB3aWxsIGFsbG9jYXRlXG4gICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXI7XG4gICAgICBjb25zdCB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSk7XG4gICAgICBjb25zdCBzbGVlcFByb21pc2UgPSB0aW1lclNjb3BlLnJ1bigoKSA9PiBzbGVlcChtcykpO1xuICAgICAgc2xlZXBQcm9taXNlLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgIGNiKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNsZWVwUHJvbWlzZSk7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLnNldChzZXEsIHRpbWVyU2NvcGUpO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG4gICAgICAvLyBDcmVhdGUgYSBQcm9taXNlIGZvciBBc3luY0xvY2FsU3RvcmFnZSB0byBiZSBhYmxlIHRvIHRyYWNrIHRoaXMgY29tcGxldGlvbiB1c2luZyBwcm9taXNlIGhvb2tzLlxuICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgc3RhcnRUb0ZpcmVUaW1lb3V0OiBtc1RvVHMobXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSkudGhlbihcbiAgICAgICAgKCkgPT4gY2IoLi4uYXJncyksXG4gICAgICAgICgpID0+IHVuZGVmaW5lZCAvKiBpZ25vcmUgY2FuY2VsbGF0aW9uICovXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gIH07XG5cbiAgZ2xvYmFsLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIChoYW5kbGU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGNvbnN0IHRpbWVyU2NvcGUgPSB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmdldChoYW5kbGUpO1xuICAgIGlmICh0aW1lclNjb3BlKSB7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7IC8vIFNob3VsZG4ndCBpbmNyZWFzZSBzZXEgbnVtYmVyLCBidXQgdGhhdCdzIHRoZSBsZWdhY3kgYmVoYXZpb3JcbiAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5kZWxldGUoaGFuZGxlKTtcbiAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgc2VxOiBoYW5kbGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gY3VycmVudFJhbmRvbSgpIGRpc3BhdGNoZXMgdG8gYSBzY29wZWQgc3RyZWFtIHdoZW4gV29ya2Zsb3dSYW5kb21TdHJlYW0ud2l0aCguLi4pIGlzIGFjdGl2ZS5cbiAgTWF0aC5yYW5kb20gPSBjdXJyZW50UmFuZG9tO1xufVxuIiwiLyoqXG4gKiBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdG9vbHMgcmVxdWlyZWQgZm9yIGF1dGhvcmluZyB3b3JrZmxvd3MuXG4gKlxuICogIyMgVXNhZ2VcbiAqIFNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2hlbGxvLXdvcmxkI3dvcmtmbG93cyB8IHR1dG9yaWFsfSBmb3Igd3JpdGluZyB5b3VyIGZpcnN0IHdvcmtmbG93LlxuICpcbiAqICMjIyBUaW1lcnNcbiAqXG4gKiBUaGUgcmVjb21tZW5kZWQgd2F5IG9mIHNjaGVkdWxpbmcgdGltZXJzIGlzIGJ5IHVzaW5nIHRoZSB7QGxpbmsgc2xlZXB9IGZ1bmN0aW9uLiBXZSd2ZSByZXBsYWNlZCBgc2V0VGltZW91dGAgYW5kXG4gKiBgY2xlYXJUaW1lb3V0YCB3aXRoIGRldGVybWluaXN0aWMgdmVyc2lvbnMgc28gdGhlc2UgYXJlIGFsc28gdXNhYmxlIGJ1dCBoYXZlIGEgbGltaXRhdGlvbiB0aGF0IHRoZXkgZG9uJ3QgcGxheSB3ZWxsXG4gKiB3aXRoIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzIHwgY2FuY2VsbGF0aW9uIHNjb3Blc30uXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNsZWVwIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcGVyKG1zID0gMTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGF3YWl0IHNsZWVwKG1zKTtcbiAqICAgY29uc29sZS5sb2coJ3NsZXB0Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgQWN0aXZpdGllc1xuICpcbiAqIFRvIHNjaGVkdWxlIEFjdGl2aXRpZXMsIHVzZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBvYnRhaW4gYW4gQWN0aXZpdHkgZnVuY3Rpb24gYW5kIGNhbGwuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB0eXBlICogYXMgYWN0aXZpdGllcyBmcm9tICcuL2FjdGl2aXRpZXMnO1xuICpcbiAqIGNvbnN0IHsgc2VuZEVtYWlsIH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEgbWludXRlJyxcbiAqIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FtcGxlV29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgc2VuZEVtYWlsKFwidG9AZXhhbXBsZS5jb21cIixcIkhlbGxvLCBUZW1wb3JhbCFcIik7XG59XG5cbiAqIGBgYFxuICogXG4gKiAjIyMgVXBkYXRlcywgU2lnbmFscyBhbmQgUXVlcmllc1xuICpcbiAqIFVzZSB7QGxpbmsgc2V0SGFuZGxlcn0gdG8gc2V0IGhhbmRsZXJzIGZvciBVcGRhdGVzLCBTaWduYWxzLCBhbmQgUXVlcmllcy5cbiAqXG4gKiBVcGRhdGUgYW5kIFNpZ25hbCBoYW5kbGVycyBjYW4gYmUgZWl0aGVyIGFzeW5jIG9yIG5vbi1hc3luYyBmdW5jdGlvbnMuIFVwZGF0ZSBoYW5kbGVycyBtYXkgcmV0dXJuIGEgdmFsdWUsIGJ1dCBzaWduYWxcbiAqIGhhbmRsZXJzIG1heSBub3QgKHJldHVybiBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gKS4gWW91IG1heSB1c2UgQWN0aXZpdGllcywgVGltZXJzLCBjaGlsZCBXb3JrZmxvd3MsIGV0YyBpbiBVcGRhdGVcbiAqIGFuZCBTaWduYWwgaGFuZGxlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZSBkb25lIGNhdXRpb3VzbHk6IGZvciBleGFtcGxlLCBub3RlIHRoYXQgaWYgeW91IGF3YWl0IGFzeW5jIG9wZXJhdGlvbnMgc3VjaCBhc1xuICogdGhlc2UgaW4gYW4gVXBkYXRlIG9yIFNpZ25hbCBoYW5kbGVyLCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHdvcmtmbG93IGRvZXMgbm90IGNvbXBsZXRlIGZpcnN0LlxuICpcbiAqIFF1ZXJ5IGhhbmRsZXJzIG1heSAqKm5vdCoqIGJlIGFzeW5jIGZ1bmN0aW9ucywgYW5kIG1heSAqKm5vdCoqIG11dGF0ZSBhbnkgdmFyaWFibGVzIG9yIHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsXG4gKiBjaGlsZCBXb3JrZmxvd3MsIGV0Yy5cbiAqXG4gKiAjIyMjIEltcGxlbWVudGF0aW9uXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRTaWduYWwgPSB3Zi5kZWZpbmVTaWduYWw8W251bWJlcl0+KCdpbmNyZW1lbnQnKTtcbiAqIGV4cG9ydCBjb25zdCBnZXRWYWx1ZVF1ZXJ5ID0gd2YuZGVmaW5lUXVlcnk8bnVtYmVyPignZ2V0VmFsdWUnKTtcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRBbmRHZXRWYWx1ZVVwZGF0ZSA9IHdmLmRlZmluZVVwZGF0ZTxudW1iZXIsIFtudW1iZXJdPignaW5jcmVtZW50QW5kR2V0VmFsdWUnKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRlcldvcmtmbG93KGluaXRpYWxWYWx1ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGxldCBjb3VudCA9IGluaXRpYWxWYWx1ZTtcbiAqICAgd2Yuc2V0SGFuZGxlcihpbmNyZW1lbnRTaWduYWwsIChhcmc6IG51bWJlcikgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgfSk7XG4gKiAgIHdmLnNldEhhbmRsZXIoZ2V0VmFsdWVRdWVyeSwgKCkgPT4gY291bnQpO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlLCAoYXJnOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgICByZXR1cm4gY291bnQ7XG4gKiAgIH0pO1xuICogICBhd2FpdCB3Zi5jb25kaXRpb24oKCkgPT4gZmFsc2UpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIE1vcmVcbiAqXG4gKiAtIFtEZXRlcm1pbmlzdGljIGJ1aWx0LWluc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20jc291cmNlcy1vZi1ub24tZGV0ZXJtaW5pc20pXG4gKiAtIFtDYW5jZWxsYXRpb24gYW5kIHNjb3Blc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvY2FuY2VsbGF0aW9uLXNjb3BlcylcbiAqICAgLSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9XG4gKiAgIC0ge0BsaW5rIFRyaWdnZXJ9XG4gKiAtIFtTaW5rc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2FwcGxpY2F0aW9uLWRldmVsb3BtZW50L29ic2VydmFiaWxpdHkvP2xhbmc9dHMjbG9nZ2luZylcbiAqICAgLSB7QGxpbmsgU2lua3N9XG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7XG4gIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgQ2FuY2VsbGVkRmFpbHVyZSxcbiAgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBSZXRyeVBvbGljeSxcbiAgcm9vdENhdXNlLFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSxcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2Vycm9ycyc7XG5leHBvcnQge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eUludGVyZmFjZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBQYXlsb2FkLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVudHlwZWRBY3Rpdml0aWVzLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dRdWVyeVR5cGUsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1NpZ25hbFR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LW9wdGlvbnMnO1xuZXhwb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UsIENhbmNlbGxhdGlvblNjb3BlLCBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5leHBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENvbnRpbnVlQXNOZXcsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFBhcmVudENsb3NlUG9saWN5LFxuICBQYXJlbnRXb3JrZmxvd0luZm8sXG4gIFJvb3RXb3JrZmxvd0luZm8sXG4gIFN0YWNrVHJhY2VTREtJbmZvLFxuICBTdGFja1RyYWNlLFxuICBVbnNhZmVXb3JrZmxvd0luZm8sXG4gIFdvcmtmbG93SW5mbyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7IHByb3h5U2lua3MsIFNpbmssIFNpbmtDYWxsLCBTaW5rRnVuY3Rpb24sIFNpbmtzIH0gZnJvbSAnLi9zaW5rcyc7XG5leHBvcnQgdHlwZSB7IFdvcmtmbG93UmFuZG9tU3RyZWFtIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtcyc7XG5leHBvcnQgeyBnZXRSYW5kb21TdHJlYW0sIHdvcmtmbG93UmFuZG9tIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtcyc7XG5leHBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZ3MnO1xuZXhwb3J0IHsgVHJpZ2dlciB9IGZyb20gJy4vdHJpZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3dvcmtmbG93JztcbmV4cG9ydCB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgeyBtZXRyaWNNZXRlciB9IGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQge1xuICBjcmVhdGVOZXh1c1NlcnZpY2VDbGllbnQsXG4gIE5leHVzU2VydmljZUNsaWVudE9wdGlvbnMsXG4gIE5leHVzU2VydmljZUNsaWVudCxcbiAgTmV4dXNPcGVyYXRpb25IYW5kbGUsXG4gIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbn0gZnJvbSAnLi9uZXh1cyc7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRGVwcmVjYXRlZCBBUElzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cblxuICBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgYXMgTG9nZ2VyU2lua3MsXG59IGZyb20gJy4vbG9ncyc7XG4iLCJpbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aCwgdHlwZSBOZXh0IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQ29tcG9zZSB3b3JrZmxvdyBpbnRlcmNlcHRvcnMgd2hpbGUgbWFraW5nIGV2ZXJ5IGBuZXh0KC4uLilgIGNvbnRpbnVhdGlvbiByZS1lbnRlclxuICogdGhlIHdvcmtmbG93LXJhbmRvbSBzY29wZSB0aGF0IHdhcyBjdXJyZW50IHdoZW4gdGhhdCBjb250aW51YXRpb24gd2FzIGNyZWF0ZWQuXG4gKlxuICogVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgdGhpbiB3cmFwcGVyIG92ZXIgdGhlIHNoYXJlZCBpbnRlcmNlcHRvciBjb21wb3NpdGlvbiBoZWxwZXJcbiAqIGluIGBwYWNrYWdlcy9jb21tb25gLiBUaGUgc2hhcmVkIGhlbHBlciBvd25zIHRoZSBhY3R1YWwgY2hhaW4tY29uc3RydWN0aW9uIGFsZ29yaXRobSxcbiAqIG9yZGVyaW5nLCBhbmQgYG5leHQoLi4uKWAgd2lyaW5nIHNvIHdvcmtmbG93IGNvZGUgY2Fubm90IHNpbGVudGx5IGRyaWZ0IGF3YXkgZnJvbSB0aGVcbiAqIHNlbWFudGljcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBTREsuXG4gKlxuICogVGhlIHdvcmtmbG93LXNwZWNpZmljIGJlaGF2aW9yIGxpdmVzIGVudGlyZWx5IGluIHRoZSBgd3JhcE5leHRgIGhvb2sgd2UgcGFzcyBpbnRvIHRoYXRcbiAqIHNoYXJlZCBoZWxwZXIuIEVhY2ggYG5leHQoLi4uKWAgY29udGludWF0aW9uIGhhbmRlZCB0byBhIHdvcmtmbG93IGludGVyY2VwdG9yIGlzIHdyYXBwZWRcbiAqIHdpdGggYEFjdGl2YXRvci5iaW5kQ3VycmVudFJhbmRvbSguLi4pYCwgd2hpY2ggY2FwdHVyZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgd29ya2Zsb3dcbiAqIHJhbmRvbSBzY29wZSwgaW5jbHVkaW5nIHRoZSBhYnNlbmNlIG9mIGFueSBzY29wZWQgb3ZlcnJpZGUuIFdoZW4gdGhlIGludGVyY2VwdG9yIGxhdGVyXG4gKiBjYWxscyBgbmV4dCguLi4pYCwgdGhlIHdyYXBwZXIgcmVzdG9yZXMgdGhhdCBjYXB0dXJlZCBzY29wZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlc3Qgb2ZcbiAqIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBvciB0aGUgYmFzZSB3b3JrZmxvdy9ydW50aW1lIGhhbmRsZXIuXG4gKlxuICogVGhhdCBpcyB0aGUgYmVoYXZpb3Igd2UgbmVlZCBmb3IgYFdvcmtmbG93UmFuZG9tU3RyZWFtLndpdGgoLi4uKWA6IGEgdGVtcG9yYXJ5XG4gKiBwbHVnaW4vaW50ZXJjZXB0b3Igc2NvcGUgc2hvdWxkIGFwcGx5IHRvIHRoZSBwbHVnaW4ncyBvd24gY29kZSwgYnV0IGl0IG11c3Qgbm90XG4gKiBsZWFrIHRocm91Z2ggYG5leHQoLi4uKWAgaW50byBkb3duc3RyZWFtIHdvcmtmbG93IGNvZGUgdW5sZXNzIHRoYXQgZG93bnN0cmVhbSBjb2RlXG4gKiBleHBsaWNpdGx5IGVzdGFibGlzaGVzIGl0cyBvd24gc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9yc1dpdGgoaW50ZXJjZXB0b3JzLCBtZXRob2QsIG5leHQsICgod3JhcHBlZE5leHQpID0+XG4gICAgYWN0aXZhdG9yLmJpbmRDdXJyZW50UmFuZG9tKHdyYXBwZWROZXh0IGFzIGFueSkpIGFzIDxGIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICAgIG5leHQ6IEZcbiAgKSA9PiBGKSBhcyB1bmtub3duIGFzIE5leHQ8SSwgTT47XG59XG4iLCIvKipcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIFdvcmtmbG93IGludGVyY2VwdG9ycy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eU9wdGlvbnMsXG4gIER1cmF0aW9uLFxuICBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgTWV0cmljVGFncyxcbiAgVGltZXN0YW1wLFxuICBXb3JrZmxvd0V4ZWN1dGlvbixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IEhlYWRlcnMsIE5leHQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cywgQ29udGludWVBc05ld09wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgfSBmcm9tICcuL25leHVzJztcblxuZXhwb3J0IHsgTmV4dCwgSGVhZGVycyB9O1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpbnN0YW50aWF0ZXMge0BsaW5rIFdvcmtmbG93SW50ZXJjZXB0b3JzfS5cbiAqXG4gKiBXb3JrZmxvdyBpbnRlcmNlcHRvciBtb2R1bGVzIHNob3VsZCBleHBvcnQgYW4gYGludGVyY2VwdG9yc2AgZnVuY3Rpb24gb2YgdGhpcyB0eXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBmdW5jdGlvbiBpbnRlcmNlcHRvcnMoKTogV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICogICByZXR1cm4ge1xuICogICAgIGluYm91bmQ6IFtdLCAgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbmJvdW5kIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICAgIG91dGJvdW5kOiBbXSwgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBvdXRib3VuZCBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgICBpbnRlcm5hbHM6IFtdLCAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW50ZXJuYWxzIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9ICgpID0+IFdvcmtmbG93SW50ZXJjZXB0b3JzO1xuXG4vKipcbiAqIEEgbWFwcGluZyBmcm9tIGludGVyY2VwdG9yIHR5cGUgdG8gYW4gb3B0aW9uYWwgbGlzdCBvZiBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVyY2VwdG9ycyB7XG4gIGluYm91bmQ/OiBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIG91dGJvdW5kPzogV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3JbXTtcbiAgaW50ZXJuYWxzPzogV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvcltdO1xufVxuXG4vLyBXb3JrZmxvdyBJbmJvdW5kIENhbGxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGluYm91bmQgY2FsbHMgbGlrZSBleGVjdXRpb24sIGFuZCBzaWduYWwgYW5kIHF1ZXJ5IGhhbmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgZXhlY3V0ZSBtZXRob2QgaXMgY2FsbGVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBXb3JrZmxvdyBleGVjdXRpb25cbiAgICovXG4gIGV4ZWN1dGU/OiAoaW5wdXQ6IFdvcmtmbG93RXhlY3V0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdleGVjdXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFVwZGF0ZSBoYW5kbGVyIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgVXBkYXRlXG4gICAqL1xuICBoYW5kbGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVVcGRhdGUnPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdXBkYXRlIHZhbGlkYXRvciBjYWxsZWRcbiAgICovXG4gIHZhbGlkYXRlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAndmFsaWRhdGVVcGRhdGUnPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byBhIFdvcmtmbG93IGV4ZWN1dGlvblxuICAgKi9cbiAgaGFuZGxlU2lnbmFsPzogKGlucHV0OiBTaWduYWxJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlU2lnbmFsJz4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgV29ya2Zsb3cgaXMgcXVlcmllZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgcXVlcnlcbiAgICovXG4gIGhhbmRsZVF1ZXJ5PzogKGlucHV0OiBRdWVyeUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVRdWVyeSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5leGVjdXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGVJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlVXBkYXRlfSBhbmQge0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IudmFsaWRhdGVVcGRhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgdXBkYXRlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVNpZ25hbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsSW5wdXQge1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlUXVlcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5SW5wdXQge1xuICByZWFkb25seSBxdWVyeUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8vIFdvcmtmbG93IE91dGJvdW5kIENhbGxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGNvZGUgY2FsbHMgdG8gdGhlIFRlbXBvcmFsIEFQSXMsIGxpa2Ugc2NoZWR1bGluZyBhbiBhY3Rpdml0eVxuICogYW5kIHN0YXJ0aW5nIGEgdGltZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgdGltZXIuXG4gICAqL1xuICBzdGFydFRpbWVyPzogKGlucHV0OiBUaW1lcklucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnRUaW1lcic+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzY2hlZHVsZXMgYW4gQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlQWN0aXZpdHk/OiAoXG4gICAgaW5wdXQ6IEFjdGl2aXR5SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NjaGVkdWxlQWN0aXZpdHknPlxuICApID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhIGxvY2FsIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uXG4gICAqL1xuICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk/OiAoXG4gICAgaW5wdXQ6IExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5Jz5cbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnROZXh1c09wZXJhdGlvbj86IChcbiAgICBpbnB1dDogU3RhcnROZXh1c09wZXJhdGlvbklucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydE5leHVzT3BlcmF0aW9uJz5cbiAgKSA9PiBQcm9taXNlPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBjaGlsZCB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqXG4gICAqIFRoZSBpbnRlcmNlcHRvciBmdW5jdGlvbiByZXR1cm5zIDIgcHJvbWlzZXM6XG4gICAqIC0gVGhlIGZpcnN0IHJlc29sdmVzIHdpdGggdGhlIGBydW5JZGAgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgaGFzIHN0YXJ0ZWQgb3IgcmVqZWN0cyBpZiBmYWlsZWQgdG8gc3RhcnQuXG4gICAqIC0gVGhlIHNlY29uZCByZXNvbHZlcyB3aXRoIHRoZSB3b3JrZmxvdyByZXN1bHQgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgY29tcGxldGVzIG9yIHJlamVjdHMgb24gZmFpbHVyZS5cbiAgICovXG4gIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbj86IChcbiAgICBpbnB1dDogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbic+XG4gICkgPT4gUHJvbWlzZTxbUHJvbWlzZTxzdHJpbmc+LCBQcm9taXNlPHVua25vd24+XT47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNpZ25hbHMgYSBjaGlsZCBvciBleHRlcm5hbCBXb3JrZmxvdy5cbiAgICovXG4gIHNpZ25hbFdvcmtmbG93PzogKFxuICAgIGlucHV0OiBTaWduYWxXb3JrZmxvd0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzaWduYWxXb3JrZmxvdyc+XG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgY2FsbHMgY29udGludWVBc05ldy5cbiAgICovXG4gIGNvbnRpbnVlQXNOZXc/OiAoXG4gICAgaW5wdXQ6IENvbnRpbnVlQXNOZXdJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnY29udGludWVBc05ldyc+XG4gICkgPT4gUHJvbWlzZTxuZXZlcj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGB3b3JrZmxvdy5sb2dgIG1ldGhvZHMuXG4gICAqXG4gICAqIFRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGluIHRoaXMgY2FsbCBhcmUgYXR0YWNoZWQgdG8gZXZlcnkgbG9nIG1lc3NhZ2UuXG4gICAqL1xuICBnZXRMb2dBdHRyaWJ1dGVzPzogKFxuICAgIGlucHV0OiBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2dldExvZ0F0dHJpYnV0ZXMnPlxuICApID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBldmVyeSB0aW1lIGEgbWV0cmljIGlzIGVtaXR0ZWQgZnJvbSBhIFdvcmtmbG93IG1ldHJpYyAoaWUuIGEgbWV0cmljIGNyZWF0ZWRcbiAgICogZnJvbSB7QGxpbmsgd29ya2Zsb3cubWV0cmljTWV0ZXJ9KS5cbiAgICpcbiAgICogVGFncyByZXR1cm5lZCBieSB0aGlzIGhvb2sgYXJlIF9wcmVwZW5kZWRfIHRvIHRhZ3MgZGVmaW5lZCBhdCB0aGUgbWV0cmljIGxldmVsIGFuZCB0YWdzXG4gICAqIGRlZmluZWQgb24gdGhlIGVtaXR0ZXIgZnVuY3Rpb24gaXRzZWxmLlxuICAgKi9cbiAgZ2V0TWV0cmljVGFncz86IChcbiAgICBpbnB1dDogR2V0TWV0cmljVGFnc0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdnZXRNZXRyaWNUYWdzJz5cbiAgKSA9PiBNZXRyaWNUYWdzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRUaW1lcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lcklucHV0IHtcbiAgcmVhZG9ubHkgZHVyYXRpb25NczogbnVtYmVyO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3B0aW9ucz86IFRpbWVyT3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHRpbWVyIChpLmUuIHNsZWVwKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGZpeGVkLCBzaW5nbGUgbGluZSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kJ3MgcHVycG9zZVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2NoZWR1bGVBY3Rpdml0eX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUxvY2FsQWN0aXZpdHl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3JpZ2luYWxTY2hlZHVsZVRpbWU/OiBUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0TmV4dXNPcGVyYXRpb259LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGlucHV0OiB1bmtub3duO1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBOZXh1cyBPcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGVuZCB0byBlbmQgdGltZW91dCBmb3IgdGhlIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIFRlbXBvcmFsIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIG9wZXJhdGlvbiBtYXkgd2FpdCBiZWZvcmUgaXQgYmVnaW5zIGV4ZWN1dGluZy4gSWYgdGhlIG9wZXJhdGlvbiBoYXMgbm90IHN0YXJ0ZWRcbiAgICogd2l0aGluIHRoaXMgd2luZG93LCBhIHRpbWVvdXQgZXJyb3Igd2l0aCB0eXBlIFNDSEVEVUxFX1RPX1NUQVJUIGlzIHJhaXNlZC5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIG5vIHRpbWVvdXQuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGFuIGFzeW5jIG9wZXJhdGlvbiBtYXkgdGFrZSB0byBjb21wbGV0ZSBhZnRlciBpdCBoYXMgc3RhcnRlZC4gSWYgdGhlIG9wZXJhdGlvbiBkb2VzXG4gICAqIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhpcyB3aW5kb3csIGEgdGltZW91dCBlcnJvciB3aXRoIHR5cGUgU1RBUlRfVE9fQ0xPU0UgaXMgcmFpc2VkLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gbm8gdGltZW91dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIE9wZXJhdGlvbidzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIG9wZXJhdGlvbidzIHJlc3VsdCBwcm9taXNlIGZhaWwgd2l0aCBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmVgLFxuICAgKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAgICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAgICogT3BlcmF0aW9uIGNhbGwgd2FzIG1hZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICByZWFkb25seSBjYW5jZWxsYXRpb25UeXBlPzogTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBBIGZpeGVkLCBzaW5nbGUtbGluZSBzdW1tYXJ5IGZvciB0aGlzIE5leHVzIE9wZXJhdGlvbiB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gc2luZ2xlLWxpbmUgVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE91dHB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0TmV4dXNPcGVyYXRpb259LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQge1xuICAvKipcbiAgICogVGhlIHRva2VuIGZvciB0aGUgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBVbmRlZmluZWQgaWYgdGhlIE5leHVzIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseSwgaW4gd2hpY2ggY2FzZSB0aGUge0BsaW5rIHJlc3VsdH1cbiAgICogd2lsbCBiZSBpbW1lZGlhdGVseSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgTmV4dXMgT3BlcmF0aW9uIGNvbXBsZXRlcywgZWl0aGVyIHdpdGggdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogT3BlcmF0aW9uIGlmIGl0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG9yIGEgZmFpbHVyZSBpZiB0aGUgTmV4dXMgT3BlcmF0aW9uIGZhaWxlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQge1xuICByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2lnbmFsV29ya2Zsb3d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdvcmtmbG93SW5wdXQge1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2lnbmFsTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHRhcmdldDpcbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogJ2V4dGVybmFsJztcbiAgICAgICAgcmVhZG9ubHkgd29ya2Zsb3dFeGVjdXRpb246IFdvcmtmbG93RXhlY3V0aW9uO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICByZWFkb25seSB0eXBlOiAnY2hpbGQnO1xuICAgICAgICByZWFkb25seSBjaGlsZFdvcmtmbG93SWQ6IHN0cmluZztcbiAgICAgIH07XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3SW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3fS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGludWVBc05ld0lucHV0T3B0aW9ucyA9IENvbnRpbnVlQXNOZXdPcHRpb25zICYgUmVxdWlyZWQ8UGljazxDb250aW51ZUFzTmV3T3B0aW9ucywgJ3dvcmtmbG93VHlwZSc+PjtcblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldExvZ0F0dHJpYnV0ZXN9LlxuICovXG5leHBvcnQgdHlwZSBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldE1ldHJpY1RhZ3N9LlxuICovXG5leHBvcnQgdHlwZSBHZXRNZXRyaWNUYWdzSW5wdXQgPSBNZXRyaWNUYWdzO1xuXG4vLyBXb3JrZmxvdyBJbnRlcm5hbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbnRlcmNlcHRvciBmb3IgdGhlIGludGVybmFscyBvZiB0aGUgV29ya2Zsb3cgcnVudGltZS5cbiAqXG4gKiBVc2UgdG8gbWFuaXB1bGF0ZSBvciB0cmFjZSBXb3JrZmxvdyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIGlzIGZvciBhZHZhbmNlZCB1c2UgY2FzZXMgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBXb3JrZmxvdyBydW50aW1lIHJ1bnMgYSBXb3JrZmxvd0FjdGl2YXRpb25Kb2IuXG4gICAqL1xuICBhY3RpdmF0ZT8oaW5wdXQ6IEFjdGl2YXRlSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2FjdGl2YXRlJz4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYWxsIGBXb3JrZmxvd0FjdGl2YXRpb25Kb2JgcyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBhbiBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBDYW4gbWFuaXB1bGF0ZSB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGJ5IHRoZSBXb3JrZmxvd1xuICAgKi9cbiAgY29uY2x1ZGVBY3RpdmF0aW9uPyhpbnB1dDogQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2NvbmNsdWRlQWN0aXZhdGlvbic+KTogQ29uY2x1ZGVBY3RpdmF0aW9uT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYmVmb3JlIGRpc3Bvc2luZyB0aGUgV29ya2Zsb3cgaXNvbGF0ZSBjb250ZXh0LlxuICAgKlxuICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cC5cbiAgICovXG4gIGRpc3Bvc2U/KGlucHV0OiBEaXNwb3NlSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2Rpc3Bvc2UnPik6IHZvaWQ7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmFjdGl2YXRlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2YXRlSW5wdXQge1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgYmF0Y2hJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5kaXNwb3NlfVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VJbnB1dCB7fVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb259XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQge1xuICByZWFkb25seSBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW107XG59XG5cbi8qKlxuICogT3V0cHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb259XG4gKi9cbmV4cG9ydCB0eXBlIENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dCA9IENvbmNsdWRlQWN0aXZhdGlvbklucHV0O1xuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgUmV0cnlQb2xpY3ksXG4gIENvbW1vbldvcmtmbG93T3B0aW9ucyxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgRHVyYXRpb24sXG4gIFZlcnNpb25pbmdJbnRlbnQsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlUGFpcixcbiAgUHJpb3JpdHksXG4gIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogV29ya2Zsb3cgRXhlY3V0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBXb3JrZmxvdywgdGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBjbGllbnQgZHVyaW5nIFdvcmtmbG93IGNyZWF0aW9uLlxuICAgKiBBIHNpbmdsZSBXb3JrZmxvdyBtYXkgcnVuIG11bHRpcGxlIHRpbWVzIGUuZy4gd2hlbiBzY2hlZHVsZWQgd2l0aCBjcm9uLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBhIHNpbmdsZSBXb3JrZmxvdyBydW5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdvcmtmbG93IGZ1bmN0aW9uJ3MgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLCBleHBvc2VkIHRocm91Z2ggYW4gaW50ZXJmYWNlLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogTm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaW5mbyAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ2hpbGQgV29ya2Zsb3cpXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBQYXJlbnRXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSByb290IHdvcmtmbG93IGV4ZWN1dGlvbiwgZGVmaW5lZCBhcyBmb2xsb3dzOlxuICAgKiAxLiBBIHdvcmtmbG93IHdpdGhvdXQgYSBwYXJlbnQgd29ya2Zsb3cgaXMgaXRzIG93biByb290IHdvcmtmbG93LlxuICAgKiAyLiBBIHdvcmtmbG93IHdpdGggYSBwYXJlbnQgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXNcbiAgICogaXRzIHBhcmVudC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBubyBwYXJlbnQgd29ya2Zsb3csIGkuZS4sIHRoZSB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3csXG4gICAqIHRoaXMgZmllbGQgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBDb250aW51ZS1hcy1OZXcgKG9yIHJlc2V0KSBwcm9wYWdhdGVzIHRoZSB3b3JrZmxvdyBwYXJlbnRhZ2UgcmVsYXRpb25zaGlwLFxuICAgKiBhbmQgdGhlcmVmb3JlLCB3aGV0aGVyIHRoZSBuZXcgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgKiBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaGFkIGEgcGFyZW50LlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdD86IFJvb3RXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgaWYgdGhpcyBpcyBhIENyb24gV29ya2Zsb3cgb3Igd2FzIENvbnRpbnVlZCBBcyBOZXcpLlxuICAgKlxuICAgKiBBbiBhcnJheSBvZiB2YWx1ZXMsIHNpbmNlIG90aGVyIFNES3MgbWF5IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgZnJvbSBhIFdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFJlc3VsdD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEZhaWx1cmUgZnJvbSB0aGUgcHJldmlvdXMgUnVuIChwcmVzZW50IHdoZW4gdGhpcyBSdW4gaXMgYSByZXRyeSwgb3IgdGhlIGxhc3QgUnVuIG9mIGEgQ3JvbiBXb3JrZmxvdyBmYWlsZWQpXG4gICAqL1xuICByZWFkb25seSBsYXN0RmFpbHVyZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgV29ya2Zsb3cgaGlzdG9yeSB1cCB1bnRpbCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiBXb3JrZmxvdyBoaXN0b3J5IGluIGJ5dGVzIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgemVybyBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKlxuICAgKiBZb3UgbWF5IHNhZmVseSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hlbiB0byB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgV29ya2Zsb3dUYXNrU3RhcnRlZCBldmVudCByZWNvbW1lbmRpbmcgd2hldGhlciB0b1xuICAgKiB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgYGZhbHNlYCBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVBc05ld1N1Z2dlc3RlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cncyBUYXJnZXQgV29ya2VyIERlcGxveW1lbnQgVmVyc2lvbiBoYXMgY2hhbmdlZCBmcm9tIGl0cyBQaW5uZWQgVmVyc2lvbi5cbiAgICogV2hlbiB0cnVlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGNvbnNpZGVyIGNvbnRpbnVpbmctYXMtbmV3IHdpdGhcbiAgICogYGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6ICdBVVRPX1VQR1JBREUnYCB0byBtb3ZlIHRvIHRoZSBuZXcgdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVwZ3JhZGUtb24tQ29udGludWUtYXMtTmV3IGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFdvcmtlckRlcGxveW1lbnRWZXJzaW9uQ2hhbmdlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVhc29uKHMpIHdoeSBjb250aW51ZSBhcyBuZXcgaXMgc3VnZ2VzdGVkLiBDYW4gcG90ZW50aWFsbHkgYmUgbXVsdGlwbGUgcmVhc29ucy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBNYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRDb250aW51ZUFzTmV3UmVhc29ucz86IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW107XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgb25cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tRdWV1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgaW5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW4gSWQgb2YgdGhlIGZpcnN0IFJ1biBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RFeGVjdXRpb25SdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBSdW4gSWQgaW4gdGhpcyBFeGVjdXRpb24gQ2hhaW5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRpbnVlZEZyb21FeGVjdXRpb25SdW5JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGlzIFtXb3JrZmxvdyBFeGVjdXRpb24gQ2hhaW5dKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvd3Mjd29ya2Zsb3ctZXhlY3V0aW9uLWNoYWluKSB3YXMgc3RhcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBjdXJyZW50IFdvcmtmbG93IFJ1biBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBydW5TdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gZXhwaXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uRXhwaXJhdGlvblRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIFdvcmtmbG93IFJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgU2VydmVyLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1blRpbWVvdXRNcz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhIFdvcmtmbG93IFRhc2sgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSB0YXNrVGltZW91dE1zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHJ5IFBvbGljeSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5yZXRyeX0uXG4gICAqL1xuICByZWFkb25seSByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgYXQgMSBhbmQgaW5jcmVtZW50cyBmb3IgZXZlcnkgcmV0cnkgaWYgdGhlcmUgaXMgYSBgcmV0cnlQb2xpY3lgXG4gICAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyb24gU2NoZWR1bGUgZm9yIHRoaXMgRXhlY3V0aW9uLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMuY3JvblNjaGVkdWxlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGJldHdlZW4gQ3JvbiBSdW5zXG4gICAqL1xuICByZWFkb25seSBjcm9uU2NoZWR1bGVUb1NjaGVkdWxlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBCdWlsZCBJRCBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWQgaWYgdGhlXG4gICAqIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgQnVpbGQgSUQuIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmUgZXhlY3V0aW5nIHRoaXNcbiAgICogdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIEJ1aWxkIElEIHNldCwgdGhlbiBpdHMgSUQgd2lsbCBiZSB1c2VkLiBUaGlzIHZhbHVlIG1heSBjaGFuZ2VcbiAgICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIHdvcmtmbG93IHJ1biwgYnV0IGlzIGRldGVybWluaXN0aWMgYW5kIHNhZmUgdG8gdXNlIGZvciBicmFuY2hpbmcuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY3VycmVudERlcGxveW1lbnRWZXJzaW9uYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QnVpbGRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIERlcGxveW1lbnQgVmVyc2lvbiBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWRcbiAgICogaWYgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgRGVwbG95bWVudCBWZXJzaW9uLiBJZiB0aGlzIHdvcmtlciBpcyB0aGUgb25lXG4gICAqIGV4ZWN1dGluZyB0aGlzIHRhc2sgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBoYXMgYSBEZXBsb3ltZW50IFZlcnNpb24gc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlXG4gICAqIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmRcbiAgICogc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnREZXBsb3ltZW50VmVyc2lvbj86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xuXG4gIHJlYWRvbmx5IHVuc2FmZTogVW5zYWZlV29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBQcmlvcml0eSBvZiB0aGlzIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86IFByaW9yaXR5O1xufVxuXG4vKipcbiAqIFVuc2FmZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24uXG4gKlxuICogTmV2ZXIgcmVseSBvbiB0aGlzIGluZm9ybWF0aW9uIGluIFdvcmtmbG93IGxvZ2ljIGFzIGl0IHdpbGwgY2F1c2Ugbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zYWZlV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIFRoZSBzYWZlIHZlcnNpb24gb2YgdGltZSBpcyBgbmV3IERhdGUoKWAgYW5kIGBEYXRlLm5vdygpYCwgd2hpY2ggYXJlIHNldCBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBhIFdvcmtmbG93XG4gICAqIFRhc2sgYW5kIHN0YXkgY29uc3RhbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgVGFzayBhbmQgZHVyaW5nIHJlcGxheS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdyBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmc6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcgaGlzdG9yeSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byB7QGxpbmsgaXNSZXBsYXlpbmd9LCBidXQgcmV0dXJucyBgZmFsc2VgIGR1cmluZyBxdWVyeSBoYW5kbGVycyBhbmQgdXBkYXRlXG4gICAqIHZhbGlkYXRvcnMsIHdoaWNoIGFyZSBsaXZlIHJlYWQtb25seSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHJlcGxheWluZ1xuICAgKiBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHRydWUsIHdvcmtmbG93IGxvZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCBhbmQgc2lua3MgZGVmaW5lZCB3aXRoXG4gICAqIGNhbGxEdXJpbmdSZXBsYXk9ZmFsc2Ugd29uJ3QgZ2V0IHByb2Nlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHdvcmtmbG93IHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmZvIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90IGFuIGFjdHVhbCBlcnJvciwgdXNlZCBieSB0aGUgV29ya2Zsb3cgcnVudGltZSB0byBhYm9ydCBleGVjdXRpb24gd2hlbiB7QGxpbmsgY29udGludWVBc05ld30gaXMgY2FsbGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29udGludWVBc05ldycpXG5leHBvcnQgY2xhc3MgQ29udGludWVBc05ldyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSUNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbikge1xuICAgIHN1cGVyKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb250aW51aW5nIGEgV29ya2Zsb3cgYXMgbmV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld09wdGlvbnMge1xuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXb3JrZmxvdyB0eXBlIG5hbWUsIGUuZy4gdGhlIGZpbGVuYW1lIGluIHRoZSBOb2RlLmpzIFNESyBvciBjbGFzcyBuYW1lIGluIEphdmFcbiAgICovXG4gIHdvcmtmbG93VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gY29udGludWUgdGhlIFdvcmtmbG93IGluXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciB0aGUgZW50aXJlIFdvcmtmbG93IHJ1blxuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGEgc2luZ2xlIFdvcmtmbG93IHRhc2tcbiAgICogQGZvcm1hdCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogTm9uLXNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIFdvcmtmbG93IHNob3VsZFxuICAgKiBDb250aW51ZS1hcy1OZXcgb250byBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50O1xuICAvKipcbiAgICogRGVmaW5lcyB0aGUgdmVyc2lvbmluZyBiZWhhdmlvciB0byBiZSB1c2VkIGJ5IHRoZSBmaXJzdCB0YXNrIG9mIGEgbmV3IHdvcmtmbG93IHJ1biBpbiBhIGNvbnRpbnVlLWFzLW5ldyBjaGFpbi5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICBpbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yPzogSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCBhbmRcbiAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSdzIG9yIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH0nc1xuICogICBwcm9taXNlIGZhaWwgd2l0aCBhIGBDaGlsZFdvcmtmbG93RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGlzIGNvbnRyb2xsZWQgYnkgdGhlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeX0gc2V0dGluZy5cbiAqXG4gKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYENoaWxkV29ya2Zsb3dPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgQ2hpbGQsIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uXG4gICAqIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFBhcmVudC1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGFjdHVhbGx5IGJlIGF0b21pY2FsbHkgYWRkZWQgdG8gdGhlIENoaWxkIHdvcmtmbG93J3MgaGlzdG9yeS5cbiAgICogSW4gcGFydGljdWxhciwgdGhlIENoaWxkIG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIFBhcmVudCB3b3JrZmxvdyB0aGlua3MgaXRzIGNoaWxkXG4gICAqIHdhcyBjYW5jZWxsZWQsIGJ1dCB0aGUgY2hpbGQgYWN0dWFsbHkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogVG8gZ3VhcmFudGVlIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIENoaWxkIFdvcmtmbG93IGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyByZWNvcmRlZCBpbiBpdHMgaGlzdG9yeS5cbiAgICpcbiAgICogVGhpcyBjYW5jZWxsYXRpb24gdHlwZSBndWFyYW50ZWVzIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgKHRoYXQgaXMsIHVubGVzcyB0aGUgQ2hpbGQgdGVybWluYXRlcyBpbmJldHdlZW4gZHVlIHRvIHVuZXhwZWN0ZWQgY2F1c2VzKS5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIENoaWxkIFdvcmtmbG93LlxuICAgKlxuICAgKiBUaGUgQ2hpbGQgbWF5IHJlc3BlY3QgY2FuY2VsbGF0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBQYXJlbnQncyBgZXhlY3V0ZUNoaWxkYCBvclxuICAgKiBgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHRgIHByb21pc2Ugd2lsbCBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWBcbiAgICogc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIENoaWxkIG1heSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LFxuICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Ugd2lsbCBlaXRoZXIgcmVzb2x2ZSB3aXRoIGEgcmVzdWx0IChpZiBDaGlsZCBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5KSBvciByZWplY3Qgd2l0aCBhIGRpZmZlcmVudCBjYXVzZSAoaWYgQ2hpbGQgY29tcGxldGVkIHVuY2Vzc2Z1bGx5KS5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMCxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDEsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDIsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIEhvdyBhIENoaWxkIFdvcmtmbG93IHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcGFyZW50LWNsb3NlLXBvbGljeS8gfCBQYXJlbnQgQ2xvc2UgUG9saWN5fVxuICovXG5leHBvcnQgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqL1xuICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcblxuICAvLy8gQW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGhhcyBiZWVuIGRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSWYgYSBgUGFyZW50Q2xvc2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIHNlcnZlciBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRWl0aGVyIGxlYXZlIHByb3BlcnR5IGB1bmRlZmluZWRgLCBvciBzZXQgYW4gZXhwbGljaXQgcG9saWN5IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBUZXJtaW5hdGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURX0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksIGRlY29kZVBhcmVudENsb3NlUG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEVdOiAxLFxuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkV29ya2Zsb3dPcHRpb25zIGV4dGVuZHMgT21pdDxDb21tb25Xb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3knPiB7XG4gIC8qKlxuICAgKiBXb3JrZmxvdyBpZCB0byB1c2Ugd2hlbiBzdGFydGluZy4gSWYgbm90IHNwZWNpZmllZCBhIFVVSUQgaXMgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgaXQgaXNcbiAgICogZGFuZ2Vyb3VzIGFzIGluIGNhc2Ugb2YgY2xpZW50IHNpZGUgcmV0cmllcyBubyBkZWR1cGxpY2F0aW9uIHdpbGwgaGFwcGVuIGJhc2VkIG9uIHRoZVxuICAgKiBnZW5lcmF0ZWQgaWQuIFNvIHByZWZlciBhc3NpZ25pbmcgYnVzaW5lc3MgbWVhbmluZ2Z1bCBpZHMgaWYgcG9zc2libGUuXG4gICAqL1xuICB3b3JrZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIHRvIHVzZSBmb3IgV29ya2Zsb3cgdGFza3MuIEl0IHNob3VsZCBtYXRjaCBhIHRhc2sgcXVldWUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYVxuICAgKiBgV29ya2VyYCB0aGF0IGhvc3RzIHRoZSBXb3JrZmxvdyBjb2RlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIGNoaWxkIGlzIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBUYXNrIFF1ZXVlIGFzIHRoZSBwYXJlbnQuXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgYW5kXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIHtAbGluayBleGVjdXRlQ2hpbGR9J3Mgb3Ige0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fSdzXG4gICAqICAgcHJvbWlzZSBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICAgKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaXMgY29udHJvbGxlZCBieSB0aGUge0BsaW5rIFBhcmVudENsb3NlUG9saWN5fSBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdGhlIENoaWxkIHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJlbnRDbG9zZVBvbGljeS5QQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURVxuICAgKi9cbiAgcGFyZW50Q2xvc2VQb2xpY3k/OiBQYXJlbnRDbG9zZVBvbGljeTtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBDaGlsZCBXb3JrZmxvdyBzaG91bGQgcnVuIG9uXG4gICAqIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnMgPSBSZXF1aXJlZDxQaWNrPENoaWxkV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZCcgfCAnY2FuY2VsbGF0aW9uVHlwZSc+PiAmIHtcbiAgYXJnczogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMgPSBDaGlsZFdvcmtmbG93T3B0aW9ucyAmIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZVNES0luZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2xpY2Ugb2YgYSBmaWxlIHN0YXJ0aW5nIGF0IGxpbmVPZmZzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlRmlsZVNsaWNlIHtcbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBwb3NzaWJsZSB0byB0cmltIHRoZSBmaWxlIHdpdGhvdXQgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy5cbiAgICovXG4gIGxpbmVfb2Zmc2V0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBzbGljZSBvZiBhIGZpbGUgd2l0aCBgXFxuYCAobmV3bGluZSkgbGluZSB0ZXJtaW5hdG9yLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIGEgZmlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24ge1xuICAvKipcbiAgICogUGF0aCB0byBzb3VyY2UgZmlsZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpLlxuICAgKiBXaGVuIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCwgbWFrZSBzdXJlIGFsbCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgcm9vdC5cbiAgICovXG4gIGZpbGVfcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIElmIHBvc3NpYmxlLCBTREsgc2hvdWxkIHNlbmQgdGhpcywgcmVxdWlyZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGNvZGUgbG9jYXRpb24uXG4gICAqL1xuICBsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLlxuICAgKi9cbiAgY29sdW1uPzogbnVtYmVyO1xuICAvKipcbiAgICogRnVuY3Rpb24gbmFtZSB0aGlzIGxpbmUgYmVsb25ncyB0byAoaWYgYXBwbGljYWJsZSkuXG4gICAqIFVzZWQgZm9yIGZhbGxpbmcgYmFjayB0byBzdGFjayB0cmFjZSB2aWV3LlxuICAgKi9cbiAgZnVuY3Rpb25fbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEZsYWcgdG8gbWFyayB0aGlzIGFzIGludGVybmFsIFNESyBjb2RlIGFuZCBoaWRlIGJ5IGRlZmF1bHQgaW4gdGhlIFVJLlxuICAgKi9cbiAgaW50ZXJuYWxfY29kZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlIHtcbiAgbG9jYXRpb25zOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgcmVzdWx0IGZvciB0aGUgZW5oYW5jZWQgc3RhY2sgdHJhY2UgcXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFN0YWNrVHJhY2Uge1xuICBzZGs6IFN0YWNrVHJhY2VTREtJbmZvO1xuICAvKipcbiAgICogTWFwcGluZyBvZiBmaWxlIHBhdGggdG8gZmlsZSBjb250ZW50cy5cbiAgICogU0RLIG1heSBjaG9vc2UgdG8gc2VuZCBubywgc29tZSBvciBhbGwgc291cmNlcy5cbiAgICogU291cmNlcyBtaWdodCBiZSB0cmltbWVkLCBhbmQgc29tZSB0aW1lIG9ubHkgdGhlIGZpbGUocykgb2YgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSB0cmFjZSB3aWxsIGJlIHNlbnQuXG4gICAqL1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+O1xuICBzdGFja3M6IFN0YWNrVHJhY2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBpbmZvOiBXb3JrZmxvd0luZm87XG4gIHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXTtcbiAgbm93OiBudW1iZXI7XG4gIHNob3dTdGFja1RyYWNlU291cmNlczogYm9vbGVhbjtcbiAgZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIGV4dGVuZHMgV29ya2Zsb3dDcmVhdGVPcHRpb25zIHtcbiAgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG4gIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcbiAgZ2V0VGltZU9mRGF5KCk6IGJpZ2ludDtcbiAgc3RhY2tUcmFjZXNFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24sIFNpZ25hbERlZmluaXRpb24gb3IgUXVlcnlEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyPFxuICBSZXQsXG4gIEFyZ3MgZXh0ZW5kcyBhbnlbXSxcbiAgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPiB8IFNpZ25hbERlZmluaXRpb248QXJncz4gfCBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPixcbj4gPSBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxpbmZlciBSLCBpbmZlciBBPlxuICA/ICguLi5hcmdzOiBBKSA9PiBSIHwgUHJvbWlzZTxSPlxuICA6IFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPGluZmVyIEE+XG4gICAgPyAoLi4uYXJnczogQSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cbiAgICA6IFQgZXh0ZW5kcyBRdWVyeURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBzaWduYWwgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsTmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgdXBkYXRlIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRVcGRhdGVIYW5kbGVyID0gKHVwZGF0ZU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFF1ZXJ5SGFuZGxlciA9IChxdWVyeU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuXG4vKipcbiAqIEEgdmFsaWRhdGlvbiBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZVZhbGlkYXRvcjxBcmdzIGV4dGVuZHMgYW55W10+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQ7XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHF1ZXJ5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5SGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHNpZ25hbCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBTaWduYWxIYW5kbGVyT3B0aW9ucyA9IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSB9O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGFuZCBkZXNjcmlwdGlvbiBvZiBhbiB1cGRhdGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdPiA9IHtcbiAgdmFsaWRhdG9yPzogVXBkYXRlVmFsaWRhdG9yPEFyZ3M+O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeT86IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbiAgdXNlZEludGVybmFsRmxhZ3M6IG51bWJlcltdO1xuICB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgRmFpbHVyZUNvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgUHJvdG9GYWlsdXJlLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zLFxuICBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMsXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQge1xuICBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgYXJyYXlGcm9tUGF5bG9hZHMsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBlbnN1cmVUZW1wb3JhbEZhaWx1cmUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBJbGxlZ2FsU3RhdGVFcnJvcixcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgbWFwRnJvbVBheWxvYWRzLFxuICBmcm9tUGF5bG9hZHNBdEluZGV4LFxuICBSYXdWYWx1ZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7XG4gIFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCxcbiAgU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgdHlwZSB7IFJORyB9IGZyb20gJy4vYWxlYSc7XG5pbXBvcnQgeyBhbGVhIH0gZnJvbSAnLi9hbGVhJztcbmltcG9ydCB7IFJvb3RDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlLCBVcGRhdGVTY29wZSB9IGZyb20gJy4vdXBkYXRlLXNjb3BlJztcbmltcG9ydCB7IGRlcml2ZUFsZWFTZWVkIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtLXNlZWQnO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciwgTG9jYWxBY3Rpdml0eURvQmFja29mZiwgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIFF1ZXJ5SW5wdXQsXG4gIFNpZ25hbElucHV0LFxuICBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LFxuICBVcGRhdGVJbnB1dCxcbiAgV29ya2Zsb3dFeGVjdXRlSW5wdXQsXG4gIFdvcmtmbG93SW50ZXJjZXB0b3JzLFxufSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlZmF1bHRTaWduYWxIYW5kbGVyLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZUZpbGVTbGljZSxcbiAgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbixcbiAgV29ya2Zsb3dJbmZvLFxuICBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCxcbiAgQWN0aXZhdGlvbkNvbXBsZXRpb24sXG4gIERlZmF1bHRVcGRhdGVIYW5kbGVyLFxuICBEZWZhdWx0UXVlcnlIYW5kbGVyLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb250aW51ZUFzTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHR5cGUgU2lua0NhbGwgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCBwa2cgZnJvbSAnLi9wa2cnO1xuaW1wb3J0IHR5cGUgeyBTZGtGbGFnIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZEZsYWcgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZywgbG9nIH0gZnJvbSAnLi9sb2dzJztcblxuY29uc3QgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPSB7XG4gIFdPUktGTE9XX0FMUkVBRFlfRVhJU1RTOiAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnLFxufSBhcyBjb25zdDtcbnR5cGUgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPVxuICAodHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKVtrZXlvZiB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdO1xuXG5jb25zdCBbX2VuY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLCBkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZV0gPVxuICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICAnU1RBUlRfQ0hJTERfV09SS0ZMT1dfRVhFQ1VUSU9OX0ZBSUxFRF9DQVVTRV8nXG4gID4oXG4gICAge1xuICAgICAgW1N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLldPUktGTE9XX0FMUkVBRFlfRVhJU1RTXTogMSxcbiAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIH0gYXMgY29uc3QsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrIHtcbiAgZm9ybWF0dGVkOiBzdHJpbmc7XG4gIHN0cnVjdHVyZWQ6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgc3RvcmUgdG8gdHJhY2sgcHJvbWlzZSBzdGFja3MgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZVN0YWNrU3RvcmUge1xuICBjaGlsZFRvUGFyZW50OiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU2V0PFByb21pc2U8dW5rbm93bj4+PjtcbiAgcHJvbWlzZVRvU3RhY2s6IE1hcDxQcm9taXNlPHVua25vd24+LCBTdGFjaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbjxTdWNjZXNzLCBDb250ZXh0ID0gbmV2ZXI+IHtcbiAgcmVzb2x2ZSh2YWw6IFN1Y2Nlc3MpOiB2b2lkO1xuICByZWplY3QocmVhc29uOiBFcnJvcik6IHZvaWQ7XG4gIGNvbnRleHQ/OiBDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbiB7XG4gIGZuKCk6IGJvb2xlYW47XG5cbiAgcmVzb2x2ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPEsgZXh0ZW5kcyBrZXlvZiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYj4gPSAoXG4gIGFjdGl2YXRpb246IE5vbk51bGxhYmxlPGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iW0tdPlxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIFZlcmlmaWVzIGFsbCBhY3RpdmF0aW9uIGpvYiBoYW5kbGluZyBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZFxuICovXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlciA9IHtcbiAgW1AgaW4ga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2JdOiBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPFA+O1xufTtcblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9uLlxuICovXG5pbnRlcmZhY2UgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBpZD86IHN0cmluZztcbn1cblxudHlwZSBJbmZlck1hcFZhbHVlPFQ+ID0gVCBleHRlbmRzIE1hcDxudW1iZXIsIGluZmVyIFY+ID8gViA6IG5ldmVyO1xuXG5pbnRlcmZhY2UgU2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2Uge1xuICByYW5kb20oKTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEtlZXBzIGFsbCBvZiB0aGUgV29ya2Zsb3cgcnVudGltZSBzdGF0ZSBsaWtlIHBlbmRpbmcgY29tcGxldGlvbnMgZm9yIGFjdGl2aXRpZXMgYW5kIHRpbWVycy5cbiAqXG4gKiBJbXBsZW1lbnRzIGhhbmRsZXJzIGZvciBhbGwgd29ya2Zsb3cgYWN0aXZhdGlvbiBqb2JzLlxuICpcbiAqIE5vdGUgdGhhdCBtb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gdGhlIFZNLlxuICpcbiAqIEhvd2V2ZXIsIGEgZmV3IG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgdGhlIFZNIChlc3NlbnRpYWxseSBmcm9tIGB2bS1zaGFyZWQudHNgKS5cbiAqIFRoZXNlIG1ldGhvZHMgYXJlIHNwZWNpZmljYWxseSBtYXJrZWQgd2l0aCBhIGNvbW1lbnQgYW5kIHJlcXVpcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLCBhcyB0aGVcbiAqIGV4ZWN1dGlvbiBjb250ZXh0IG1heSBub3QgcHJvcGVybHkgcmVmbGVjdCB0aGF0IG9mIHRoZSB0YXJnZXQgd29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuOiB3aXRoIFJldXNhYmxlXG4gKiBWTXMsIHRoZSBgZ2xvYmFsYCBtYXkgbm90IGhhdmUgYmVlbiBzd2FwcGVkIHRvIHRob3NlIG9mIHRoYXQgd29ya2Zsb3cgZXhlY3V0aW9uOyB0aGUgYWN0aXZlIG1pY3JvdGFza1xuICogcXVldWUgbWF5IGJlIHRoYXQgb2YgdGhlIHRocmVhZC9wcm9jZXNzLCByYXRoZXIgdGhhbiB0aGUgcXVldWUgb2YgdGhhdCBWTSBjb250ZXh0OyBldGMpLiBDb25zZXF1ZW50bHksXG4gKiBtZXRob2RzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFZNIG11c3Qgbm90IGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqIC0gQWNjZXNzIGFueSBnbG9iYWwgdmFyaWFibGU7XG4gKiAtIENyZWF0ZSBQcm9taXNlIG9iamVjdHMsIHVzZSBhc3luYy9hd2FpdCwgb3Igb3RoZXJ3aXNlIHNjaGVkdWxlIG1pY3JvdGFza3M7XG4gKiAtIENhbGwgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGFueSBmb3JtIG9mIGludGVyY2VwdG9yLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQWN0aXZhdGlvbkhhbmRsZXIge1xuICAvKipcbiAgICogQ2FjaGUgZm9yIG1vZHVsZXMgLSByZWZlcmVuY2VkIGluIHJldXNhYmxlLXZtLnRzXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdGFzayBzZXF1ZW5jZSB0byBhIENvbXBsZXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBsZXRpb25zID0ge1xuICAgIHRpbWVyOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgICBhY3Rpdml0eTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93biwgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25TdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25Db21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93bj4+KCksXG4gICAgY2hpbGRXb3JrZmxvd1N0YXJ0OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjxzdHJpbmcsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICAgIGNoaWxkV29ya2Zsb3dDb21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93biwgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgc2lnbmFsV29ya2Zsb3c6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHZvaWQsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICAgIGNhbmNlbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkLCBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0Pj4oKSxcbiAgfTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgVXBkYXRlIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFVwZGF0ZXMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlPigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyBidWZmZXJlZCBzaWduYWwgY2FsbHMgdW50aWwgYSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1ZmZlcmVkU2lnbmFscyA9IEFycmF5PGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JU2lnbmFsV29ya2Zsb3c+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgdXBkYXRlIG5hbWUgdG8gaGFuZGxlciBhbmQgdmFsaWRhdG9yXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2Ygc2lnbmFsIG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGluLXByb2dyZXNzIHVwZGF0ZXMgdG8gaGFuZGxlciBleGVjdXRpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpblByb2dyZXNzVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbj4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyBzaWduYWxzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1NpZ25hbHMgPSBuZXcgTWFwPG51bWJlciwgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIEEgc2VxdWVuY2UgbnVtYmVyIHByb3ZpZGluZyB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2lnbmFsSGFuZGxlckV4ZWN1dGlvblNlcSA9IDA7XG5cbiAgLyoqXG4gICAqIEEgc2lnbmFsIGhhbmRsZXIgdGhhdCBjYXRjaGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0U2lnbmFsSGFuZGxlcj86IERlZmF1bHRTaWduYWxIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBBIHVwZGF0ZSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFVwZGF0ZUhhbmRsZXI/OiBEZWZhdWx0VXBkYXRlSGFuZGxlcjtcblxuICAvKipcbiAgICogQSBxdWVyeSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0UXVlcnlIYW5kbGVyPzogRGVmYXVsdFF1ZXJ5SGFuZGxlcjtcblxuICAvKipcbiAgICogU291cmNlIG1hcCBmaWxlIGZvciBsb29raW5nIHVwIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVzcG9uc2UgdG8gX19lbmhhbmNlZF9zdGFja190cmFjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzZW5kIHRoZSBzb3VyY2VzIGluIGVuaGFuY2VkIHN0YWNrIHRyYWNlIHF1ZXJ5IHJlc3BvbnNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTdGFja1RyYWNlU291cmNlcztcblxuICByZWFkb25seSBwcm9taXNlU3RhY2tTdG9yZTogUHJvbWlzZVN0YWNrU3RvcmUgPSB7XG4gICAgcHJvbWlzZVRvU3RhY2s6IG5ldyBNYXAoKSxcbiAgICBjaGlsZFRvUGFyZW50OiBuZXcgTWFwKCksXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrIHRvIGZhaWwuIFNldHMgaWYgYSBub24tYFRlbXBvcmFsRmFpbHVyZWBcbiAgICogZXJyb3IgYnViYmxlcyB1cCBvdXQgb2YgdGhlIFdvcmtmbG93IGZ1bmN0aW9uLCBvciBvdXQgb2YgYSBTaWduYWwgb3IgVXBkYXRlIGhhbmRsZXIuIFdlXG4gICAqIGNhcHR1cmUgZXJyb3JzIHRoaXMgd2F5IGJlY2F1c2UgdGhvc2UgZnVuY3Rpb25zIGFyZSBub3QgdGVjaG5pY2FsbHkgYXdhaXRlZCB3aGVuIHN0YXJ0ZWQsXG4gICAqIGJ1dCBsZWZ0IHRvIHJ1biBhc3luY2hyb25vdXNseS4gVGhlcmUgaXMgdGhlcmVmb3JlIG5vIHJlYWwgXCJwYXJlbnRcIiBmdW5jdGlvbiB0aGF0IGNhblxuICAgKiBkaXJlY3RseSBoYW5kbGUgdGhvc2UgZXJyb3JzLCBhbmQgbm90IGNhcHR1cmluZyBpdCB3b3VsZCByZXN1bHQgaW4gYW4gVW5oYW5kbGVkIFByb21pc2VcbiAgICogUmVqZWN0aW9uLiBTbyBpbnN0ZWFkLCB3ZSBidWZmZXIgdGhlIGVycm9yIGhlcmUsIHRvIHRoZW4gYmUgcHJvY2Vzc2VkIGluIHRoZSBjb250ZXh0XG4gICAqIG9mIG91ciBvd24gc3luY2hyb25vdXMgQWN0aXZhdGlvbiBoYW5kbGluZyBldmVudCBsb29wLlxuICAgKlxuICAgKiBPdXIgY29kZSBkb2VzIGEgYmVzdCBlZmZvcnQgdG8gc3RvcCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGFjdGl2YXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgKiBhZnRlciB0aGlzIGZpZWxkIGlzIHNldDpcbiAgICogIC0gSWYgYW4gZXJyb3IgaXMgdGhyb3duIHdoaWxlIGV4ZWN1dGluZyBjb2RlIHN5bmNocm9ub3VzbHkgKGUuZy4gYW55dGhpbmcgYmVmb3JlIHRoZVxuICAgKiAgICBmaXJzdCBgYXdhaXRgIHN0YXRlbWVudCBpbiBhIFdvcmtmbG93IGZ1bmN0aW9uIG9yIGEgc2lnbmFsL3VwZGF0ZSBoYW5kbGVyKSwgdGhlIGVycm9yXG4gICAqICAgIHdpbGwgYmUgX2ltbWVkaWF0ZWx5XyByZXRocm93biwgd2hpY2ggd2lsbCBwcmV2ZW50IGV4ZWN1dGlvbiBvZiBmdXJ0aGVyIGpvYnMgaW4gdGhlXG4gICAqICAgIGN1cnJlbnQgYWN0aXZhdGlvbi4gV2Uga25vdyB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBjb2RlIHN5bmNocm9ub3VzbHkgdGhhbmtzIHRvIHRoZVxuICAgKiAgICBgcmV0aHJvd1N5bmNocm9ub3VzbHlgIGZsYWcgYmVsb3cuXG4gICAqICAtIEl0IGFuIGVycm9yIGlzIHRocm93biB3aGlsZSBleGVjdXRpbmcgbWljcm90YXNrcywgdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBvblxuICAgKiAgICB0aGUgbmV4dCBjYWxsIHRvIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYC5cbiAgICpcbiAgICogVW5mb3J0dW5hdGVseSwgdGhlcmUncyBubyB3YXkgZm9yIHVzIHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb24gb2YgbWljcm90YXNrcyB0aGF0IGhhdmVcbiAgICogYWxyZWFkeSBiZWVuIHNjaGVkdWxlZCwgbm9yIHRob3NlIHRoYXQgd2lsbCBiZSByZWN1cnNpdmVseSBzY2hlZHVsZWQgZnJvbSB0aG9zZSBtaWNyb3Rhc2tzLlxuICAgKiBTaG91bGQgbW9yZSBlcnJvcnMgZ2V0IHRocm93biB3aGlsZSBzZXR0bGluZyBtaWNyb3Rhc2tzLCB0aG9zZSB3aWxsIGJlIGlnbm9yZWQgKGkuZS4gb25seVxuICAgKiB0aGUgZmlyc3QgY2FwdHVyZWQgZXJyb3IgaXMgcHJlc2VydmVkKS5cbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvd1Rhc2tFcnJvcjogdW5rbm93bjtcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSBfbmFtZXNfIChmcm9tIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9KSB0aGF0XG4gICAqIHNob3VsZCBjYXVzZSBXb3JrZmxvdyBFeGVjdXRpb24gZmFpbHVyZSByYXRoZXIgdGhhbiBXRlQgZmFpbHVyZS5cbiAgICpcbiAgICogU2V0IGF0IHdvcmtmbG93IGNyZWF0aW9uIHRpbWUgZnJvbSB0aGUgd29ya2VyIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogRXJyb3IgX3R5cGVzXyAoZnJvbSB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy5mYWlsdXJlRXhjZXB0aW9uVHlwZXN9KVxuICAgKiB0aGF0IHNob3VsZCBjYXVzZSBXb3JrZmxvdyBFeGVjdXRpb24gZmFpbHVyZSByYXRoZXIgdGhhbiBXRlQgZmFpbHVyZS5cbiAgICpcbiAgICogU2V0IGluIGB3b3JrZXItaW50ZXJmYWNlLnRzYCBhZnRlciB0aGUgd29ya2Zsb3cgZGVmaW5pdGlvbiBvcHRpb25zIGFyZSByZWFkLlxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlczogQXJyYXk8bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gRXJyb3I+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB3aGVuIHJ1bm5pbmcgc3luY2hyb25vdXMgY29kZSAoZS5nLiB3aGlsZSBwcm9jZXNzaW5nIGFjdGl2YXRpb24gam9icyBhbmQgd2hlbiBjYWxsaW5nXG4gICAqIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCkuIFdoaWxlIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGlzIHNhZmUgdG8gbGV0IGVycm9ycyBidWJibGUgdXAuXG4gICAqL1xuICBwdWJsaWMgcmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcm9vdFNjb3BlID0gbmV3IFJvb3RDYW5jZWxsYXRpb25TY29wZSgpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHF1ZXJ5IG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHF1ZXJ5SGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGU+KFtcbiAgICBbXG4gICAgICBTVEFDS19UUkFDRV9RVUVSWV9OQU1FLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTxzdHJpbmc+KFxuICAgICAgICAgICAgdGhpcy5nZXRTdGFja1RyYWNlcygpXG4gICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZm9ybWF0dGVkKVxuICAgICAgICAgICAgICAuam9pbignXFxuXFxuJylcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzZW5zaWJsZSBzdGFjayB0cmFjZS4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgIEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpOiBSYXdWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzb3VyY2VNYXAgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgc2RrOiBTdGFja1RyYWNlU0RLSW5mbyA9IHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2ZXJzaW9uOiBwa2cudmVyc2lvbiB9O1xuICAgICAgICAgIGNvbnN0IHN0YWNrcyA9IHRoaXMuZ2V0U3RhY2tUcmFjZXMoKS5tYXAoKHsgc3RydWN0dXJlZDogbG9jYXRpb25zIH0pID0+ICh7IGxvY2F0aW9ucyB9KSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgU3RhY2tUcmFjZUZpbGVTbGljZVtdPiA9IHt9O1xuICAgICAgICAgIGlmICh0aGlzLnNob3dTdGFja1RyYWNlU291cmNlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IGxvY2F0aW9ucyB9IG9mIHN0YWNrcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZV9wYXRoIH0gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlX3BhdGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzb3VyY2VNYXA/LnNvdXJjZXNDb250ZW50Py5bc291cmNlTWFwPy5zb3VyY2VzLmluZGV4T2YoZmlsZV9wYXRoKV07XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzW2ZpbGVfcGF0aF0gPSBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUmF3VmFsdWU8RW5oYW5jZWRTdGFja1RyYWNlPih7IHNkaywgc3RhY2tzLCBzb3VyY2VzIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzdGFjayB0cmFjZSBhbm5vdGF0ZWQgd2l0aCBzb3VyY2UgaW5mb3JtYXRpb24uJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICAnX190ZW1wb3JhbF93b3JrZmxvd19tZXRhZGF0YScsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpOiBSYXdWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dUeXBlID0gdGhpcy5pbmZvLndvcmtmbG93VHlwZTtcbiAgICAgICAgICBjb25zdCBxdWVyeURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5SGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBzaWduYWxEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy5zaWduYWxIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnVwZGF0ZUhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTx0ZW1wb3JhbC5hcGkuc2RrLnYxLklXb3JrZmxvd01ldGFkYXRhPih7XG4gICAgICAgICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgIHR5cGU6IHdvcmtmbG93VHlwZSxcbiAgICAgICAgICAgICAgcXVlcnlEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgc2lnbmFsRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgIHVwZGF0ZURlZmluaXRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1cnJlbnREZXRhaWxzOiB0aGlzLmN1cnJlbnREZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd29ya2Zsb3cuJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIExvYWRlZCBpbiB7QGxpbmsgaW5pdFJ1bnRpbWV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJjZXB0b3JzOiBSZXF1aXJlZDxXb3JrZmxvd0ludGVyY2VwdG9ycz4gPSB7XG4gICAgaW5ib3VuZDogW10sXG4gICAgb3V0Ym91bmQ6IFtdLFxuICAgIGludGVybmFsczogW10sXG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciB0aGF0IHN0b3JlcyBhbGwgZ2VuZXJhdGVkIGNvbW1hbmRzLCByZXNldCBhZnRlciBlYWNoIGFjdGl2YXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW10gPSBbXTtcblxuICAvKipcbiAgICogU3RvcmVzIGFsbCB7QGxpbmsgY29uZGl0aW9ufXMgdGhhdCBoYXZlbid0IGJlZW4gdW5ibG9ja2VkIHlldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrZWRDb25kaXRpb25zID0gbmV3IE1hcDxudW1iZXIsIENvbmRpdGlvbj4oKTtcblxuICAvKipcbiAgICogSXMgdGhpcyBXb3JrZmxvdyBjb21wbGV0ZWQ/XG4gICAqXG4gICAqIEEgV29ya2Zsb3cgd2lsbCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlZCBpZiBpdCBnZW5lcmF0ZXMgYSBjb21tYW5kIHRoYXQgdGhlXG4gICAqIHN5c3RlbSBjb25zaWRlcnMgYXMgYSBmaW5hbCBXb3JrZmxvdyBjb21tYW5kIChlLmcuXG4gICAqIGNvbXBsZXRlV29ya2Zsb3dFeGVjdXRpb24gb3IgZmFpbFdvcmtmbG93RXhlY3V0aW9uKS5cbiAgICovXG4gIHB1YmxpYyBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2FzIHRoaXMgV29ya2Zsb3cgY2FuY2VsbGVkP1xuICAgKi9cbiAgcHJvdGVjdGVkIGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV4dCAoaW5jcmVtZW50YWwpIHNlcXVlbmNlIHRvIGFzc2lnbiB3aGVuIGdlbmVyYXRpbmcgY29tcGxldGFibGUgY29tbWFuZHNcbiAgICovXG4gIHB1YmxpYyBuZXh0U2VxcyA9IHtcbiAgICB0aW1lcjogMSxcbiAgICBhY3Rpdml0eTogMSxcbiAgICBjaGlsZFdvcmtmbG93OiAxLFxuICAgIHNpZ25hbFdvcmtmbG93OiAxLFxuICAgIGNhbmNlbFdvcmtmbG93OiAxLFxuICAgIGNvbmRpdGlvbjogMSxcbiAgICBuZXh1c09wZXJhdGlvbjogMSxcbiAgICAvLyBVc2VkIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhY3RpdmUgc3RhY2sgdHJhY2VzXG4gICAgc3RhY2s6IDEsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2V0IGV2ZXJ5IHRpbWUgdGhlIHdvcmtmbG93IGV4ZWN1dGVzIGFuIGFjdGl2YXRpb25cbiAgICogTWF5IGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgbm93OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBXb3JrZmxvdywgaW5pdGlhbGl6ZWQgd2hlbiBhIFdvcmtmbG93IGlzIHN0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvdz86IFdvcmtmbG93IHwgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPGFueVtdLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvd1xuICAgKiBNYXkgYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBpbmZvOiBXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIGRldGVybWluaXN0aWMgUk5HIGZvciB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogU2NvcGVkIG92ZXJyaWRlcyB1c2VkIGJ5IGBXb3JrZmxvd1JhbmRvbVN0cmVhbS53aXRoKC4uLilgIGFyZSBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIFJORy5cbiAgICovXG4gIHB1YmxpYyByYW5kb206IFJORztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2VlZCBtYXRlcmlhbCBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24ncyBkZXRlcm1pbmlzdGljIFJOR3MuXG4gICAqL1xuICBwdWJsaWMgcmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGRldGVybWluaXN0aWMgUk5HIHN0cmVhbXMga2V5ZWQgYnkgc3RhYmxlIHN0cmVhbSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWVkUmFuZG9tU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBSTkc+KCk7XG5cbiAgcHJvdGVjdGVkIGN1cnJlbnRSYW5kb21TdG9yYWdlPzogQUxTPFNjb3BlZFdvcmtmbG93UmFuZG9tU291cmNlIHwgdW5kZWZpbmVkPjtcblxuICBwdWJsaWMgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciA9IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyO1xuICBwdWJsaWMgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIGtub3cgdGhlIHN0YXR1cyBvZiBmb3IgdGhpcyB3b3JrZmxvdywgYXMgaW4ge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duUHJlc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBzZW50IHRvIGNvcmUge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93bkZsYWdzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgc2RrVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQnVmZmVyZWQgc2luayBjYWxscyBwZXIgYWN0aXZhdGlvblxuICAgKi9cbiAgc2lua0NhbGxzID0gQXJyYXk8U2lua0NhbGw+KCk7XG5cbiAgLyoqXG4gICAqIEEgbmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWUgZnVuY3Rpb24sIGV4dGVybmFsbHkgaW5qZWN0ZWQuIFRoaXMgaXMgdXNlZCB0b1xuICAgKiBwcmVjaXNlbHkgc29ydCBsb2dzIGVudHJpZXMgZW1pdHRlZCBmcm9tIHRoZSBXb3JrZmxvdyBDb250ZXh0IHZzIHRob3NlIGVtaXR0ZWRcbiAgICogZnJvbSBvdGhlciBzb3VyY2VzIChlLmcuIG1haW4gdGhyZWFkLCBDb3JlLCBldGMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdldFRpbWVPZkRheTogKCkgPT4gYmlnaW50O1xuXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG5cbiAgcHVibGljIGN1cnJlbnREZXRhaWxzOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuICBwdWJsaWMgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcj86ICgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93U2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFja1RyYWNlc0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZm8sXG4gICAgbm93LFxuICAgIHNob3dTdGFja1RyYWNlU291cmNlcyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZ2V0VGltZU9mRGF5LFxuICAgIHJhbmRvbW5lc3NTZWVkLFxuICAgIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLFxuICAgIHN0YWNrVHJhY2VzRW5hYmxlZCxcbiAgICBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzLFxuICB9OiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCkge1xuICAgIHRoaXMuZ2V0VGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gICAgdGhpcy5zaG93U3RhY2tUcmFjZVNvdXJjZXMgPSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG4gICAgdGhpcy5zb3VyY2VNYXAgPSBzb3VyY2VNYXA7XG4gICAgdGhpcy5yYW5kb21uZXNzU2VlZCA9IFsuLi5yYW5kb21uZXNzU2VlZF07XG4gICAgdGhpcy5yYW5kb20gPSBhbGVhKHRoaXMucmFuZG9tbmVzc1NlZWQpO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMgPSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lcztcbiAgICB0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCA9IHN0YWNrVHJhY2VzRW5hYmxlZDtcbiAgICB0aGlzLmZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMgPSBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzID8/IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFJhbmRvbW5lc3NTZWVkKHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmFuZG9tbmVzc1NlZWQgPSBbLi4ucmFuZG9tbmVzc1NlZWRdO1xuICAgIHRoaXMucmFuZG9tID0gYWxlYSh0aGlzLnJhbmRvbW5lc3NTZWVkKTtcbiAgICB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGdldE5hbWVkUmFuZG9tKG5hbWU6IHN0cmluZyk6IFJORyB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYW1lZFJhbmRvbVN0cmVhbXMuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5kb20gPSBhbGVhKGRlcml2ZUFsZWFTZWVkKHRoaXMucmFuZG9tbmVzc1NlZWQsIG5hbWUpKTtcbiAgICB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5zZXQobmFtZSwgcmFuZG9tKTtcbiAgICByZXR1cm4gcmFuZG9tO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdpdGhSYW5kb21Tb3VyY2U8VD4ocmFuZG9tU291cmNlOiBTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB8IHVuZGVmaW5lZCwgZm46ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFJhbmRvbVN0b3JhZ2UgPz89IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB8IHVuZGVmaW5lZD4oKSkucnVuKFxuICAgICAgcmFuZG9tU291cmNlLFxuICAgICAgZm5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHdpdGhDdXJyZW50UmFuZG9tPFQ+KHJhbmRvbVNvdXJjZTogU2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2UsIGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJhbmRvbVNvdXJjZShyYW5kb21Tb3VyY2UsIGZuKTtcbiAgfVxuXG4gIHB1YmxpYyBiaW5kQ3VycmVudFJhbmRvbTxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZuOiBUKTogVCB7XG4gICAgY29uc3QgcmFuZG9tU291cmNlID0gdGhpcy5jdXJyZW50UmFuZG9tU3RvcmFnZT8uZ2V0U3RvcmUoKTtcbiAgICByZXR1cm4gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiB0aGlzLndpdGhSYW5kb21Tb3VyY2UocmFuZG9tU291cmNlLCAoKSA9PiBmbiguLi5hcmdzKSkpIGFzIFQ7XG4gIH1cblxuICBwdWJsaWMgY3VycmVudFJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRSYW5kb21TdG9yYWdlPy5nZXRTdG9yZSgpPy5yYW5kb20oKSA/PyB0aGlzLnJhbmRvbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBtdXRhdGVXb3JrZmxvd0luZm8oZm46IChpbmZvOiBXb3JrZmxvd0luZm8pID0+IFdvcmtmbG93SW5mbyk6IHZvaWQge1xuICAgIHRoaXMuaW5mbyA9IGZuKHRoaXMuaW5mbyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RhY2tUcmFjZXMoKTogU3RhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBzdGFjayB0cmFjZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgd29ya2VyJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY2hpbGRUb1BhcmVudCwgcHJvbWlzZVRvU3RhY2sgfSA9IHRoaXMucHJvbWlzZVN0YWNrU3RvcmU7XG4gICAgY29uc3QgaW50ZXJuYWxOb2RlcyA9IFsuLi5jaGlsZFRvUGFyZW50LnZhbHVlcygpXS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGN1cnIpIHtcbiAgICAgICAgYWNjLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IFNldCgpKTtcbiAgICBjb25zdCBzdGFja3MgPSBuZXcgTWFwPHN0cmluZywgU3RhY2s+KCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFRvUGFyZW50LmtleXMoKSkge1xuICAgICAgaWYgKCFpbnRlcm5hbE5vZGVzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwcm9taXNlVG9TdGFjay5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5mb3JtYXR0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBzdGFja3Muc2V0KHN0YWNrLmZvcm1hdHRlZCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3QgMTAwJSBzdXJlIHdoZXJlIHRoaXMgY29tZXMgZnJvbSwganVzdCBmaWx0ZXIgaXQgb3V0XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pJyk7XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pXFxuJyk7XG4gICAgcmV0dXJuIFsuLi5zdGFja3NdLm1hcCgoW18sIHN0YWNrXSkgPT4gc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBnZXRBbmRSZXNldFNpbmtDYWxscygpOiBTaW5rQ2FsbFtdIHtcbiAgICBjb25zdCB7IHNpbmtDYWxscyB9ID0gdGhpcztcbiAgICB0aGlzLnNpbmtDYWxscyA9IFtdO1xuICAgIHJldHVybiBzaW5rQ2FsbHM7XG4gIH1cblxuICAvKipcbiAgICogQnVmZmVyIGEgV29ya2Zsb3cgY29tbWFuZCB0byBiZSBjb2xsZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBQcmV2ZW50cyBjb21tYW5kcyBmcm9tIGJlaW5nIGFkZGVkIGFmdGVyIFdvcmtmbG93IGNvbXBsZXRpb24uXG4gICAqL1xuICBwdXNoQ29tbWFuZChjbWQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZCwgY29tcGxldGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChjbWQpO1xuICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKSxcbiAgICAgIHVzZWRJbnRlcm5hbEZsYWdzOiBbLi4udGhpcy5rbm93bkZsYWdzXSxcbiAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFdvcmtmbG93TmV4dEhhbmRsZXIoeyBhcmdzIH06IFdvcmtmbG93RXhlY3V0ZUlucHV0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHdvcmtmbG93IH0gPSB0aGlzO1xuICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93KC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyh0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLCAnZXhlY3V0ZScsIHRoaXMuc3RhcnRXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcblxuICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nKCgpID0+XG4gICAgICAgIGV4ZWN1dGUoe1xuICAgICAgICAgIGhlYWRlcnM6IGFjdGl2YXRpb24uaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uYXJndW1lbnRzLCBjb250ZXh0KSxcbiAgICAgICAgfSlcbiAgICAgICkudGhlbih0aGlzLmNvbXBsZXRlV29ya2Zsb3cuYmluZCh0aGlzKSwgdGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGludWVkRmFpbHVyZSwgbGFzdENvbXBsZXRpb25SZXN1bHQsIG1lbW8sIHNlYXJjaEF0dHJpYnV0ZXMgfSA9IGFjdGl2YXRpb247XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gICAgLy8gTW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpbml0aWFsaXphdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgLi4uaW5mbyxcblxuICAgICAgc2VhcmNoQXR0cmlidXRlczogZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzPy5pbmRleGVkRmllbGRzKSxcbiAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlczogZGVjb2RlVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM/LmluZGV4ZWRGaWVsZHMpLFxuXG4gICAgICBtZW1vOiBtYXBGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBtZW1vPy5maWVsZHMsIGNvbnRleHQpLFxuICAgICAgbGFzdFJlc3VsdDogZnJvbVBheWxvYWRzQXRJbmRleCh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIDAsIGxhc3RDb21wbGV0aW9uUmVzdWx0Py5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICBsYXN0RmFpbHVyZTpcbiAgICAgICAgY29udGludWVkRmFpbHVyZSAhPSBudWxsXG4gICAgICAgICAgPyB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoY29udGludWVkRmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgICBjb25zdCB3b3JrZmxvd0RlZmluaXRpb25PcHRzID0gdGhpcy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyPy4oKTtcbiAgICBpZiAod29ya2Zsb3dEZWZpbml0aW9uT3B0cykge1xuICAgICAgdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IgPSB3b3JrZmxvd0RlZmluaXRpb25PcHRzLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICAgIHRoaXMud29ya2Zsb3dEZWZpbml0aW9uRmFpbHVyZUV4Y2VwdGlvblR5cGVzID0gd29ya2Zsb3dEZWZpbml0aW9uT3B0cy5mYWlsdXJlRXhjZXB0aW9uVHlwZXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbFdvcmtmbG93KF9hY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUNhbmNlbFdvcmtmbG93KTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMucm9vdFNjb3BlLmNhbmNlbCgpO1xuICB9XG5cbiAgcHVibGljIGZpcmVUaW1lcihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUZpcmVUaW1lcik6IHZvaWQge1xuICAgIC8vIFRpbWVycyBhcmUgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlaXIgY29tcGxldGlvbiBtaWdodCBub3QgYmUgaW4gV29ya2Zsb3cgc3RhdGUsXG4gICAgLy8gdGhpcyBpcyBkdWUgdG8gaW1tZWRpYXRlIHRpbWVyIGNhbmNlbGxhdGlvbiB0aGF0IGRvZXNuJ3QgZ28gd2FpdCBmb3IgQ29yZS5cbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCd0aW1lcicsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgY29tcGxldGlvbj8ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVBY3Rpdml0eShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVBY3Rpdml0eSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQWN0aXZpdHkgYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignYWN0aXZpdHknLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGNhbmNlbGxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmJhY2tvZmYpIHtcbiAgICAgIHJlamVjdChuZXcgTG9jYWxBY3Rpdml0eURvQmFja29mZihhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQoXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93U3RhcnQnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnN1Y2NlZWRlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydCB3aXRoIG5vIHJ1bklkJyk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGFjdGl2YXRpb24uc3VjY2VlZGVkLnJ1bklkKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uZmFpbGVkKSB7XG4gICAgICBpZiAoZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UoYWN0aXZhdGlvbi5mYWlsZWQuY2F1c2UpICE9PSAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignR290IHVua25vd24gU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGFjdGl2YXRpb24uc2VxICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQgJiYgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgaW4gYWN0aXZhdGlvbiBqb2InKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChcbiAgICAgICAgbmV3IFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcihcbiAgICAgICAgICAnV29ya2Zsb3cgZXhlY3V0aW9uIGFscmVhZHkgc3RhcnRlZCcsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dJZCxcbiAgICAgICAgICBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd1R5cGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoIWFjdGl2YXRpb24uY2FuY2VsbGVkLmZhaWx1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IG5vIGZhaWx1cmUgaW4gY2FuY2VsbGVkIHZhcmlhbnQnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5jYW5jZWxsZWQuZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gc3RhdHVzJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24gYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd0NvbXBsZXRlJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGZhaWxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBjYW5jZWxsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZXEgPSBnZXRTZXEoYWN0aXZhdGlvbik7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuXG4gICAgaWYgKCFhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdW50cmFja1Byb21pc2UoY29tcGxldGVQcm9taXNlKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgcmVzb2x2ZSh7IHRva2VuOiBhY3RpdmF0aW9uLm9wZXJhdGlvblRva2VuISwgcmVzdWx0OiBjb21wbGV0ZVByb21pc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbGVkKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvbihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVOZXh1c09wZXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHNlcSA9IGdldFNlcShhY3RpdmF0aW9uKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCwgY29udGV4dCk7XG5cbiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBSZXNvbHZlTmV4dXNPcGVyYXRpb24gdG8gYmUgcmVjZWl2ZWQgd2l0aG91dCBhIHByaW9yIFJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0LFxuICAgICAgLy8gZS5nLiBiZWNhdXNlIHRoZSBoYW5kbGVyIGNvbXBsZXRlZCB0aGUgT3BlcmF0aW9uIHN5bmNocm9ub3VzbHkuXG4gICAgICBjb25zdCBzdGFydENvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuICAgICAgaWYgKHN0YXJ0Q29tcGxldGlvbikge1xuICAgICAgICBzdGFydENvbXBsZXRpb24ucmVzb2x2ZSh7IHJlc3VsdDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnI6IEVycm9yO1xuICAgICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5mYWlsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY2FuY2VsbGVkKSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LnRpbWVkT3V0KSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQudGltZWRPdXQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wbGV0aW9uID1cbiAgICAgICAgdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKSA/P1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKTtcbiAgICAgIGNvbXBsZXRpb24ucmVqZWN0KGVyciEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgbm9uLWFzeW5jIGZ1bmN0aW9uIHNvIHRoaXMgaGFuZGxlciBkb2Vzbid0IHNob3cgdXAgaW4gdGhlIHN0YWNrIHRyYWNlXG4gIHByb3RlY3RlZCBxdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIoeyBxdWVyeU5hbWUsIGFyZ3MgfTogUXVlcnlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGxldCBmbiA9IHRoaXMucXVlcnlIYW5kbGVycy5nZXQocXVlcnlOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm4gPSB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIHF1ZXJ5TmFtZSk7XG4gICAgfVxuICAgIC8vIE5vIGhhbmRsZXIgb3IgZGVmYXVsdCByZWdpc3RlcmVkLCBmYWlsLlxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrbm93blF1ZXJ5VHlwZXMgPSBbLi4udGhpcy5xdWVyeUhhbmRsZXJzLmtleXMoKV0uam9pbignICcpO1xuICAgICAgLy8gRmFpbCB0aGUgcXVlcnlcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgIGBXb3JrZmxvdyBkaWQgbm90IHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgJHtxdWVyeU5hbWV9LiBSZWdpc3RlcmVkIHF1ZXJpZXM6IFske2tub3duUXVlcnlUeXBlc31dYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBFeGVjdXRlIGhhbmRsZXIuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdRdWVyeSBoYW5kbGVycyBzaG91bGQgbm90IHJldHVybiBhIFByb21pc2UnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVlcnlXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVF1ZXJ5V29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgcXVlcnlJZCwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIShxdWVyeVR5cGUgJiYgcXVlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcXVlcnkgYWN0aXZhdGlvbiBhdHRyaWJ1dGVzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHF1ZXJpZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLlxuICAgIGlmIChcbiAgICAgIHF1ZXJ5VHlwZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiZcbiAgICAgICF0aGlzLnF1ZXJ5SGFuZGxlcnMuaGFzKHF1ZXJ5VHlwZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlIHF1ZXJ5IG5hbWU6ICcke3F1ZXJ5VHlwZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHF1ZXJ5LlxuICAgIGNvbnN0IGlzSW50ZXJuYWxRdWVyeSA9XG4gICAgICBxdWVyeVR5cGUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBxdWVyeVR5cGUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIHF1ZXJ5VHlwZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsUXVlcnkgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlUXVlcnknLCB0aGlzLnF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgZXhlY3V0ZSh7XG4gICAgICBxdWVyeU5hbWU6IHF1ZXJ5VHlwZSxcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMsIGNvbnRleHQpLFxuICAgICAgcXVlcnlJZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSkudGhlbihcbiAgICAgIChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVRdWVyeShxdWVyeUlkLCByZXN1bHQpLFxuICAgICAgKHJlYXNvbikgPT4gdGhpcy5mYWlsUXVlcnkocXVlcnlJZCwgcmVhc29uKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZG9VcGRhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgaWQ6IHVwZGF0ZUlkLCBwcm90b2NvbEluc3RhbmNlSWQsIG5hbWUsIGhlYWRlcnMsIHJ1blZhbGlkYXRvciB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXVwZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIGlkJyk7XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBuYW1lJyk7XG4gICAgfVxuICAgIGlmICghcHJvdG9jb2xJbnN0YW5jZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIHByb3RvY29sSW5zdGFuY2VJZCcpO1xuICAgIH1cblxuICAgIC8vIFJlamVjdCBfX3RlbXBvcmFsXy1wcmVmaXhlZCB1cGRhdGVzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHJvdXRlZCB0byB0aGVcbiAgICAvLyB1c2VyJ3MgZGVmYXVsdCBoYW5kbGVyLiBBIHNwZWNpZmljIHJlZ2lzdGVyZWQgaGFuZGxlciAoZS5nLiBmcm9tIGFcbiAgICAvLyBjb250cmliIHBhY2thZ2UpIGlzIGFsbG93ZWQgdGhyb3VnaCwgYW5kIHVucmVnaXN0ZXJlZCBuYW1lcyB3aXRob3V0IGFcbiAgICAvLyBkZWZhdWx0IGhhbmRsZXIgZmFsbCB0aHJvdWdoIHRvIHRoZSBidWZmZXItdGhlbi1yZWplY3QgcGF0aCBiZWxvdy5cbiAgICBpZiAoXG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSAmJlxuICAgICAgIXRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKG5hbWUpICYmXG4gICAgICB0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgdXBkYXRlIG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbnRlcmNlcHRvcnMgaWYgaXQncyBhbiBpbnRlcm5hbCB1cGRhdGUuXG4gICAgY29uc3QgaXNJbnRlcm5hbFVwZGF0ZSA9XG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSB8fFxuICAgICAgbmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fFxuICAgICAgbmFtZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsVXBkYXRlID8gW10gOiB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kO1xuXG4gICAgY29uc3QgZW50cnkgPVxuICAgICAgdGhpcy51cGRhdGVIYW5kbGVycy5nZXQobmFtZSkgPz9cbiAgICAgICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlci5iaW5kKHVuZGVmaW5lZCwgbmFtZSksXG4gICAgICAgICAgICB2YWxpZGF0b3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gYSB3YXJuaW5nIHBvbGljeS5cbiAgICAgICAgICAgIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET04sXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwpO1xuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmcm9tIGVpdGhlciBzb3VyY2UsIGJ1ZmZlciBhbmQgcmV0dXJuXG4gICAgaWYgKGVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRVcGRhdGVzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFrZUlucHV0ID0gKCk6IFVwZGF0ZUlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZUlkLFxuICAgICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQsIGNvbnRleHQpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciB1cGhvbGRpbmcsIGFuZCBjb25zdHJhaW5lZFxuICAgIC8vIGJ5LCB0aGUgZm9sbG93aW5nIGNvbnRyYWN0OlxuICAgIC8vXG4gICAgLy8gMS4gSWYgbm8gdmFsaWRhdG9yIGlzIHByZXNlbnQgdGhlbiB2YWxpZGF0aW9uIGludGVyY2VwdG9ycyB3aWxsIG5vdCBiZSBydW4uXG4gICAgLy9cbiAgICAvLyAyLiBEdXJpbmcgdmFsaWRhdGlvbiwgYW55IGVycm9yIG11c3QgZmFpbCB0aGUgVXBkYXRlOyBkdXJpbmcgdGhlIFVwZGF0ZVxuICAgIC8vICAgIGl0c2VsZiwgVGVtcG9yYWwgZXJyb3JzIGZhaWwgdGhlIFVwZGF0ZSB3aGVyZWFzIG90aGVyIGVycm9ycyBmYWlsIHRoZVxuICAgIC8vICAgIGFjdGl2YXRpb24uXG4gICAgLy9cbiAgICAvLyAzLiBUaGUgaGFuZGxlciBtdXN0IG5vdCBzZWUgYW55IG11dGF0aW9ucyBvZiB0aGUgYXJndW1lbnRzIG1hZGUgYnkgdGhlXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNC4gQW55IGVycm9yIHdoZW4gZGVjb2RpbmcvZGVzZXJpYWxpemluZyBpbnB1dCBtdXN0IGJlIGNhdWdodCBhbmQgcmVzdWx0XG4gICAgLy8gICAgaW4gcmVqZWN0aW9uIG9mIHRoZSBVcGRhdGUgYmVmb3JlIGl0IGlzIGFjY2VwdGVkLCBldmVuIGlmIHRoZXJlIGlzIG5vXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNS4gVGhlIGluaXRpYWwgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgKGFzeW5jKSBVcGRhdGUgaGFuZGxlciBzaG91bGRcbiAgICAvLyAgICBiZSBleGVjdXRlZCBhZnRlciB0aGUgKHN5bmMpIHZhbGlkYXRvciBjb21wbGV0ZXMgc3VjaCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gICAgbWluaW1hbCBvcHBvcnR1bml0eSBmb3IgYSBkaWZmZXJlbnQgY29uY3VycmVudCB0YXNrIHRvIGJlIHNjaGVkdWxlZFxuICAgIC8vICAgIGJldHdlZW4gdGhlbS5cbiAgICAvL1xuICAgIC8vIDYuIFRoZSBzdGFjayB0cmFjZSB2aWV3IHByb3ZpZGVkIGluIHRoZSBUZW1wb3JhbCBVSSBtdXN0IG5vdCBiZSBwb2xsdXRlZFxuICAgIC8vICAgIGJ5IHByb21pc2VzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIHVzZXIgY29kZS4gVGhpcyBpbXBsaWVzIHRoYXRcbiAgICAvLyAgICBhc3luYy9hd2FpdCBzeW50YXggbWF5IG5vdCBiZSB1c2VkLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGVsaWJlcmF0ZWx5IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBiZWxvdy5cbiAgICAvLyBUaGVzZSBhcmUgY2F1Z2h0IGVsc2V3aGVyZSBhbmQgZmFpbCB0aGUgY29ycmVzcG9uZGluZyBhY3RpdmF0aW9uLlxuICAgIGNvbnN0IGRvVXBkYXRlSW1wbCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpbnB1dDogVXBkYXRlSW5wdXQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocnVuVmFsaWRhdG9yICYmIGVudHJ5LnZhbGlkYXRvcikge1xuICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IG1hcmsgYXMgbm90IHJlcGxheWluZyBoaXN0b3J5IGV2ZW50cyBkdXJpbmcgdmFsaWRhdG9yIGV4ZWN1dGlvblxuICAgICAgICAgIC8vIHNvIHRoYXQgbG9nZ2luZyBpcyBwZXJtaXR0ZWQuIFZhbGlkYXRvcnMgYXJlIGxpdmUgcmVhZC1vbmx5IG9wZXJhdGlvbnMuXG4gICAgICAgICAgY29uc3Qgd2FzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cyA9IHRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzO1xuICAgICAgICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgICAgIHVuc2FmZTogeyAuLi5pbmZvLnVuc2FmZSwgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiBmYWxzZSB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICAgICAgICBpbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVVcGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LnZhbGlkYXRvcilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YWxpZGF0ZShtYWtlSW5wdXQoKSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgICB1bnNhZmU6IHsgLi4uaW5mby51bnNhZmUsIGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogd2FzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cyB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IG1ha2VJbnB1dCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCBlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWNjZXB0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCk7XG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgaW50ZXJjZXB0b3JzLFxuICAgICAgICAnaGFuZGxlVXBkYXRlJyxcbiAgICAgICAgdGhpcy51cGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LmhhbmRsZXIpXG4gICAgICApO1xuICAgICAgY29uc3QgeyB1bmZpbmlzaGVkUG9saWN5IH0gPSBlbnRyeTtcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuc2V0KHVwZGF0ZUlkLCB7IG5hbWUsIHVuZmluaXNoZWRQb2xpY3ksIGlkOiB1cGRhdGVJZCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGV4ZWN1dGUoaW5wdXQpXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCByZXN1bHQpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5pblByb2dyZXNzVXBkYXRlcy5kZWxldGUodXBkYXRlSWQpKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHJlcyk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgdW50cmFja1Byb21pc2UoVXBkYXRlU2NvcGUudXBkYXRlV2l0aEluZm8odXBkYXRlSWQsIG5hbWUsIGRvVXBkYXRlSW1wbCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZU5leHRIYW5kbGVyKGhhbmRsZXI6IFdvcmtmbG93VXBkYXRlVHlwZSwgeyBhcmdzIH06IFVwZGF0ZUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIoLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVVcGRhdGVOZXh0SGFuZGxlcih2YWxpZGF0b3I6IFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSB8IHVuZGVmaW5lZCwgeyBhcmdzIH06IFVwZGF0ZUlucHV0KTogdm9pZCB7XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFsaWRhdG9yKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFVwZGF0ZXMgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcztcbiAgICB3aGlsZSAoYnVmZmVyZWRVcGRhdGVzLmxlbmd0aCkge1xuICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgdXBkYXRlIGhhbmRsZXIsIHNvIGFsbCB1cGRhdGVzIGFyZSBkaXNwYXRjaGFibGUuXG4gICAgICBpZiAodGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlcikge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBidWZmZXJlZFVwZGF0ZXMuc2hpZnQoKTtcbiAgICAgICAgLy8gTG9naWNhbGx5LCB0aGlzIG11c3QgYmUgZGVmaW5lZCBhcyB3ZSdyZSBpbiB0aGUgbG9vcC5cbiAgICAgICAgLy8gQnV0IFR5cGVzY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgc28gd2UgdXNlIGEgbm9uLW51bGwgYXNzZXJ0aW9uICghKS5cbiAgICAgICAgdGhpcy5kb1VwZGF0ZSh1cGRhdGUhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFVwZGF0ZXMuZmluZEluZGV4KCh1cGRhdGUpID0+IHRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKHVwZGF0ZS5uYW1lIGFzIHN0cmluZykpO1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAvLyBObyBidWZmZXJlZCBVcGRhdGVzIGhhdmUgYSBoYW5kbGVyIHlldC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbdXBkYXRlXSA9IGJ1ZmZlcmVkVXBkYXRlcy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuZG9VcGRhdGUodXBkYXRlISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlamVjdEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShcbiAgICAgICAgICB1cGRhdGUucHJvdG9jb2xJbnN0YW5jZUlkISxcbiAgICAgICAgICBBcHBsaWNhdGlvbkZhaWx1cmUubm9uUmV0cnlhYmxlKGBObyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIHVwZGF0ZTogJHt1cGRhdGUubmFtZX1gKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduYWxXb3JrZmxvd05leHRIYW5kbGVyKHsgc2lnbmFsTmFtZSwgYXJncyB9OiBTaWduYWxJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5zaWduYWxIYW5kbGVycy5nZXQoc2lnbmFsTmFtZSk/LmhhbmRsZXI7XG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcihzaWduYWxOYW1lLCAuLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyByZWdpc3RlcmVkIHNpZ25hbCBoYW5kbGVyIGZvciBzaWduYWw6ICR7c2lnbmFsTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2lnbmFsV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklTaWduYWxXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2lnbmFsTmFtZSwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXNpZ25hbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiBzaWduYWxOYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHNpZ25hbHMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLCBhbmQgdW5yZWdpc3RlcmVkIG5hbWVzIHdpdGhvdXQgYVxuICAgIC8vIGRlZmF1bHQgaGFuZGxlciBmYWxsIHRocm91Z2ggdG8gdGhlIGJ1ZmZlci10aGVuLXJlamVjdCBwYXRoIGJlbG93LlxuICAgIGlmIChcbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmXG4gICAgICAhdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsTmFtZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYENhbm5vdCB1c2Ugc2lnbmFsIG5hbWU6ICcke3NpZ25hbE5hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHNpZ25hbC5cbiAgICBjb25zdCBpc0ludGVybmFsU2lnbmFsID1cbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxTaWduYWwgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbE5hbWUpICYmICF0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkU2lnbmFscy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciB0aGVuIHRoZSB1bmZpbmlzaGVkXG4gICAgLy8gcG9saWN5IGlzIFdBUk5fQU5EX0FCQU5ET047IHVzZXJzIGN1cnJlbnRseSBoYXZlIG5vIHdheSB0byBzaWxlbmNlIGFueVxuICAgIC8vIGVuc3Vpbmcgd2FybmluZ3MuXG4gICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9XG4gICAgICB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuXG4gICAgY29uc3Qgc2lnbmFsRXhlY3V0aW9uTnVtID0gdGhpcy5zaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxKys7XG4gICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5zZXQoc2lnbmFsRXhlY3V0aW9uTnVtLCB7IG5hbWU6IHNpZ25hbE5hbWUsIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlU2lnbmFsJywgdGhpcy5zaWduYWxXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5pbnB1dCwgY29udGV4dCksXG4gICAgICBzaWduYWxOYW1lLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KVxuICAgICAgLmNhdGNoKHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlLmJpbmQodGhpcykpXG4gICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLmRlbGV0ZShzaWduYWxFeGVjdXRpb25OdW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkU2lnbmFscygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFNpZ25hbHMgPSB0aGlzLmJ1ZmZlcmVkU2lnbmFscztcbiAgICB3aGlsZSAoYnVmZmVyZWRTaWduYWxzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIsIHNvIGFsbCBzaWduYWxzIGFyZSBkaXNwYXRjaGFibGVcblxuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KGJ1ZmZlcmVkU2lnbmFscy5zaGlmdCgpISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gYnVmZmVyZWRTaWduYWxzLmZpbmRJbmRleCgoc2lnbmFsKSA9PiB0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWwuc2lnbmFsTmFtZSBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBicmVhaztcbiAgICAgICAgY29uc3QgW3NpZ25hbF0gPSBidWZmZXJlZFNpZ25hbHMuc3BsaWNlKGZvdW5kSW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KHNpZ25hbCEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlU2lnbmFsRXh0ZXJuYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGNvbnRleHQgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ3NpZ25hbFdvcmtmbG93JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5mYWlsdXJlKSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjYW5jZWxXb3JrZmxvdycsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24uZmFpbHVyZSkge1xuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0V2FybmFibGUgPSAoaGFuZGxlckV4ZWN1dGlvbnM6IEl0ZXJhYmxlPE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPik6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10gPT4ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oaGFuZGxlckV4ZWN1dGlvbnMpLmZpbHRlcihcbiAgICAgICAgKGV4KSA9PiBleC51bmZpbmlzaGVkUG9saWN5ID09PSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCB3YXJuYWJsZVVwZGF0ZXMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2Uod2FybmFibGVVcGRhdGVzKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmFibGVTaWduYWxzID0gZ2V0V2FybmFibGUodGhpcy5pblByb2dyZXNzU2lnbmFscy52YWx1ZXMoKSk7XG4gICAgaWYgKHdhcm5hYmxlU2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKHdhcm5hYmxlU2lnbmFscykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSYW5kb21TZWVkKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JVXBkYXRlUmFuZG9tU2VlZCk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWN0aXZhdGlvbiB3aXRoIHJhbmRvbW5lc3NTZWVkIGF0dHJpYnV0ZScpO1xuICAgIH1cbiAgICB0aGlzLnNldFJhbmRvbW5lc3NTZWVkKGFjdGl2YXRpb24ucmFuZG9tbmVzc1NlZWQudG9CeXRlcygpKTtcbiAgfVxuXG4gIHB1YmxpYyBub3RpZnlIYXNQYXRjaChhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSU5vdGlmeUhhc1BhdGNoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nKVxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdVbmV4cGVjdGVkIG5vdGlmeUhhc1BhdGNoIGpvYiBvbiBub24tcmVwbGF5IGFjdGl2YXRpb24nKTtcbiAgICBpZiAoIWFjdGl2YXRpb24ucGF0Y2hJZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignbm90aWZ5SGFzUGF0Y2ggbWlzc2luZyBwYXRjaCBpZCcpO1xuICAgIHRoaXMua25vd25QcmVzZW50UGF0Y2hlcy5hZGQoYWN0aXZhdGlvbi5wYXRjaElkKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXRjaEludGVybmFsKHBhdGNoSWQ6IHN0cmluZywgZGVwcmVjYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndvcmtmbG93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignUGF0Y2hlcyBjYW5ub3QgYmUgdXNlZCBiZWZvcmUgV29ya2Zsb3cgc3RhcnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZVBhdGNoID0gIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgfHwgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmhhcyhwYXRjaElkKTtcbiAgICAvLyBBdm9pZCBzZW5kaW5nIGNvbW1hbmRzIGZvciBwYXRjaGVzIGNvcmUgYWxyZWFkeSBrbm93cyBhYm91dC5cbiAgICAvLyBUaGlzIG9wdGltaXphdGlvbiBlbmFibGVzIGRldmVsb3BtZW50IG9mIGF1dG9tYXRpYyBwYXRjaGluZyB0b29scy5cbiAgICBpZiAodXNlUGF0Y2ggJiYgIXRoaXMuc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpKSB7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgICAgc2V0UGF0Y2hNYXJrZXI6IHsgcGF0Y2hJZCwgZGVwcmVjYXRlZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbnRQYXRjaGVzLmFkZChwYXRjaElkKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVBhdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBlYXJseSB3aGlsZSBoYW5kbGluZyBhbiBhY3RpdmF0aW9uIHRvIHJlZ2lzdGVyIGtub3duIGZsYWdzLlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGFkZEtub3duRmxhZ3MoZmxhZ3M6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIGZsYWdzKSB7XG4gICAgICBhc3NlcnRWYWxpZEZsYWcoZmxhZyk7XG4gICAgICB0aGlzLmtub3duRmxhZ3MuYWRkKGZsYWcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBTREsgRmxhZyBtYXkgYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBTREsgZmxhZ3MgcGxheSBhIHJvbGUgc2ltaWxhciB0byB0aGUgYHBhdGNoZWQoKWAgQVBJLCBidXQgYXJlIG1lYW50IGZvciBpbnRlcm5hbCB1c2FnZSBieSB0aGVcbiAgICogU0RLIGl0c2VsZi4gVGhleSBtYWtlIGl0IHBvc3NpYmxlIGZvciB0aGUgU0RLIHRvIGV2b2x2ZSBpdHMgYmVoYXZpb3JzIG92ZXIgdGltZSwgd2hpbGUgc3RpbGxcbiAgICogbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIFdvcmtmbG93IGhpc3RvcmllcyBwcm9kdWNlZCBieSBvbGRlciBTREtzLCB3aXRob3V0IGNhdXNpbmdcbiAgICogZGV0ZXJtaW5pc20gdmlvbGF0aW9ucy5cbiAgICpcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBoYXNGbGFnKGZsYWc6IFNka0ZsYWcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5rbm93bkZsYWdzLmhhcyhmbGFnLmlkKSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBJZiBub3QgcmVwbGF5aW5nLCBlbmFibGUgdGhlIGZsYWcgaWYgaXQgaXMgY29uZmlndXJlZCB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFNldHRpbmcgYVxuICAgIC8vIGZsYWcncyBkZWZhdWx0IHRvIGZhbHNlIGFsbG93cyBwcm9ncmVzc2l2ZSByb2xsb3V0IG9mIG5ldyBmZWF0dXJlIGZsYWdzLCB3aXRoIHRoZSBwb3NzaWJpbGl0eVxuICAgIC8vIG9mIHJldmVydGluZyBiYWNrIHRvIGEgdmVyc2lvbiBvZiB0aGUgU0RLIHdoZXJlIHRoZSBmbGFnIGlzIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAvLyBJdCBpcyBhbHNvIHVzZWZ1bCBmb3IgdGVzdGluZyBwdXJwb3NlLlxuICAgIGlmICghdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiBmbGFnLmRlZmF1bHQpIHtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZy5pZCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHJlcGxheWluZywgYSBmbGFnIGlzIGNvbnNpZGVyZWQgZW5hYmxlZCBpZiBpdCB3YXMgZW5hYmxlZCBkdXJpbmcgdGhlIG9yaWdpbmFsIGV4ZWN1dGlvbiBvZlxuICAgIC8vIHRoYXQgV29ya2Zsb3cgVGFzazsgdGhpcyBpcyBub3JtYWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgZmxhZyBJRCBpbiB0aGUgY29ycmVzcG9uZGluZ1xuICAgIC8vIFdGVCBDb21wbGV0ZWQncyBgc2RrTWV0YWRhdGEubGFuZ1VzZWRGbGFnc2AuXG4gICAgLy9cbiAgICAvLyBTREsgRmxhZyBBbHRlcm5hdGUgQ29uZGl0aW9uIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgZmxhZyBzaG91bGRcbiAgICAvLyBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREsgdGhhdFxuICAgIC8vIGVtaXR0ZWQgYSBXRlQuIFRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHJldHJvYWN0aXZlbHkgdHVybiBvbiBzb21lIGZsYWdzIGZvciBXRlQgZW1pdHRlZFxuICAgIC8vIGJ5IHByZXZpb3VzIFNES3MgdGhhdCBjb250YWluZWQgYSBidWcuIEFsdCBDb25kaXRpb25zIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcuIEFsc28sIGFsdGVybmF0ZSBjb25kaXRpb25zIHdpbGwgbm90XG4gICAgLy8gY2F1c2UgdGhlIGZsYWcgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrc1xuICAgIC8vIG1heSBub3QgcmVmbGVjdCB0aGlzIGZsYWcgaWYgdGhlIGNvbmRpdGlvbiBubyBsb25nZXIgaG9sZHMuIFRoaXMgaXMgc28gdG8gYXZvaWQgaW5jb3JyZWN0XG4gICAgLy8gYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvdyBFeGVjdXRpb24gaGFzIGdvbmUgdGhyb3VnaCBhIG5ld2VyIFNESyB2ZXJzaW9uIHRoZW4gYWdhaW5cbiAgICAvLyB0aHJvdWdoIGFuIG9sZGVyIG9uZS5cbiAgICBpZiAodGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiBmbGFnLmFsdGVybmF0aXZlQ29uZGl0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBjb25kIG9mIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICAgIGlmIChjb25kKHsgaW5mbzogdGhpcy5pbmZvLCBzZGtWZXJzaW9uOiB0aGlzLnNka1ZlcnNpb24gfSkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGcm9tQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdyZW1vdmVGcm9tQ2FjaGUgYWN0aXZhdGlvbiBqb2Igc2hvdWxkIG5vdCByZWFjaCB3b3JrZmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgZmFpbHVyZXMgaW50byBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBVc2VkIHRvIGhhbmRsZSBhbnkgZmFpbHVyZSBlbWl0dGVkIGJ5IHRoZSBXb3JrZmxvdy5cbiAgICovXG4gIGhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCAmJiBpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjYW5jZWxXb3JrZmxvd0V4ZWN1dGlvbjoge30gfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjb250aW51ZUFzTmV3V29ya2Zsb3dFeGVjdXRpb246IGVycm9yLmNvbW1hbmQgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSB8fCB0aGlzLmlzQ29uZmlndXJlZEZhaWx1cmVFeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdy4gV2UgZG8gbm90IHdhbnQgdG8gaXNzdWUgdW5maW5pc2hlZEhhbmRsZXJzIHdhcm5pbmdzLiBUbyBhY2hpZXZlIHRoYXQsIHdlXG4gICAgICAvLyBtYXJrIGFsbCBoYW5kbGVycyBhcyBjb21wbGV0ZWQgbm93LlxuICAgICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5jbGVhcigpO1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5jbGVhcigpO1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY29yZFdvcmtmbG93VGFza0Vycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlcnJvciBtYXRjaGVzIGFueSBvZiB0aGUgY29uZmlndXJlZCBmYWlsdXJlIGV4Y2VwdGlvbiB0eXBlc1xuICAgKiAoZnJvbSB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSBvclxuICAgKiB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy5mYWlsdXJlRXhjZXB0aW9uVHlwZXN9KS5cbiAgICovXG4gIHByaXZhdGUgaXNDb25maWd1cmVkRmFpbHVyZUV4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGNsYXNzIHJlZmVyZW5jZXMgZnJvbSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIChpbnN0YW5jZW9mLWJhc2VkLCBzdXBwb3J0cyBzdWJjbGFzc2VzKVxuICAgIGlmICh0aGlzLndvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlcykge1xuICAgICAgLy8gV2UgZ3VhcmFudGVlIHRoYXQgaW5jbHVkaW5nIEVycm9yIGluIHRoZSBsaXN0IHdpbGwgY2F0Y2ggX2FueV8gZXJyb3IuXG4gICAgICBpZiAodGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMuaW5jbHVkZXMoRXJyb3IpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBlcnJvclR5cGUgb2YgdGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgZXJyb3JUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBjbGFzcyBuYW1lIHN0cmluZ3MgZnJvbSBXb3JrZXJPcHRpb25zIChwcm90b3R5cGUtY2hhaW4tYmFzZWQpXG4gICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZSBndWFyYW50ZWUgdGhhdCBpbmNsdWRpbmcgJ0Vycm9yJyBpbiB0aGUgbGlzdCB3aWxsIGNhdGNoIF9hbnlfIGVycm9yLlxuICAgICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5pbmNsdWRlcygnRXJyb3InKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBjdG9yID0gKGVycm9yIGFzIGFueSkuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjdG9yICE9IG51bGwgJiYgY3RvciAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IChjdG9yIGFzIGFueSkubmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMuaW5jbHVkZXMobmFtZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVjb3JkV29ya2Zsb3dUYXNrRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGtlZXAgdGhlIGZpcnN0IGVycm9yIHRoYXQgYnViYmxlcyB1cDsgc3Vic2VxdWVudCBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkLlxuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yID09PSB1bmRlZmluZWQpIHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPSBlcnJvcjtcblxuICAgIC8vIEltbWVkaWF0ZWx5IHJldGhyb3cgdGhlIGVycm9yIGlmIHdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBzbyAoaS5lLiB3ZSBhcmUgbm90IHJ1bm5pbmcgYXN5bmNcbiAgICAvLyBtaWNyb3Rhc2tzKS4gT3RoZXJ3aXNlLCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biB3aGVuZXZlciB3ZSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gc28sXG4gICAgLy8gZS5nLiB0aGUgbmV4dCB0aW1lIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCBpcyBjYWxsZWQuXG4gICAgaWYgKHRoaXMucmV0aHJvd1N5bmNocm9ub3VzbHkpIHRoaXMubWF5YmVSZXRocm93V29ya2Zsb3dUYXNrRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIFdvcmtmbG93IFRhc2sgZXJyb3Igd2FzIGNhcHR1cmVkLCBhbmQgd2UgYXJlIHJ1bm5pbmcgaW4gc3luY2hyb25vdXMgbW9kZSxcbiAgICogdGhlbiBidWJibGUgaXQgdXAgbm93LiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBldmVuIGlmIHRoZXJlIGlzIG5vIGVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICBtYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgdGhyb3cgdGhpcy53b3JrZmxvd1Rhc2tFcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7IHF1ZXJ5SWQsIHN1Y2NlZWRlZDogeyByZXNwb25zZTogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpIH0gfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbFF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7XG4gICAgICAgIHF1ZXJ5SWQsXG4gICAgICAgIGZhaWxlZDogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFjY2VwdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoeyB1cGRhdGVSZXNwb25zZTogeyBwcm90b2NvbEluc3RhbmNlSWQsIGFjY2VwdGVkOiB7fSB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBjb21wbGV0ZWQ6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0LCBjb250ZXh0KSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZToge1xuICAgICAgICBwcm90b2NvbEluc3RhbmNlSWQsXG4gICAgICAgIHJlamVjdGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUgKi9cbiAgcHJpdmF0ZSBtYXliZUNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZ2V0KHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZGVsZXRlKHRhc2tTZXEpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbiBhcyBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQ29uc3VtZSBhIGNvbXBsZXRpb24gaWYgaXQgZXhpc3RzIGluIFdvcmtmbG93IHN0YXRlLCB0aHJvd3MgaWYgaXQgZG9lc24ndCAqL1xuICBwcml2YXRlIGNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbih0eXBlLCB0YXNrU2VxKTtcbiAgICBpZiAoY29tcGxldGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIGNvbXBsZXRpb24gZm9yIHRhc2tTZXEgJHt0YXNrU2VxfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVXb3JrZmxvdyhyZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgIHJlc3VsdDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duKTogUHJvdG9GYWlsdXJlIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNvbnZlcnRlci5lcnJvclRvRmFpbHVyZShlcnIsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCk7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUpOiBFcnJvciB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpOiBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5pbmZvLm5hbWVzcGFjZSxcbiAgICAgIHdvcmtmbG93SWQ6IHRoaXMuaW5mby53b3JrZmxvd0lkLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VxPFQgZXh0ZW5kcyB7IHNlcT86IG51bWJlciB8IG51bGwgfT4oYWN0aXZhdGlvbjogVCk6IG51bWJlciB7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRpb24uc2VxO1xuICBpZiAoc2VxID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBHb3QgYWN0aXZhdGlvbiB3aXRoIG5vIHNlcSBhdHRyaWJ1dGVgKTtcbiAgfVxuICByZXR1cm4gc2VxO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5maW5pc2hlZFVwZGF0ZUhhbmRsZXJNZXNzYWdlKGhhbmRsZXJFeGVjdXRpb25zOiBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbltdKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBcbltUTVBSTDExMDJdIFdvcmtmbG93IGZpbmlzaGVkIHdoaWxlIGFuIHVwZGF0ZSBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnVwZGF0ZSBoYW5kbGVyIHdhcyBkb2luZywgYW5kIHRoZSBjbGllbnQgdGhhdCBzZW50IHRoZSB1cGRhdGUgd2lsbCByZWNlaXZlIGEgJ3dvcmtmbG93IGV4ZWN1dGlvblxuYWxyZWFkeSBjb21wbGV0ZWQnIFJQQ0Vycm9yIGluc3RlYWQgb2YgdGhlIHVwZGF0ZSByZXN1bHQuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsXG5oYW5kbGVycyB0byBjb21wbGV0ZSBieSB1c2luZyBcXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuXG5BbHRlcm5hdGl2ZWx5LCBpZiBib3RoIHlvdSBhbmQgdGhlIGNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnNcbndoZW4gdGhlIHdvcmtmbG93IGZpbmlzaGVzLCBhbmQgY2F1c2luZyBjbGllbnRzIHRvIHJlY2VpdmUgZXJyb3JzLCB0aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnlcbnBhc3NpbmcgYW4gb3B0aW9uIHdoZW4gc2V0dGluZyB0aGUgaGFuZGxlcjpcblxcYHdvcmtmbG93LnNldEhhbmRsZXIobXlVcGRhdGUsIG15VXBkYXRlSGFuZGxlciwge3VuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LkFCQU5ET059KTtcXGAuYFxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGAke21lc3NhZ2V9IFRoZSBmb2xsb3dpbmcgdXBkYXRlcyB3ZXJlIHVuZmluaXNoZWQgKGFuZCB3YXJuaW5ncyB3ZXJlIG5vdCBkaXNhYmxlZCBmb3IgdGhlaXIgaGFuZGxlcik6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgaGFuZGxlckV4ZWN1dGlvbnMubWFwKChleCkgPT4gKHsgbmFtZTogZXgubmFtZSwgaWQ6IGV4LmlkIH0pKVxuICApfWA7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYSBzaWduYWwgaGFuZGxlciB3YXMgc3RpbGwgcnVubmluZy4gVGhpcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB3b3JrIHRoYXQgdGhlXG5zaWduYWwgaGFuZGxlciB3YXMgZG9pbmcuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nXG5cXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuIEFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGVcbmNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnMgd2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsXG50aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnkgcGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVNpZ25hbCwgbXlTaWduYWxIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG5cbiAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IG5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBleCBvZiBoYW5kbGVyRXhlY3V0aW9ucykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZXMuZ2V0KGV4Lm5hbWUpIHx8IDA7XG4gICAgbmFtZXMuc2V0KGV4Lm5hbWUsIGNvdW50ICsgMSk7XG4gIH1cblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyBzaWduYWxzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBBcnJheS5mcm9tKG5hbWVzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgY291bnRdKSA9PiAoeyBuYW1lLCBjb3VudCB9KSlcbiAgKX1gO1xufVxuIiwiaW1wb3J0IHsgU2RrQ29tcG9uZW50IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IHR5cGUgU2luaywgdHlwZSBTaW5rcywgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb250aW51ZUFzTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjdXJyZW50VXBkYXRlSW5mbywgaW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL3dvcmtmbG93JztcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0xvZ2dlciBleHRlbmRzIFNpbmsge1xuICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICpcbiAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGV4dGVuZHMgU2lua3Mge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAgICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICAgKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gICAqL1xuICBkZWZhdWx0V29ya2VyTG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNpbmtzSW50ZXJuYWwgZXh0ZW5kcyBTaW5rcyB7XG4gIF9fdGVtcG9yYWxfbG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuY29uc3QgbG9nZ2VyU2luayA9IHByb3h5U2lua3M8TG9nZ2VyU2lua3NJbnRlcm5hbD4oKS5fX3RlbXBvcmFsX2xvZ2dlcjtcblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBieSB0aGUgU0RLIGxvZ2dlciB0byBleHRyYWN0IGEgdGltZXN0YW1wIGZyb20gbG9nIGF0dHJpYnV0ZXMuXG4gKiBBbHNvIGRlZmluZWQgaW4gYHdvcmtlci9sb2dnZXIudHNgIC0gaW50ZW50aW9uYWxseSBub3Qgc2hhcmVkLlxuICovXG5jb25zdCBMb2dUaW1lc3RhbXAgPSBTeW1ib2wuZm9yKCdsb2dfdGltZXN0YW1wJyk7XG5cbi8qKlxuICogRGVmYXVsdCB3b3JrZmxvdyBsb2dnZXIuXG4gKlxuICogVGhpcyBsb2dnZXIgaXMgcmVwbGF5LWF3YXJlIGFuZCB3aWxsIG9taXQgbG9nIG1lc3NhZ2VzIG9uIHdvcmtmbG93IHJlcGxheS4gTWVzc2FnZXMgZW1pdHRlZCBieSB0aGlzIGxvZ2dlciBhcmVcbiAqIGZ1bm5lbGxlZCB0aHJvdWdoIGEgc2luayB0aGF0IGZvcndhcmRzIHRoZW0gdG8gdGhlIGxvZ2dlciByZWdpc3RlcmVkIG9uIHtAbGluayBSdW50aW1lLmxvZ2dlcn0uXG4gKlxuICogQXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbiBjb250ZXh0IGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGFzIG1ldGFkYXRhIG9uIGV2ZXJ5IGxvZ1xuICogZW50cmllcy4gQW4gZXh0cmEgYHNka0NvbXBvbmVudGAgbWV0YWRhdGEgYXR0cmlidXRlIGlzIGFsc28gYWRkZWQsIHdpdGggdmFsdWUgYHdvcmtmbG93YDsgdGhpcyBjYW4gYmUgdXNlZCBmb3JcbiAqIGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIGVudHJpZXMgZnVydGhlciBkb3duc3RyZWFtLlxuICpcbiAqIFRvIGN1c3RvbWl6ZSBsb2cgYXR0cmlidXRlcywgcmVnaXN0ZXIgYSB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3J9IHRoYXQgaW50ZXJjZXB0cyB0aGVcbiAqIGBnZXRMb2dBdHRyaWJ1dGVzKClgIG1ldGhvZC5cbiAqXG4gKiBOb3RpY2UgdGhhdCBzaW5jZSBzaW5rcyBhcmUgdXNlZCB0byBwb3dlciB0aGlzIGxvZ2dlciwgYW55IGxvZyBhdHRyaWJ1dGVzIG11c3QgYmUgdHJhbnNmZXJhYmxlIHZpYSB0aGVcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX1cbiAqIEFQSS5cbiAqXG4gKiBOT1RFOiBTcGVjaWZ5aW5nIGEgY3VzdG9tIGxvZ2dlciB0aHJvdWdoIHtAbGluayBkZWZhdWx0U2lua30gb3IgYnkgbWFudWFsbHkgcmVnaXN0ZXJpbmcgYSBzaW5rIG5hbWVkXG4gKiBgZGVmYXVsdFdvcmtlckxvZ2dlcmAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2c6IFdvcmtmbG93TG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAoWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSBhcyBBcnJheTxrZXlvZiBXb3JrZmxvd0xvZ2dlcj4pLm1hcCgobGV2ZWwpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgbGV2ZWwsXG4gICAgICAobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5sb2coLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICAgICAgY29uc3QgZ2V0TG9nQXR0cmlidXRlcyA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2dldExvZ0F0dHJpYnV0ZXMnLCAoYSkgPT4gYSk7XG4gICAgICAgIHJldHVybiBsb2dnZXJTaW5rW2xldmVsXSEobWVzc2FnZSwge1xuICAgICAgICAgIC8vIEluamVjdCB0aGUgY2FsbCB0aW1lIGluIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBhcyBleHBlY3RlZCBieSB0aGUgd29ya2VyIGxvZ2dlci5cbiAgICAgICAgICBbTG9nVGltZXN0YW1wXTogYWN0aXZhdG9yLmdldFRpbWVPZkRheSgpLFxuICAgICAgICAgIHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtmbG93LFxuICAgICAgICAgIC4uLmdldExvZ0F0dHJpYnV0ZXMod29ya2Zsb3dMb2dBdHRyaWJ1dGVzKGFjdGl2YXRvci5pbmZvKSksXG4gICAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICBdO1xuICB9KVxuKSBhcyBhbnk7XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoZm46ICgpID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgbG9nLmRlYnVnKCdXb3JrZmxvdyBzdGFydGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gIGNvbnN0IHAgPSBmbigpLnRoZW4oXG4gICAgKHJlcykgPT4ge1xuICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb21wbGV0ZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIC8vIEF2b2lkIHVzaW5nIGluc3RhbmNlb2YgY2hlY2tzIGluIGNhc2UgdGhlIG1vZHVsZXMgdGhleSdyZSBkZWZpbmVkIGluIGxvYWRlZCBtb3JlIHRoYW4gb25jZSxcbiAgICAgIC8vIGUuZy4gYnkgamVzdCBvciB3aGVuIG11bHRpcGxlIHZlcnNpb25zIGFyZSBpbnN0YWxsZWQuXG4gICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbXBsZXRlZCBhcyBjYW5jZWxsZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbnRpbnVlZCBhcyBuZXcnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nLndhcm4oJ1dvcmtmbG93IGZhaWxlZCcsIHsgZXJyb3IsIHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgKTtcbiAgLy8gQXZvaWQgc2hvd2luZyB0aGlzIGludGVyY2VwdG9yIGluIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gIHVudHJhY2tQcm9taXNlKHApO1xuICByZXR1cm4gcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWFwIG9mIGF0dHJpYnV0ZXMgdG8gYmUgc2V0IF9ieSBkZWZhdWx0XyBvbiBsb2cgbWVzc2FnZXMgZm9yIGEgZ2l2ZW4gV29ya2Zsb3cuXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgV29ya2Zsb3cgY29udGV4dCAoZWcuIGJ5IHRoZSB3b3JrZXIgaXRzZWxmKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93TG9nQXR0cmlidXRlcyhpbmZvOiBXb3JrZmxvd0luZm8pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgbmFtZXNwYWNlOiBpbmZvLm5hbWVzcGFjZSxcbiAgICB0YXNrUXVldWU6IGluZm8udGFza1F1ZXVlLFxuICAgIHdvcmtmbG93SWQ6IGluZm8ud29ya2Zsb3dJZCxcbiAgICBydW5JZDogaW5mby5ydW5JZCxcbiAgICB3b3JrZmxvd1R5cGU6IGluZm8ud29ya2Zsb3dUeXBlLFxuICB9O1xuICBpZiAoaW5Xb3JrZmxvd0NvbnRleHQoKSkge1xuICAgIGNvbnN0IHVwZGF0ZUluZm8gPSBjdXJyZW50VXBkYXRlSW5mbygpO1xuICAgIGlmICh1cGRhdGVJbmZvKSB7XG4gICAgICAvLyBBZGQgdXBkYXRlIGluZm8gaWYgaXQgZXhpc3RzXG4gICAgICBhdHRyaWJ1dGVzWyd1cGRhdGVJZCddID0gdXBkYXRlSW5mby5pZDtcbiAgICAgIGF0dHJpYnV0ZXNbJ3VwZGF0ZU5hbWUnXSA9IHVwZGF0ZUluZm8ubmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF0dHJpYnV0ZXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIE1ldHJpY0NvdW50ZXIsXG4gIE1ldHJpY0dhdWdlLFxuICBNZXRyaWNIaXN0b2dyYW0sXG4gIE1ldHJpY01ldGVyLFxuICBNZXRyaWNUYWdzLFxuICBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB0eXBlIHsgU2luaywgU2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHByb3h5U2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHdvcmtmbG93SW5mbyB9IGZyb20gJy4vd29ya2Zsb3cnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuY2xhc3MgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0NvdW50ZXIobmFtZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgY3JlYXRlSGlzdG9ncmFtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW0obmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVHYXVnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNHYXVnZSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNHYXVnZShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljTWV0ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0NvdW50ZXIgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljQ291bnRlciB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5hZGRNZXRyaWNDb3VudGVyVmFsdWUodGhpcy5uYW1lLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCBleHRyYVRhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljQ291bnRlciB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0NvdW50ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbSBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHJlY29yZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljSGlzdG9ncmFtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLnJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW1gKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0dhdWdlIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHNldCh2YWx1ZTogbnVtYmVyLCB0YWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljR2F1Z2UgdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1Npbmsuc2V0TWV0cmljR2F1Z2VWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCB0YWdzID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljR2F1Z2VgKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIE5vdGU6IGdpdmVuIHRoYXQgZm9yd2FyZGluZyBtZXRyaWNzIG91dHNpZGUgb2YgdGhlIHNhbmJveCBjYW4gYmUgcXVpdGUgY2hhdHR5IGFuZCBhZGQgbm9uXG4vLyBuZWdsaWdlYWJsZSBvdmVyaGVhZCwgd2UgZWFnZXJseSBjaGVjayBmb3IgYGlzUmVwbGF5aW5nYCBhbmQgY29tcGxldGVseSBza2lwIGRvaW5nIHNpbmtcbi8vIGNhbGxzIGlmIHdlIGFyZSByZXBsYXlpbmcuXG5jb25zdCBtZXRyaWNTaW5rID0gcHJveHlTaW5rczxNZXRyaWNTaW5rcz4oKS5fX3RlbXBvcmFsX21ldHJpY3M7XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbWV0cmljcyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXIuXG4gKlxuICogVGhlc2Ugc2luayBmdW5jdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB3b3JrZmxvdyBjb2RlOyBpbnN0ZWFkLFxuICogZGV2ZWxvcGVycyBzaG91bGQgdXNlIHRoZSBgbWV0cmljTWV0ZXJgIG9iamVjdCBleHBvc2VkIHRvIHdvcmtmbG93IGNvZGUgYnkgdGhlIFNESywgd2hpY2hcbiAqIHByb3ZpZGVzIGFuIEFQSSB0aGF0IGlzIGVhc2llciB0byB3b3JrIHdpdGguXG4gKlxuICogVGhpcyBzaW5rIGludGVyZmFjZSBpcyBhbHNvIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB1c2VyLlxuICpcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9tZXRyaWNzOiBXb3JrZmxvd01ldHJpY01ldGVyO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd01ldHJpY01ldGVyIGV4dGVuZHMgU2luayB7XG4gIGFkZE1ldHJpY0NvdW50ZXJWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHNldE1ldHJpY0dhdWdlVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBNZXRyaWNNZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGVtaXQgbWV0cmljcyBmcm9tIHdpdGhpbiBhIFdvcmtmbG93LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ldHJpY01ldGVyOiBNZXRyaWNNZXRlciA9IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncy5jb21wb3NlKFxuICBuZXcgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwoKSxcbiAgKCkgPT4ge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5tZXRyaWNNZXRlciBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICBjb25zdCBnZXRNZXRyaWNUYWdzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TWV0cmljVGFncycsIChhKSA9PiBhKTtcblxuICAgIGNvbnN0IGluZm8gPSBhY3RpdmF0b3IuaW5mbztcbiAgICByZXR1cm4gZ2V0TWV0cmljVGFncyh7XG4gICAgICAvLyBuYW1lc3BhY2UgYW5kIHRhc2tRdWV1ZSB3aWxsIGJlIGFkZGVkIGJ5IHRoZSBXb3JrZXJcbiAgICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gICAgfSk7XG4gIH0sXG4gIHRydWVcbik7XG4iLCJpbXBvcnQgdHlwZSAqIGFzIG5leHVzIGZyb20gJ25leHVzLXJwYyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyB1c2VyTWV0YWRhdGFUb1BheWxvYWQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3VzZXItbWV0YWRhdGEnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgU3RhcnROZXh1c09wZXJhdGlvbklucHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuLyoqXG4gKiBBIE5leHVzIGNsaWVudCBmb3IgaW52b2tpbmcgTmV4dXMgT3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnQ8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBleGVjdXRlT3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj47XG5cbiAgLy8gVE9ETyhuZXh1cy9wb3N0LWluaXRpYWwtcmVsZWFzZSk6IFJldmlzaXQgdGhlIFwiT3BlcmF0aW9uIFByb3BlcnR5IE5hbWVcIiB0ZXJtaW5vbG9neSxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWZsZWN0IGluIHRoZSBOZXh1cyBSUEMgU0RLLlxuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQW4gT3BlcmF0aW9uJ3MgX3Byb3BlcnR5IG5hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGRlZmluZSB0aGF0IE9wZXJhdGlvbiBpblxuICAgKiB0aGUge0BsaW5rIG5leHVzLlNlcnZpY2VEZWZpbml0aW9ufSBvYmplY3Q7IGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgKiBpZiBvbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSB7QGxpbmsgbmV4dXMuT3BlcmF0aW9uRGVmaW5pdGlvbn0gb2JqZWN0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj47XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIHRha2luZyBhIHtAbGluayBuZXh1cy5vcGVyYXRpb259LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIE9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgIG9wOiBPLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxPPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnRPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj4+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzT3BlcmF0aW9uSGFuZGxlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBPcGVyYXRpb24ncyBzZXJ2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW9uIHRva2VuIGFzIHNldCBieSB0aGUgT3BlcmF0aW9uJ3MgaGFuZGxlci4gTWF5IGJlIGVtcHR5IGlmIHRoZSBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2FpdCBmb3IgT3BlcmF0aW9uIGNvbXBsZXRpb24gYW5kIGdldCBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9uczxUPiB7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2U6IFQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+KFxuICBvcHRpb25zOiBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+XG4pOiBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICBjbGFzcyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4gaW1wbGVtZW50cyBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICAgIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nIHwgVFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XSxcbiAgICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dPixcbiAgICAgIG9wZXJhdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICAgICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0aGlzLnN0YXJ0T3BlcmF0aW9uKG9wZXJhdGlvbiwgaW5wdXQsIG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBvcE5hbWUgPVxuICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gLy8gQ2FzdGluZyBhcyBzdHJpbmcgdG8gY292ZXIgdXAgdGhlIGZhY3QgdGhhdCBgb3BOYW1lYCBtaWdodCBiZSB1bmRlZmluZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYGV4ZWN1dGVgIHdpbGwgcHJvZHVjZSBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmUuTk9UX0ZPVU5EYC5cbiAgICAgICAgICAgIChvcHRpb25zLnNlcnZpY2Uub3BlcmF0aW9uc1tvcGVyYXRpb25dPy5uYW1lIGFzIHN0cmluZylcbiAgICAgICAgICA6IG9wZXJhdGlvbi5uYW1lO1xuXG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5uZXh1c09wZXJhdGlvbisrO1xuXG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nLFxuICAgICAgICBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBpbnRlcmNlcHRvciByZXR1cm5zIGEgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Piwgd2l0aCB0aGUgcmVzdWx0IHByb21pc2UgY29udGFpbmVkXG4gICAgICAvLyBpbiB0aGF0IE91dHB1dCBvYmplY3QuIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIHJlc3VsdCBwcm9taXNlL2NvbXBsZXRpb24gZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHVudGlsIHRoZSBTdGFydE5leHVzT3BlcmF0aW9uIGV2ZW50IGlzIHJlY2VpdmVkLiBUaGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBkaWQgaW5cbiAgICAgIC8vIENoaWxkV29ya2Zsb3csIGJ1dCBpcyBtdWNoIGNsZWFuZXIgZnJvbSB0aGUgaW50ZXJjZXB0b3JzIHBvaW50IG9mIHZpZXcuXG4gICAgICBjb25zdCB7IHRva2VuLCByZXN1bHQ6IHJlc3VsdFByb21pc2UgfSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgc2VydmljZTogb3B0aW9ucy5zZXJ2aWNlLm5hbWUsXG4gICAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBvcGVyYXRpb25PcHRpb25zPy5jYW5jZWxsYXRpb25UeXBlID8/ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc2VxLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBhc3luYyByZXN1bHQoKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZSBhcyBuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz47XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTmV4dXNTZXJ2aWNlQ2xpZW50SW1wbDxUPigpO1xufVxuXG5mdW5jdGlvbiBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXIoe1xuICBpbnB1dCxcbiAgZW5kcG9pbnQsXG4gIHNlcnZpY2UsXG4gIG9wdGlvbnMsXG4gIG9wZXJhdGlvbixcbiAgc2VxLFxuICBoZWFkZXJzLFxufTogU3RhcnROZXh1c09wZXJhdGlvbklucHV0KTogUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIHR5cGU6ICd3b3JrZmxvdycgYXMgY29uc3QsXG4gICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgd29ya2Zsb3dJZDogYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dJZCxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGVkID1cbiAgICAgICAgICAgICFhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5oYXMoc2VxKSAmJlxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvbkNvbXBsZXRlLmhhcyhzZXEpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxOZXh1c09wZXJhdGlvbjogeyBzZXEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY2FuY2VsIG90aGVyd2lzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2NoZWR1bGVOZXh1c09wZXJhdGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIG5leHVzSGVhZGVyOiBoZWFkZXJzLFxuICAgICAgICBpbnB1dDogYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKGlucHV0LCBjb250ZXh0KSxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlKG9wdGlvbnM/LmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uU3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lczpcbiAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE5leHVzIE9wZXJhdGlvblxuICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgT3BlcmF0aW9uJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFdvcmtmbG93XG4gKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIG9wZXJhdGlvbidzIHJlc3VsdCBwcm9taXNlIGZhaWwgd2l0aCBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmVgLFxuICogICB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAqIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBPcGVyYXRpb24gY2FsbCB3YXMgbWFkZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIE5leHVzIE9wZXJhdGlvbiwgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydFxuICAgKiBjYW5jZWxsYXRpb24gdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogSW5pdGlhdGUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmb3IgdGhlIE5leHVzIG9wZXJhdGlvbiBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvbiB0b1xuICAgKiB0aGUgY2FsbGVyLiBOb3RlIHRoYXQgaXQgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkIHRvIHRoZSBvcGVyYXRpb24gaWZcbiAgICogY2FsbGluZyB3b3JrZmxvdyBleGl0cyBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGRvbmUuIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGNhbmNlbGxhdGlvbiBpc1xuICAgKiBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBXb3JrZmxvdy1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgT3BlcmF0aW9uIEhhbmRsZXIuIEluIHBhcnRpY3VsYXIsIGVpdGhlciB0aGVcbiAgICogT3BlcmF0aW9uIG9yIHRoZSBXb3JrZmxvdyBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIE9wZXJhdGlvbiBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5LCBidXQgdGhlIFdvcmtmbG93IHRoaW5rcyBpdCB3YXMgY2FuY2VsbGVkLlxuICAgKlxuICAgKiBUbyBndWFyYW50ZWUgdGhhdCB0aGUgT3BlcmF0aW9uIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIE9wZXJhdGlvbiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3YXMgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIE9wZXJhdGlvbi5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlID1cbiAgKHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGVdO1xuXG5jb25zdCBbZW5jb2RlTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAwLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDEsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMixcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuIiwiLy8gLi4vcGFja2FnZS5qc29uIGlzIG91dHNpZGUgb2YgdGhlIFRTIHByb2plY3Qgcm9vdERpciB3aGljaCBjYXVzZXMgVFMgdG8gY29tcGxhaW4gYWJvdXQgdGhpcyBpbXBvcnQuXG4vLyBXZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UgdGhlIHJvb3REaXIgYmVjYXVzZSBpdCBtZXNzZXMgdXAgdGhlIG91dHB1dCBzdHJ1Y3R1cmUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBkZWZhdWx0IHBrZyBhcyB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH07XG4iLCJleHBvcnQgZnVuY3Rpb24gZmlsbFdpdGhSYW5kb20ocmFuZG9tOiAoKSA9PiBudW1iZXIsIGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlc1tpXSA9IE1hdGguZmxvb3IocmFuZG9tKCkgKiAweDEwMCk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXVpZDRGcm9tUmFuZG9tKHJhbmRvbTogKCkgPT4gbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaG8gPSAobjogbnVtYmVyLCBwOiBudW1iZXIpID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KHAsICcwJyk7XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7XG4gIHZpZXcuc2V0VWludDMyKDAsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDQsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDgsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDEyLCAocmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQ4KDYsICh2aWV3LmdldFVpbnQ4KDYpICYgMHhmKSB8IDB4NDApO1xuICB2aWV3LnNldFVpbnQ4KDgsICh2aWV3LmdldFVpbnQ4KDgpICYgMHgzZikgfCAweDgwKTtcbiAgcmV0dXJuIGAke2hvKHZpZXcuZ2V0VWludDMyKDApLCA4KX0tJHtobyh2aWV3LmdldFVpbnQxNig0KSwgNCl9LSR7aG8odmlldy5nZXRVaW50MTYoNiksIDQpfS0ke2hvKFxuICAgIHZpZXcuZ2V0VWludDE2KDgpLFxuICAgIDRcbiAgKX0tJHtobyh2aWV3LmdldFVpbnQzMigxMCksIDgpfSR7aG8odmlldy5nZXRVaW50MTYoMTQpLCA0KX1gO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9lbmNvZGluZyc7XG5cbmNvbnN0IFJBTkRPTV9TVFJFQU1fU0VFRF9QUkVGSVggPSBBcnJheS5mcm9tKGVuY29kZSgndGVtcG9yYWwtd29ya2Zsb3ctcmFuZG9tLXN0cmVhbS12MScpKTtcblxuZnVuY3Rpb24gZW5jb2RlVTMyKHZhbHVlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBbKHZhbHVlID4+PiAyNCkgJiAweGZmLCAodmFsdWUgPj4+IDE2KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gOCkgJiAweGZmLCB2YWx1ZSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlQWxlYVNlZWQoc2VlZDogbnVtYmVyW10sIG5hbWVzcGFjZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBuYW1lc3BhY2VCeXRlcyA9IEFycmF5LmZyb20oZW5jb2RlKG5hbWVzcGFjZSkpO1xuICByZXR1cm4gW1xuICAgIC4uLlJBTkRPTV9TVFJFQU1fU0VFRF9QUkVGSVgsXG4gICAgLi4uZW5jb2RlVTMyKHNlZWQubGVuZ3RoKSxcbiAgICAuLi5zZWVkLFxuICAgIC4uLmVuY29kZVUzMihuYW1lc3BhY2VCeXRlcy5sZW5ndGgpLFxuICAgIC4uLm5hbWVzcGFjZUJ5dGVzLFxuICBdO1xufVxuIiwiaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdG9yIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgZmlsbFdpdGhSYW5kb20sIHV1aWQ0RnJvbVJhbmRvbSB9IGZyb20gJy4vcmFuZG9tLWhlbHBlcnMnO1xuXG4vKipcbiAqIEEgZGV0ZXJtaW5pc3RpYyBQUk5HIHN0cmVhbSBzY29wZWQgdG8gdGhlIGN1cnJlbnQgV29ya2Zsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFdvcmtmbG93IGNvZGUgYWxyZWFkeSBnZXRzIGEgZGV0ZXJtaW5pc3RpYyBkZWZhdWx0IHN0cmVhbSB0aHJvdWdoIGBNYXRoLnJhbmRvbSgpYC5cbiAqIFRoaXMgaW50ZXJmYWNlIGV4cG9zZXMgYWRkaXRpb25hbCBuYW1lZCBzdHJlYW1zIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSB0aGUgd29ya2Zsb3dcbiAqIHNlZWQgd2l0aG91dCBjb25zdW1pbmcgdGhhdCBkZWZhdWx0IHN0cmVhbS4gUmVwZWF0ZWQgY2FsbHMgdG9cbiAqIHtAbGluayBnZXRSYW5kb21TdHJlYW19IHdpdGggdGhlIHNhbWUgbmFtZSByZWZlciB0byB0aGUgc2FtZSBsb2dpY2FsIHN0cmVhbSBzdGF0ZVxuICogZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbiwgYW5kIHRoYXQgc3RhdGUgaXMgcHJlc2VydmVkIGFjcm9zcyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgY2FzZSBpcyB3b3JrZmxvdyBwbHVnaW5zIGFuZCBpbnRlcmNlcHRvcnMgdGhhdCBuZWVkIHByaXZhdGUsXG4gKiByZXBsYXktc3RhYmxlIGVudHJvcHkgd2l0aG91dCBwZXJ0dXJiaW5nIHVzZXIgd29ya2Zsb3cgcmFuZG9tbmVzcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIG1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIC8qKlxuICAgKiBEcmF3IHRoZSBuZXh0IGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBudW1iZXIgZnJvbSB0aGlzIHN0cmVhbS5cbiAgICpcbiAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBNYXRoLnJhbmRvbSgpYCwgYnV0IGlzb2xhdGVkIGZyb20gdGhlIHdvcmtmbG93J3MgbWFpblxuICAgKiByYW5kb20gc3RyZWFtIGFuZCBmcm9tIG90aGVyIG5hbWVkIHN0cmVhbXMuXG4gICAqL1xuICByYW5kb20oKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGRldGVybWluaXN0aWMgVVVJRHY0IGJhY2tlZCBieSB0aGlzIHN0cmVhbS5cbiAgICovXG4gIHV1aWQ0KCk6IHN0cmluZztcblxuICAvKipcbiAgICogRmlsbCBhIGJ5dGUgYXJyYXkgZGV0ZXJtaW5pc3RpY2FsbHkgZnJvbSB0aGlzIHN0cmVhbS5cbiAgICovXG4gIGZpbGwoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBSdW4gYGZuYCB3aXRoIHNjb3BlZCB3b3JrZmxvdy1yYW5kb20gaGVscGVycyBzdWNoIGFzIGBNYXRoLnJhbmRvbSgpYCBhbmQgYHV1aWQ0KClgXG4gICAqIHJvdXRlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzY29wZWQgb3ZlcnJpZGUgQVBJIGZvciB3b3JrZmxvdyByYW5kb20gc3RyZWFtcy4gSXQgaXMgaW50ZW5kZWQgZm9yXG4gICAqIGJvdW5kZWQgcGx1Z2luL2ludGVyY2VwdG9yIGNvZGUgdGhhdCBuZWVkcyBleGlzdGluZyBjYWxscyB0byBgTWF0aC5yYW5kb20oKWAgb3JcbiAgICogYHV1aWQ0KClgIHRvIHVzZSB0aGlzIHN0cmVhbSB3aXRob3V0IHBlcnR1cmJpbmcgdGhlIHdvcmtmbG93J3MgZGVmYXVsdCByYW5kb21cbiAgICogc2VxdWVuY2Ugb3IgYW55IG90aGVyIG5hbWVkIHN0cmVhbS5cbiAgICpcbiAgICogVGhlIG92ZXJyaWRlIGZvbGxvd3MgYXN5bmMgY29udGludWF0aW9ucyBzdGFydGVkIGJ5IGBmbmAuIFdvcmtmbG93IGludGVyY2VwdG9yXG4gICAqIGBuZXh0KC4uLilgIGNvbnRpbnVhdGlvbnMgcmVzdG9yZSB0aGUgZG93bnN0cmVhbSB3b3JrZmxvdyByYW5kb20gc2NvcGUgYmVmb3JlXG4gICAqIGVudGVyaW5nIHRoZSByZXN0IG9mIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBvciB3b3JrZmxvdyBjb2RlLCBzbyBhIHRlbXBvcmFyeVxuICAgKiBwbHVnaW4gc2NvcGUgZG9lcyBub3QgbGVhayBkb3duc3RyZWFtIHVubGVzcyB0aGF0IGRvd25zdHJlYW0gY29kZSBleHBsaWNpdGx5XG4gICAqIGVzdGFibGlzaGVzIGl0cyBvd24gc2NvcGUuXG4gICAqXG4gICAqIFByZWZlciBleHBsaWNpdCBgc3RyZWFtLnJhbmRvbSgpYCAvIGBzdHJlYW0udXVpZDQoKWAgY2FsbHMgd2hlbiB0aGF0IGlzIHByYWN0aWNhbC5cbiAgICogVXNlIGBzdHJlYW0ud2l0aCguLi4pYCB3aGVuIGEgdGVtcG9yYXJ5IHNjb3BlZCBvdmVycmlkZSBpcyB0aGUgYmV0dGVyIGZpdCwgb3JcbiAgICogd2hlbiB5b3Ugd2FudCB0byBrZWVwIHRoZSBzdHJlYW0gaW5zdGFuY2UgaW4gbW9kdWxlIHNjb3BlIGFuZCByZXVzZSBpdCBkaXJlY3RseS5cbiAgICovXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUO1xufVxuXG5jbGFzcyBBY3RpdmF0b3JSYW5kb21TdHJlYW0gaW1wbGVtZW50cyBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmF0b3I6IEFjdGl2YXRvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICkge31cblxuICByYW5kb20oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmF0b3IuZ2V0TmFtZWRSYW5kb20odGhpcy5uYW1lKSgpO1xuICB9XG5cbiAgdXVpZDQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXVpZDRGcm9tUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCkpO1xuICB9XG5cbiAgZmlsbChieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBmaWxsV2l0aFJhbmRvbSgoKSA9PiB0aGlzLnJhbmRvbSgpLCBieXRlcyk7XG4gIH1cblxuICB3aXRoPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdG9yLndpdGhDdXJyZW50UmFuZG9tKHRoaXMsIGZuKTtcbiAgfVxufVxuXG5jbGFzcyBEZWZhdWx0V29ya2Zsb3dSYW5kb21TdHJlYW0gaW1wbGVtZW50cyBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIHJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dSYW5kb20gbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJykucmFuZG9tKCk7XG4gIH1cblxuICB1dWlkNCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkNEZyb21SYW5kb20oKCkgPT4gdGhpcy5yYW5kb20oKSk7XG4gIH1cblxuICBmaWxsKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGZpbGxXaXRoUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCksIGJ5dGVzKTtcbiAgfVxuXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dSYW5kb20gbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJyk7XG4gICAgcmV0dXJuIGFjdGl2YXRvci53aXRoQ3VycmVudFJhbmRvbSh0aGlzLCBmbik7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBkZXRlcm1pbmlzdGljIHJhbmRvbSBzdHJlYW0gZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGlzIGV4cG9zZXMgdGhlIHNhbWUgdW5kZXJseWluZyBzZXF1ZW5jZSB1c2VkIGJ5IHdvcmtmbG93LWxldmVsIGBNYXRoLnJhbmRvbSgpYFxuICogd2hlbiBubyBuYW1lZCBvdmVycmlkZSBpcyBhY3RpdmUuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIHBsdWdpbi9pbnRlcmNlcHRvciBjb2RlXG4gKiB0aGF0IHdhbnRzIGFuIGV4cGxpY2l0IGhhbmRsZSB0byB0aGUgbWFpbiB3b3JrZmxvdyByYW5kb20gc3RyZWFtLCBpbmNsdWRpbmcgZnJvbVxuICogaW5zaWRlIGEgdGVtcG9yYXJ5IG5hbWVkIHNjb3BlIGVzdGFibGlzaGVkIGJ5IGFub3RoZXIgYFdvcmtmbG93UmFuZG9tU3RyZWFtYC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIG1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93UmFuZG9tOiBXb3JrZmxvd1JhbmRvbVN0cmVhbSA9IG5ldyBEZWZhdWx0V29ya2Zsb3dSYW5kb21TdHJlYW0oKTtcblxuLyoqXG4gKiBHZXQgYSBuYW1lZCBkZXRlcm1pbmlzdGljIHJhbmRvbSBzdHJlYW0gZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBOYW1lZCBzdHJlYW1zIGFyZSBkZXJpdmVkIGZyb20gdGhlIHdvcmtmbG93IHNlZWQgYW5kIGEgc3RhYmxlIHN0cmVhbSBuYW1lLFxuICogd2l0aG91dCBjb25zdW1pbmcgdGhlIHdvcmtmbG93J3MgZGVmYXVsdCBgTWF0aC5yYW5kb20oKWAgc3RyZWFtLiBSZXBlYXRlZFxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgd2l0aGluIGEgd29ya2Zsb3cgZXhlY3V0aW9uIHJlZmVyIHRvIHRoZSBzYW1lXG4gKiBsb2dpY2FsIHN0cmVhbSBzdGF0ZSwgaW5jbHVkaW5nIGFjcm9zcyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgZW50cnkgcG9pbnQgZm9yIHdvcmtmbG93IHBsdWdpbnMgYW5kIGludGVyY2VwdG9ycyB0aGF0XG4gKiBuZWVkIHRoZWlyIG93biBkZXRlcm1pbmlzdGljIGVudHJvcHkuIFVzZSBzdGFibGUgcGFja2FnZS0gb3IgbW9kdWxlLXN0eWxlXG4gKiBuYW1lcyBzbyB0aGUgc3RyZWFtIGlkZW50aXR5IHJlbWFpbnMgcmVwbGF5LXNhZmUsIHRoZW4ga2VlcCB0aGUgcmV0dXJuZWRcbiAqIGBXb3JrZmxvd1JhbmRvbVN0cmVhbWAgYXJvdW5kIGFuZCBjYWxsIGl0cyBtZXRob2RzIGRpcmVjdGx5LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgbWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tU3RyZWFtKG5hbWU6IHN0cmluZyk6IFdvcmtmbG93UmFuZG9tU3RyZWFtIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmdldFJhbmRvbVN0cmVhbSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICByZXR1cm4gbmV3IEFjdGl2YXRvclJhbmRvbVN0cmVhbShhY3RpdmF0b3IsIG5hbWUpO1xufVxuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgV29ya2Zsb3cgZW5kIG9mIHRoZSBzaW5rcyBtZWNoYW5pc20uXG4gKlxuICogU2lua3MgYXJlIGEgbWVjaGFuaXNtIGZvciBleHBvcnRpbmcgZGF0YSBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZVxuICogTm9kZS5qcyBlbnZpcm9ubWVudCwgdGhleSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFdvcmtmbG93IGhhcyBubyB3YXkgdG9cbiAqIGNvbW11bmljYXRlIHdpdGggdGhlIG91dHNpZGUgV29ybGQuXG4gKlxuICogU2lua3MgYXJlIHR5cGljYWxseSB1c2VkIGZvciBleHBvcnRpbmcgbG9ncywgbWV0cmljcyBhbmQgdHJhY2VzIG91dCBmcm9tIHRoZVxuICogV29ya2Zsb3cuXG4gKlxuICogU2luayBmdW5jdGlvbnMgbWF5IG5vdCByZXR1cm4gdmFsdWVzIHRvIHRoZSBXb3JrZmxvdyBpbiBvcmRlciB0byBwcmV2ZW50XG4gKiBicmVha2luZyBkZXRlcm1pbmlzbS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBBbnkgZnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBiZSB1c2VkIGZvciBTaW5rIGZ1bmN0aW9ucyBhcyBsb25nIGFzIHRoZSByZXR1cm4gdHlwZSBpcyBgdm9pZGAuXG4gKlxuICogV2hlbiBjYWxsaW5nIGEgU2luayBmdW5jdGlvbiwgYXJndW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCB1c2luZ1xuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbCN3b3JrZXJfdGhyZWFkc19wb3J0X3Bvc3RtZXNzYWdlX3ZhbHVlX3RyYW5zZmVybGlzdCB8IHBvc3RNZXNzYWdlfS5cblxuICogVGhpcyBjb25zdHJhaW5zIHRoZSBhcmd1bWVudCB0eXBlcyB0byBwcmltaXRpdmVzIChleGNsdWRpbmcgU3ltYm9scykuXG4gKi9cbmV4cG9ydCB0eXBlIFNpbmtGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcblxuLyoqIEEgbWFwcGluZyBvZiBuYW1lIHRvIGZ1bmN0aW9uLCBkZWZpbmVzIGEgc2luZ2xlIHNpbmsgKGUuZy4gbG9nZ2VyKSAqL1xuZXhwb3J0IHR5cGUgU2luayA9IFJlY29yZDxzdHJpbmcsIFNpbmtGdW5jdGlvbj47XG4vKipcbiAqIFdvcmtmbG93IFNpbmsgYXJlIGEgbWFwcGluZyBvZiBuYW1lIHRvIHtAbGluayBTaW5rfVxuICovXG5leHBvcnQgdHlwZSBTaW5rcyA9IFJlY29yZDxzdHJpbmcsIFNpbms+O1xuXG4vKipcbiAqIENhbGwgaW5mb3JtYXRpb24gZm9yIGEgU2lua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmtDYWxsIHtcbiAgaWZhY2VOYW1lOiBzdHJpbmc7XG4gIGZuTmFtZTogc3RyaW5nO1xuICBhcmdzOiBhbnlbXTtcbiAgd29ya2Zsb3dJbmZvOiBXb3JrZmxvd0luZm87XG59XG5cbi8qKlxuICogR2V0IGEgcmVmZXJlbmNlIHRvIFNpbmtzIGZvciBleHBvcnRpbmcgZGF0YSBvdXQgb2YgdGhlIFdvcmtmbG93LlxuICpcbiAqIFRoZXNlIFNpbmtzICoqbXVzdCoqIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgV29ya2VyIGluIG9yZGVyIGZvciB0aGlzXG4gKiBtZWNoYW5pc20gdG8gd29yay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5U2lua3MsIFNpbmtzIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGludGVyZmFjZSBNeVNpbmtzIGV4dGVuZHMgU2lua3Mge1xuICogICBsb2dnZXI6IHtcbiAqICAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gKiAgICAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAqICAgfTtcbiAqIH1cbiAqXG4gKiBjb25zdCB7IGxvZ2dlciB9ID0gcHJveHlTaW5rczxNeURlcGVuZGVuY2llcz4oKTtcbiAqIGxvZ2dlci5pbmZvKCdzZXR0aW5nIHVwJyk7XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAqICAgICAgIGxvZ2dlci5pbmZvKFwiaGV5IGhvXCIpO1xuICogICAgICAgbG9nZ2VyLmVycm9yKFwibGV0cyBnb1wiKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5U2lua3M8VCBleHRlbmRzIFNpbmtzPigpOiBUIHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICB7fSxcbiAgICB7XG4gICAgICBnZXQoXywgaWZhY2VOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgICAge30sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZ2V0KF8sIGZuTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgICAgICAgICAgICAgICAnUHJveGllZCBzaW5rcyBmdW5jdGlvbnMgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFjdGl2YXRvci5zaW5rQ2FsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBpZmFjZU5hbWU6IGlmYWNlTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICBmbk5hbWU6IGZuTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAvLyBTaW5rIGZ1bmN0aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBpbW1lZGlhdGVseS4gTWFrZSBhIGNsb25lIG9mIHRoZSBzaW5rJ3MgYXJncywgc28gdGhhdCBmdXJ0aGVyIG11dGF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlc2Ugb2JqZWN0cyBkb24ndCBjb3JydXB0IHRoZSBhcmdzIHRoYXQgdGhlIHNpbmsgZnVuY3Rpb24gd2lsbCByZWNlaXZlLiBPbmx5IGF2YWlsYWJsZSBmcm9tIG5vZGUgMTcuXG4gICAgICAgICAgICAgICAgICBhcmdzOiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZSA/IChnbG9iYWxUaGlzIGFzIGFueSkuc3RydWN0dXJlZENsb25lKGFyZ3MpIDogYXJncyxcbiAgICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRvci5pbmZvIGlzIGludGVybmFsbHkgY29weS1vbi13cml0ZS4gVGhpcyBlbnN1cmUgdGhhdCBhbnkgZnVydGhlciBtdXRhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSB3b3JrZmxvdyBzdGF0ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJlc2VudCBhY3RpdmF0aW9uIHdpbGwgbm90IGNvcnJ1cHQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvd0luZm8gc3RhdGUgdGhhdCBnZXRzIHBhc3NlZCB3aGVuIHRoZSBzaW5rIGZ1bmN0aW9uIGFjdHVhbGx5IGdldHMgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJbmZvOiBhY3RpdmF0b3IuaW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9XG4gICkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgcHJvbWlzZSBmcm9tIGJlaW5nIHRyYWNrZWQgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5IHB1cnBvc2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnRyYWNrUHJvbWlzZShwcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gbWF5YmVHZXRBY3RpdmF0b3IoKT8ucHJvbWlzZVN0YWNrU3RvcmU7XG4gIGlmICghc3RvcmUpIHJldHVybjtcbiAgc3RvcmUuY2hpbGRUb1BhcmVudC5kZWxldGUocHJvbWlzZSk7XG4gIHN0b3JlLnByb21pc2VUb1N0YWNrLmRlbGV0ZShwcm9taXNlKTtcbn1cbiIsImltcG9ydCB7IENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuXG4vKipcbiAqIEEgYFByb21pc2VMaWtlYCBoZWxwZXIgd2hpY2ggZXhwb3NlcyBpdHMgYHJlc29sdmVgIGFuZCBgcmVqZWN0YCBtZXRob2RzLlxuICpcbiAqIFRyaWdnZXIgaXMgQ2FuY2VsbGF0aW9uU2NvcGUtYXdhcmU6IGl0IGlzIGxpbmtlZCB0byB0aGUgY3VycmVudCBzY29wZSBvblxuICogY29uc3RydWN0aW9uIGFuZCB0aHJvd3Mgd2hlbiB0aGF0IHNjb3BlIGlzIGNhbmNlbGxlZC5cbiAqXG4gKiBVc2VmdWwgZm9yIGUuZy4gd2FpdGluZyBmb3IgdW5ibG9ja2luZyBhIFdvcmtmbG93IGZyb20gYSBTaWduYWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBkZWZpbmVTaWduYWwsIHNldEhhbmRsZXIsIHNsZWVwLCBUcmlnZ2VyIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGNvbnN0IGNvbXBsZXRlVXNlckludGVyYWN0aW9uID0gZGVmaW5lU2lnbmFsKCdjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbicpO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0T25Vc2VyKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGNvbnN0IHVzZXJJbnRlcmFjdGlvbiA9IG5ldyBUcmlnZ2VyPGJvb2xlYW4+KCk7XG4gKlxuICogICAvLyBwcm9ncmFtbWF0aWNhbGx5IHJlc29sdmUgVHJpZ2dlclxuICogICBzZXRIYW5kbGVyKGNvbXBsZXRlVXNlckludGVyYWN0aW9uLCAoKSA9PiB1c2VySW50ZXJhY3Rpb24ucmVzb2x2ZSh0cnVlKSk7XG4gKlxuICogICBjb25zdCB1c2VySW50ZXJhY3RlZCA9IGF3YWl0IFByb21pc2UucmFjZShbdXNlckludGVyYWN0aW9uLCBzbGVlcCgnMzAgZGF5cycpXSk7XG4gKiAgIGlmICghdXNlckludGVyYWN0ZWQpIHtcbiAqICAgICBhd2FpdCBzZW5kUmVtaW5kZXJFbWFpbCh1c2VySWQpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXI8VD4gaW1wbGVtZW50cyBQcm9taXNlTGlrZTxUPiB7XG4gIC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgcmVhbGl6ZSB0aGF0IHRoZSBwcm9taXNlIGV4ZWN1dG9yIGlzIHJ1biBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlc29sdmU6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8VD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApOiBQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3luY0xvY2FsU3RvcmFnZSBhcyBBTFMgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIFVwZGF0ZVNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVTY29wZSB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBVcGRhdGVTY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHNjb3BlIGFzIGN1cnJlbnQgYW5kIHJ1biB0aGUgdXBkYXRlIGhhbmRsZXIgYGZuYC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCBmbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgdXBkYXRlIHNjb3BlLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKTogVXBkYXRlU2NvcGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCk7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBVcGRhdGVTY29wZSh7IGlkLCBuYW1lIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB1cGRhdGVXaXRoSW5mbzxUPihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgaWQsIG5hbWUgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlOiBBTFM8VXBkYXRlU2NvcGU+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG4iLCIvKipcbiAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgdGhlIFdvcmtlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBXb3JrZmxvdyBpc29sYXRlXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIElsbGVnYWxTdGF0ZUVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnLi9pbnRlcmNlcHRvci1jb21wb3NpdGlvbic7XG5pbXBvcnQgeyBzZXRBY3RpdmF0b3IsIGdldEFjdGl2YXRvciwgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLy8gRXhwb3J0IHRoZSB0eXBlIGZvciB1c2Ugb24gdGhlIFwid29ya2VyXCIgc2lkZVxuZXhwb3J0IHsgUHJvbWlzZVN0YWNrU3RvcmUgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBpc29sYXRlIHJ1bnRpbWUuXG4gKlxuICogU2V0cyByZXF1aXJlZCBpbnRlcm5hbCBzdGF0ZSBhbmQgaW5zdGFudGlhdGVzIHRoZSB3b3JrZmxvdyBhbmQgaW50ZXJjZXB0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFJ1bnRpbWUob3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbmV3IEFjdGl2YXRvcih7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpbmZvOiBmaXhQcm90b3R5cGVzKHtcbiAgICAgIC4uLm9wdGlvbnMuaW5mbyxcbiAgICAgIHVuc2FmZTogeyAuLi5vcHRpb25zLmluZm8udW5zYWZlLCBub3c6IE9yaWdpbmFsRGF0ZS5ub3cgfSxcbiAgICB9KSxcbiAgfSk7XG4gIC8vIFRoZXJlJ3Mgb25lIGFjdGl2YXRvciBwZXIgd29ya2Zsb3cgaW5zdGFuY2UsIHNldCBpdCBnbG9iYWxseSBvbiB0aGUgY29udGV4dC5cbiAgLy8gV2UgZG8gdGhpcyBiZWZvcmUgaW1wb3J0aW5nIGFueSB1c2VyIGNvZGUgc28gdXNlciBjb2RlIGNhbiBzdGF0aWNhbGx5IHJlZmVyZW5jZSBAdGVtcG9yYWxpby93b3JrZmxvdyBmdW5jdGlvbnNcbiAgLy8gYXMgd2VsbCBhcyBEYXRlIGFuZCBNYXRoLnJhbmRvbS5cbiAgc2V0QWN0aXZhdG9yKGFjdGl2YXRvcik7XG5cbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIHBheWxvYWRDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21QYXlsb2FkQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXInKS5wYXlsb2FkQ29udmVydGVyO1xuICAgIC8vIFRoZSBgcGF5bG9hZENvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIgPSBjdXN0b21QYXlsb2FkQ29udmVydGVyO1xuICAgIH1cbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIGZhaWx1cmVDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21GYWlsdXJlQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fZmFpbHVyZV9jb252ZXJ0ZXInKS5mYWlsdXJlQ29udmVydGVyO1xuICAgIC8vIFRoZSBgZmFpbHVyZUNvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLmZhaWx1cmVDb252ZXJ0ZXIgPSBjdXN0b21GYWlsdXJlQ29udmVydGVyO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW1wb3J0V29ya2Zsb3dzLCBpbXBvcnRJbnRlcmNlcHRvcnMgfSA9IGdsb2JhbFRoaXMuX19URU1QT1JBTF9fO1xuICAgIGlmIChpbXBvcnRXb3JrZmxvd3MgPT09IHVuZGVmaW5lZCB8fCBpbXBvcnRJbnRlcmNlcHRvcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBidW5kbGUgZGlkIG5vdCByZWdpc3RlciBpbXBvcnQgaG9va3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpbXBvcnRJbnRlcmNlcHRvcnMoKTtcbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGZhY3Rvcnk6IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9IG1vZC5pbnRlcmNlcHRvcnM7XG4gICAgICBpZiAoZmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3dzIGludGVyY2VwdG9yczogZXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IGdvdDogJyR7ZmFjdG9yeX0nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gZmFjdG9yeSgpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmluYm91bmQucHVzaCguLi4oaW50ZXJjZXB0b3JzLmluYm91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMub3V0Ym91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMucHVzaCguLi4oaW50ZXJjZXB0b3JzLmludGVybmFscyA/PyBbXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9IGltcG9ydFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHdvcmtmbG93Rm4gPSBtb2RbYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlXTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2Zsb3dGbiA9IG1vZFsnZGVmYXVsdCddO1xuXG4gICAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSB3b3JrZmxvd0ZuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRXb3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSBkZWZhdWx0V29ya2Zsb3dGbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlscyA9XG4gICAgICAgIHdvcmtmbG93Rm4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gJ25vIHN1Y2ggZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnkgdGhlIHdvcmtmbG93IGJ1bmRsZSdcbiAgICAgICAgICA6IGBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHt0eXBlb2Ygd29ya2Zsb3dGbn0nYDtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtmbG93IG9mIHR5cGUgJyR7YWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlfSc6ICR7ZGV0YWlsc31gKTtcbiAgICB9XG4gICAgaWYgKGlzV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zKGFjdGl2YXRvci53b3JrZmxvdykpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFjdGl2YXRvci52ZXJzaW9uaW5nQmVoYXZpb3IgPSBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy52ZXJzaW9uaW5nQmVoYXZpb3I7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMgPVxuICAgICAgICAgIGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zLmZhaWx1cmVFeGNlcHRpb25UeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyID0gYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENvcmUgd29uJ3Qgc2VuZCBhbiBldmljdGlvbiBqb2IgYWZ0ZXIgYW4gZWFybHkgZXJyb3IsIHNvIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZ1xuICAgICAgLy8gZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0LiBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHJlc291cmNlIGxlYWtzLlxuICAgICAgZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKF9pbm5lckVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3IgZGlzcG9zaW5nIG9mIGFjdGl2YXRvciwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIE9iamVjdHMgdHJhbnNmZXJlZCB0byB0aGUgVk0gZnJvbSBvdXRzaWRlIGhhdmUgcHJvdG90eXBlcyBiZWxvbmdpbmcgdG8gdGhlXG4gKiBvdXRlciBjb250ZXh0LCB3aGljaCBtZWFucyB0aGF0IGluc3RhbmNlb2Ygd29uJ3Qgd29yayBpbnNpZGUgdGhlIFZNLiBUaGlzXG4gKiBmdW5jdGlvbiByZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdCwgYW5kIHJlY3JlYXRlIHNvbWVcbiAqIG9mIHRoZXNlIG9iamVjdHMgKG5vdGFibHkgQXJyYXksIERhdGUgYW5kIE9iamVjdHMpLlxuICovXG5mdW5jdGlvbiBmaXhQcm90b3R5cGVzPFg+KG9iajogWCk6IFgge1xuICBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopPy5jb25zdHJ1Y3Rvcj8ubmFtZSkge1xuICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSgob2JqIGFzIEFycmF5PHVua25vd24+KS5tYXAoZml4UHJvdG90eXBlcykpIGFzIFg7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iaiBhcyB1bmtub3duIGFzIERhdGUpIGFzIFg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pOiBbc3RyaW5nLCBhbnldID0+IFtrLCBmaXhQcm90b3R5cGVzKHYpXSkpIGFzIFg7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSB3b3JrZmxvdy4gT3IgdG8gYmUgZXhhY3QsIF9jb21wbGV0ZV8gaW5pdGlhbGl6YXRpb24sIGFzIG1vc3QgcGFydCBoYXMgYmVlbiBkb25lIGluIGNvbnN0cnVjdG9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoaW5pdGlhbGl6ZVdvcmtmbG93Sm9iOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IuaW5pdGlhbGl6ZVdvcmtmbG93KGluaXRpYWxpemVXb3JrZmxvd0pvYik7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gYSBjaHVuayBvZiBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90aWNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgYXN5bmMgYW5kIHJ1bnMgX2luc2lkZV8gdGhlIFZNIGNvbnRleHQuIFRoZXJlZm9yZSwgbm8gbWljcm90YXNrXG4gKiB3aWxsIGdldCBleGVjdXRlZCBfd2hpbGVfIHRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlOyB0aGV5IHdpbGwgaG93ZXZlciBnZXQgZXhlY3V0ZWQgX2FmdGVyXyB0aGlzXG4gKiBmdW5jdGlvbiByZXR1cm5zIChpLmUuIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzIGluIHRoZSBWTSB3aWxsIGdldCBleGVjdXRlZCBiZWZvcmUgZXhlY3V0aW9uXG4gKiByZXN1bWVzIG91dCBvZiB0aGUgVk0sIGluIGB2bS1zaGFyZWQudHM6YWN0aXZhdGUoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb24sIGJhdGNoSW5kZXggPSAwKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGludGVyY2VwdCA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdhY3RpdmF0ZScsICh7IGFjdGl2YXRpb24gfSkgPT4ge1xuICAgICAgLy8gQ2FzdCBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIHdoaWNoIGhhcyB0aGUgYHZhcmlhbnRgIGF0dHJpYnV0ZS5cbiAgICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBhY3RpdmF0aW9uIGlzIGEgcHJvdG8gY2xhc3MuXG4gICAgICBjb25zdCBqb2JzID0gYWN0aXZhdGlvbi5qb2JzIGFzIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbXTtcblxuICAgICAgLy8gSW5pdGlhbGl6YXRpb24gd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LCBidXQgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBzdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dKb2IgPSBqb2JzWzBdPy52YXJpYW50ID09PSAnaW5pdGlhbGl6ZVdvcmtmbG93JyA/IGpvYnMuc2hpZnQoKT8uaW5pdGlhbGl6ZVdvcmtmbG93IDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgIGlmIChqb2IudmFyaWFudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBqb2IudmFyaWFudCB0byBiZSBkZWZpbmVkJyk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGpvYltqb2IudmFyaWFudF07XG4gICAgICAgIGlmICghdmFyaWFudCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgam9iLiR7am9iLnZhcmlhbnR9IHRvIGJlIHNldGApO1xuXG4gICAgICAgIGFjdGl2YXRvcltqb2IudmFyaWFudF0odmFyaWFudCBhcyBhbnkgLyogVFMgY2FuJ3QgaW5mZXIgdGhpcyB0eXBlICovKTtcblxuICAgICAgICBpZiAoam9iLnZhcmlhbnQgIT09ICdxdWVyeVdvcmtmbG93JykgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0V29ya2Zsb3dKb2IpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYlR5cGVzOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iWyd2YXJpYW50J11bXSA9IFtcbiAgICAgICAgICAnaW5pdGlhbGl6ZVdvcmtmbG93JyxcbiAgICAgICAgICAnc2lnbmFsV29ya2Zsb3cnLFxuICAgICAgICAgICdkb1VwZGF0ZScsXG4gICAgICAgICAgJ2NhbmNlbFdvcmtmbG93JyxcbiAgICAgICAgICAndXBkYXRlUmFuZG9tU2VlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChqb2JzLnNvbWUoKGpvYikgPT4gIXNhZmVKb2JUeXBlcy5pbmNsdWRlcyhqb2IudmFyaWFudCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdSZWNlaXZlZCBib3RoIGluaXRpYWxpemVXb3JrZmxvdyBhbmQgbm9uLXNpZ25hbC9ub24tdXBkYXRlIGpvYnMgaW4gdGhlIHNhbWUgYWN0aXZhdGlvbjogJyArXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGpvYnMubWFwKChqb2IpID0+IGpvYi52YXJpYW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aXZhdG9yLnN0YXJ0V29ya2Zsb3coc3RhcnRXb3JrZmxvd0pvYik7XG5cbiAgICAgICAgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcmNlcHQoeyBhY3RpdmF0aW9uLCBiYXRjaEluZGV4IH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29uY2x1ZGUgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYWN0aXZhdGlvbiBqb2JzIGFuZCBxdWV1ZWQgbWljcm90YXNrcy5cbiAqXG4gKiBBY3RpdmF0aW9uIGZhaWx1cmVzIGFyZSBoYW5kbGVkIGluIHRoZSBtYWluIE5vZGUuanMgaXNvbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBjb3Jlc2RrLndvcmtmbG93X2NvbXBsZXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IucmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk7XG4gICAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2NvbmNsdWRlQWN0aXZhdGlvbicsIChpbnB1dCkgPT4gaW5wdXQpO1xuICAgIGNvbnN0IGFjdGl2YXRpb25Db21wbGV0aW9uID0gYWN0aXZhdG9yLmNvbmNsdWRlQWN0aXZhdGlvbigpO1xuICAgIGNvbnN0IHsgY29tbWFuZHMgfSA9IGludGVyY2VwdCh7IGNvbW1hbmRzOiBhY3RpdmF0aW9uQ29tcGxldGlvbi5jb21tYW5kcyB9KTtcbiAgICBpZiAoYWN0aXZhdG9yLmNvbXBsZXRlZCkge1xuICAgICAgYWN0aXZhdG9yLndhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcnVuSWQ6IGFjdGl2YXRvci5pbmZvLnJ1bklkLFxuICAgICAgc3VjY2Vzc2Z1bDoge1xuICAgICAgICAuLi5hY3RpdmF0aW9uQ29tcGxldGlvbixcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yKGFjdGl2YXRpb25Db21wbGV0aW9uLnZlcnNpb25pbmdCZWhhdmlvciksXG4gICAgICB9LFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29wIHRocm91Z2ggYWxsIGJsb2NrZWQgY29uZGl0aW9ucywgZXZhbHVhdGUgYW5kIHVuYmxvY2sgaWYgcG9zc2libGUuXG4gKlxuICogQHJldHVybnMgbnVtYmVyIG9mIHVuYmxvY2tlZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTogbnVtYmVyIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgbGV0IG51bVVuYmxvY2tlZCA9IDA7XG4gICAgZm9yICg7Oykge1xuICAgICAgYWN0aXZhdG9yLm1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk7XG4gICAgICBjb25zdCBwcmV2VW5ibG9ja2VkID0gbnVtVW5ibG9ja2VkO1xuICAgICAgZm9yIChjb25zdCBbc2VxLCBjb25kXSBvZiBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChjb25kLmZuKCkpIHtcbiAgICAgICAgICBjb25kLnJlc29sdmUoKTtcbiAgICAgICAgICBudW1VbmJsb2NrZWQrKztcbiAgICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIGRlbGV0ZSBlbGVtZW50cyBkdXJpbmcgbWFwIGl0ZXJhdGlvblxuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZXZVbmJsb2NrZWQgPT09IG51bVVuYmxvY2tlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bVVuYmxvY2tlZDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBIYW5kbGUgZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkZXN0cm95aW5nXG4vLyB0aGUgc2FuZGJveCB2bSwgd2hpY2ggbWF5IHBvc3NpYmx5IGJlIHJldXNlZCBpZiBgcmV1c2VWOENvbnRleHRgIGlzIHRydWUpLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcG9zZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdkaXNwb3NlJywgYXN5bmMgKCkgPT4ge30pO1xuICAgICAgZGlzcG9zZSh7fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgIH1cblxuICAgIC8vIERlc3RydWN0b3JzIGFyZSBydW4gb3V0c2lkZSBvZiBpbnRlcmNlcHRvcnMsIGJlY2F1c2UgaW50ZXJjZXB0b3JzIHRoZW1zZWx2ZXMgb2Z0ZW4gcmVseVxuICAgIC8vIG9uIG9iamVjdHMgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZCAobm90YWJseSBBc3luY0xvY2FsU3RvcmFnZSBpbnN0YW5jZXMpLCBhbmQgYmVjYXVzZSB3ZVxuICAgIC8vIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVzb3VyY2VzIGdldCBjbGVhbmVkIHVwIGV2ZW4gaWYgYW4gaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLlxuICAgIC8vIE9ubHkgdGhlIGZpcnN0IGVycm9yIChpZiBhbnkpIGlzIHJldGhyb3duLlxuICAgIGZvciAoY29uc3QgZGVzdHJ1Y3RvciBvZiBhY3RpdmF0b3Iud29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnMuc3BsaWNlKDApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGFjdGl2YXRvciBpcyBubyBsb25nZXIgdmFsaWQgcGFzdCB0aGlzIHBvaW50LlxuICAgIHNldEFjdGl2YXRvcih1bmRlZmluZWQpO1xuICB9XG59XG5cbi8vIERlc3Ryb3kgdGhlIHNhbmRib3ggVk0gKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRpc3Bvc2luZyBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQpLlxuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGhhdmUgYmVlbiBkaXNwb3NlZCBmaXJzdCcpO1xuXG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkZXN0cnVjdG9yIG9mIGdsb2JhbFRoaXMuX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM/LnNwbGljZSgwKSA/PyBbXSkge1xuICAgIHRyeSB7XG4gICAgICBkZXN0cnVjdG9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyhvYmo6IGFueSk6IG9iaiBpcyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT4ge1xuICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24ob2JqLCAnd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucycpO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0LFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgV2l0aFdvcmtmbG93QXJncyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXBpbGVSZXRyeVBvbGljeSxcbiAgY29tcGlsZVByaW9yaXR5LFxuICBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgZXh0cmFjdFdvcmtmbG93VHlwZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIG1hcFRvUGF5bG9hZHMsXG4gIGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHRvUGF5bG9hZHNXaXRoQ29udGV4dCxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgdXNlck1ldGFkYXRhVG9QYXlsb2FkIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi91c2VyLW1ldGFkYXRhJztcbmltcG9ydCB7XG4gIGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2NvbnZlcnRlci9wYXlsb2FkLXNlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi92ZXJzaW9uaW5nLWludGVudC1lbnVtJztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9UcywgcmVxdWlyZWRUc1RvTXMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgdGhyb3dJZlJlc2VydmVkTmFtZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvcmVzZXJ2ZWQnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUsIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUlucHV0LFxuICBMb2NhbEFjdGl2aXR5SW5wdXQsXG4gIFNpZ25hbFdvcmtmbG93SW5wdXQsXG4gIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0LFxuICBUaW1lcklucHV0LFxuICBUaW1lck9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmltcG9ydCB0eXBlIHtcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRGVmYXVsdFNpZ25hbEhhbmRsZXIsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbiAgSGFuZGxlcixcbiAgUXVlcnlIYW5kbGVyT3B0aW9ucyxcbiAgU2lnbmFsSGFuZGxlck9wdGlvbnMsXG4gIFVwZGF0ZUhhbmRsZXJPcHRpb25zLFxuICBXb3JrZmxvd0luZm8sXG4gIFVwZGF0ZUluZm8sXG4gIERlZmF1bHRVcGRhdGVIYW5kbGVyLFxuICBEZWZhdWx0UXVlcnlIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENvbnRpbnVlQXNOZXcsXG4gIGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExvY2FsQWN0aXZpdHlEb0JhY2tvZmYgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCwgZ2V0QWN0aXZhdG9yLCBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgdXVpZDRGcm9tUmFuZG9tIH0gZnJvbSAnLi9yYW5kb20taGVscGVycyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuZnVuY3Rpb24gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHdvcmtmbG93SWQ6IGluZm8ud29ya2Zsb3dJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0V29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dChpbmZvOiBXb3JrZmxvd0luZm8sIHdvcmtmbG93SWQ6IHN0cmluZyk6IFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd3b3JrZmxvdycsXG4gICAgbmFtZXNwYWNlOiBpbmZvLm5hbWVzcGFjZSxcbiAgICB3b3JrZmxvd0lkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0KFxuICBpbmZvOiBXb3JrZmxvd0luZm8sXG4gIGFjdGl2aXR5SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaXNMb2NhbDogYm9vbGVhblxuKTogQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2FjdGl2aXR5JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIGFjdGl2aXR5SWQsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICAgIGlzTG9jYWwsXG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBkZWZhdWx0IHZhbHVlcyBvZiBgd29ya2Zsb3dJZGAgYW5kIGBjYW5jZWxsYXRpb25UeXBlYCB0byBnaXZlbiB3b3JrZmxvdyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9uczxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICBvcHRzOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMge1xuICBjb25zdCB7IGFyZ3MsIHdvcmtmbG93SWQsIC4uLnJlc3QgfSA9IG9wdHM7XG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogd29ya2Zsb3dJZCA/PyB1dWlkNCgpLFxuICAgIGFyZ3M6IChhcmdzID8/IFtdKSBhcyB1bmtub3duW10sXG4gICAgY2FuY2VsbGF0aW9uVHlwZTogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVELFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogUHVzaCBhIHN0YXJ0VGltZXIgY29tbWFuZCBpbnRvIHN0YXRlIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHRpbWVyTmV4dEhhbmRsZXIoeyBzZXEsIGR1cmF0aW9uTXMsIG9wdGlvbnMgfTogVGltZXJJbnB1dCkge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgY29uc3QgY29udGV4dCA9IGN1cnJlbnRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLmRlbGV0ZShzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICBjYW5jZWxUaW1lcjoge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBzdGFydFRvRmlyZVRpbWVvdXQ6IG1zVG9UcyhkdXJhdGlvbk1zKSxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucz8uc3VtbWFyeSwgdW5kZWZpbmVkLCBjb250ZXh0KSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzIHNsZWVwLlxuICpcbiAqIFNjaGVkdWxlcyBhIHRpbWVyIG9uIHRoZSBUZW1wb3JhbCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciBvciAwLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgdGltZXIgb3B0aW9ucyBmb3IgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogRHVyYXRpb24sIG9wdGlvbnM/OiBUaW1lck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNsZWVwKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJyk7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuXG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBNYXRoLm1heCgxLCBtc1RvTnVtYmVyKG1zKSk7XG5cbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ3N0YXJ0VGltZXInLCB0aW1lck5leHRIYW5kbGVyKTtcblxuICByZXR1cm4gZXhlY3V0ZSh7XG4gICAgZHVyYXRpb25NcyxcbiAgICBzZXEsXG4gICAgb3B0aW9ucyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0ID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1aXJlZCBlaXRoZXIgc2NoZWR1bGVUb0Nsb3NlVGltZW91dCBvciBzdGFydFRvQ2xvc2VUaW1lb3V0Jyk7XG4gIH1cbn1cblxuLy8gVXNlIHNhbWUgdmFsaWRhdGlvbiB3ZSB1c2UgZm9yIG5vcm1hbCBhY3Rpdml0aWVzXG5jb25zdCB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zID0gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnM7XG5cbi8qKlxuICogUHVzaCBhIHNjaGVkdWxlQWN0aXZpdHkgY29tbWFuZCBpbnRvIGFjdGl2YXRvciBhY2N1bXVsYXRvciBhbmQgcmVnaXN0ZXIgY29tcGxldGlvblxuICovXG5mdW5jdGlvbiBzY2hlZHVsZUFjdGl2aXR5TmV4dEhhbmRsZXIoeyBvcHRpb25zLCBhcmdzLCBoZWFkZXJzLCBzZXEsIGFjdGl2aXR5VHlwZSB9OiBBY3Rpdml0eUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgYWN0aXZpdHlJZCA9IG9wdGlvbnMuYWN0aXZpdHlJZCA/PyBgJHtzZXF9YDtcbiAgY29uc3QgY29udGV4dCA9IGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIGFjdGl2aXR5SWQsIGZhbHNlKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUFjdGl2aXR5OiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgYWN0aXZpdHlJZCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgaGVhcnRiZWF0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIGRvTm90RWFnZXJseUV4ZWN1dGU6ICEob3B0aW9ucy5hbGxvd0VhZ2VyRGlzcGF0Y2ggPz8gdHJ1ZSksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8gY29tcGlsZVByaW9yaXR5KG9wdGlvbnMucHJpb3JpdHkpIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLnN1bW1hcnksIHVuZGVmaW5lZCwgY29udGV4dCksXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBhcmdzLFxuICBoZWFkZXJzLFxuICBzZXEsXG4gIGFjdGl2aXR5VHlwZSxcbiAgYXR0ZW1wdCxcbiAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG59OiBMb2NhbEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGNvbnN0IGFjdGl2aXR5SWQgPSBgJHtzZXF9YDtcbiAgY29uc3QgY29udGV4dCA9IGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIGFjdGl2aXR5SWQsIHRydWUpO1xuICAvLyBFYWdlcmx5IGZhaWwgdGhlIGxvY2FsIGFjdGl2aXR5ICh3aGljaCB3aWxsIGluIHR1cm4gZmFpbCB0aGUgd29ya2Zsb3cgdGFzay5cbiAgLy8gRG8gbm90IGZhaWwgb24gcmVwbGF5IHdoZXJlIHRoZSBsb2NhbCBhY3Rpdml0aWVzIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBvbiB0aGUgcmVwbGF5IHdvcmtlci5cbiAgaWYgKCFhY3RpdmF0b3IuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgIWFjdGl2YXRvci5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcy5oYXMoYWN0aXZpdHlUeXBlKSkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgTG9jYWwgYWN0aXZpdHkgb2YgdHlwZSAnJHthY3Rpdml0eVR5cGV9JyBub3QgcmVnaXN0ZXJlZCBvbiB3b3JrZXJgKTtcbiAgfVxuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5oYXMoc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IHJlc29sdmVkIG9yIG5ldmVyIHNjaGVkdWxlZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgcmVxdWVzdENhbmNlbExvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbiAgICAgICAgYWN0aXZpdHlJZCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBsb2NhbFJldHJ5VGhyZXNob2xkOiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmxvY2FsUmV0cnlUaHJlc2hvbGQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgY29udGV4dCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IGNvbnRleHQgPSB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB3b3JrZmxvd0lkKTtcbiAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZSA9ICFhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLmhhcyhzZXEpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZSkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgY2FuY2VsQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbjogeyBjaGlsZFdvcmtmbG93U2VxOiBzZXEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBOb3RoaW5nIHRvIGNhbmNlbCBvdGhlcndpc2VcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICB3b3JrZmxvd1R5cGUsXG4gICAgICAgIGlucHV0OiB0b1BheWxvYWRzV2l0aENvbnRleHQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIG9wdGlvbnMuYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93UnVuVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXQpLFxuICAgICAgICB3b3JrZmxvd1Rhc2tUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93VGFza1RpbWVvdXQpLFxuICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSwgLy8gTm90IGNvbmZpZ3VyYWJsZVxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6IGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeShvcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeSksXG4gICAgICAgIHBhcmVudENsb3NlUG9saWN5OiBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeShvcHRpb25zLnBhcmVudENsb3NlUG9saWN5KSxcbiAgICAgICAgY3JvblNjaGVkdWxlOiBvcHRpb25zLmNyb25TY2hlZHVsZSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczpcbiAgICAgICAgICBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMgfHwgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICAgID8geyBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMsIG9wdGlvbnMudHlwZWRTZWFyY2hBdHRyaWJ1dGVzKSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbywgY29udGV4dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8gY29tcGlsZVByaW9yaXR5KG9wdGlvbnMucHJpb3JpdHkpIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKFxuICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgb3B0aW9ucz8uc3RhdGljU3VtbWFyeSxcbiAgICAgICAgb3B0aW9ucz8uc3RhdGljRGV0YWlscyxcbiAgICAgICAgY29udGV4dFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd1N0YXJ0LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBXZSBjb25zdHJ1Y3QgYSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2hpbGQgV29ya2Zsb3cgYmVmb3JlIHdlIGtub3dcbiAgLy8gaWYgdGhlIFdvcmtmbG93IGNvZGUgd2lsbCBhd2FpdCBpdCB0byBjYXB0dXJlIHRoZSByZXN1bHQgaW4gY2FzZSBpdCBkb2VzLlxuICBjb25zdCBjb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQ2hhaW4gc3RhcnQgUHJvbWlzZSByZWplY3Rpb24gdG8gdGhlIGNvbXBsZXRlIFByb21pc2UuXG4gICAgdW50cmFja1Byb21pc2Uoc3RhcnRQcm9taXNlLmNhdGNoKHJlamVjdCkpO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93Q29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIGNvbnRleHQsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB0YXJnZXRXb3JrZmxvd0lkID0gdGFyZ2V0LnR5cGUgPT09ICdleHRlcm5hbCcgPyB0YXJnZXQud29ya2Zsb3dFeGVjdXRpb24ud29ya2Zsb3dJZCA6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQ7XG4gIGNvbnN0IGNvbnRleHQgPSB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB0YXJnZXRXb3JrZmxvd0lkISk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHsgY2FuY2VsU2lnbmFsV29ya2Zsb3c6IHsgc2VxIH0gfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2lnbmFsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGFyZ3M6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHNpZ25hbE5hbWUsXG4gICAgICAgIC4uLih0YXJnZXQudHlwZSA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIC4uLnRhcmdldC53b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiB0YXJnZXQuY2hpbGRXb3JrZmxvd0lkLFxuICAgICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LnNldChzZXEsIHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBpbiB0aGUgcmV0dXJuIHR5cGUgb2YgcHJveHkgbWV0aG9kcyB0byBtYXJrIHRoYXQgYW4gYXR0cmlidXRlIG9uIHRoZSBzb3VyY2UgdHlwZSBpcyBub3QgYSBtZXRob2QuXG4gKlxuICogQHNlZSB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKiBAc2VlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9XG4gKiBAc2VlIHtAbGluayBwcm94eUxvY2FsQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IGNvbnN0IE5vdEFuQWN0aXZpdHlNZXRob2QgPSBTeW1ib2wuZm9yKCdfX1RFTVBPUkFMX05PVF9BTl9BQ1RJVklUWV9NRVRIT0QnKTtcblxuLyoqXG4gKiBUeXBlIGhlbHBlciB0aGF0IHRha2VzIGEgdHlwZSBgVGAgYW5kIHRyYW5zZm9ybXMgYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qge0BsaW5rIEFjdGl2aXR5RnVuY3Rpb259IHRvXG4gKiB7QGxpbmsgTm90QW5BY3Rpdml0eU1ldGhvZH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBwcm94eUFjdGl2aXRpZXN9IHRvIGdldCB0aGlzIGNvbXBpbGUtdGltZSBlcnJvcjpcbiAqXG4gKiBgYGB0c1xuICogaW50ZXJmYWNlIE15QWN0aXZpdGllcyB7XG4gKiAgIHZhbGlkKGlucHV0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG4gKiAgIGludmFsaWQoaW5wdXQ6IG51bWJlcik6IG51bWJlcjtcbiAqIH1cbiAqXG4gKiBjb25zdCBhY3QgPSBwcm94eUFjdGl2aXRpZXM8TXlBY3Rpdml0aWVzPih7IHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc1bScgfSk7XG4gKlxuICogYXdhaXQgYWN0LnZhbGlkKHRydWUpO1xuICogYXdhaXQgYWN0LmludmFsaWQoKTtcbiAqIC8vIF4gVFMgY29tcGxhaW5zIHdpdGg6XG4gKiAvLyAocHJvcGVydHkpIGludmFsaWREZWZpbml0aW9uOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZFxuICogLy8gVGhpcyBleHByZXNzaW9uIGlzIG5vdCBjYWxsYWJsZS5cbiAqIC8vIFR5cGUgJ1N5bWJvbCcgaGFzIG5vIGNhbGwgc2lnbmF0dXJlcy4oMjM0OSlcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eUludGVyZmFjZUZvcjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBBY3Rpdml0eUZ1bmN0aW9uID8gQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VCBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24+ID0gVCAmIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGl2aXR5LCBvdmVycmlkaW5nIGl0cyBleGlzdGluZyBvcHRpb25zIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJncyBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIFRoZSBsb2NhbCBhY3Rpdml0eSBjb3VudGVycGFydCB0byB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogUnVuIHRoZSBsb2NhbCBhY3Rpdml0eSwgb3ZlcnJpZGluZyBpdHMgZXhpc3Rpbmcgb3B0aW9ucyB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJncyBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zLCBhcmdzOiBQYXJhbWV0ZXJzPFQ+KTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pjtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBBY3Rpdml0eU9wdGlvbnN9LlxuICpcbiAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gc2V0dXAgQWN0aXZpdGllcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkgfCBQcm94eX0gZm9yXG4gKiAgICAgICAgIHdoaWNoIGVhY2ggYXR0cmlidXRlIGlzIGEgY2FsbGFibGUgQWN0aXZpdHkgZnVuY3Rpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSAnLi4vYWN0aXZpdGllcyc7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIG1vZHVsZSBleHBvcnRzXG4gKiBjb25zdCB7IGh0dHBHZXQsIG90aGVyQWN0aXZpdHkgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMzAgbWludXRlcycsXG4gKiB9KTtcbiAqXG4gKiAvLyBVc2UgYWN0aXZpdGllcyB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICogY29uc3QgcmVzdWx0MSA9IGF3YWl0IGh0dHBHZXQoJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICpcbiAqIC8vIE92ZXJyaWRlIG9wdGlvbnMgZm9yIHNwZWNpZmljIGFjdGl2aXR5IGNhbGxzXG4gKiBjb25zdCByZXN1bHQyID0gYXdhaXQgaHR0cEdldC5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICBzdGF0aWNTdW1tYXJ5OiAnRmV0Y2hlcyBkYXRhIGZyb20gZXh0ZXJuYWwgQVBJJyxcbiAqICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogJzVtJ1xuICogfSwgWydodHRwOi8vYXBpLmV4YW1wbGUuY29tJ10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdDMgPSBhd2FpdCBvdGhlckFjdGl2aXR5LmV4ZWN1dGVXaXRoT3B0aW9ucyh7XG4gKiAgIHN0YXRpY1N1bW1hcnk6ICdQcm9jZXNzZXMgdGhlIGZldGNoZWQgZGF0YScsXG4gKiAgIHRhc2tRdWV1ZTogJ3NwZWNpYWwtdGFzay1xdWV1ZSdcbiAqIH0sIFtkYXRhXSk7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIGFuIGV4cGxpY2l0IGludGVyZmFjZSAoZS5nLiB3aGVuIGRlZmluZWQgYnkgYW5vdGhlciBTREspXG4gKiBpbnRlcmZhY2UgSmF2YUFjdGl2aXRpZXMge1xuICogICBodHRwR2V0RnJvbUphdmEodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogfVxuICpcbiAqIGNvbnN0IHtcbiAqICAgaHR0cEdldEZyb21KYXZhLFxuICogICBzb21lT3RoZXJKYXZhQWN0aXZpdHlcbiAqIH0gPSBwcm94eUFjdGl2aXRpZXM8SmF2YUFjdGl2aXRpZXM+KHtcbiAqICAgdGFza1F1ZXVlOiAnamF2YS13b3JrZXItdGFza1F1ZXVlJyxcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyxcbiAqIH0pO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICogICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh0dHBHZXQoXCJodHRwOi8vZXhhbXBsZS5jb21cIik7XG4gKiAgIC8vIE9yIHdpdGggY3VzdG9tIG9wdGlvbnM6XG4gKiAgIGNvbnN0IHJlc3BvbnNlMiA9IGF3YWl0IGh0dHBHZXRGcm9tSmF2YS5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICAgIHN0YXRpY1N1bW1hcnk6ICdKYXZhIEhUVFAgY2FsbCB3aXRoIHRpbWVvdXQgb3ZlcnJpZGUnLFxuICogICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICcybSdcbiAqICAgfSwgW1wiaHR0cDovL2Zhc3QtYXBpLmV4YW1wbGUuY29tXCJdKTtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5QWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgQWN0aXZpdHlJbnRlcmZhY2VGb3I8QT4sIHtcbiAgICBnZXQoXywgYWN0aXZpdHlUeXBlKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGl2aXR5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIEFjdGl2aXR5IHR5cGVzLCBnb3Q6ICR7U3RyaW5nKGFjdGl2aXR5VHlwZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQWN0aXZpdHkoYWN0aXZpdHlUeXBlIGFzIHN0cmluZywgYXJncywgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5UHJveHlGdW5jdGlvbi5leGVjdXRlV2l0aE9wdGlvbnMgPSBmdW5jdGlvbiAoXG4gICAgICAgIG92ZXJyaWRlT3B0aW9uczogQWN0aXZpdHlPcHRpb25zLFxuICAgICAgICBhcmdzOiBhbnlbXVxuICAgICAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUFjdGl2aXR5KGFjdGl2aXR5VHlwZSwgYXJncywgZGVlcE1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFjdGl2aXR5UHJveHlGdW5jdGlvbjtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgTG9jYWwgQWN0aXZpdHkgZnVuY3Rpb25zIHdpdGggZ2l2ZW4ge0BsaW5rIExvY2FsQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9XG4gKiAgICAgICAgIGZvciB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQHNlZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSBmb3IgZXhhbXBsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5TG9jYWxBY3Rpdml0aWVzPEEgPSBVbnR5cGVkQWN0aXZpdGllcz4oXG4gIG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zXG4pOiBMb2NhbEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBMb2NhbEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+LCB7XG4gICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2NhbEFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlTG9jYWxBY3Rpdml0eShhY3Rpdml0eVR5cGUgYXMgc3RyaW5nLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24uZXhlY3V0ZVdpdGhPcHRpb25zID0gZnVuY3Rpb24gKFxuICAgICAgICBvdmVycmlkZU9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICAgICAgICBhcmdzOiBhbnlbXVxuICAgICAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlLCBhcmdzLCBkZWVwTWVyZ2Uob3B0aW9ucywgb3ZlcnJpZGVPcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb247XG4gICAgfSxcbiAgfSk7XG59XG5cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIHBhdGNoIGFmdGVyIFwiZW5vdWdoXCIgdGltZSBoYXMgcGFzc2VkXG5jb25zdCBFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0ggPSAnX190ZW1wb3JhbF9pbnRlcm5hbF9jb25uZWN0X2V4dGVybmFsX2hhbmRsZV9jYW5jZWxfdG9fc2NvcGUnO1xuLy8gVGhlIG5hbWUgb2YgdGhpcyBwYXRjaCBjb21lcyBmcm9tIGFuIGF0dGVtcHQgdG8gYnVpbGQgYSBnZW5lcmljIGludGVybmFsIHBhdGNoaW5nIG1lY2hhbmlzbS5cbi8vIFRoYXQgZWZmb3J0IGhhcyBiZWVuIGFiYW5kb25lZCBpbiBmYXZvciBvZiBhIG5ld2VyIFdvcmtmbG93VGFza0NvbXBsZXRlZE1ldGFkYXRhIGJhc2VkIG1lY2hhbmlzbS5cbmNvbnN0IENPTkRJVElPTl8wX1BBVENIID0gJ19fc2RrX2ludGVybmFsX3BhdGNoX251bWJlcjoxJztcblxuLyoqXG4gKiBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIGFuZCBjYW5jZWwgYW4gZXhpc3RpbmcgV29ya2Zsb3cgZXhlY3V0aW9uLlxuICogSXQgdGFrZXMgYSBXb3JrZmxvdyBJRCBhbmQgb3B0aW9uYWwgcnVuIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSh3b3JrZmxvd0lkOiBzdHJpbmcsIHJ1bklkPzogc3RyaW5nKTogRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5nZXRFeHRlcm5hbFdvcmtmbG93SGFuZGxlKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZ2V0SGFuZGxlKC4uLikgaW5zdGVhZC4pJ1xuICApO1xuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQsXG4gICAgcnVuSWQsXG4gICAgY2FuY2VsKCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQ29ubmVjdCB0aGlzIGNhbmNlbCBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHNjb3BlLlxuICAgICAgICAvLyBUaGlzIGlzIGJlaGF2aW9yIHdhcyBpbnRyb2R1Y2VkIGFmdGVyIHYwLjIyLjAgYW5kIGlzIGluY29tcGF0aWJsZVxuICAgICAgICAvLyB3aXRoIGhpc3RvcmllcyBnZW5lcmF0ZWQgd2l0aCBwcmV2aW91cyBTREsgdmVyc2lvbnMgYW5kIHRodXMgcmVxdWlyZXNcbiAgICAgICAgLy8gcGF0Y2hpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHRyeSB0byBkZWxheSBwYXRjaGluZyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGF2b2lkIHBvbGx1dGluZ1xuICAgICAgICAvLyBoaXN0b3JpZXMgdW5sZXNzIHN0cmljdGx5IHJlcXVpcmVkLlxuICAgICAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgICAgIGlmIChwYXRjaGVkKEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuY2FuY2VsV29ya2Zsb3crKztcbiAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICByZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHdvcmtmbG93SWQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNhbmNlbFdvcmtmbG93LnNldChzZXEsIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBjb250ZXh0OiB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB3b3JrZmxvd0lkKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnZXh0ZXJuYWwnLFxuICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7IHdvcmtmbG93SWQsIHJ1bklkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIEJ5IGRlZmF1bHQsIGEgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzICgpID0+IFByb21pc2U8YW55Pj4od29ya2Zsb3dUeXBlOiBzdHJpbmcpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQsXG4gIG9wdGlvbnM/OiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zdGFydENoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuc3RhcnQoLi4uKSBpbnN0ZWFkLiknXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgW3N0YXJ0ZWQsIGNvbXBsZXRlZF0gPSBhd2FpdCBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICBjb25zdCBmaXJzdEV4ZWN1dGlvblJ1bklkID0gYXdhaXQgc3RhcnRlZDtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQ6IG9wdGlvbnNXaXRoRGVmYXVsdHMud29ya2Zsb3dJZCxcbiAgICBmaXJzdEV4ZWN1dGlvblJ1bklkLFxuICAgIGFzeW5jIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCBjb21wbGV0ZWQpIGFzIGFueTtcbiAgICB9LFxuICAgIGFzeW5jIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnY2hpbGQnLFxuICAgICAgICAgIGNoaWxkV29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzICgpID0+IFdvcmtmbG93UmV0dXJuVHlwZT4od29ya2Zsb3dGdW5jOiBUKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZXhlY3V0ZUNoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZXhlY3V0ZSguLi4pIGluc3RlYWQuJ1xuICApO1xuICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9ucyhvcHRpb25zID8/ICh7fSBhcyBhbnkpKTtcbiAgY29uc3Qgd29ya2Zsb3dUeXBlID0gZXh0cmFjdFdvcmtmbG93VHlwZSh3b3JrZmxvd1R5cGVPckZ1bmMpO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLFxuICAgICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nLFxuICAgIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbk5leHRIYW5kbGVyXG4gICk7XG4gIGNvbnN0IGV4ZWNQcm9taXNlID0gZXhlY3V0ZSh7XG4gICAgc2VxOiBhY3RpdmF0b3IubmV4dFNlcXMuY2hpbGRXb3JrZmxvdysrLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgaGVhZGVyczoge30sXG4gICAgd29ya2Zsb3dUeXBlLFxuICB9KTtcbiAgdW50cmFja1Byb21pc2UoZXhlY1Byb21pc2UpO1xuICBjb25zdCBjb21wbGV0ZWRQcm9taXNlID0gZXhlY1Byb21pc2UudGhlbigoW19zdGFydGVkLCBjb21wbGV0ZWRdKSA9PiBjb21wbGV0ZWQpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZWRQcm9taXNlKTtcbiAgcmV0dXJuIGNvbXBsZXRlZFByb21pc2UgYXMgUHJvbWlzZTxhbnk+O1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmcm96ZW4gY29weSBvZiBXb3JrZmxvd0luZm8sIGF0IHRoZSBwb2ludCB3aGVyZSB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gKiBDaGFuZ2VzIGhhcHBlbmluZyBhdCBsYXRlciBwb2ludCBpbiB3b3JrZmxvdyBleGVjdXRpb24gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogRm9yIHRoaXMgcmVhc29uLCB3ZSByZWNvbW1lbmQgY2FsbGluZyBgd29ya2Zsb3dJbmZvKClgIG9uIGV2ZXJ5IGFjY2VzcyB0byB7QGxpbmsgV29ya2Zsb3dJbmZvfSdzIGZpZWxkcyxcbiAqIHJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIGBXb3JrZmxvd0luZm9gIG9iamVjdCAob3IgcGFydCBvZiBpdCkgaW4gYSBsb2NhbCB2YXJpYWJsZS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIC8vIEdPT0RcbiAqIGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIGRvU29tZXRoaW5nKHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXMpXG4gKiAgIC4uLlxuICogICBkb1NvbWV0aGluZ0Vsc2Uod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHZzXG4gKlxuICogYGBgdHNcbiAqIC8vIEJBRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgY29uc3QgYXR0cmlidXRlcyA9IHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXNcbiAqICAgZG9Tb21ldGhpbmcoYXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZShhdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0luZm8oKTogV29ya2Zsb3dJbmZvIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LndvcmtmbG93SW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5pbmZvO1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB1cGRhdGUgaWYgYW55LlxuICpcbiAqIEByZXR1cm4gSW5mbyBmb3IgdGhlIGN1cnJlbnQgdXBkYXRlIGhhbmRsZXIgdGhlIGNvZGUgY2FsbGluZyB0aGlzIGlzIGV4ZWN1dGluZ1xuICogd2l0aGluIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRVcGRhdGVJbmZvKCk6IFVwZGF0ZUluZm8gfCB1bmRlZmluZWQge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY3VycmVudFVwZGF0ZUluZm8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBVcGRhdGVTY29wZS5jdXJyZW50KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBjb2RlIGlzIGV4ZWN1dGluZyBpbiB3b3JrZmxvdyBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbldvcmtmbG93Q29udGV4dCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heWJlR2V0QWN0aXZhdG9yKCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gYGZgIHRoYXQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byBDb250aW51ZUFzTmV3IHdoZW4gY2FsbGVkLlxuICpcbiAqIGBmYCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIFdvcmtmbG93IGZ1bmN0aW9uIHN1cHBsaWVkIHRvIHR5cGVwYXJhbSBgRmAuXG4gKlxuICogT25jZSBgZmAgaXMgY2FsbGVkLCBXb3JrZmxvdyBFeGVjdXRpb24gaW1tZWRpYXRlbHkgY29tcGxldGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEYgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdGlvbnM/OiBDb250aW51ZUFzTmV3T3B0aW9uc1xuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pID0+IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LmNvbnRpbnVlQXNOZXcoLi4uKSBhbmQgV29ya2Zsb3cubWFrZUNvbnRpbnVlQXNOZXdGdW5jKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICBjb25zdCB7IHdvcmtmbG93VHlwZSwgdGFza1F1ZXVlLCAuLi5yZXN0IH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCByZXF1aXJlZE9wdGlvbnMgPSB7XG4gICAgd29ya2Zsb3dUeXBlOiB3b3JrZmxvd1R5cGUgPz8gaW5mby53b3JrZmxvd1R5cGUsXG4gICAgdGFza1F1ZXVlOiB0YXNrUXVldWUgPz8gaW5mby50YXNrUXVldWUsXG4gICAgLi4ucmVzdCxcbiAgfTtcblxuICByZXR1cm4gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pOiBQcm9taXNlPG5ldmVyPiA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGN1cnJlbnRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGluZm8pO1xuICAgIGNvbnN0IGZuID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnY29udGludWVBc05ldycsIGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWFkZXJzLCBhcmdzLCBvcHRpb25zIH0gPSBpbnB1dDtcbiAgICAgIHRocm93IG5ldyBDb250aW51ZUFzTmV3KHtcbiAgICAgICAgd29ya2Zsb3dUeXBlOiBvcHRpb25zLndvcmtmbG93VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIGFyZ3MpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlLFxuICAgICAgICBtZW1vOiBvcHRpb25zLm1lbW8gJiYgbWFwVG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5tZW1vLCBjb250ZXh0KSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczpcbiAgICAgICAgICBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMgfHwgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICAgID8geyBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMsIG9wdGlvbnMudHlwZWRTZWFyY2hBdHRyaWJ1dGVzKSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6IGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3Iob3B0aW9ucy5pbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmbih7XG4gICAgICBhcmdzLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICBvcHRpb25zOiByZXF1aXJlZE9wdGlvbnMsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvdy1leGVjdXRpb24vY29udGludWUtYXMtbmV3I2NvbnRpbnVlLWFzLW5ldyB8IENvbnRpbnVlcy1Bcy1OZXd9IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvblxuICogd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogU2hvcnRoYW5kIGZvciBgbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEY+KCkoLi4uYXJncylgLiAoU2VlOiB7QGxpbmsgbWFrZUNvbnRpbnVlQXNOZXdGdW5jfS4pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogICAvLyAuLi4gV29ya2Zsb3cgbG9naWNcbiAqICAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZUFzTmV3PEYgZXh0ZW5kcyBXb3JrZmxvdz4oLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIG1ha2VDb250aW51ZUFzTmV3RnVuYygpKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIFJGQyBjb21wbGlhbnQgVjQgdXVpZC5cbiAqIFVzZXMgdGhlIHdvcmtmbG93J3MgZGV0ZXJtaW5pc3RpYyBQUk5HIG1ha2luZyBpdCBzYWZlIGZvciB1c2Ugd2l0aGluIGEgd29ya2Zsb3cuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGluc2VjdXJlLlxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQgfCBzdGFja292ZXJmbG93IGRpc2N1c3Npb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIHV1aWQ0RnJvbVJhbmRvbShhY3RpdmF0b3IgPyAoKSA9PiBhY3RpdmF0b3IuY3VycmVudFJhbmRvbSgpIDogTWF0aC5yYW5kb20pO1xufVxuXG4vKipcbiAqIFBhdGNoIG9yIHVwZ3JhZGUgd29ya2Zsb3cgY29kZSBieSBjaGVja2luZyBvciBzdGF0aW5nIHRoYXQgdGhpcyB3b3JrZmxvdyBoYXMgYSBjZXJ0YWluIHBhdGNoLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIHJlcGxheWluZyBhbiBleGlzdGluZyBoaXN0b3J5LCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoYXRcbiAqIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyIHdoaWNoIGFsc28gaGFkIGEgYHBhdGNoZWRgIGNhbGwgd2l0aCB0aGUgc2FtZSBgcGF0Y2hJZGAuXG4gKiBJZiB0aGUgaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgKndpdGhvdXQqIHN1Y2ggYSBjYWxsLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyBub3QgY3VycmVudGx5IHJlcGxheWluZywgdGhlbiB0aGlzIGNhbGwgKmFsd2F5cyogcmV0dXJucyB0cnVlLlxuICpcbiAqIFlvdXIgd29ya2Zsb3cgY29kZSBzaG91bGQgcnVuIHRoZSBcIm5ld1wiIGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUsIGlmIGl0IHJldHVybnMgZmFsc2UsIHlvdVxuICogc2hvdWxkIHJ1biB0aGUgXCJvbGRcIiBjb2RlLiBCeSBkb2luZyB0aGlzLCB5b3UgY2FuIG1haW50YWluIGRldGVybWluaXNtLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hlZChwYXRjaElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIHJldHVybiBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCBmYWxzZSk7XG59XG5cbi8qKlxuICogSW5kaWNhdGUgdGhhdCBhIHBhdGNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBXb3JrZmxvd3Mgd2l0aCB0aGlzIGNhbGwgbWF5IGJlIGRlcGxveWVkIGFsb25nc2lkZSB3b3JrZmxvd3Mgd2l0aCBhIHtAbGluayBwYXRjaGVkfSBjYWxsLCBidXRcbiAqIHRoZXkgbXVzdCAqbm90KiBiZSBkZXBsb3llZCB3aGlsZSBhbnkgd29ya2VycyBzdGlsbCBleGlzdCBydW5uaW5nIG9sZCBjb2RlIHdpdGhvdXQgYVxuICoge0BsaW5rIHBhdGNoZWR9IGNhbGwsIG9yIGFueSBydW5zIHdpdGggaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IHN1Y2ggd29ya2VycyBleGlzdC4gSWYgZWl0aGVyIGtpbmRcbiAqIG9mIHdvcmtlciBlbmNvdW50ZXJzIGEgaGlzdG9yeSBwcm9kdWNlZCBieSB0aGUgb3RoZXIsIHRoZWlyIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBPbmNlIGFsbCBsaXZlIHdvcmtmbG93IHJ1bnMgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5IHdvcmtlcnMgd2l0aCB0aGlzIGNhbGwsIHlvdSBjYW4gZGVwbG95IHdvcmtlcnNcbiAqIHdoaWNoIGFyZSBmcmVlIG9mIGVpdGhlciBraW5kIG9mIHBhdGNoIGNhbGwgZm9yIHRoaXMgSUQuIFdvcmtlcnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGNhbGxcbiAqIG1heSBjb2V4aXN0LCBhcyBsb25nIGFzIHRoZXkgYXJlIGJvdGggcnVubmluZyB0aGUgXCJuZXdcIiBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlUGF0Y2gocGF0Y2hJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLCBwcm92aWRpbmdcbiAqIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0aW1lciAoaS5lLiBwcm92aWRlIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRpbWVyT3B0aW9ucyBpcyBhIG5ldyBhZGRpdGlvbiBhbmQgc3ViamVjdCB0byBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24sIG9wdGlvbnM6IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uLCBvcHRzPzogVGltZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0LCBvcHRzKS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIENhbm5vdCByZWdpc3RlciBoYW5kbGVyIGZvciByZXNlcnZlZCBuYW1lc1xuICB0aHJvd0lmUmVzZXJ2ZWROYW1lKGRlZi50eXBlLCBkZWYubmFtZSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgdXBkYXRlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKlxuICogVXBkYXRlcyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdXBkYXRlcyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRVcGRhdGVIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRVcGRhdGVIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0VXBkYXRlSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0VXBkYXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgcXVlcnkgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqXG4gKiBRdWVyaWVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5IGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcmllcyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFF1ZXJ5SGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0UXVlcnlIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0UXVlcnlIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nIHx8IGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0UXVlcnlIYW5kbGVyID0gaGFuZGxlcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlcyBjYW4gYmUgdXBzZXJ0ZWQgdXNpbmcgZWl0aGVyIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpIG9yIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSAocHJlZmVycmVkKVxuICpcbiAqIFVwc2VydGluZyBhIHdvcmtmbG93J3Mgc2VhcmNoIGF0dHJpYnV0ZXMgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBpbnRLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUludEZpZWxkJywgJ0lOVCcpO1xuICogY29uc3QgYm9vbEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tQm9vbEZpZWxkJywgJ0JPT0wnKTtcbiAqIGNvbnN0IGtleXdvcmRMaXN0S2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21LZXl3b3JkRmllbGQnLCAnS0VZV09SRF9MSVNUJyk7XG4gKlxuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgMSksXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGJvb2xLZXksIHRydWUpXG4gKiBdKTtcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoW1xuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShpbnRLZXksIDQyKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoa2V5d29yZExpc3RLZXksIFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J10pXG4gKiBdKTtcbiAqIGBgYFxuICpcbiAqIFdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIFNlYXJjaCBBdHRyaWJ1dGVzOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXSxcbiAqICAgQ3VzdG9tS2V5d29yZEZpZWxkOiBbJ2R1cmFibGUgY29kZScsICdpcyBncmVhdCddXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VhcmNoQXR0cmlidXRlcyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpLCBzZXQgYSB2YWx1ZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqIElmIHVzaW5nIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpLCBzZXQgYSB2YWx1ZSB0byB1bmRlZmluZWQgb3IgYW4gZW1wdHkgbGlzdCB0byByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXMgfCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuXG4gIGlmIChzZWFyY2hBdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlYXJjaEF0dHJpYnV0ZXMgbXVzdCBiZSBhIG5vbi1udWxsIFNlYXJjaEF0dHJpYnV0ZXMnKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgLy8gVHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXNcbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgdXBzZXJ0V29ya2Zsb3dTZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyh1bmRlZmluZWQsIHNlYXJjaEF0dHJpYnV0ZXMpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGFjdGl2YXRvci5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm86IFdvcmtmbG93SW5mbyk6IFdvcmtmbG93SW5mbyA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07XG4gICAgICBmb3IgKGNvbnN0IHBhaXIgb2Ygc2VhcmNoQXR0cmlidXRlcykge1xuICAgICAgICBpZiAocGFpci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG51bGwsIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBtdXRhdGUgdGhlIGV4aXN0aW5nIHN0YXRlIChqdXN0IHRoZSBuZXcgbWFwKSBzbyB0aGlzIGlzIHNhZmUuXG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXSA9IEFycmF5LmlzQXJyYXkocGFpci52YWx1ZSlcbiAgICAgICAgICAgID8gcGFpci52YWx1ZVxuICAgICAgICAgICAgOiAoW3BhaXIudmFsdWVdIGFzIFNlYXJjaEF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogbmV3U2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvcHkgYW5kIGFwcGx5IGV4aXN0aW5nIGFuZCBuZXcgdXBkYXRlcy4gS2VlcCBpbiBtaW5kIHRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgKGV4aXN0aW5nIGZpcnN0LCBuZXcgc2Vjb25kIC0gdG8gcG9zc2libHkgb3ZlcndyaXRlIGV4aXN0aW5nKS5cbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBpbmZvLnR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFsuLi5zZWFyY2hBdHRyaWJ1dGVzXSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgbGV0IHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW10pO1xuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07XG5cbiAgICAgIC8vIFVwc2VydCBsZWdhY3kgc2VhcmNoIGF0dHJpYnV0ZXMgaW50byB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuXG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWFyY2ggYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb3IgdW5kZWZpbmVkLCBnb3QgJHt2fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHVuZGVmaW5lZCBvciBhbiBlbXB0eSBsaXN0LCB0aGlzIHNpZ25pZmllcyBkZWxldGlvbi5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gYm90aCB1bnR5cGVkICYgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXMuXG4gICAgICAgIGlmICh2ID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgLy8gV2UgY2Fubm90IGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZyb20gdGhlc2UgdmFsdWVzLlxuICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGRvIGEgXCJiZXN0IGVmZm9ydFwiIGRlbGV0aW9uIGZyb20gdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXM6XG4gICAgICAgICAgLy8gLSBjaGVjayBpZiBhIG1hdGNoaW5nIGtleSBuYW1lIGV4aXN0cywgaWYgc28sIHJlbW92ZSBpdC5cbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1BhaXIgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkuZmluZCgocGFpcikgPT4gcGFpci5rZXkubmFtZSA9PT0gayk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nUGFpcikge1xuICAgICAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzID0gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW1xuICAgICAgICAgICAgICB7IGtleTogbWF0Y2hpbmdQYWlyLmtleSwgdmFsdWU6IG51bGwgfSBhcyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXR0ZW1wdCB0byBkaXNjZXJuIGEgdmFsaWQga2V5IHR5cGluZyBmb3IgdGhlIHVwZGF0ZS5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0S2V5RnJvbVVudHlwZWQoaywgdik7XG5cbiAgICAgICAgLy8gVW5hYmxlIHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIChubyB2YWxpZCB0eXBlIGZvciBkZWZpbmVkIHZhbHVlKS5cbiAgICAgICAgLy8gU2tpcCBhcHBseWluZyB0aGlzIHVwZGF0ZSAobm8tb3ApLlxuICAgICAgICBpZiAodHlwZWRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVEVYVCB0eXBlIGlzIGluZmVycmVkIGZyb20gYSBzdHJpbmcgdmFsdWUsIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIEtFWVdPUkQuXG4gICAgICAgIC8vIElmIGEgbWF0Y2hpbmcgcGFpciBleGlzdHMgd2l0aCBLRVlXT1JEIHR5cGUsIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgIGlmICh0eXBlZEtleS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1BhaXIgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkuZmluZCgocGFpcikgPT4gcGFpci5rZXkubmFtZSA9PT0gdHlwZWRLZXkubmFtZSk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nUGFpcikge1xuICAgICAgICAgICAgdHlwZWRLZXkudHlwZSA9IG1hdGNoaW5nUGFpci5rZXkudHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3VmFsdWU6IHVua25vd24gPSB2O1xuICAgICAgICAvLyBVbnBhY2sgdmFsdWUgaWYgaXQgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheS5cbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSB2WzBdO1xuICAgICAgICAgIC8vIENvbnZlcnQgdmFsdWUgYmFjayB0byBEYXRlLlxuICAgICAgICAgIGlmICh0eXBlZEtleS50eXBlID09PSAnREFURVRJTUUnKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG5ldyBEYXRlKG5ld1ZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmluZWQgdmFsdWUgd2l0aCB2YWxpZCB0eXBlLiBBcHBseSB0aGUgdXBkYXRlLlxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgeyBrZXk6IHR5cGVkS2V5LCB2YWx1ZTogbmV3VmFsdWUgfSBhcyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICAgICAgICBdKTtcbiAgICAgICAgbmV3U2VhcmNoQXR0cmlidXRlc1trXSA9IHY7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbmZvLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBuZXdTZWFyY2hBdHRyaWJ1dGVzLFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGlzIFdvcmtmbG93J3MgTWVtb3MgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgYG1lbW9gIHdpdGggZXhpc3RpbmdcbiAqIE1lbW9zIChhcyByZXR1cm5lZCBieSBgd29ya2Zsb3dJbmZvKCkubWVtb2ApLlxuICpcbiAqIE5ldyBtZW1vIGlzIG1lcmdlZCBieSByZXBsYWNpbmcgcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIF9hdCB0aGUgZmlyc3RcbiAqIGxldmVsIG9ubHlfLiBTZXR0aW5nIGEgcHJvcGVydHkgdG8gdmFsdWUgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGNsZWFycyB0aGF0XG4gKiBrZXkgZnJvbSB0aGUgTWVtby5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTE6IHZhbHVlIH1cbiAqICAga2V5NDogdmFsdWUsXG4gKiB9KTtcbiAqIHVwc2VydE1lbW8oe1xuICogICBrZXkyOiB2YWx1ZVxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH1cbiAqICAga2V5NDogdW5kZWZpbmVkLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiB3b3VsZCByZXN1bHQgaW4gdGhlIFdvcmtmbG93IGhhdmluZyB0aGVzZSBNZW1vOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkyOiB2YWx1ZSxcbiAqICAga2V5MzogeyBzdWJrZXkyOiB2YWx1ZSB9ICAvLyBOb3RlIHRoaXMgb2JqZWN0IHdhcyBjb21wbGV0ZWx5IHJlcGxhY2VkXG4gKiAgIC8vIE5vdGUgdGhhdCBrZXk0IHdhcyBjb21wbGV0ZWx5IHJlbW92ZWRcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtZW1vIFRoZSBSZWNvcmQgdG8gbWVyZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRNZW1vKG1lbW86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy51cHNlcnRNZW1vKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBjb25zdCBjb250ZXh0ID0gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8pO1xuXG4gIGlmIChtZW1vID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lbW8gbXVzdCBiZSBhIG5vbi1udWxsIFJlY29yZCcpO1xuICB9XG5cbiAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICBtb2RpZnlXb3JrZmxvd1Byb3BlcnRpZXM6IHtcbiAgICAgIHVwc2VydGVkTWVtbzoge1xuICAgICAgICBmaWVsZHM6IG1hcFRvUGF5bG9hZHMoXG4gICAgICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZFxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZW1vKS5tYXAoKFtrLCB2XSkgPT4gW2ssIHYgPz8gdW5kZWZpbmVkXSkpLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIG1lbW86IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgIC4uLmluZm8ubWVtbyxcbiAgICAgICAgICAuLi5tZW1vLFxuICAgICAgICB9KS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPSBudWxsKVxuICAgICAgKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLlxuICpcbiAqIENvbnNpZGVyIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gYmVmb3JlIHdvcmtmbG93IHJldHVybiBvciBjb250aW51ZS1hcy1uZXcsIHRvIHByZXZlbnRcbiAqIGludGVycnVwdGlvbiBvZiBpbi1wcm9ncmVzcyBoYW5kbGVycyBieSB3b3JrZmxvdyBleGl0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluLXByb2dyZXNzIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsSGFuZGxlcnNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2FsbEhhbmRsZXJzRmluaXNoZWQoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1NpZ25hbHMuc2l6ZSA9PT0gMCAmJiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1VwZGF0ZXMuc2l6ZSA9PT0gMDtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBhbHRlciB3b3JrZmxvdyBmdW5jdGlvbnMgd2l0aCBjZXJ0YWluIG9wdGlvbnMgc3BlY2lmaWVkIGF0IGRlZmluaXRpb24gdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGU6XG4gKiBgYGB0c1xuICogc2V0V29ya2Zsb3dPcHRpb25zKHtcbiAqICAgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyxcbiAqICAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBbQ3VzdG9tV29ya2Zsb3dFcnJvcl1cbiAqIH0sIG15V29ya2Zsb3cpO1xuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAqICAgLy8gV29ya2Zsb3cgY29kZSBoZXJlXG4gKiAgIHJldHVybiBcImhpXCI7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogVG8gYW5ub3RhdGUgYSBkZWZhdWx0IG9yIGR5bmFtaWMgd29ya2Zsb3c6XG4gKiBgYGB0c1xuICogZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gKiAgIC8vIFdvcmtmbG93IGNvZGUgaGVyZVxuICogICByZXR1cm4gXCJoaVwiO1xuICogfVxuICogc2V0V29ya2Zsb3dPcHRpb25zKHtcbiAqICAgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyxcbiAqICAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBbQ3VzdG9tV29ya2Zsb3dFcnJvcl1cbiAqIH0sIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IGRlZmludGlvbiwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgb3B0aW9ucy4gSWYgYVxuICogZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgY2FsbGVkIG9uY2UganVzdCBiZWZvcmUgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlXG4gKiBmaXJzdCB0aW1lLiBJdCBpcyBzYWZlIHRvIGNhbGwge0BsaW5rIHdvcmtmbG93SW5mb30gaW5zaWRlIHN1Y2ggYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBUaGUgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXb3JrZmxvd09wdGlvbnM8QSBleHRlbmRzIGFueVtdLCBSVD4oXG4gIG9wdGlvbnM6IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbiAgZm46ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFJUPlxuKTogdm9pZCB7XG4gIE9iamVjdC5hc3NpZ24oZm4sIHtcbiAgICB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zOiBvcHRpb25zLFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0YWNrVHJhY2VRdWVyeSA9IGRlZmluZVF1ZXJ5PHN0cmluZz4oJ19fc3RhY2tfdHJhY2UnKTtcbmV4cG9ydCBjb25zdCBlbmhhbmNlZFN0YWNrVHJhY2VRdWVyeSA9IGRlZmluZVF1ZXJ5PEVuaGFuY2VkU3RhY2tUcmFjZT4oJ19fZW5oYW5jZWRfc3RhY2tfdHJhY2UnKTtcbmV4cG9ydCBjb25zdCB3b3JrZmxvd01ldGFkYXRhUXVlcnkgPSBkZWZpbmVRdWVyeTx0ZW1wb3JhbC5hcGkuc2RrLnYxLklXb3JrZmxvd01ldGFkYXRhPignX190ZW1wb3JhbF93b3JrZmxvd19tZXRhZGF0YScpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudERldGFpbHMoKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmN1cnJlbnREZXRhaWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudERldGFpbHMoZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdnZXRDdXJyZW50RGV0YWlscygpIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgYWN0aXZhdG9yLmN1cnJlbnREZXRhaWxzID0gZGV0YWlscztcbn1cbiIsImltcG9ydCB7IGluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZiB9IGZyb20gXCIuLi9pbnRlcm5hbC9zeW1ib2wtaW5zdGFuY2VvZlwiO1xuaW1wb3J0IHR5cGUgeyBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuXG4vKipcbiAqIEEgTmV4dXMgaGFuZGxlciBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGhhbmRsaW5nIG9mIGFcbiAqIE5leHVzIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGEgaGFuZGxlciBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIm5leHVzLXJwY1wiO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIkJBRF9SRVFVRVNUXCIsIFwiSW52YWxpZCBpbnB1dCBwcm92aWRlZFwiKTtcbiAqXG4gKiAgICAgLy8gVGhyb3cgYSBiYWQgcmVxdWVzdCBlcnJvciwgd2l0aCBhIGNhdXNlXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIkJBRF9SRVFVRVNUXCIsIFwiSW52YWxpZCBpbnB1dCBwcm92aWRlZFwiLCB7IGNhdXNlIH0pO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIHJldHJ5YWJsZSBpbnRlcm5hbCBlcnJvclxuICogICAgIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJJTlRFUk5BTFwiLCBcIkRhdGFiYXNlIHVuYXZhaWxhYmxlXCIsIHsgcmV0cnlhYmxlT3ZlcnJpZGU6IHRydWUgfSk7XG4gKlxuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgSGFuZGxlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogT25lIG9mIHRoZSBwcmVkZWZpbmVkIGVycm9yIHR5cGVzLlxuICAgKlxuICAgKiBJZiB0aGUgY29uc3RydWN0b3IgcmVjZWl2ZWQgYW4gdW5rbm93biBzdHJpbmcsIHRoaXMgd2lsbCBiZSBgXCJVTktOT1dOXCJgLlxuICAgKiBVc2Uge0BsaW5rIHJhd0Vycm9yVHlwZX0gdG8gYWNjZXNzIHRoZSBvcmlnaW5hbCBzdHJpbmcuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIEhhbmRsZXJFcnJvclR5cGV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogSGFuZGxlckVycm9yVHlwZTtcblxuICAvKipcbiAgICogVGhlIHJhdyBlcnJvciB0eXBlIHN0cmluZy5cbiAgICpcbiAgICogRm9yIGtub3duIHR5cGVzLCB0aGlzIGVxdWFscyB7QGxpbmsgdHlwZX0uIEZvciB1bmtub3duIHR5cGVzLCB0aGlzIHByZXNlcnZlc1xuICAgKiB0aGUgb3JpZ2luYWwgd2lyZSBzdHJpbmcgd2hpbGUge0BsaW5rIHR5cGV9IGlzIHNldCB0byBgXCJVTktOT1dOXCJgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJhd0Vycm9yVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqXG4gICAqIElmIHNwZWNpZmllZCwgYHJldHJ5YWJsZU92ZXJyaWRlYCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmV0cnkgYmVoYXZpb3IgZGV0ZXJtaW5lZCBiYXNlZCBvblxuICAgKiB0aGUgZXJyb3IgdHlwZS4gVXNlIHtAbGluayByZXRyeWFibGV9IHRvIGRldGVybWluZSB0aGUgZWZmZWN0aXZlIHJldHJ5IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayByZXRyeWFibGV9LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldHJ5YWJsZU92ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IGlmIHRoaXMgZXJyb3Igd2FzIGNvbnN0cnVjdGVkIGZyb20gYSB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0LlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGZhaWx1cmUgZm9yIHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEhhbmRsZXJFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGVycm9yLiBNdXN0IGJlIGEga25vd24ge0BsaW5rIEhhbmRsZXJFcnJvclR5cGV9LlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFeHRyYSBvcHRpb25zIGZvciB0aGUgZXJyb3IsIGluY2x1ZGluZyB0aGUgY2F1c2UgYW5kIHJldHJ5YWJsZSBvdmVycmlkZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZTogSGFuZGxlckVycm9yVHlwZSwgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IEhhbmRsZXJFcnJvck9wdGlvbnMpIHtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBgSGFuZGxlciBlcnJvcjogJHt0eXBlfWA7XG5cbiAgICBzdXBlcihhY3R1YWxNZXNzYWdlLCB7IGNhdXNlOiBvcHRpb25zPy5jYXVzZSB9KTtcblxuICAgIGlmICghT2JqZWN0Lmhhc093bihIYW5kbGVyRXJyb3JUeXBlLCB0eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBIYW5kbGVyRXJyb3JUeXBlOiAke3R5cGV9YCk7XG4gICAgfVxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5yYXdFcnJvclR5cGUgPSB0eXBlID09PSBcIlVOS05PV05cIiA/IChvcHRpb25zPy5yYXdFcnJvclR5cGUgPz8gdHlwZSkgOiB0eXBlO1xuICAgIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGUgPSBvcHRpb25zPy5yZXRyeWFibGVPdmVycmlkZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUge0BsaW5rIHJldHJ5YWJsZU92ZXJyaWRlfSBwcm9wZXJ0eSBpbiB0aGF0IGByZXRyeWFibGVgIHRha2VzIGludG9cbiAgICogYWNjb3VudCB0aGUgZGVmYXVsdCBiZWhhdmlvciByZXN1bHRpbmcgZnJvbSB0aGUgZXJyb3IgdHlwZSwgaWYgbm8gb3ZlcnJpZGUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZU92ZXJyaWRlfS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmV0cnlhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJCQURfUkVRVUVTVFwiOlxuICAgICAgY2FzZSBcIlVOQVVUSEVOVElDQVRFRFwiOlxuICAgICAgY2FzZSBcIlVOQVVUSE9SSVpFRFwiOlxuICAgICAgY2FzZSBcIk5PVF9GT1VORFwiOlxuICAgICAgY2FzZSBcIk5PVF9JTVBMRU1FTlRFRFwiOlxuICAgICAgY2FzZSBcIkNPTkZMSUNUXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgY2FzZSBcIlVOQVZBSUxBQkxFXCI6XG4gICAgICBjYXNlIFwiVVBTVFJFQU1fVElNRU9VVFwiOlxuICAgICAgY2FzZSBcIlJFU09VUkNFX0VYSEFVU1RFRFwiOlxuICAgICAgY2FzZSBcIklOVEVSTkFMXCI6XG4gICAgICBjYXNlIFwiUkVRVUVTVF9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiVU5LTk9XTlwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBGb3JjZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBtaXNzaW5nIGEgY2FzZVxuICAgICAgICBjb25zdCBfbm9NaXNzaW5nQ2FzZTogbmV2ZXIgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoSGFuZGxlckVycm9yLCBcIkhhbmRsZXJFcnJvclwiKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAaW5saW5lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlckVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogdW5rbm93bjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGVycm9yIHNob3VsZCBiZSBjb25zaWRlcmVkIHJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgbm90IHNldCwgdGhlIHJldHJ5IGJlaGF2aW9yIGlzIGRldGVybWluZWQgZnJvbSB0aGUgZXJyb3IgdHlwZS5cbiAgICogRm9yIGV4YW1wbGUsIGJ5IGRlZmF1bHQsIGBJTlRFUk5BTGAgaXMgcmV0cnlhYmxlLCBidXQgYFVOQVZBSUxBQkxFYCBpcyBub24tcmV0cnlhYmxlLlxuICAgKi9cbiAgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBzdGFjayB0cmFjZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgYHN0YWNrYCBwcm9wZXJ0eSBvbiB0aGUgZXJyb3IuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlbW90ZSBzdGFjayB0cmFjZXMgcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZSxcbiAgICogd2hpY2ggbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IGxhbmd1YWdlIHJ1bnRpbWUuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBvcmlnaW5hbEZhaWx1cmU/OiBGYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgZXJyb3IgdHlwZSBzdHJpbmcsIHByZXNlcnZpbmcgdGhlIHJhdyB3aXJlIHZhbHVlLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAqIFdoZW4gdGhlIGVycm9yJ3MgdHlwZSBpcyBzZXQgdG8gYFwiVU5LTk9XTlwiYCwgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgd2lyZSBzdHJpbmcuXG4gICAqL1xuICByYXdFcnJvclR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgSGFuZGxlckVycm9yfSwgZGVmaW5lZCBhY2NvcmRpbmcgdG8gdGhlIE5leHVzIHNwZWNpZmljYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyRXJyb3JUeXBlID0gKHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlKVtrZXlvZiB0eXBlb2YgSGFuZGxlckVycm9yVHlwZV07XG5leHBvcnQgY29uc3QgSGFuZGxlckVycm9yVHlwZSA9IHtcbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0eXBlIGlzIHVua25vd24uXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBVTktOT1dOOiBcIlVOS05PV05cIixcblxuICAvKipcbiAgICogVGhlIGhhbmRsZXIgY2Fubm90IG9yIHdpbGwgbm90IHByb2Nlc3MgdGhlIHJlcXVlc3QgZHVlIHRvIGFuIGFwcGFyZW50IGNsaWVudCBlcnJvci5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBCQURfUkVRVUVTVDogXCJCQURfUkVRVUVTVFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50IGRpZCBub3Qgc3VwcGx5IHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIRU5USUNBVEVEOiBcIlVOQVVUSEVOVElDQVRFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIFVOQVVUSE9SSVpFRDogXCJVTkFVVEhPUklaRURcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQgYnV0IG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIE5PVF9GT1VORDogXCJOT1RfRk9VTkRcIixcblxuICAvKipcbiAgICogUmV0dXJuZWQgYnkgdGhlIHNlcnZlciB3aGVuIGl0IGhhcyBnaXZlbiB1cCBoYW5kbGluZyBhIHJlcXVlc3QuIFRoaXMgbWF5IG9jY3VyIGJ5IGVuZm9yY2luZ1xuICAgKiBhIGNsaWVudCBwcm92aWRlZCBgUmVxdWVzdC1UaW1lb3V0YCBvciBmb3IgYW55IGFyYml0cmFyeSByZWFzb24gc3VjaCBhcyBlbmZvcmNpbmcgc29tZVxuICAgKiBjb25maWd1cmFibGUgbGltaXQuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVFVRVNUX1RJTUVPVVQ6IFwiUkVRVUVTVF9USU1FT1VUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBtYWRlIGR1ZSB0byBhIGNvbmZsaWN0LiBUaGlzIG1heSBoYXBwZW4gd2hlbiB0cnlpbmcgdG8gY3JlYXRlIGFuXG4gICAqIG9wZXJhdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBDT05GTElDVDogXCJDT05GTElDVFwiLFxuXG4gIC8qKlxuICAgKiBTb21lIHJlc291cmNlIGhhcyBiZWVuIGV4aGF1c3RlZCwgcGVyaGFwcyBhIHBlci11c2VyIHF1b3RhLCBvciBwZXJoYXBzIHRoZSBlbnRpcmUgZmlsZSBzeXN0ZW1cbiAgICogaXMgb3V0IG9mIHNwYWNlLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgUkVTT1VSQ0VfRVhIQVVTVEVEOiBcIlJFU09VUkNFX0VYSEFVU1RFRFwiLFxuXG4gIC8qKlxuICAgKiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIElOVEVSTkFMOiBcIklOVEVSTkFMXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZWl0aGVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcmVxdWVzdCBtZXRob2QsIG9yIGl0IGxhY2tzIHRoZSBhYmlsaXR5IHRvIGZ1bGZpbGwgdGhlXG4gICAqIHJlcXVlc3QuIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgTk9UX0lNUExFTUVOVEVEOiBcIk5PVF9JTVBMRU1FTlRFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBVTkFWQUlMQUJMRTogXCJVTkFWQUlMQUJMRVwiLFxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGdhdGV3YXlzIHRvIHJlcG9ydCB0aGF0IGEgcmVxdWVzdCB0byBhbiB1cHN0cmVhbSBzZXJ2ZXIgaGFzIHRpbWVkIG91dC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVQU1RSRUFNX1RJTUVPVVQ6IFwiVVBTVFJFQU1fVElNRU9VVFwiLFxufSBhcyBjb25zdDtcbiIsImV4cG9ydCB7IHR5cGUgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcbmV4cG9ydCB7IEhhbmRsZXJFcnJvciwgSGFuZGxlckVycm9yVHlwZSwgdHlwZSBIYW5kbGVyRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vaGFuZGxlci1lcnJvclwiO1xuZXhwb3J0IHsgdHlwZSBMaW5rIH0gZnJvbSBcIi4vbGlua1wiO1xuZXhwb3J0IHtcbiAgT3BlcmF0aW9uRXJyb3IsXG4gIHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSxcbiAgdHlwZSBPcGVyYXRpb25FcnJvck9wdGlvbnMsXG59IGZyb20gXCIuL29wZXJhdGlvbi1lcnJvclwiO1xuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBvcGVyYXRpb24gZXJyb3IuXG4gKlxuICogVGhpcyBlcnJvciBjbGFzcyByZXByZXNlbnRzIHRoZSBhYm5vcm1hbCBjb21wbGV0aW9uIG9mIGEgTmV4dXMgb3BlcmF0aW9uLFxuICogdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBhcyBhbiBvcGVyYXRpb24gZXJyb3IuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogICAgIGltcG9ydCB7IE9wZXJhdGlvbkVycm9yIH0gZnJvbSBcIm5leHVzLXJwY1wiO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJmYWlsZWRcIiwgXCJOb3QgZW5vdWdoIGludmVudG9yeVwiKTtcbiAqXG4gKiAgICAgLy8gVGhyb3cgYSBmYWlsZWQgb3BlcmF0aW9uIGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJmYWlsZWRcIiwgXCJOb3QgZW5vdWdoIGludmVudG9yeVwiLCB7IGNhdXNlIH0pO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGNhbmNlbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImNhbmNlbGVkXCIsIFwiVXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uXCIpO1xuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBTdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlOiBPcGVyYXRpb25FcnJvclN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgdGhhdCByZXN1bHRlZCBpbiB0aGlzIG9wZXJhdGlvbiBlcnJvci5cbiAgICovXG4gIGRlY2xhcmUgcHVibGljIHJlYWRvbmx5IGNhdXNlOiBFcnJvcjtcblxuICAvKipcbiAgICogU2V0IGlmIHRoaXMgZXJyb3Igd2FzIGNvbnN0cnVjdGVkIGZyb20gYSB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0LlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGZhaWx1cmUgZm9yIHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE9wZXJhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlIC0gVGhlIHN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgZS5nLiB0aGUgY2F1c2UuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXRlOiBPcGVyYXRpb25FcnJvclN0YXRlLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBzdGF0ZSA9PT0gXCJjYW5jZWxlZFwiID8gYE9wZXJhdGlvbiBjYW5jZWxlZGAgOiBgT3BlcmF0aW9uIGZhaWxlZGA7XG4gICAgY29uc3QgYWN0dWFsTWVzc2FnZSA9IG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2U7XG5cbiAgICBzdXBlcihhY3R1YWxNZXNzYWdlLCB7IGNhdXNlOiBvcHRpb25zPy5jYXVzZSB9KTtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vcmlnaW5hbEZhaWx1cmUgPSBvcHRpb25zPy5vcmlnaW5hbEZhaWx1cmU7XG4gICAgaWYgKG9wdGlvbnM/LnN0YWNrVHJhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IG9wdGlvbnMuc3RhY2tUcmFjZTtcbiAgICB9XG4gIH1cbn1cblxuaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mKE9wZXJhdGlvbkVycm9yLCBcIk9wZXJhdGlvbkVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25FcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVW5kZXJseWluZyBjYXVzZSBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICBjYXVzZT86IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBzdGFjayB0cmFjZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgYHN0YWNrYCBwcm9wZXJ0eSBvbiB0aGUgZXJyb3IuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlbW90ZSBzdGFjayB0cmFjZXMgcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZSxcbiAgICogd2hpY2ggbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IGxhbmd1YWdlIHJ1bnRpbWUuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBvcmlnaW5hbEZhaWx1cmU/OiBGYWlsdXJlO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBzdGF0ZSBvZiBhbiBvcGVyYXRpb24gdGhhdCBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAaW5saW5lXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkVycm9yU3RhdGUgPSBcImZhaWxlZFwiIHwgXCJjYW5jZWxlZFwiO1xuIiwiZXhwb3J0IHtcbiAgdHlwZSBPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIFN0YXJ0T3BlcmF0aW9uQ29udGV4dCxcbiAgdHlwZSBDYW5jZWxPcGVyYXRpb25Db250ZXh0LFxufSBmcm9tIFwiLi9vcGVyYXRpb24tY29udGV4dFwiO1xuXG5leHBvcnQge1xuICBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQsXG4gIHR5cGUgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYyxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYyxcbn0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuXG5leHBvcnQge1xuICAvL1xuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXIsXG4gIHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbmV4cG9ydCB7XG4gIFNlcnZpY2VIYW5kbGVyLFxuICBzZXJ2aWNlSGFuZGxlcixcbiAgdHlwZSBPcGVyYXRpb25IYW5kbGVyRm9yLFxuICB0eXBlIFNlcnZpY2VIYW5kbGVyRm9yLFxufSBmcm9tIFwiLi9zZXJ2aWNlLWhhbmRsZXJcIjtcbiIsImltcG9ydCB7IEhhbmRsZXJFcnJvciB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHRcIjtcbmltcG9ydCB7IENhbmNlbE9wZXJhdGlvbkNvbnRleHQsIFN0YXJ0T3BlcmF0aW9uQ29udGV4dCB9IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBPcGVyYXRpb25EZWZpbml0aW9uLFxuICBPcGVyYXRpb25JbnB1dCxcbiAgT3BlcmF0aW9uS2V5LFxuICBPcGVyYXRpb25NYXAsXG4gIE9wZXJhdGlvbk91dHB1dCxcbn0gZnJvbSBcIi4uL3NlcnZpY2VcIjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIGEgTmV4dXMgb3BlcmF0aW9uLlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IE5leHVzIHNlcnZpY2UgaW1wbGVtZW50b3JzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHtcbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBzdGFydCBhbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIFJldHVybiB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luY30gdG8gcmVzcG9uZCBzdWNjZXNzZnVsbHkgaW5saW5lLCBvclxuICAgKiB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmN9IHRvIGluZGljYXRlIHRoYXQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3YXMgc3RhcnRlZC5cbiAgICogVGhyb3cgYW4ge0BsaW5rIE9wZXJhdGlvbkVycm9yfSB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgYXMgZmFpbGVkIG9yIGNhbmNlbGVkLlxuICAgKi9cbiAgc3RhcnQoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKTogUHJvbWlzZTxIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQ8Tz4+O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVxdWVzdHMgdG8gY2FuY2VsIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uXG4gICAqXG4gICAqIENhbmNlbGF0aW9uIG9mIGEgTmV4dXMgb3BlcmF0aW9uIGlzOlxuICAgKiAxLiBfYXN5bmNocm9ub3VzXyAtIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kIG9ubHkgY29uZmlybXMgdGhhdCBjYW5jZWxhdGlvbiB3YXMgbm90aWZpZWQ7XG4gICAqICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgaG93ZXZlciBjaG9vc2UgdG8gcHJvY2VzcyB0aGUgY2FuY2VsbGF0aW9uIGF0IGEgbGF0ZXIgdGltZSwgb3IgdG9cbiAgICogICAgaWdub3JlIGl0IGVudGlyZWx5LlxuICAgKiAyLiBfaWRlbXBvdGVudF8gLSBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpZ25vcmUgZHVwbGljYXRlIGNhbmNlbGF0aW9ucyBmb3IgdGhlIHNhbWUgb3BlcmF0aW9uLlxuICAgKi9cbiAgY2FuY2VsKGN0eDogQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBzaG9ydGN1dCBmb3IgZGVmaW5pbmcgYW4gb3BlcmF0aW9uIGhhbmRsZXIgdGhhdCBvbmx5IGltcGxlbWVudHMgdGhlIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLnN0YXJ0fVxuICogbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJucyBhIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gKGN0eDogU3RhcnRPcGVyYXRpb25Db250ZXh0LCBpbnB1dDogSSkgPT4gUHJvbWlzZTxPPjtcblxuLyoqXG4gKiBDb21waWxlcyBhbiBvcGVyYXRpb24gaGFuZGxlciBpbnRvIGEge0BsaW5rIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcn0uIEEgY29tcGlsZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGlzIGEgc2luZ2xlIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb3BlcmF0aW9uIGRlZmluaXRpb24gYW5kIGEgZnVsbC1mbGVkZ2VkIG9wZXJhdGlvblxuICogaGFuZGxlciBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlT3BlcmF0aW9uSGFuZGxlcjxJLCBPPihcbiAgZGVmaW5pdGlvbjogT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPixcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgdW5kZWZpbmVkLFxuKTogQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+IHtcbiAgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgTm8gaGFuZGxlciByZWdpc3RlcmVkIGZvciBvcGVyYXRpb24gJyR7ZGVmaW5pdGlvbi5uYW1lfScgKGV4cGVjdGVkIHByb3BlcnR5IG5hbWUgJyR7ZGVmaW5pdGlvbi5uYW1lfScpYCxcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBPcGVyYXRpb24gaGFuZGxlciBpcyBkZWNsYXJlZCB1c2luZyB0aGUgc2hvcnRjdXQgc3ludGF4LiBXcmFwIGl0IGludG8gYSBmdWxsLWZsZWRnZWQgaGFuZGxlci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmaW5pdGlvbixcblxuICAgICAgc3RhcnQ6IGFzeW5jIChjdHgsIGlucHV0KSA9PiB7XG4gICAgICAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luYyhhd2FpdCBoYW5kbGVyKGN0eCwgaW5wdXQpKTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IG5vdEltcGxlbWVudGVkLFxuICAgIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIuc3RhcnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEhhbmRsZXIgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyBoYXMgbm8gc3RhcnQgbWV0aG9kYCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmRlZmluaXRpb24sXG5cbiAgICAvLyBEZWZlbnNpdmVseSBlbnN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYWxsIHRoZSByZXF1aXJlZCBtZXRob2RzLFxuICAgIC8vIGRlZmF1bHRpbmcgdG8gdGhyb3dpbmcgYSBub3QgaW1wbGVtZW50ZWQgZXJyb3IgaWYgc29tZSBtZXRob2RzIGFyZSBtaXNzaW5nLlxuICAgIHN0YXJ0OiBoYW5kbGVyLnN0YXJ0LmJpbmQoaGFuZGxlciksXG4gICAgY2FuY2VsOiBoYW5kbGVyLmNhbmNlbD8uYmluZChoYW5kbGVyKSA/PyBub3RJbXBsZW1lbnRlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGNvbXBpbGVkIG9wZXJhdGlvbiBoYW5kbGVyIGlzIGEgc2luZ2xlIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb3BlcmF0aW9uIGRlZmluaXRpb24gYW5kIGFcbiAqIGZ1bGwtZmxlZGdlZCBvcGVyYXRpb24gaGFuZGxlciBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiA9IE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz4gJiBPcGVyYXRpb25IYW5kbGVyPEksIE8+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPiA9IENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcjxcbiAgT3BlcmF0aW9uSW5wdXQ8T3BzW09wZXJhdGlvbktleTxPcHM+XT4sXG4gIE9wZXJhdGlvbk91dHB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPlxuPjtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbm90SW1wbGVtZW50ZWQoKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiTk9UX0lNUExFTUVOVEVEXCIsIFwiTm90IGltcGxlbWVudGVkXCIpO1xufVxuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uRGVmaW5pdGlvbiwgT3BlcmF0aW9uS2V5LCBPcGVyYXRpb25NYXAsIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3NlcnZpY2VcIjtcbmltcG9ydCB7XG4gIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcixcbiAgY29tcGlsZU9wZXJhdGlvbkhhbmRsZXIsXG4gIE9wZXJhdGlvbkhhbmRsZXIsXG4gIFN5bmNPcGVyYXRpb25IYW5kbGVyLFxufSBmcm9tIFwiLi9vcGVyYXRpb24taGFuZGxlclwiO1xuXG4vKipcbiAqIEEgTmV4dXMgU2VydmljZSBpbXBsZW1lbnRhdGlvbiwgdGhhdCBwcm92aWRlcyBoYW5kbGVycyBmb3IgZWFjaCBvZiBpdHMgb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+IHtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgYFNlcnZpY2VIYW5kbGVyYCBmcm9tIGEgc2VydmljZSBkZWZpbml0aW9uIGFuZCBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9uIGhhbmRsZXJzLlxuICAgKlxuICAgKiBUaGVyZSBtdXN0IGJlIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBldmVyeSBvcGVyYXRpb24gaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnNcbiAgICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgaGFuZGxlclxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQGhpZGRlblxuICAgKi9cbiAgc3RhdGljIGJ1aWxkPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcD4oXG4gICAgc2VydmljZTogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgKTogU2VydmljZUhhbmRsZXI8T3BzPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IG5ldyBNYXA8T3BlcmF0aW9uS2V5PE9wcz4sIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHM+PigpO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGRlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2Uub3BlcmF0aW9ucykpIHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkT3BIYW5kbGVyID0gY29tcGlsZU9wZXJhdGlvbkhhbmRsZXIoZGVmaW5pdGlvbiwgaGFuZGxlcnNbcHJvcE5hbWVdKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBjb21waWxlZE9wSGFuZGxlci5uYW1lIGFzIE9wZXJhdGlvbktleTxPcHM+O1xuXG4gICAgICBpZiAob3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgT3BlcmF0aW9uIHdpdGggbmFtZSAnJHtvcGVyYXRpb25OYW1lfScgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBzZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5zZXQob3BlcmF0aW9uTmFtZSwgY29tcGlsZWRPcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2VydmljZUhhbmRsZXIoc2VydmljZSwgaGFuZGxlcnMsIG9wZXJhdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVmaW5pdGlvbjogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcnM6IFNlcnZpY2VIYW5kbGVyRm9yPE9wcz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25zTWFwOiBNYXA8T3BlcmF0aW9uS2V5PE9wcz4sIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHM+PixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZpbml0aW9uIGFuZCBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRPcGVyYXRpb25IYW5kbGVyPEsgZXh0ZW5kcyBPcGVyYXRpb25LZXk8T3BzPj4oXG4gICAgb3BlcmF0aW9uTmFtZTogSyxcbiAgKTogQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5vcGVyYXRpb25zTWFwLmdldChvcGVyYXRpb25OYW1lKTtcbiAgICBpZiAoZW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcbiAgICAgICAgXCJOT1RfRk9VTkRcIixcbiAgICAgICAgYE9wZXJhdGlvbiBoYW5kbGVyIG5vdCByZWdpc3RlcmVkIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9uTmFtZX0nIGluIHNlcnZpY2UgJyR7dGhpcy5kZWZpbml0aW9uLm5hbWV9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgc2VydmljZSBoYW5kbGVyIGZvciBhIGdpdmVuIHNlcnZpY2UgY29udHJhY3QuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUhhbmRsZXI8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgc2VydmljZTogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgaGFuZGxlcnM6IFNlcnZpY2VIYW5kbGVyRm9yPE9wcz4sXG4pOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgcmV0dXJuIFNlcnZpY2VIYW5kbGVyLmJ1aWxkKHNlcnZpY2UsIGhhbmRsZXJzKTtcbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiBvcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25IYW5kbGVyRm9yPFQ+ID1cbiAgVCBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCBTeW5jT3BlcmF0aW9uSGFuZGxlcjxJLCBPPlxuICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaW50ZXJmYWNlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VIYW5kbGVyRm9yPFQgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogT3BlcmF0aW9uSGFuZGxlckZvcjxUW0tdPjtcbn07XG4iLCIvKiogQGltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9vcGVyYXRpb24taGFuZGxlclwiICovXG5cbi8qKlxuICogQW4gaW50ZXJuYWwgc3ltYm9sLCB1c2VkIHRvIHByZXZlbnQgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZXMuXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sID0gU3ltYm9sKFwiX19uZXh1c19pc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFwiKTtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQ8VCA9IHVua25vd24+ID1cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+XG4gIHwgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmM7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIGZyb20gdGhlIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLnN0YXJ0fSBtZXRob2QuXG4gKlxuICogVXNlIGVpdGhlciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IG9yIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmN9XG4gKiB0byBjcmVhdGUgYSByZXN1bHQgb2JqZWN0LiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNvbnN0IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAgICovXG4gIGFzeW5jKHRva2VuOiBzdHJpbmcpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXN5bmM6IHRydWUsXG4gICAgICB0b2tlbixcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzeW5jPFQ+KHZhbHVlOiBUKTogSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYzxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXN5bmM6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgICBbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdOiB0cnVlLFxuICAgIH07XG4gIH0sXG5cbiAgW1N5bWJvbC5oYXNJbnN0YW5jZV06IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgKHZhbHVlIGFzIGFueSlbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdID09PSB0cnVlXG4gICAgKTtcbiAgfSxcbn07XG5cbi8qKlxuICogQSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSB0byBjcmVhdGUgYSBzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luYyg0Mik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYzxUID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgdmFsdWU6IFQ7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG5cbi8qKlxuICogQSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gaGFzIGJlZW4gYWNjZXB0ZWQgYW5kIHdpbGwgY29tcGxldGUgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogVXNlIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmN9IHRvIGNyZWF0ZSBhbiBhc3luYyByZXN1bHQgb2JqZWN0LlxuICogRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogICByZXR1cm4gSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jKFwidW5pcXVlIHRva2VuXCIpO1xuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgLyoqXG4gICAqIEluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseSAoZmFsc2UpIG9yIHdpbGwgY29tcGxldGVcbiAgICogYXN5bmNocm9ub3VzbHkgKHRydWUpLlxuICAgKi9cbiAgaXNBc3luYzogdHJ1ZTtcblxuICAvKipcbiAgICogQSB0b2tlbiB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGluIGZvbGxvd3VwIGhhbmRsZXIgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLmdldFJlc3VsdH1cbiAgICogYW5kIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLmNhbmNlbH0uXG4gICAqL1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdOiB0cnVlO1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9oYW5kbGVyXCI7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IG1hcHBpbmcgYWxsIHN0cmluZyBwcm9wZXJ0aWVzIChrZXlzIGFuZCB2YWx1ZXMpIG9mIGFuIGV4aXN0aW5nIG9iamVjdFxuICogdGhyb3VnaCBhIG1hcHBlciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHNvdXJjZSBvYmplY3QsIHdob3NlIHByb3BlcnRpZXMgd2lsbCBiZSBtYXBwZWQuXG4gKiBAcGFyYW0gZm4gLSBUaGUgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG1hcHBlZCB0byB0aGUgbmV3IHR5cGUuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBLZXlWYWx1ZXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFU+KFxuICBvYmo6IFQsXG4gIGZuOiAoa2V5OiBrZXlvZiBUICYgc3RyaW5nLCB2YWx1ZTogVFtrZXlvZiBUICYgc3RyaW5nXSkgPT4gVSxcbik6IFJlY29yZDxrZXlvZiBULCBVPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgZm4oa2V5LCB2YWx1ZSldKSxcbiAgKSBhcyBSZWNvcmQ8a2V5b2YgVCwgVT47XG59XG4iLCIvKipcbiAqIEluamVjdCBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBvbiB0aGUgZ2l2ZW4gY2xhc3MsIHRoYXQgd29ya3MgY29ycmVjdGx5IGFjcm9zcyBleGVjdXRpb24gY29udGV4dHMuXG4gKlxuICogIyMjIERldGFpbHMgIyMjXG4gKlxuICogQWNjb3JkaW5nIHRvIHRoZSBFY21hU2NyaXB0J3Mgc3BlYywgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSmF2YVNjcmlwdCdzIGB4IGluc3RhbmNlb2YgWWAgb3BlcmF0b3IgaXMgdG8gd2FsayB1cCB0aGVcbiAqIHByb3RvdHlwZSBjaGFpbiBvZiBvYmplY3QgJ3gnLCBjaGVja2luZyBpZiBhbnkgY29uc3RydWN0b3IgaW4gdGhhdCBoaWVyYXJjaHkgaXMgX2V4YWN0bHkgdGhlIHNhbWUgb2JqZWN0XyBhcyB0aGVcbiAqIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICdZJy5cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCBpdCBoYXBwZW5zIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGF0IGRpZmZlcmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBvYmplY3RzIGdldCBjcmVhdGVkIGZvciB3aGF0XG4gKiBhcHBlYXJzIHRvIGJlIHRoZSB2ZXJ5IHNhbWUgY2xhc3MuIFRoaXMgbGVhZHMgdG8gc3VycHJpc2luZyBiZWhhdmlvciB3aGVyZSBgaW5zdGFuY2VvZmAgcmV0dXJucyBmYWxzZSB0aG91Z2ggaXQgaXNcbiAqIGtub3duIHRoYXQgdGhlIG9iamVjdCBpcyBpbmRlZWQgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4gT25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgd2hlbiBjb25zdHJ1Y3RvclxuICogJ1knIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGUgY29uc3R1Y3RvciB3aXRoIHdoaWNoICd4JyB3YXMgaW5zdGFudGlhdGVkLiBBbm90aGVyIGNhc2UgaXMgd2hlbiB0d28gY29waWVzXG4gKiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGdldHMgbG9hZGVkIGluIHRoZSBzYW1lIHJlYWxtLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIHRlbmRzIHRvIGNhdXNlIGlzc3VlcyB3aGVuIGNyb3NzaW5nIHRoZSB3b3JrZmxvdy1zYW5kYm94aW5nIGJvdW5kYXJ5IChzaW5jZSBOb2RlJ3Mgdm0gbW9kdWxlXG4gKiByZWFsbHkgY3JlYXRlcyBuZXcgZXhlY3V0aW9uIHJlYWxtcyksIGFzIHdlbGwgYXMgd2hlbiBydW5uaW5nIHRlc3RzIHVzaW5nIEplc3QgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdGpzL2plc3QvaXNzdWVzLzI1NDlcbiAqIGZvciBzb21lIGRldGFpbHMgb24gdGhhdCBvbmUpLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW5qZWN0cyBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBpbnRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6Jywgd2hpY2ggaXMgYm90aCBjcm9zcy1yZWFsbSBzYWZlIGFuZFxuICogY3Jvc3MtY29waWVzLW9mLXRoZS1zYW1lLWxpYiBzYWZlLiBJdCB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIHN5bWJvbCBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIGFuZCB0aGVuXG4gKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoYXQgc3ltYm9sLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mPEU+KGNsYXp6OiBDbGFzczxFPiwgbWFya2VyTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIEl0IG1heSBzZWVtIHJlZHVuZGFudCB0byBoYXZlIGFuIGV4cGxpY2l0IG1hcmtlck5hbWUgYXJndW1lbnQgaGVyZS4gQ2FuJ3Qgd2Ugc2ltcGx5IHVzZSB0aGUgY2xhc3NcbiAgLy8gZnVuY3Rpb24gbmFtZSBmb3IgdGhhdD8gVW5mb3J0dW5hdGVseSwgbm8sIGFzIHRoZSBjbGFzcyBuYW1lIG1heSBnZXQgbWFuZ2xlZCBpZiB0aGUgZmlsZSBnZXRzIG1pbmlmaWVkLlxuICBjb25zdCBtYXJrZXIgPSBTeW1ib2wuZm9yKGBfX25leHVzX2lzJHttYXJrZXJOYW1lfWApO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIFwibmFtZVwiLCB7IHZhbHVlOiBtYXJrZXJOYW1lLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCBtYXJrZXIsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCB2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICBpZiAodGhpcyA9PT0gY2xhenopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KVttYXJrZXJdID09PSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gJ3RoaXMnIG11c3QgYmUgYSBfc3ViY2xhc3NfIG9mIGNsYXp6IHRoYXQgZG9lc24ndCByZWRlZmluZWQgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIHNvIHRoYXQgaXQgaW5oZXJpdGVkXG4gICAgICAgIC8vIGZyb20gY2xhenoncyBbU3ltYm9sLmhhc0luc3RhbmNlXS4gSWYgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgcGFydGljdWxhciBzaXR1YXRpb24sIHRoZW5cbiAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZGVhbGx5LCBpdCdkIGJlIHByZWZlcmFibGUgdG8gYXZvaWQgdGhpcyBjYXNlIGVudGlyZWx5LCBieSBtYWtpbmcgc3VyZSB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mICdjbGF6eidcbiAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgIC8vIGJlaGF2aW9yICh3aGljaCBpcyBOT1QgY3Jvc3MtcmVhbG0gc2FmZSkuXG4gICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHZhbHVlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgY2xhc3MuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3M8RT4ge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogRTtcbiAgcHJvdG90eXBlOiBFO1xufVxuIiwiaW1wb3J0IHsgbWFwS2V5VmFsdWVzIH0gZnJvbSBcIi4uL2ludGVybmFsL29iamVjdC11dGlsc1wiO1xuaW1wb3J0IHsgU2ltcGxpZnkgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdHlwZXNcIjtcbmltcG9ydCB7IGlucHV0QnJhbmQsIG91dHB1dEJyYW5kLCB2YWxpZGF0ZVNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIHNlcnZpY2UgZGVmaW5pdGlvbiBmb3IgYSBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZTxPcHMgZXh0ZW5kcyBQYXJ0aWFsT3BlcmF0aW9uTWFwPihcbiAgbmFtZTogc3RyaW5nLFxuICBvcGVyYXRpb25zOiBPcHMsXG4pOiBTZXJ2aWNlRGVmaW5pdGlvbjxTaW1wbGlmeTxPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxPcHM+Pj4ge1xuICBjb25zdCBzZXJ2aWNlID0ge1xuICAgIG5hbWUsXG4gICAgb3BlcmF0aW9uczogbWFwS2V5VmFsdWVzKG9wZXJhdGlvbnMsIChrZXksIG9wOiBQYXJ0aWFsT3BlcmF0aW9uPGFueSwgYW55PikgPT4gKHtcbiAgICAgIC4uLm9wLFxuICAgICAgbmFtZTogb3AubmFtZSB8fCBrZXksXG4gICAgfSkpLFxuICB9IGFzIFNlcnZpY2VEZWZpbml0aW9uPE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+O1xuXG4gIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZSk7XG4gIHJldHVybiBzZXJ2aWNlO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhcyBwYXJ0IG9mIGEgc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb248SSwgTz4ob3A/OiBPcGVyYXRpb25PcHRpb25zPEksIE8+KTogUGFydGlhbE9wZXJhdGlvbjxJLCBPPiB7XG4gIHJldHVybiB7IC4uLm9wIH0gYXMgUGFydGlhbE9wZXJhdGlvbjxJLCBPPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIG9wZXJhdGlvbn0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbk9wdGlvbnM8X0ksIF9PPiB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBuYW1lZCBjb2xsZWN0aW9uIG9mIHBhcnRpYWwgb3BlcmF0aW9uIGhhbmRsZXJzLiBJbnB1dCBmb3IgdGhlIHtAbGluayBzZXJ2aWNlfSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRpYWxPcGVyYXRpb25NYXAgPSBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsT3BlcmF0aW9uPGFueSwgYW55Pj47XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgdHJhbnNmb3JtcyBhIHtAbGluayBQYXJ0aWFsT3BlcmF0aW9uTWFwfSBpbnRvIGFuIHtAbGluayBPcGVyYXRpb25NYXB9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8VCBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb248aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz5cbiAgICA6IG5ldmVyO1xufTtcblxuLyoqXG4gKiBBIHBhcnRpYWwge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgYW4gb3BlcmF0aW9uIGluIGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHtAbGluayBPcGVyYXRpb25EZWZpbml0aW9ufSBpcyB0aGF0IHRoZSBuYW1lIGlzIG9wdGlvbmFsLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgbmFtZT86IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuIiwiZXhwb3J0IHtcbiAgdHlwZSBTZXJ2aWNlRGVmaW5pdGlvbixcbiAgdHlwZSBPcGVyYXRpb25EZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbk1hcCxcbiAgdHlwZSBPcGVyYXRpb25JbnB1dCxcbiAgdHlwZSBPcGVyYXRpb25PdXRwdXQsXG4gIHR5cGUgT3BlcmF0aW9uS2V5LFxufSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcblxuZXhwb3J0IHtcbiAgc2VydmljZSxcbiAgb3BlcmF0aW9uLFxuICB0eXBlIE9wZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCxcbiAgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbCxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uLFxufSBmcm9tIFwiLi9oZWxwZXJzXCI7XG4iLCJleHBvcnQgZGVjbGFyZSBjb25zdCBpbnB1dEJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IGRlY2xhcmUgY29uc3Qgb3V0cHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIE5leHVzIHNlcnZpY2UgY29udHJhY3QsIGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgb3BlcmF0aW9ucy5cbiAqXG4gKiBDYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBieSB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlRGVmaW5pdGlvbjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvcGVyYXRpb25zOiBPcHM7XG59XG5cbi8qKlxuICogQW4gb3BlcmF0aW9uIGNvbnRyYWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBuYW1lLCBhbmQgaW5wdXQgYW5kIG91dHB1dCB0eXBlcyBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIFtpbnB1dEJyYW5kXTogSTtcbiAgW291dHB1dEJyYW5kXTogTztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucywgYXMgZGVmaW5lZCBieSBhIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXAgPSBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgYW55Pj47XG5cbi8qKlxuICogQSBtYXBwZWQgdHlwZSB0aGF0IGV4dHJhY3RzIHRoZSBpbnB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbklucHV0PFQ+ID0gVCBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248aW5mZXIgSSwgYW55PiA/IEkgOiBhbnk7XG5cbi8qKlxuICogQSBtYXBwZWQgdHlwZSB0aGF0IGV4dHJhY3RzIHRoZSBvdXRwdXQgdHlwZSBmcm9tIGFuIG9wZXJhdGlvbiBpbiBhIHNlcnZpY2UuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25PdXRwdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxhbnksIGluZmVyIE8+ID8gTyA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgYWxsIG9wZXJhdGlvbiBuYW1lcyBmcm9tIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbktleTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IFRbS10gZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgYW55PiA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogQ29uZmlybSB0aGF0IGEgc2VydmljZSBkZWZpbml0aW9uIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIHNlcnZpY2UgZGVmaW5pdGlvbiB0byB2YWxpZGF0ZS5cbiAqXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgaW52YWxpZC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNlcnZpY2VEZWZpbml0aW9uKHNlcnZpY2U6IFNlcnZpY2VEZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2Ygc2VydmljZS5uYW1lICE9PSBcInN0cmluZ1wiIHx8ICFzZXJ2aWNlLm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VydmljZSBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbcHJvcE5hbWUsIG9wZXJhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24ubmFtZTtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbk5hbWUgIT09IFwic3RyaW5nXCIgfHwgIW9wZXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9wZXJhdGlvbiBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLCBmb3IgcHJvcGVydHkgJyR7cHJvcE5hbWV9J2ApO1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9uTmFtZXMuaGFzKG9wZXJhdGlvbk5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBEdXBsaWNhdGUgb3BlcmF0aW9uIGRlZmluaXRpb24gZm9yIG5hbWU6ICcke29wZXJhdGlvbk5hbWV9J2ApO1xuICAgIH1cbiAgICBvcGVyYXRpb25OYW1lcy5hZGQob3BlcmF0aW9uTmFtZSk7XG4gIH1cbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8vIEhlbHBlcnMuXG5jb25zdCBzID0gMTAwMDtcbmNvbnN0IG0gPSBzICogNjA7XG5jb25zdCBoID0gbSAqIDYwO1xuY29uc3QgZCA9IGggKiAyNDtcbmNvbnN0IHcgPSBkICogNztcbmNvbnN0IHkgPSBkICogMzY1LjI1O1xuZnVuY3Rpb24gbXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucz8ubG9uZyA/IGZtdExvbmcodmFsdWUpIDogZm10U2hvcnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG51bWJlci4nKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpc0Vycm9yKGVycm9yKVxuICAgICAgICAgICAgPyBgJHtlcnJvci5tZXNzYWdlfS4gdmFsdWU9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgICAgICAgOiAnQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC4nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gICAgY29uc3QgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB1bml0ICR7dHlwZX0gd2FzIG1hdGNoZWQsIGJ1dCBubyBtYXRjaGluZyBjYXNlIGV4aXN0cy5gKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBtcztcbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gZCl9ZGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gaCl9aGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbSl9bWA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gcyl9c2A7XG4gICAgfVxuICAgIHJldHVybiBgJHttc31tc2A7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBgJHttc30gbXNgO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICAgIGNvbnN0IGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG4pfSAke25hbWV9JHtpc1BsdXJhbCA/ICdzJyA6ICcnfWA7XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgZXJyb3JzLlxuICovXG5mdW5jdGlvbiBpc0Vycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ21lc3NhZ2UnIGluIGVycm9yO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMDkgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzXG4gKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgV2lydHogLyBUaGUgbG9uZy5qcyBBdXRob3JzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8vIFdlYkFzc2VtYmx5IG9wdGltaXphdGlvbnMgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXG52YXIgd2FzbSA9IG51bGw7XG50cnkge1xuICB3YXNtID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKFxuICAgIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoXG4gICAgICBuZXcgVWludDhBcnJheShbXG4gICAgICAgIC8vIFxcMGFzbVxuICAgICAgICAwLCA5NywgMTE1LCAxMDksXG4gICAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgICAxLCAwLCAwLCAwLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJ0eXBlXCJcbiAgICAgICAgMSwgMTMsIDIsXG4gICAgICAgIC8vIDAsICgpID0+IGkzMlxuICAgICAgICA5NiwgMCwgMSwgMTI3LFxuICAgICAgICAvLyAxLCAoaTMyLCBpMzIsIGkzMiwgaTMyKSA9PiBpMzJcbiAgICAgICAgOTYsIDQsIDEyNywgMTI3LCAxMjcsIDEyNywgMSwgMTI3LFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJmdW5jdGlvblwiXG4gICAgICAgIDMsIDcsIDYsXG4gICAgICAgIC8vIDAsIHR5cGUgMFxuICAgICAgICAwLFxuICAgICAgICAvLyAxLCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gMiwgdHlwZSAxXG4gICAgICAgIDEsXG4gICAgICAgIC8vIDMsIHR5cGUgMVxuICAgICAgICAxLFxuICAgICAgICAvLyA0LCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gNSwgdHlwZSAxXG4gICAgICAgIDEsXG5cbiAgICAgICAgLy8gc2VjdGlvbiBcImdsb2JhbFwiXG4gICAgICAgIDYsIDYsIDEsXG4gICAgICAgIC8vIDAsIFwiaGlnaFwiLCBtdXRhYmxlIGkzMlxuICAgICAgICAxMjcsIDEsIDY1LCAwLCAxMSxcblxuICAgICAgICAvLyBzZWN0aW9uIFwiZXhwb3J0XCJcbiAgICAgICAgNywgNTAsIDYsXG4gICAgICAgIC8vIDAsIFwibXVsXCJcbiAgICAgICAgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSxcbiAgICAgICAgLy8gMSwgXCJkaXZfc1wiXG4gICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTUsIDAsIDIsXG4gICAgICAgIC8vIDIsIFwiZGl2X3VcIlxuICAgICAgICA1LCAxMDAsIDEwNSwgMTE4LCA5NSwgMTE3LCAwLCAzLFxuICAgICAgICAvLyAzLCBcInJlbV9zXCJcbiAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCxcbiAgICAgICAgLy8gNCwgXCJyZW1fdVwiXG4gICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTcsIDAsIDUsXG4gICAgICAgIC8vIDUsIFwiZ2V0X2hpZ2hcIlxuICAgICAgICA4LCAxMDMsIDEwMSwgMTE2LCA5NSwgMTA0LCAxMDUsIDEwMywgMTA0LCAwLCAwLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJjb2RlXCJcbiAgICAgICAgMTAsIDE5MSwgMSwgNixcbiAgICAgICAgLy8gMCwgXCJnZXRfaGlnaFwiXG4gICAgICAgIDQsIDAsIDM1LCAwLCAxMSxcbiAgICAgICAgLy8gMSwgXCJtdWxcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDIsIFwiZGl2X3NcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjcsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDMsIFwiZGl2X3VcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjgsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDQsIFwicmVtX3NcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDUsIFwicmVtX3VcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMzAsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICBdKSxcbiAgICApLFxuICAgIHt9LFxuICApLmV4cG9ydHM7XG59IGNhdGNoIHtcbiAgLy8gbm8gd2FzbSBzdXBwb3J0IDooXG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIsIGdpdmVuIGl0cyBsb3cgYW5kIGhpZ2ggMzIgYml0IHZhbHVlcyBhcyAqc2lnbmVkKiBpbnRlZ2Vycy5cbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxuICogQGV4cG9ydHMgTG9uZ1xuICogQGNsYXNzIEEgTG9uZyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaCBUaGUgaGlnaCAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gsIHVuc2lnbmVkKSB7XG4gIC8qKlxuICAgKiBUaGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLmxvdyA9IGxvdyB8IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcblxuICAvKipcbiAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XG59XG5cbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXG4vLyBXZSB1c2UgMzItYml0IHBpZWNlcyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyBvbiB3aGljaFxuLy8gSmF2YXNjcmlwdCBwZXJmb3JtcyBiaXQtb3BlcmF0aW9ucy4gIEZvciBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXG4vLyBtdWx0aXBsaWVkIHdpdGhpbiBKYXZhc2NyaXB0J3MgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBvdmVyZmxvd1xuLy8gb3IgY2hhbmdlIGluIHNpZ24uXG4vL1xuLy8gSW4gdGhlIGFsZ29yaXRobXMgYmVsb3csIHdlIGZyZXF1ZW50bHkgcmVkdWNlIHRoZSBuZWdhdGl2ZSBjYXNlIHRvIHRoZVxuLy8gcG9zaXRpdmUgY2FzZSBieSBuZWdhdGluZyB0aGUgaW5wdXQocykgYW5kIHRoZW4gcG9zdC1wcm9jZXNzaW5nIHRoZSByZXN1bHQuXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcbi8vICgtMl42MykgYmVjYXVzZSAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRSAoc2luY2UgMl42MyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXNcbi8vIGEgcG9zaXRpdmUgbnVtYmVyLCBpdCBvdmVyZmxvd3MgYmFjayBpbnRvIGEgbmVnYXRpdmUpLiAgTm90IGhhbmRsaW5nIHRoaXNcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cbi8vXG4vLyBDb21tb24gY29uc3RhbnQgdmFsdWVzIFpFUk8sIE9ORSwgTkVHX09ORSwgZXRjLiBhcmUgZGVmaW5lZCBiZWxvdyB0aGUgZnJvbSpcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXG5cbi8qKlxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAY29uc3RcbiAqIEBwcml2YXRlXG4gKi9cbkxvbmcucHJvdG90eXBlLl9faXNMb25nX187XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb25nLnByb3RvdHlwZSwgXCJfX2lzTG9uZ19fXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcbiAgcmV0dXJuIChvYmogJiYgb2JqW1wiX19pc0xvbmdfX1wiXSkgPT09IHRydWU7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlIG51bWJlclxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBjdHozMih2YWx1ZSkge1xuICB2YXIgYyA9IE1hdGguY2x6MzIodmFsdWUgJiAtdmFsdWUpO1xuICByZXR1cm4gdmFsdWUgPyAzMSAtIGMgOiBjO1xufVxuXG4vKipcbiAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgTG9uZy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXG4gKiBAdHlwZSB7IU9iamVjdH1cbiAqIEBpbm5lclxuICovXG52YXIgSU5UX0NBQ0hFID0ge307XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuXG4gKiBAdHlwZSB7IU9iamVjdH1cbiAqIEBpbm5lclxuICovXG52YXIgVUlOVF9DQUNIRSA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xuICBpZiAodW5zaWduZWQpIHtcbiAgICB2YWx1ZSA+Pj49IDA7XG4gICAgaWYgKChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpKSB7XG4gICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgfVxuICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAwLCB0cnVlKTtcbiAgICBpZiAoY2FjaGUpIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgfD0gMDtcbiAgICBpZiAoKGNhY2hlID0gLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcbiAgICAgIGNhY2hlZE9iaiA9IElOVF9DQUNIRVt2YWx1ZV07XG4gICAgICBpZiAoY2FjaGVkT2JqKSByZXR1cm4gY2FjaGVkT2JqO1xuICAgIH1cbiAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7XG4gICAgaWYgKGNhY2hlKSBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIDMyIGJpdCBpbnRlZ2VyIHZhbHVlLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tSW50ID0gZnJvbUludDtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICBpZiAodW5zaWduZWQpIHtcbiAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gVVpFUk87XG4gICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKSByZXR1cm4gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1BWF9WQUxVRTtcbiAgfVxuICBpZiAodmFsdWUgPCAwKSByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgIHZhbHVlICUgVFdPX1BXUl8zMl9EQkwgfCAwLFxuICAgICh2YWx1ZSAvIFRXT19QV1JfMzJfREJMKSB8IDAsXG4gICAgdW5zaWduZWQsXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZSwgcHJvdmlkZWQgdGhhdCBpdCBpcyBhIGZpbml0ZSBudW1iZXIuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21OdW1iZXIgPSBmcm9tTnVtYmVyO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgNjQgYml0IGludGVnZXIgdGhhdCBjb21lcyBieSBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsb3cgYW5kIGhpZ2ggYml0cy4gRWFjaCBpc1xuICogIGFzc3VtZWQgdG8gdXNlIDMyIGJpdHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzIFRoZSBsb3cgMzIgYml0c1xuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzIFRoZSBoaWdoIDMyIGJpdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQGlubmVyXG4gKi9cbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXhcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSB0aHJvdyBFcnJvcihcImVtcHR5IHN0cmluZ1wiKTtcbiAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XG4gICAgcmFkaXggPSB1bnNpZ25lZDtcbiAgICB1bnNpZ25lZCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgfVxuICBpZiAoXG4gICAgc3RyID09PSBcIk5hTlwiIHx8XG4gICAgc3RyID09PSBcIkluZmluaXR5XCIgfHxcbiAgICBzdHIgPT09IFwiK0luZmluaXR5XCIgfHxcbiAgICBzdHIgPT09IFwiLUluZmluaXR5XCJcbiAgKVxuICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG5cbiAgdmFyIHA7XG4gIGlmICgocCA9IHN0ci5pbmRleE9mKFwiLVwiKSkgPiAwKSB0aHJvdyBFcnJvcihcImludGVyaW9yIGh5cGhlblwiKTtcbiAgZWxzZSBpZiAocCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7XG4gIH1cblxuICAvLyBEbyBzZXZlcmFsICg4KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7XG5cbiAgdmFyIHJlc3VsdCA9IFpFUk87XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgdmFyIHNpemUgPSBNYXRoLm1pbig4LCBzdHIubGVuZ3RoIC0gaSksXG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcoaSwgaSArIHNpemUpLCByYWRpeCk7XG4gICAgaWYgKHNpemUgPCA4KSB7XG4gICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xuICAgIH1cbiAgfVxuICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcbiAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggVGhlIHJhZGl4IGluIHdoaWNoIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tVmFsdWUodmFsLCB1bnNpZ25lZCkge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGZyb21OdW1iZXIodmFsLCB1bnNpZ25lZCk7XG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcbiAgLy8gVGhyb3dzIGZvciBub24tb2JqZWN0cywgY29udmVydHMgbm9uLWluc3RhbmNlb2YgTG9uZzpcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgIHZhbC5sb3csXG4gICAgdmFsLmhpZ2gsXG4gICAgdHlwZW9mIHVuc2lnbmVkID09PSBcImJvb2xlYW5cIiA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkLFxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbCBWYWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nLmZyb21WYWx1ZSA9IGZyb21WYWx1ZTtcblxuLy8gTk9URTogdGhlIGNvbXBpbGVyIHNob3VsZCBpbmxpbmUgdGhlc2UgY29uc3RhbnQgdmFsdWVzIGJlbG93IGFuZCB0aGVuIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMsIHNvIHRoZXJlIHNob3VsZCBiZVxuLy8gbm8gcnVudGltZSBwZW5hbHR5IGZvciB0aGVzZS5cblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMzJfREJMID0gVFdPX1BXUl8xNl9EQkwgKiBUV09fUFdSXzE2X0RCTDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBjb25zdFxuICogQGlubmVyXG4gKi9cbnZhciBUV09fUFdSXzI0ID0gZnJvbUludChUV09fUFdSXzI0X0RCTCk7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBaRVJPID0gZnJvbUludCgwKTtcblxuLyoqXG4gKiBTaWduZWQgemVyby5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5aRVJPID0gWkVSTztcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIFVaRVJPID0gZnJvbUludCgwLCB0cnVlKTtcblxuLyoqXG4gKiBVbnNpZ25lZCB6ZXJvLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlVaRVJPID0gVVpFUk87XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBPTkUgPSBmcm9tSW50KDEpO1xuXG4vKipcbiAqIFNpZ25lZCBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuT05FID0gT05FO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgVU9ORSA9IGZyb21JbnQoMSwgdHJ1ZSk7XG5cbi8qKlxuICogVW5zaWduZWQgb25lLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlVPTkUgPSBVT05FO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgTkVHX09ORSA9IGZyb21JbnQoLTEpO1xuXG4vKipcbiAqIFNpZ25lZCBuZWdhdGl2ZSBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuTkVHX09ORSA9IE5FR19PTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNQVhfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHg3ZmZmZmZmZiB8IDAsIGZhbHNlKTtcblxuLyoqXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHhmZmZmZmZmZiB8IDAsIHRydWUpO1xuXG4vKipcbiAqIE1heGltdW0gdW5zaWduZWQgdmFsdWUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMHg4MDAwMDAwMCB8IDAsIGZhbHNlKTtcblxuLyoqXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XG5cbi8qKlxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXG4gKiBAaW5uZXJcbiAqL1xudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xuICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IHRoaXMubG93ID4+PiAwIDogdGhpcy5sb3c7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xuICBpZiAodGhpcy51bnNpZ25lZClcbiAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG4gIHJldHVybiB0aGlzLmhpZ2ggKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggUmFkaXggKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBvdmVycmlkZVxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYHJhZGl4YCBpcyBvdXQgb2YgcmFuZ2VcbiAqL1xuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XG4gIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgdGhyb3cgUmFuZ2VFcnJvcihcInJhZGl4XCIpO1xuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIFwiMFwiO1xuICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgTG9uZyB2YWx1ZSBiZWZvcmUgaXQgY2FuIGJlIG5lZ2F0ZWQsIHNvIHdlIHJlbW92ZVxuICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxuICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLFxuICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxuICAgICAgICByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTtcbiAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcbiAgICB9IGVsc2UgcmV0dXJuIFwiLVwiICsgdGhpcy5uZWcoKS50b1N0cmluZyhyYWRpeCk7XG4gIH1cblxuICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA2KSwgdGhpcy51bnNpZ25lZCksXG4gICAgcmVtID0gdGhpcztcbiAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHJlbURpdiA9IHJlbS5kaXYocmFkaXhUb1Bvd2VyKSxcbiAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxuICAgICAgZGlnaXRzID0gaW50dmFsLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZW0gPSByZW1EaXY7XG4gICAgaWYgKHJlbS5pc1plcm8oKSkgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNikgZGlnaXRzID0gXCIwXCIgKyBkaWdpdHM7XG4gICAgICByZXN1bHQgPSBcIlwiICsgZGlnaXRzICsgcmVzdWx0O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBoaWdoIGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xuICByZXR1cm4gdGhpcy5oaWdoO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGhpZ2ggYml0c1xuICovXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xuICByZXR1cm4gdGhpcy5oaWdoID4+PiAwO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGxvdyBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XG4gIHJldHVybiB0aGlzLmxvdztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGxvdyBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xuICByZXR1cm4gdGhpcy5sb3cgPj4+IDA7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSlcbiAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcbiAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XG4gIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSkgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKSBicmVhaztcbiAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcgY2FuIGJlIHNhZmVseSByZXByZXNlbnRlZCBhcyBhIEphdmFTY3JpcHQgbnVtYmVyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNTYWZlSW50ZWdlciA9IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIoKSB7XG4gIC8vIDJeNTMtMSBpcyB0aGUgbWF4aW11bSBzYWZlIHZhbHVlXG4gIHZhciB0b3AxMUJpdHMgPSB0aGlzLmhpZ2ggPj4gMjE7XG4gIC8vIFswLCAyXjUzLTFdXG4gIGlmICghdG9wMTFCaXRzKSByZXR1cm4gdHJ1ZTtcbiAgLy8gPiAyXjUzLTFcbiAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gWy0yXjUzLCAtMV0gZXhjZXB0IC0yXjUzXG4gIHJldHVybiB0b3AxMUJpdHMgPT09IC0xICYmICEodGhpcy5sb3cgPT09IDAgJiYgdGhpcy5oaWdoID09PSAtMHgyMDAwMDApO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gMCAmJiB0aGlzLmxvdyA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XG4gIHJldHVybiAhdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPCAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZSBvciB6ZXJvLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7XG4gIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBvZGQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkge1xuICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4oKSB7XG4gIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIGlmIChcbiAgICB0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJlxuICAgIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiZcbiAgICBvdGhlci5oaWdoID4+PiAzMSA9PT0gMVxuICApXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcbiAgcmV0dXJuICF0aGlzLmVxKC8qIHZhbGlkYXRlcyAqLyBvdGhlcik7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW59LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPiAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPj0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3RlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ2UgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIDA7XG4gIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksXG4gICAgb3RoZXJOZWcgPSBvdGhlci5pc05lZ2F0aXZlKCk7XG4gIGlmICh0aGlzTmVnICYmICFvdGhlck5lZykgcmV0dXJuIC0xO1xuICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpIHJldHVybiAxO1xuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXG4gIGlmICghdGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XG4gIC8vIEJvdGggYXJlIHBvc2l0aXZlIGlmIGF0IGxlYXN0IG9uZSBpcyB1bnNpZ25lZFxuICByZXR1cm4gb3RoZXIuaGlnaCA+Pj4gMCA+IHRoaXMuaGlnaCA+Pj4gMCB8fFxuICAgIChvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgb3RoZXIubG93ID4+PiAwID4gdGhpcy5sb3cgPj4+IDApXG4gICAgPyAtMVxuICAgIDogMTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcCA9IExvbmdQcm90b3R5cGUuY29tcGFyZTtcblxuLyoqXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XG4gIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBNSU5fVkFMVUU7XG4gIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xufTtcblxuLyoqXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25lZ2F0ZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUubmVnID0gTG9uZ1Byb3RvdHlwZS5uZWdhdGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gU3VtXG4gKi9cbkxvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xuICBpZiAoIWlzTG9uZyhhZGRlbmQpKSBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTtcblxuICAvLyBEaXZpZGUgZWFjaCBudW1iZXIgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBzdW0gdGhlIGNodW5rcy5cblxuICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuXG4gIHZhciBiNDggPSBhZGRlbmQuaGlnaCA+Pj4gMTY7XG4gIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGIxNiA9IGFkZGVuZC5sb3cgPj4+IDE2O1xuICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDB4ZmZmZjtcblxuICB2YXIgYzQ4ID0gMCxcbiAgICBjMzIgPSAwLFxuICAgIGMxNiA9IDAsXG4gICAgYzAwID0gMDtcbiAgYzAwICs9IGEwMCArIGIwMDtcbiAgYzE2ICs9IGMwMCA+Pj4gMTY7XG4gIGMwMCAmPSAweGZmZmY7XG4gIGMxNiArPSBhMTYgKyBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTMyICsgYjMyO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzQ4ICs9IGE0OCArIGI0ODtcbiAgYzQ4ICY9IDB4ZmZmZjtcbiAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcbiAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XG4gIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxuICovXG5Mb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICovXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXM7XG4gIGlmICghaXNMb25nKG11bHRpcGxpZXIpKSBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xuXG4gIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICBpZiAod2FzbSkge1xuICAgIHZhciBsb3cgPSB3YXNtW1wibXVsXCJdKHRoaXMubG93LCB0aGlzLmhpZ2gsIG11bHRpcGxpZXIubG93LCBtdWx0aXBsaWVyLmhpZ2gpO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuXG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xuICB9IGVsc2UgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XG5cbiAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxuICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSAqIG11bHRpcGxpZXIudG9OdW1iZXIoKSwgdGhpcy51bnNpZ25lZCk7XG5cbiAgLy8gRGl2aWRlIGVhY2ggbG9uZyBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIGFkZCB1cCA0eDQgcHJvZHVjdHMuXG4gIC8vIFdlIGNhbiBza2lwIHByb2R1Y3RzIHRoYXQgd291bGQgb3ZlcmZsb3cuXG5cbiAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4ZmZmZjtcblxuICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcbiAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjtcbiAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhmZmZmO1xuXG4gIHZhciBjNDggPSAwLFxuICAgIGMzMiA9IDAsXG4gICAgYzE2ID0gMCxcbiAgICBjMDAgPSAwO1xuICBjMDAgKz0gYTAwICogYjAwO1xuICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgYzAwICY9IDB4ZmZmZjtcbiAgYzE2ICs9IGExNiAqIGIwMDtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweGZmZmY7XG4gIGMxNiArPSBhMDAgKiBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTMyICogYjAwO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzMyICs9IGExNiAqIGIxNjtcbiAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gIGMzMiAmPSAweGZmZmY7XG4gIGMzMiArPSBhMDAgKiBiMzI7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhmZmZmO1xuICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xuICBjNDggJj0gMHhmZmZmO1xuICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICovXG5Mb25nUHJvdG90eXBlLm11bCA9IExvbmdQcm90b3R5cGUubXVsdGlwbHk7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGUgcmVzdWx0IGlzIHNpZ25lZCBpZiB0aGlzIExvbmcgaXMgc2lnbmVkIG9yXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gKi9cbkxvbmdQcm90b3R5cGUuZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGRpdmlzb3IpIHtcbiAgaWYgKCFpc0xvbmcoZGl2aXNvcikpIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG4gIGlmIChkaXZpc29yLmlzWmVybygpKSB0aHJvdyBFcnJvcihcImRpdmlzaW9uIGJ5IHplcm9cIik7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XG4gICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxuICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgaWYgKFxuICAgICAgIXRoaXMudW5zaWduZWQgJiZcbiAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcbiAgICAgIGRpdmlzb3IubG93ID09PSAtMSAmJlxuICAgICAgZGl2aXNvci5oaWdoID09PSAtMVxuICAgICkge1xuICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJkaXZfdVwiXSA6IHdhc21bXCJkaXZfc1wiXSkoXG4gICAgICB0aGlzLmxvdyxcbiAgICAgIHRoaXMuaGlnaCxcbiAgICAgIGRpdmlzb3IubG93LFxuICAgICAgZGl2aXNvci5oaWdoLFxuICAgICk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICB9XG5cbiAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICB2YXIgYXBwcm94LCByZW0sIHJlcztcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XG4gICAgLy8gVGhpcyBzZWN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHNpZ25lZCBsb25ncyBhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZVxuICAgIC8vIGNsb3N1cmUgbGlicmFyeSBhcyBhIHdob2xlLlxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSlcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcbiAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE9ORTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXG4gICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpO1xuICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpO1xuICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XG4gICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW0gPSB0aGlzLnN1YihkaXZpc29yLm11bChhcHByb3gpKTtcbiAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTtcbiAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XG4gICAgcmVzID0gWkVSTztcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgYWxnb3JpdGhtIGJlbG93IGhhcyBub3QgYmVlbiBtYWRlIGZvciB1bnNpZ25lZCBsb25ncy4gSXQncyB0aGVyZWZvcmVcbiAgICAvLyByZXF1aXJlZCB0byB0YWtlIHNwZWNpYWwgY2FyZSBvZiB0aGUgTVNCIHByaW9yIHRvIHJ1bm5pbmcgaXQuXG4gICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKSBkaXZpc29yID0gZGl2aXNvci50b1Vuc2lnbmVkKCk7XG4gICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpIHJldHVybiBVWkVSTztcbiAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKVxuICAgICAgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcbiAgICAgIHJldHVybiBVT05FO1xuICAgIHJlcyA9IFVaRVJPO1xuICB9XG5cbiAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcbiAgLy8gZmxvYXRpbmctcG9pbnQgdGhhdCBhcHByb3hpbWF0ZXMgcmVtYWluZGVyIC8gb3RoZXIgKmZyb20gYmVsb3cqLCBhZGQgdGhpc1xuICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XG4gIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcbiAgLy8gcmVtYWluZGVyIG5ldmVyIGJlY29tZXMgbmVnYXRpdmUuXG4gIHJlbSA9IHRoaXM7XG4gIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XG4gICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxuICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxuICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcblxuICAgIC8vIFdlIHdpbGwgdHdlYWsgdGhlIGFwcHJveGltYXRlIHJlc3VsdCBieSBjaGFuZ2luZyBpdCBpbiB0aGUgNDgtdGggZGlnaXQgb3JcbiAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXG4gICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSxcbiAgICAgIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcbiAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkge1xuICAgICAgYXBwcm94IC09IGRlbHRhO1xuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB9XG5cbiAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcbiAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cbiAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKSBhcHByb3hSZXMgPSBPTkU7XG5cbiAgICByZXMgPSByZXMuYWRkKGFwcHJveFJlcyk7XG4gICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAqL1xuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5tb2R1bG8gPSBmdW5jdGlvbiBtb2R1bG8oZGl2aXNvcikge1xuICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcblxuICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgaWYgKHdhc20pIHtcbiAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wicmVtX3VcIl0gOiB3YXNtW1wicmVtX3NcIl0pKFxuICAgICAgdGhpcy5sb3csXG4gICAgICB0aGlzLmhpZ2gsXG4gICAgICBkaXZpc29yLmxvdyxcbiAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICApO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gKi9cbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICovXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XG4gIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudExlYWRpbmdaZXJvcygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA/IE1hdGguY2x6MzIodGhpcy5oaWdoKSA6IE1hdGguY2x6MzIodGhpcy5sb3cpICsgMzI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudExlYWRpbmdaZXJvc30uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IW51bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5jbHogPSBMb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zO1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRUcmFpbGluZ1plcm9zKCkge1xuICByZXR1cm4gdGhpcy5sb3cgPyBjdHozMih0aGlzLmxvdykgOiBjdHozMih0aGlzLmhpZ2gpICsgMzI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRUcmFpbGluZ1plcm9zfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ31cbiAqIEByZXR1cm5zIHshbnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLmN0eiA9IExvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgQU5EIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyB8IG90aGVyLmxvdywgdGhpcy5oaWdoIHwgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyBeIG90aGVyLmxvdywgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgIHRoaXMubG93IDw8IG51bUJpdHMsXG4gICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiAoMzIgLSBudW1CaXRzKSksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIGVsc2UgcmV0dXJuIGZyb21CaXRzKDAsIHRoaXMubG93IDw8IChudW1CaXRzIC0gMzIpLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdExlZnR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0KG51bUJpdHMpIHtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksXG4gICAgICB0aGlzLmhpZ2ggPj4gbnVtQml0cyxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgZWxzZVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgIHRoaXMuaGlnaCA+PiAobnVtQml0cyAtIDMyKSxcbiAgICAgIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLFxuICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0fS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHRVbnNpZ25lZChudW1CaXRzKSB7XG4gIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgIHRoaXMuaGlnaCA+Pj4gbnVtQml0cyxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCAwLCB0aGlzLnVuc2lnbmVkKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+Pj4gKG51bUJpdHMgLSAzMiksIDAsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hydSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaHJfdSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChudW1CaXRzKSB7XG4gIHZhciBiO1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIH1cbiAgbnVtQml0cyAtPSAzMjtcbiAgYiA9IDMyIC0gbnVtQml0cztcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+IGIpLFxuICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgIHRoaXMudW5zaWduZWQsXG4gICk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZUxlZnR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RsID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUucm90YXRlUmlnaHQgPSBmdW5jdGlvbiByb3RhdGVSaWdodChudW1CaXRzKSB7XG4gIHZhciBiO1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIH1cbiAgbnVtQml0cyAtPSAzMjtcbiAgYiA9IDMyIC0gbnVtQml0cztcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgIHRoaXMudW5zaWduZWQsXG4gICk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVSaWdodH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnJvdHIgPSBMb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBzaWduZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9IFNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9TaWduZWQgPSBmdW5jdGlvbiB0b1NpZ25lZCgpIHtcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7XG4gIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXG4gKi9cbkxvbmdQcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMobGUpIHtcbiAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKi9cbkxvbmdQcm90b3R5cGUudG9CeXRlc0xFID0gZnVuY3Rpb24gdG9CeXRlc0xFKCkge1xuICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgbG8gPSB0aGlzLmxvdztcbiAgcmV0dXJuIFtcbiAgICBsbyAmIDB4ZmYsXG4gICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgKGxvID4+PiAxNikgJiAweGZmLFxuICAgIGxvID4+PiAyNCxcbiAgICBoaSAmIDB4ZmYsXG4gICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgIGhpID4+PiAyNCxcbiAgXTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7XG4gIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICBsbyA9IHRoaXMubG93O1xuICByZXR1cm4gW1xuICAgIGhpID4+PiAyNCxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgaGkgJiAweGZmLFxuICAgIGxvID4+PiAyNCxcbiAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgbG8gJiAweGZmLFxuICBdO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbUJ5dGVzID0gZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzLCB1bnNpZ25lZCwgbGUpIHtcbiAgcmV0dXJuIGxlXG4gICAgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZClcbiAgICA6IExvbmcuZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tQnl0ZXNMRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkge1xuICByZXR1cm4gbmV3IExvbmcoXG4gICAgYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkgfCAoYnl0ZXNbMl0gPDwgMTYpIHwgKGJ5dGVzWzNdIDw8IDI0KSxcbiAgICBieXRlc1s0XSB8IChieXRlc1s1XSA8PCA4KSB8IChieXRlc1s2XSA8PCAxNikgfCAoYnl0ZXNbN10gPDwgMjQpLFxuICAgIHVuc2lnbmVkLFxuICApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhcbiAgICAoYnl0ZXNbNF0gPDwgMjQpIHwgKGJ5dGVzWzVdIDw8IDE2KSB8IChieXRlc1s2XSA8PCA4KSB8IGJ5dGVzWzddLFxuICAgIChieXRlc1swXSA8PCAyNCkgfCAoYnl0ZXNbMV0gPDwgMTYpIHwgKGJ5dGVzWzJdIDw8IDgpIHwgYnl0ZXNbM10sXG4gICAgdW5zaWduZWQsXG4gICk7XG59O1xuXG4vLyBTdXBwb3J0IGNvbnZlcnNpb24gdG8vZnJvbSBCaWdJbnQgd2hlcmUgYXZhaWxhYmxlXG5pZiAodHlwZW9mIEJpZ0ludCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJpZyBpbnRlZ2VyLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBiaWcgaW50ZWdlciB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgKi9cbiAgTG9uZy5mcm9tQmlnSW50ID0gZnVuY3Rpb24gZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICB2YXIgbG93Qml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSkpO1xuICAgIHZhciBoaWdoQml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSA+PiBCaWdJbnQoMzIpKSk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGVcbiAgTG9uZy5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWVXaXRoQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBMb25nLmZyb21CaWdJbnQodmFsdWUsIHVuc2lnbmVkKTtcbiAgICByZXR1cm4gZnJvbVZhbHVlKHZhbHVlLCB1bnNpZ25lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGl0cyBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAgICogQHRoaXMgeyFMb25nfVxuICAgKiBAcmV0dXJucyB7YmlnaW50fVxuICAgKi9cbiAgTG9uZ1Byb3RvdHlwZS50b0JpZ0ludCA9IGZ1bmN0aW9uIHRvQmlnSW50KCkge1xuICAgIHZhciBsb3dCaWdJbnQgPSBCaWdJbnQodGhpcy5sb3cgPj4+IDApO1xuICAgIHZhciBoaWdoQmlnSW50ID0gQmlnSW50KHRoaXMudW5zaWduZWQgPyB0aGlzLmhpZ2ggPj4+IDAgOiB0aGlzLmhpZ2gpO1xuICAgIHJldHVybiAoaGlnaEJpZ0ludCA8PCBCaWdJbnQoMzIpKSB8IGxvd0JpZ0ludDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9uZztcbiIsImV4cG9ydCBjb25zdCBTVFVDS19KT0JfVEhSRVNIT0xEX1NFQ09ORFMgPSAxODA7XG4iLCJleHBvcnQge3N0dWNrSm9iRGV0ZWN0b3J9IGZyb20gJy4vc3R1Y2stam9iLWRldGVjdG9yLmpzJztcbiIsImltcG9ydCB7bG9nLCBwcm94eUFjdGl2aXRpZXN9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbmltcG9ydCB7U1RVQ0tfSk9CX1RIUkVTSE9MRF9TRUNPTkRTfSBmcm9tICcjY29yZS9tYWludGVuYW5jZS1wb2xpY3kuanMnO1xuXG5pbXBvcnQgdHlwZSB7Y3JlYXRlUnVubmVyc01haW50ZW5hbmNlQWN0aXZpdGllc30gZnJvbSAnLi4vYWN0aXZpdGllcy9pbmRleC5qcyc7XG5cbmNvbnN0IHtcbiAgZGVsZXRlRXhwaXJlZEVwaGVtZXJhbFJlZ2lzdHJhdGlvblRva2Vuc0FjdGl2aXR5LFxuICBkZWxldGVFeHBpcmVkUmVzZXJ2YXRpb25zQWN0aXZpdHksXG4gIGRlbGV0ZUV4cGlyZWRSdW5uZXJTZXNzaW9uc0FjdGl2aXR5LFxuICBkZXRlY3RBbmRFeHBpcmVTdHVja0pvYnNBY3Rpdml0eSxcbiAgcmVhcFN0YWxlUHJvdmlzaW9uZWRSdW5uZXJzQWN0aXZpdHksXG59ID0gcHJveHlBY3Rpdml0aWVzPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJ1bm5lcnNNYWludGVuYW5jZUFjdGl2aXRpZXM+Pih7XG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc2MHMnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHVja0pvYkRldGVjdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHtkZWxldGVkfSA9IGF3YWl0IGRlbGV0ZUV4cGlyZWRSZXNlcnZhdGlvbnNBY3Rpdml0eSgpO1xuICAgIGlmIChkZWxldGVkID4gMCkge1xuICAgICAgbG9nLmluZm8oJ1N0dWNrLWpvYiBkZXRlY3RvciBkZWxldGVkIGV4cGlyZWQgcnVubmVyIHJlc2VydmF0aW9ucycsIHtkZWxldGVkfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdTdHVjay1qb2IgZGV0ZWN0b3IgZmFpbGVkIHRvIGRlbGV0ZSBleHBpcmVkIHJ1bm5lciByZXNlcnZhdGlvbnMnLCB7XG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7ZGVsZXRlZH0gPSBhd2FpdCBkZWxldGVFeHBpcmVkUnVubmVyU2Vzc2lvbnNBY3Rpdml0eSgpO1xuICAgIGlmIChkZWxldGVkID4gMCkge1xuICAgICAgbG9nLmluZm8oJ1N0dWNrLWpvYiBkZXRlY3RvciBkZWxldGVkIGV4cGlyZWQgcnVubmVyIHNlc3Npb25zJywge2RlbGV0ZWR9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ1N0dWNrLWpvYiBkZXRlY3RvciBmYWlsZWQgdG8gZGVsZXRlIGV4cGlyZWQgcnVubmVyIHNlc3Npb25zJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qge2RlbGV0ZWR9ID0gYXdhaXQgZGVsZXRlRXhwaXJlZEVwaGVtZXJhbFJlZ2lzdHJhdGlvblRva2Vuc0FjdGl2aXR5KCk7XG4gICAgaWYgKGRlbGV0ZWQgPiAwKSB7XG4gICAgICBsb2cuaW5mbygnU3R1Y2stam9iIGRldGVjdG9yIGRlbGV0ZWQgZXhwaXJlZCBlcGhlbWVyYWwgcmVnaXN0cmF0aW9uIHRva2VucycsIHtkZWxldGVkfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdTdHVjay1qb2IgZGV0ZWN0b3IgZmFpbGVkIHRvIGRlbGV0ZSBleHBpcmVkIGVwaGVtZXJhbCByZWdpc3RyYXRpb24gdG9rZW5zJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHtleHBpcmVkfSA9IGF3YWl0IGRldGVjdEFuZEV4cGlyZVN0dWNrSm9ic0FjdGl2aXR5KHtcbiAgICB0aHJlc2hvbGRTZWNvbmRzOiBTVFVDS19KT0JfVEhSRVNIT0xEX1NFQ09ORFMsXG4gIH0pO1xuICBpZiAoZXhwaXJlZCA+IDApIHtcbiAgICBsb2cuaW5mbygnU3R1Y2stam9iIGRldGVjdG9yIGV4cGlyZWQgam9iIGxlYXNlcycsIHtcbiAgICAgIGV4cGlyZWQsXG4gICAgICB0aHJlc2hvbGRTZWNvbmRzOiBTVFVDS19KT0JfVEhSRVNIT0xEX1NFQ09ORFMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7cmVhcGVkLCByZXNlcnZhdGlvbnNSZWxlYXNlZH0gPSBhd2FpdCByZWFwU3RhbGVQcm92aXNpb25lZFJ1bm5lcnNBY3Rpdml0eSgpO1xuICBpZiAocmVhcGVkID4gMCkge1xuICAgIGxvZy5pbmZvKCdTdHVjay1qb2IgZGV0ZWN0b3IgcmVhcGVkIHN0YWxlIHByb3Zpc2lvbmVkIHJ1bm5lcnMnLCB7XG4gICAgICByZWFwZWQsXG4gICAgICByZXNlcnZhdGlvbnNSZWxlYXNlZCxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIlxuY29uc3QgYXBpID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL3dvcmtlci1pbnRlcmZhY2UuanMnKTtcbmV4cG9ydHMuYXBpID0gYXBpO1xuXG5jb25zdCB7IG92ZXJyaWRlR2xvYmFscyB9ID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL2dsb2JhbC1vdmVycmlkZXMuanMnKTtcbm92ZXJyaWRlR2xvYmFscygpO1xuXG5leHBvcnRzLnByZWxvYWRNb2R1bGVzID0gZnVuY3Rpb24gcHJlbG9hZE1vZHVsZXMoKSB7XG5cbn1cblxuZXhwb3J0cy5pbXBvcnRXb3JrZmxvd3MgPSBmdW5jdGlvbiBpbXBvcnRXb3JrZmxvd3MoKSB7XG4gIHJldHVybiByZXF1aXJlKC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbGlicy9hcGkvcnVubmVycy9kaXN0L3RlbXBvcmFsL3dvcmtmbG93cy9pbmRleC5qc1wiKTtcbn1cblxuZXhwb3J0cy5pbXBvcnRJbnRlcmNlcHRvcnMgPSBmdW5jdGlvbiBpbXBvcnRJbnRlcmNlcHRvcnMoKSB7XG4gIHJldHVybiBbXG4gICAgXG4gIF07XG59XG4iXSwibmFtZXMiOlsiU1RVQ0tfSk9CX1RIUkVTSE9MRF9TRUNPTkRTIiwic3R1Y2tKb2JEZXRlY3RvciIsImxvZyIsInByb3h5QWN0aXZpdGllcyIsImRlbGV0ZUV4cGlyZWRFcGhlbWVyYWxSZWdpc3RyYXRpb25Ub2tlbnNBY3Rpdml0eSIsImRlbGV0ZUV4cGlyZWRSZXNlcnZhdGlvbnNBY3Rpdml0eSIsImRlbGV0ZUV4cGlyZWRSdW5uZXJTZXNzaW9uc0FjdGl2aXR5IiwiZGV0ZWN0QW5kRXhwaXJlU3R1Y2tKb2JzQWN0aXZpdHkiLCJyZWFwU3RhbGVQcm92aXNpb25lZFJ1bm5lcnNBY3Rpdml0eSIsInN0YXJ0VG9DbG9zZVRpbWVvdXQiLCJkZWxldGVkIiwiaW5mbyIsImVycm9yIiwid2FybiIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImV4cGlyZWQiLCJ0aHJlc2hvbGRTZWNvbmRzIiwicmVhcGVkIiwicmVzZXJ2YXRpb25zUmVsZWFzZWQiXSwic291cmNlUm9vdCI6IiJ9
11426
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuRCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUM5RixJQUFJLENB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OztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QVksbUJBQU8sQ0FBQyx1S0FBOEM7QUFDbEUsV0FBVzs7QUFFWCxRQUFRLGtCQUFrQixFQUFFLG1CQUFPLENBQUMsdUtBQThDO0FBQ2xGOztBQUVBLHNCQUFzQjs7QUFFdEI7O0FBRUEsdUJBQXVCO0FBQ3ZCLFNBQVMsbUJBQU8sNEJBQTRCLDhFQUFxRjtBQUNqSTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1jYW5jZWxsYXRpb24tZGV0YWlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnRpbnVlLWFzLW5ldy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvZGF0YS1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvbnZlcnRlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvdHlwZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZGVwcmVjYXRlZC10aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2VuY29kaW5nLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2Vycm9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9mYWlsdXJlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmZhY2VzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvb2JqZWN0cy1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2xvZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ByaW9yaXR5LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3Jlc2VydmVkLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3JldHJ5LXBvbGljeS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3R5cGUtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy91c2VyLW1ldGFkYXRhLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LWVudW0udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdmVyc2lvbmluZy1pbnRlbnQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2VyLWRlcGxveW1lbnRzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZmxvdy1oYW5kbGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvYWxlYS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvY2FuY2VsbGF0aW9uLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9jdXJyZW50LXJhbmRvbS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZXJyb3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9mbGFncy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLWF0dHJpYnV0ZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2dsb2JhbC1vdmVycmlkZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmNlcHRvci1jb21wb3NpdGlvbi50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJjZXB0b3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmZhY2VzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcm5hbHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2xvZ3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL21ldHJpY3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL25leHVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9wa2cudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3JhbmRvbS1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9yYW5kb20tc3RyZWFtLXNlZWQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3JhbmRvbS1zdHJlYW1zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9zaW5rcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc3RhY2staGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdHJpZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdXBkYXRlLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZXItaW50ZXJmYWNlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZmxvdy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9oYW5kbGVyLWVycm9yLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL29wZXJhdGlvbi1lcnJvci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL29wZXJhdGlvbi1oYW5kbGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9zZXJ2aWNlLWhhbmRsZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL29iamVjdC11dGlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2Uvc2VydmljZS1kZWZpbml0aW9uLnRzIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX2ZhaWx1cmVfY29udmVydGVyIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX3BheWxvYWRfY29udmVydGVyIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9tc0AzLjAuMC1jYW5hcnkuMS9ub2RlX21vZHVsZXMvbXMvZGlzdC9pbmRleC5tanMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL2xvbmdANS4zLjIvbm9kZV9tb2R1bGVzL2xvbmcvaW5kZXguanMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbGlicy9hcGkvcnVubmVycy9zcmMvY29yZS9tYWludGVuYW5jZS1wb2xpY3kudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbGlicy9hcGkvcnVubmVycy9zcmMvdGVtcG9yYWwvd29ya2Zsb3dzL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL3J1bm5lcnMvc3JjL3RlbXBvcmFsL3dvcmtmbG93cy9zdHVjay1qb2ItZGV0ZWN0b3IudHMiLCJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0IiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL3J1bm5lcnMvZGlzdC90ZW1wb3JhbC93b3JrZmxvd3MvaW5kZXgtYXV0b2dlbmVyYXRlZC1lbnRyeXBvaW50LmNqcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc0hvbGRlciB7XG4gIGRldGFpbHM/OiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzT3B0aW9ucyB7XG4gIG5vdEZvdW5kPzogYm9vbGVhbjtcbiAgY2FuY2VsUmVxdWVzdGVkPzogYm9vbGVhbjtcbiAgcGF1c2VkPzogYm9vbGVhbjtcbiAgdGltZWRPdXQ/OiBib29sZWFuO1xuICB3b3JrZXJTaHV0ZG93bj86IGJvb2xlYW47XG4gIHJlc2V0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVhc29ucyBmb3IgdGhlIGFjdGl2aXR5J3MgY2FuY2VsbGF0aW9uLiBDYW5jZWxsYXRpb24gZGV0YWlscyBhcmUgc2V0IG9uY2UgYW5kIGRvIG5vdCBjaGFuZ2Ugb25jZSBzZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMge1xuICByZWFkb25seSBub3RGb3VuZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBib29sZWFuO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRpbWVkT3V0OiBib29sZWFuO1xuICByZWFkb25seSB3b3JrZXJTaHV0ZG93bjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVzZXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubm90Rm91bmQgPSBvcHRpb25zLm5vdEZvdW5kID8/IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gb3B0aW9ucy5jYW5jZWxSZXF1ZXN0ZWQgPz8gZmFsc2U7XG4gICAgdGhpcy5wYXVzZWQgPSBvcHRpb25zLnBhdXNlZCA/PyBmYWxzZTtcbiAgICB0aGlzLnRpbWVkT3V0ID0gb3B0aW9ucy50aW1lZE91dCA/PyBmYWxzZTtcbiAgICB0aGlzLndvcmtlclNodXRkb3duID0gb3B0aW9ucy53b3JrZXJTaHV0ZG93biA/PyBmYWxzZTtcbiAgICB0aGlzLnJlc2V0ID0gb3B0aW9ucy5yZXNldCA/PyBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUHJvdG8oXG4gICAgcHJvdG86IGNvcmVzZGsuYWN0aXZpdHlfdGFzay5JQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMge1xuICAgIGlmIChwcm90byA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscygpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyh7XG4gICAgICBub3RGb3VuZDogcHJvdG8uaXNOb3RGb3VuZCA/PyBmYWxzZSxcbiAgICAgIGNhbmNlbFJlcXVlc3RlZDogcHJvdG8uaXNDYW5jZWxsZWQgPz8gZmFsc2UsXG4gICAgICBwYXVzZWQ6IHByb3RvLmlzUGF1c2VkID8/IGZhbHNlLFxuICAgICAgdGltZWRPdXQ6IHByb3RvLmlzVGltZWRPdXQgPz8gZmFsc2UsXG4gICAgICB3b3JrZXJTaHV0ZG93bjogcHJvdG8uaXNXb3JrZXJTaHV0ZG93biA/PyBmYWxzZSxcbiAgICAgIHJlc2V0OiBwcm90by5pc1Jlc2V0ID8/IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IFByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSc7XG5cbi8vIE5vdGU6IFRoZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgaGVyZSBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoZXkgc2hvdWxkIGhhdmUgYmVlbiBkZWZpbmVkXG4vLyBpbiB0aGUgJ3dvcmtmbG93JyBwYWNrYWdlLCBpbnN0ZWFkIG9mICdjb21tb24nLiBUaGV5IGFyZSBub3cgcmVleHBvcnRlZCBmcm9tIHRoZSAnd29ya2Zsb3cnXG4vLyBwYWNrYWdlLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBpbXBvcnQgdGhlbSwgYnV0IHdlIHVuZm9ydHVuYXRlbHkgY2FuJ3QgcmVtb3ZlIHRoZW0gZnJvbVxuLy8gaGVyZSBhcyB0aGF0IHdvdWxkIGJlIGEgYnJlYWtpbmcgY2hhbmdlLlxuXG4vKipcbiAqIERldGVybWluZXM6XG4gKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAqXG4gKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gKi9cbi8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eU9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgYW5kXG4vLyAgICAgICAgICAgICAgYExvY2FsQWN0aXZpdHlPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkcyBsYXRlciBpbiB0aGlzIGZpbGUuXG5leHBvcnQgY29uc3QgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIEFjdGl2aXR5LCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvblxuICAgKiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYWN0dWFsbHkgYmUgZGVsaXZlcmVkIHRvIHRoZSBBY3Rpdml0eTsgZS5nLiB0aGUgY2FsbGluZyBXb3JrZmxvd1xuICAgKiBtYXkgZXhpdCBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGNvbXBsZXRlZCwgb3IgdGhlIEFjdGl2aXR5IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseVxuICAgKiBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZSBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlXG4gICAqIHdvcmtmbG93IHRoaW5rcyB0aGUgYWN0aXZpdHkgd2FzIGNhbmNlbGxlZCwgYnV0IHRoZSBhY3Rpdml0eSBhY3R1YWxseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBUbyBlbnN1cmUgdGhhdCB0aGUgV29ya2Zsb3cgaXMgcHJvcGVybHkgaW5mb3JtZWQgb2YgdGhlIEFjdGl2aXR5J3MgZmluYWwgc3RhdGUgKGkuZS4gZWl0aGVyXG4gICAqIGNvbXBsZXRpb24gb3IgY2FuY2VsbGF0aW9uKSwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCBhbmQgd2FpdCBmb3IgdGhlIGFjdGl2aXR5XG4gICAqIHRvIGNvbXBsZXRlIGl0cyBleGVjdXRpb24gKGVpdGhlciBzdWNjZXNzZnVsbHksIHVuY2Vzc2Z1bGx5LCBvciBhcyBjYW5jZWxsZWQpLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIEFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IHRvIHJlY2VpdmUgYSBjYW5jZWxsYXRpb24gbm90aWZpY2F0aW9uLiBUaGlzIGNhbiBibG9ja1xuICAgKiB0aGUgV29ya2Zsb3cncyBjYW5jZWxsYXRpb24gZm9yIGEgbG9uZyB0aW1lIGlmIHRoZSBBY3Rpdml0eSBkb2Vzbid0IGhlYXJ0YmVhdCBvciBjaG9vc2VzIHRvXG4gICAqIGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuXG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9ICh0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsIGRlY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDAsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAxLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDIsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG5vbi1sb2NhbCBhY3Rpdml0eSBpbnZvY2F0aW9uIGluc2lkZSBhIHdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgdG8gdXNlIGZvciB0cmFja2luZyB0aGUgYWN0aXZpdHkgaW4gV29ya2Zsb3cgaGlzdG9yeS5cbiAgICogVGhlIGBhY3Rpdml0eUlkYCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIGFjdGl2aXR5IGZ1bmN0aW9uLlxuICAgKiBEb2VzIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyXG4gICAqL1xuICBhY3Rpdml0eUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGN1cnJlbnQgd29ya2VyIHRhc2sgcXVldWVcbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSGVhcnRiZWF0IGludGVydmFsLiBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCBiZWZvcmUgdGhpcyBpbnRlcnZhbCBwYXNzZXMgYWZ0ZXIgYSBsYXN0IGhlYXJ0YmVhdCBvciBhY3Rpdml0eSBzdGFydC5cbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBoZWFydGJlYXRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lIGhvdyBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBzZXJ2ZXItZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuIFRvIGVuc3VyZSB6ZXJvIHJldHJpZXMsIHNldCBtYXhpbXVtIGF0dGVtcHRzIHRvIDEuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgb2YgYSBzaW5nbGUgQWN0aXZpdHkgZXhlY3V0aW9uIGF0dGVtcHQuIE5vdGUgdGhhdCB0aGUgVGVtcG9yYWwgU2VydmVyIGRvZXNuJ3QgZGV0ZWN0IFdvcmtlciBwcm9jZXNzXG4gICAqIGZhaWx1cmVzIGRpcmVjdGx5OiBpbnN0ZWFkLCBpdCByZWxpZXMgb24gdGhpcyB0aW1lb3V0IHRvIGRldGVjdCB0aGF0IGFuIEFjdGl2aXR5IGRpZG4ndCBjb21wbGV0ZSBvbiB0aW1lLiBUaGVyZWZvcmUsIHRoaXNcbiAgICogdGltZW91dCBzaG91bGQgYmUgYXMgc2hvcnQgYXMgdGhlIGxvbmdlc3QgcG9zc2libGUgZXhlY3V0aW9uIG9mIHRoZSBBY3Rpdml0eSBib2R5LiBQb3RlbnRpYWxseSBsb25nLXJ1bm5pbmdcbiAgICogQWN0aXZpdGllcyBtdXN0IHNwZWNpZnkge0BsaW5rIGhlYXJ0YmVhdFRpbWVvdXR9IGFuZCBjYWxsIHtAbGluayBhY3Rpdml0eS5Db250ZXh0LmhlYXJ0YmVhdH0gcGVyaW9kaWNhbGx5IGZvclxuICAgKiB0aW1lbHkgZmFpbHVyZSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRpbWUgdGhhdCB0aGUgQWN0aXZpdHkgVGFzayBjYW4gc3RheSBpbiB0aGUgVGFzayBRdWV1ZSBiZWZvcmUgaXQgaXMgcGlja2VkIHVwIGJ5IGEgV29ya2VyLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHRpbWVvdXQgdW5sZXNzIHVzaW5nIGhvc3Qtc3BlY2lmaWMgVGFzayBRdWV1ZXMgZm9yIEFjdGl2aXR5IFRhc2tzIGFyZSBiZWluZyB1c2VkIGZvciByb3V0aW5nLlxuICAgKiBgc2NoZWR1bGVUb1N0YXJ0VGltZW91dGAgaXMgYWx3YXlzIG5vbi1yZXRyeWFibGUuIFJldHJ5aW5nIGFmdGVyIHRoaXMgdGltZW91dCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgaXQgd291bGQganVzdCBwdXQgdGhlIEFjdGl2aXR5IFRhc2sgYmFjayBpbnRvIHRoZSBzYW1lIFRhc2sgUXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRvdGFsIHRpbWUgdGhhdCBhIHdvcmtmbG93IGlzIHdpbGxpbmcgdG8gd2FpdCBmb3IgdGhlIEFjdGl2aXR5IHRvIGNvbXBsZXRlLlxuICAgKiBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgbGltaXRzIHRoZSB0b3RhbCB0aW1lIG9mIGFuIEFjdGl2aXR5J3MgZXhlY3V0aW9uIGluY2x1ZGluZyByZXRyaWVzICh1c2Uge0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IHRvIGxpbWl0IHRoZSB0aW1lIG9mIGEgc2luZ2xlIGF0dGVtcHQpLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHk7IGFuZFxuICAgKiAtIHdoZW4gc2hvdWxkIHRoZSBBY3Rpdml0eSBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgdG8gV29ya2Zsb3cgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGVcbiAgICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBjYW5jZWxsYXRpb24gYmVpbmdcbiAgICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gICAqIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlIEFjdGl2aXR5IGNhbGwgd2FzIG1hZGUuIFRlcm1pbmF0aW9uIG9mIGEgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqIGFsd2F5cyByZXN1bHRzIGluIGNhbmNlbGxhdGlvbiBvZiBpdHMgb3V0c3RhbmRpbmcgQWN0aXZpdHkgZXhlY3V0aW9ucywgcmVnYXJkbGVzcyBvZiB0aG9zZVxuICAgKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBFYWdlciBkaXNwYXRjaCBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBpbXByb3ZlcyB0aGUgdGhyb3VnaHB1dCBhbmQgbG9hZCBvbiB0aGUgc2VydmVyIGZvciBzY2hlZHVsaW5nIEFjdGl2aXRpZXMuXG4gICAqIFdoZW4gdXNlZCwgdGhlIHNlcnZlciB3aWxsIGhhbmQgb3V0IEFjdGl2aXR5IHRhc2tzIGJhY2sgdG8gdGhlIFdvcmtlciB3aGVuIGl0IGNvbXBsZXRlcyBhIFdvcmtmbG93IHRhc2suXG4gICAqIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHNlcnZlciB2ZXJzaW9uIDEuMTcgYmVoaW5kIHRoZSBgc3lzdGVtLmVuYWJsZUFjdGl2aXR5RWFnZXJFeGVjdXRpb25gIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogRWFnZXIgZGlzcGF0Y2ggd2lsbCBvbmx5IGJlIHVzZWQgaWYgYGFsbG93RWFnZXJEaXNwYXRjaGAgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIGFuZCB7QGxpbmsgdGFza1F1ZXVlfSBpcyBlaXRoZXJcbiAgICogb21pdHRlZCBvciB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dFYWdlckRpc3BhdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBBY3Rpdml0eSBzaG91bGQgcnVuIG9uIGFcbiAgICogd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgYWN0aXZpdHlcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lcyBob3cgYW4gYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgU0RLLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLlxuICAgKiBOb3RlIHRoYXQgbG9jYWwgYWN0aXZpdGllcyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgbWF4aW11bSBhdHRlbXB0cyBpcyBzZXQgdG8gMSBkdWUgdG8gV29ya2Zsb3cgdGFzayByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHRhc2sgaXMgZGlzcGF0Y2hlZC4gVGhpc1xuICAgKiB0aW1lb3V0IGlzIGFsd2F5cyByZXRyeWFibGUuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqIElmIHNldCwgdGhpcyBtdXN0IGJlIDw9IHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbWl0cyB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBjYW4gaWRsZSBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBleGVjdXRlZC4gVGhhdCBjYW4gaGFwcGVuIGlmXG4gICAqIHRoZSB3b3JrZXIgaXMgY3VycmVudGx5IGF0IG1heCBjb25jdXJyZW50IGxvY2FsIGFjdGl2aXR5IGV4ZWN1dGlvbnMuIFRoaXMgdGltZW91dCBpcyBhbHdheXNcbiAgICogbm9uIHJldHJ5YWJsZSBhcyBhbGwgYSByZXRyeSB3b3VsZCBhY2hpZXZlIGlzIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHNhbWUgcXVldWUuIERlZmF1bHRzXG4gICAqIHRvIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpZiBub3Qgc3BlY2lmaWVkIGFuZCB0aGF0IGlzIHNldC4gTXVzdCBiZSA8PVxuICAgKiB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gd2hlbiBzZXQsIG90aGVyd2lzZSwgaXQgd2lsbCBiZSBjbGFtcGVkIGRvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0IGZvciBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uLiBMaW1pdHMgaG93XG4gICAqIGxvbmcgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZC5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWN0aXZpdHkgaXMgcmV0cnlpbmcgYW5kIGJhY2tvZmYgd291bGQgZXhjZWVkIHRoaXMgdmFsdWUsIGEgc2VydmVyIHNpZGUgdGltZXIgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gICAqIE90aGVyd2lzZSwgYmFja29mZiB3aWxsIGhhcHBlbiBpbnRlcm5hbGx5IGluIHRoZSBTREsuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiovXG4gIGxvY2FsUmV0cnlUaHJlc2hvbGQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gICAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICAgKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICAgKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAgICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gICAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgTWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gPSB7XG4gIEhJU1RPUllfU0laRV9UT09fTEFSR0U6ICdISVNUT1JZX1NJWkVfVE9PX0xBUkdFJyxcbiAgVE9PX01BTllfSElTVE9SWV9FVkVOVFM6ICdUT09fTUFOWV9ISVNUT1JZX0VWRU5UUycsXG4gIFRPT19NQU5ZX1VQREFURVM6ICdUT09fTUFOWV9VUERBVEVTJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9ICh0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24pW2tleW9mIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLCBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gICdTVUdHRVNUX0NPTlRJTlVFX0FTX05FV19SRUFTT05fJ1xuPihcbiAge1xuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5ISVNUT1JZX1NJWkVfVE9PX0xBUkdFXTogMSxcbiAgICBbU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24uVE9PX01BTllfSElTVE9SWV9FVkVOVFNdOiAyLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9VUERBVEVTXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4pO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uc0Zyb21Qcm90byhcbiAgcmVhc29uczogdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlYXNvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZXM6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlYXNvbnMpIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24ocik7XG4gICAgaWYgKGRlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnB1c2goZGVjb2RlZCk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciB9IGZyb20gJy4vZmFpbHVyZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29kZWMgfSBmcm9tICcuL3BheWxvYWQtY29kZWMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQcm90b0ZhaWx1cmUgfSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7XG4gIEFjdGl2aXR5RmFpbHVyZSxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksXG4gIGRlY29kZVJldHJ5U3RhdGUsXG4gIGRlY29kZVRpbWVvdXRUeXBlLFxuICBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZW5jb2RlUmV0cnlTdGF0ZSxcbiAgZW5jb2RlVGltZW91dFR5cGUsXG4gIEZBSUxVUkVfU09VUkNFLFxuICBOZXh1c09wZXJhdGlvbkZhaWx1cmUsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJy4uL3RpbWUnO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBhcnJheUZyb21QYXlsb2FkcywgZnJvbVBheWxvYWRzQXRJbmRleCwgdG9QYXlsb2Fkc1dpdGhDb250ZXh0IH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuXG4vLyBDYW4ndCBpbXBvcnQgcHJvdG8gZW51bXMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgdXNlIHRoaXMgaGVscGVyIHR5cGUgYW5kIGVudW0gY29udmVydGVyIGluc3RlYWQuXG5jb25zdCBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgPSB7XG4gIFJFVFJZQUJMRTogJ1JFVFJZQUJMRScsXG4gIE5PTl9SRVRSWUFCTEU6ICdOT05fUkVUUllBQkxFJyxcbn0gYXMgY29uc3Q7XG50eXBlIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9XG4gICh0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKVtrZXlvZiB0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXTtcblxuY29uc3QgW2VuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciwgZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gICdORVhVU19IQU5ETEVSX0VSUk9SX1JFVFJZX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLlJFVFJZQUJMRV06IDEsXG4gICAgW05leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvci5OT05fUkVUUllBQkxFXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuKTtcblxuZnVuY3Rpb24gY29tYmluZVJlZ0V4cCguLi5yZWdleHBzOiBSZWdFeHBbXSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cHMubWFwKCh4KSA9PiBgKD86JHt4LnNvdXJjZX0pYCkuam9pbignfCcpKTtcbn1cblxuLyoqXG4gKiBTdGFjayB0cmFjZXMgd2lsbCBiZSBjdXRvZmYgd2hlbiBvbiBvZiB0aGVzZSBwYXR0ZXJucyBpcyBtYXRjaGVkXG4gKi9cbmNvbnN0IENVVE9GRl9TVEFDS19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBBY3Rpdml0eSBleGVjdXRpb24gKi9cbiAgL1xccythdCAoQWN0aXZpdHlcXC4pP2V4ZWN1dGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIE5leHVzIGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0KCBhc3luYyk/IChOZXh1c0hhbmRsZXJcXC4pP2ludm9rZVVzZXJDb2RlIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11uZXh1c1tcXFxcL11pbmRleFxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBhY3RpdmF0aW9uIChpbmJvdW5kIGhhbmRsZXJzIG9ubHkpICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKEFjdGl2YXRvclxcLik/KHN0YXJ0V29ya2Zsb3d8cXVlcnlXb3JrZmxvd3xzaWduYWxXb3JrZmxvd3x1cGRhdGV8dmFsaWRhdGVVcGRhdGUpTmV4dEhhbmRsZXIgXFwoLipcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogV29ya2Zsb3cgcnVuIGFueXRoaW5nIGluIGNvbnRleHQgKi9cbiAgL1xccythdCAoU2NyaXB0XFwuKT9ydW5JbkNvbnRleHQgXFwobmF0aXZlfHVua25vd258KD86KD86bm9kZTp2bXx2bVxcLmpzKTpcXGQrOlxcZCspXFwpL1xuKTtcblxuLyoqXG4gKiBBbnkgc3RhY2sgdHJhY2UgZnJhbWVzIHRoYXQgbWF0Y2ggYW55IG9mIHRob3NlIHdpbCBiZSBkb3BwZWQuXG4gKiBUaGUgXCJudWxsLlwiIHByZWZpeCBvbiBzb21lIGNhc2VzIGlzIHRvIGF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDI0MTdcbiAqL1xuY29uc3QgRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP25leHQgXFwoLipbXFxcXC9dY29tbW9uW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVyY2VwdG9yc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/ZXhlY3V0ZU5leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQ3V0cyBvdXQgdGhlIGZyYW1ld29yayBwYXJ0IG9mIGEgc3RhY2sgdHJhY2UsIGxlYXZpbmcgb25seSB1c2VyIGNvZGUgZW50cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3V0b2ZmU3RhY2tUcmFjZShzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gKHN0YWNrID8/ICcnKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBhY2MgPSBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChDVVRPRkZfU1RBQ0tfUEFUVEVSTlMudGVzdChsaW5lKSkgYnJlYWs7XG4gICAgaWYgKCFEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUy50ZXN0KGxpbmUpKSBhY2MucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gYWNjLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEEgYEZhaWx1cmVDb252ZXJ0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGZyb20gcHJvdG8gYEZhaWx1cmVgIGluc3RhbmNlcyB0byBKUyBgRXJyb3JzYCBhbmQgYmFjay5cbiAqXG4gKiBXZSByZWNvbW1lbmRlZCB1c2luZyB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpbnN0ZWFkIG9mIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGluIG9yZGVyXG4gKiB0byBtYWludGFpbiBjcm9zcy1sYW5ndWFnZSBGYWlsdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2F1Z2h0IGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlLlxuICAgKi9cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm90b0ZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgZXJyb3IgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBgVGVtcG9yYWxGYWlsdXJlYC5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9yKGVycjogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgXCJzaGFwZVwiIG9mIHRoZSBhdHRyaWJ1dGVzIHNldCBhcyB0aGUge0BsaW5rIFByb3RvRmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlc30gcGF5bG9hZCBpbiBjYXNlXG4gKiB7QGxpbmsgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcy5lbmNvZGVDb21tb25BdHRyaWJ1dGVzfSBpcyBzZXQgdG8gYHRydWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXMge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrX3RyYWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5jb2RlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgKGZvciBlbmNyeXB0aW5nIHRoZXNlIGF0dHJpYnV0ZXMgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30pLlxuICAgKi9cbiAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0LCBjcm9zcy1sYW5ndWFnZS1jb21wYXRpYmxlIEZhaWx1cmUgY29udmVydGVyLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGl0IHdpbGwgbGVhdmUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyBhcyBwbGFpbiB0ZXh0LiBJbiBvcmRlciB0byBlbmNyeXB0IHRoZW0sIHNldFxuICogYGVuY29kZUNvbW1vbkF0dHJpYnV0ZXNgIHRvIGB0cnVlYCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBhbmQgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30gdGhhdCBjYW4gZW5jcnlwdCAvXG4gKiBkZWNyeXB0IFBheWxvYWRzIGluIHlvdXIge0BsaW5rIFdvcmtlck9wdGlvbnMuZGF0YUNvbnZlcnRlciB8IFdvcmtlcn0gYW5kXG4gKiB7QGxpbmsgQ2xpZW50T3B0aW9ucy5kYXRhQ29udmVydGVyIHwgQ2xpZW50IG9wdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGYWlsdXJlQ29udmVydGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgeyBlbmNvZGVDb21tb25BdHRyaWJ1dGVzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuY29kZUNvbW1vbkF0dHJpYnV0ZXM6IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgPz8gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogRG9lcyBub3Qgc2V0IGNvbW1vbiBwcm9wZXJ0aWVzLCB0aGF0IGlzIGRvbmUgaW4ge0BsaW5rIGZhaWx1cmVUb0Vycm9yfS5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9ySW5uZXIoXG4gICAgZmFpbHVyZTogUHJvdG9GYWlsdXJlLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IEVycm9yIHtcbiAgICBpZiAoZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLnR5cGUsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5jYXRlZ29yeSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnNlcnZlckZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFNlcnZlckZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRpbWVvdXRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmcm9tUGF5bG9hZHNBdEluZGV4KHBheWxvYWRDb252ZXJ0ZXIsIDAsIGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIGRlY29kZVRpbWVvdXRUeXBlKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLnRpbWVvdXRUeXBlKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGVybWluYXRlZEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm1pbmF0ZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuY2FuY2VsZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMsIGNvbnRleHQpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgJ1Jlc2V0V29ya2Zsb3cnLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5yZXNldFdvcmtmbG93RmFpbHVyZUluZm8ubGFzdEhlYXJ0YmVhdERldGFpbHM/LnBheWxvYWRzLCBjb250ZXh0KSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgY29uc3QgeyBuYW1lc3BhY2UsIHdvcmtmbG93VHlwZSwgd29ya2Zsb3dFeGVjdXRpb24sIHJldHJ5U3RhdGUgfSA9IGZhaWx1cmUuY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvO1xuICAgICAgaWYgKCEod29ya2Zsb3dUeXBlPy5uYW1lICYmIHdvcmtmbG93RXhlY3V0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgb24gY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENoaWxkV29ya2Zsb3dGYWlsdXJlKFxuICAgICAgICBuYW1lc3BhY2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgd29ya2Zsb3dUeXBlLm5hbWUsXG4gICAgICAgIGRlY29kZVJldHJ5U3RhdGUocmV0cnlTdGF0ZSksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvKSB7XG4gICAgICBpZiAoIWZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGU/Lm5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3Rpdml0eVR5cGU/Lm5hbWUgb24gYWN0aXZpdHlGYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0eUZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGUubmFtZSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5yZXRyeVN0YXRlKSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmlkZW50aXR5ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvKSB7XG4gICAgICBsZXQgcmV0cnlhYmxlT3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXRyeUJlaGF2aW9yID0gZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8ucmV0cnlCZWhhdmlvcik7XG4gICAgICBzd2l0Y2ggKHJldHJ5QmVoYXZpb3IpIHtcbiAgICAgICAgY2FzZSAnUkVUUllBQkxFJzpcbiAgICAgICAgICByZXRyeWFibGVPdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ05PTl9SRVRSWUFCTEUnOlxuICAgICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd0Vycm9yVHlwZSA9IGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8udHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZTogbmV4dXMuSGFuZGxlckVycm9yVHlwZSA9IE9iamVjdC5oYXNPd24obmV4dXMuSGFuZGxlckVycm9yVHlwZSwgcmF3RXJyb3JUeXBlKVxuICAgICAgICA/IG5leHVzLkhhbmRsZXJFcnJvclR5cGVbcmF3RXJyb3JUeXBlIGFzIGtleW9mIHR5cGVvZiBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlXVxuICAgICAgICA6ICdVTktOT1dOJztcblxuICAgICAgcmV0dXJuIG5ldyBuZXh1cy5IYW5kbGVyRXJyb3IocmVzb2x2ZWRUeXBlLCBmYWlsdXJlLm1lc3NhZ2UgPz8gJ05leHVzIGhhbmRsZXIgZXJyb3InLCB7XG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUsXG4gICAgICAgIHJhd0Vycm9yVHlwZSxcbiAgICAgICAgb3JpZ2luYWxGYWlsdXJlOiB0aGlzLnRlbXBvcmFsRmFpbHVyZVRvTmV4dXNGYWlsdXJlKGZhaWx1cmUpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgTmV4dXNPcGVyYXRpb25GYWlsdXJlKFxuICAgICAgICAvLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgc2V0IGEgZGVmYXVsdCBtZXNzYWdlIGhlcmUsIG9uY2Ugd2UndmUgZGVjaWRlZCBvbiBlcnJvciBoYW5kbGluZy5cbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLnNjaGVkdWxlZEV2ZW50SWQ/LnRvTnVtYmVyKCksXG4gICAgICAgIC8vIFdlIGFzc3VtZSB0aGVzZSB3aWxsIGFsd2F5cyBiZSBzZXQgb3IgZ3JhY2VmdWxseSBzZXQgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLmVuZHBvaW50ID8/ICcnLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8uc2VydmljZSA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvbiA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvblRva2VuID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVtcG9yYWxGYWlsdXJlKFxuICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogRXJyb3Ige1xuICAgIGlmIChmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhdHRycyA9IHBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQ8RGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcz4oZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcywgY29udGV4dCk7XG4gICAgICAvLyBEb24ndCBhcHBseSBlbmNvZGVkQXR0cmlidXRlcyB1bmxlc3MgdGhleSBjb25mb3JtIHRvIGFuIGV4cGVjdGVkIHNjaGVtYVxuICAgICAgaWYgKHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgYXR0cnMgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja190cmFjZSB9ID0gYXR0cnM7XG4gICAgICAgIC8vIEF2b2lkIG11dGF0aW5nIHRoZSBhcmd1bWVudFxuICAgICAgICBmYWlsdXJlID0geyAuLi5mYWlsdXJlIH07XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhY2tfdHJhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmFpbHVyZS5zdGFja1RyYWNlID0gc3RhY2tfdHJhY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcklubmVyKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICAgIGVyci5zdGFjayA9IGZhaWx1cmUuc3RhY2tUcmFjZSA/PyAnJztcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICBlcnIuZmFpbHVyZSA9IGZhaWx1cmU7XG4gICAgfVxuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFByb3RvRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IHRoaXMuZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnIsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jb2RlQ29tbW9uQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja1RyYWNlIH0gPSBmYWlsdXJlO1xuICAgICAgZmFpbHVyZS5tZXNzYWdlID0gJ0VuY29kZWQgZmFpbHVyZSc7XG4gICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSAnJztcbiAgICAgIGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlOiBzdGFja1RyYWNlIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlSW5uZXIoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm90b0ZhaWx1cmUge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlICYmIGVyci5mYWlsdXJlKSByZXR1cm4gZXJyLmZhaWx1cmU7XG4gICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoZXJyLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2aXR5RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgYWN0aXZpdHlUeXBlOiB7IG5hbWU6IGVyci5hY3Rpdml0eVR5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IGVyci5leGVjdXRpb24sXG4gICAgICAgICAgICB3b3JrZmxvd1R5cGU6IHsgbmFtZTogZXJyLndvcmtmbG93VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhcHBsaWNhdGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgIG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSxcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIGVyci5kZXRhaWxzKSB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuZXh0UmV0cnlEZWxheTogbXNPcHRpb25hbFRvVHMoZXJyLm5leHRSZXRyeURlbGF5KSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeShlcnIuY2F0ZWdvcnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgY2FuY2VsZWRGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgZGV0YWlsczpcbiAgICAgICAgICAgICAgZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB7IHBheWxvYWRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQocGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0aW1lb3V0RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHRpbWVvdXRUeXBlOiBlbmNvZGVUaW1lb3V0VHlwZShlcnIudGltZW91dFR5cGUpLFxuICAgICAgICAgICAgbGFzdEhlYXJ0YmVhdERldGFpbHM6IGVyci5sYXN0SGVhcnRiZWF0RGV0YWlsc1xuICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBbZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzXSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFNlcnZlckZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHNlcnZlckZhaWx1cmVJbmZvOiB7IG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlcm1pbmF0ZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0ZXJtaW5hdGVkRmFpbHVyZUluZm86IHt9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIG5leHVzLkhhbmRsZXJFcnJvcikge1xuICAgICAgICBpZiAoZXJyLm9yaWdpbmFsRmFpbHVyZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGVyci5vcmlnaW5hbEZhaWx1cmUsIGVyci5yZXRyeWFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXRyeUJlaGF2aW9yOiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHN3aXRjaCAoZXJyLnJldHJ5YWJsZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IgPSBlbmNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoJ1JFVFJZQUJMRScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IgPSBlbmNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoJ05PTl9SRVRSWUFCTEUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICBuZXh1c0hhbmRsZXJGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5leHVzT3BlcmF0aW9uRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgbmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgc2NoZWR1bGVkRXZlbnRJZDogZXJyLnNjaGVkdWxlZEV2ZW50SWQgPyBMb25nLmZyb21OdW1iZXIoZXJyLnNjaGVkdWxlZEV2ZW50SWQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5kcG9pbnQ6IGVyci5lbmRwb2ludCxcbiAgICAgICAgICAgIHNlcnZpY2U6IGVyci5zZXJ2aWNlLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiBlcnIub3BlcmF0aW9uLFxuICAgICAgICAgICAgb3BlcmF0aW9uVG9rZW46IGVyci5vcGVyYXRpb25Ub2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gSnVzdCBhIFRlbXBvcmFsRmFpbHVyZVxuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IHtcbiAgICAgIHNvdXJjZTogRkFJTFVSRV9TT1VSQ0UsXG4gICAgfTtcblxuICAgIGlmIChpc0Vycm9yKGVycikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIG1lc3NhZ2U6IFN0cmluZyhlcnIubWVzc2FnZSA/PyAnJyksXG4gICAgICAgIHN0YWNrVHJhY2U6IGN1dG9mZlN0YWNrVHJhY2UoZXJyLnN0YWNrKSxcbiAgICAgICAgY2F1c2U6IHRoaXMub3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKChlcnIgYXMgYW55KS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gYCBbQSBub24tRXJyb3IgdmFsdWUgd2FzIHRocm93biBmcm9tIHlvdXIgY29kZS4gV2UgcmVjb21tZW5kIHRocm93aW5nIEVycm9yIG9iamVjdHMgc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSBhIHN0YWNrIHRyYWNlXWA7XG5cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IGVyciArIHJlY29tbWVuZGF0aW9uIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgIHRyeSB7XG4gICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShlcnIpO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICBtZXNzYWdlID0gU3RyaW5nKGVycik7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBtZXNzYWdlICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBTdHJpbmcoZXJyKSArIHJlY29tbWVuZGF0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICovXG4gIG9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihcbiAgICBmYWlsdXJlOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmFpbHVyZSA/IHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gZXJyb3IgdG8gYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZFxuICAgKi9cbiAgb3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKFxuICAgIGVycjogdW5rbm93bixcbiAgICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICAgIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuICApOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBlcnIgPyB0aGlzLmVycm9yVG9GYWlsdXJlKGVyciwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIG5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGZhaWx1cmU6IG5leHVzLkZhaWx1cmUsIHJldHJ5YWJsZTogYm9vbGVhbik6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGZhaWx1cmUubWV0YWRhdGE/LnR5cGUgPT09ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJykge1xuICAgICAgaWYgKGZhaWx1cmUuZGV0YWlscyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtaXNzaW5nIGRldGFpbHMgZm9yIE5leHVzIEZhaWx1cmUgb2YgdHlwZSAndGVtcG9yYWwuYXBpLmZhaWx1cmUudjEuRmFpbHVyZSdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVyZS5kZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhbEZhaWx1cmU6IFByb3RvRmFpbHVyZSA9IHt9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8gPSB7XG4gICAgICAgIHR5cGU6ICdOZXh1c0ZhaWx1cmUnLFxuICAgICAgICBub25SZXRyeWFibGU6ICFyZXRyeWFibGUsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBwYXlsb2FkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBlbmNvZGluZzogZW5jb2RlKCdqc29uL3BsYWluJykgfSxcbiAgICAgICAgICAgICAgZGF0YTogZW5jb2RlKEpTT04uc3RyaW5naWZ5KHsgLi4uZmFpbHVyZSwgbWVzc2FnZTogJycgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHRlbXBvcmFsRmFpbHVyZS5tZXNzYWdlID0gZmFpbHVyZS5tZXNzYWdlO1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLnN0YWNrVHJhY2UgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgICByZXR1cm4gdGVtcG9yYWxGYWlsdXJlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGVtcG9yYWxGYWlsdXJlVG9OZXh1c0ZhaWx1cmUoZmFpbHVyZTogUHJvdG9GYWlsdXJlKTogbmV4dXMuRmFpbHVyZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGZhaWx1cmUubWVzc2FnZSA/PyAnJyxcbiAgICAgIG1ldGFkYXRhOiB7IHR5cGU6ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJyB9LFxuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgUHJvdG9GYWlsdXJlIGFzIHRoZSBOZXh1cyBmYWlsdXJlIGRldGFpbHMgc28gaXQgY2FuIGJlIHJvdW5kLXRyaXBwZWRcbiAgICAgIC8vIGxvc3NsZXNzbHkgYmFjayB0byBhIFByb3RvRmFpbHVyZSB2aWEgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUuXG4gICAgICBkZXRhaWxzOiB7IC4uLmZhaWx1cmUgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5cbi8qKlxuICogYFBheWxvYWRDb2RlY2AgaXMgYW4gb3B0aW9uYWwgc3RlcCB0aGF0IGhhcHBlbnMgYmV0d2VlbiB0aGUgd2lyZSBhbmQgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyfTpcbiAqXG4gKiBUZW1wb3JhbCBTZXJ2ZXIgPC0tPiBXaXJlIDwtLT4gYFBheWxvYWRDb2RlY2AgPC0tPiBgUGF5bG9hZENvbnZlcnRlcmAgPC0tPiBVc2VyIGNvZGVcbiAqXG4gKiBJbXBsZW1lbnQgdGhpcyB0byB0cmFuc2Zvcm0gYW4gYXJyYXkgb2Yge0BsaW5rIFBheWxvYWR9cyB0by9mcm9tIHRoZSBmb3JtYXQgc2VudCBvdmVyIHRoZSB3aXJlIGFuZCBzdG9yZWQgYnkgVGVtcG9yYWwgU2VydmVyLlxuICogQ29tbW9uIHRyYW5zZm9ybWF0aW9ucyBhcmUgZW5jcnlwdGlvbiBhbmQgY29tcHJlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvZGVjIHtcbiAgLyoqXG4gICAqIEVuY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIGZvciBzZW5kaW5nIG92ZXIgdGhlIHdpcmUuXG4gICAqIEBwYXJhbSBwYXlsb2FkcyBNYXkgaGF2ZSBsZW5ndGggMC5cbiAgICovXG4gIGVuY29kZShwYXlsb2FkczogUGF5bG9hZFtdLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUHJvbWlzZTxQYXlsb2FkW10+O1xufVxuIiwiaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgeyBQYXlsb2FkQ29udmVydGVyRXJyb3IsIFZhbHVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgZW5jb2RpbmdLZXlzLCBlbmNvZGluZ1R5cGVzLCBNRVRBREFUQV9FTkNPRElOR19LRVkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgbGlrZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLlxuICpcbiAqIFRoaXMgaXMgY2FsbGVkIGluc2lkZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RldGVybWluaXNtIHwgV29ya2Zsb3cgaXNvbGF0ZX0uXG4gKiBUbyB3cml0ZSBhc3luYyBjb2RlIG9yIHVzZSBOb2RlIEFQSXMgKG9yIHVzZSBwYWNrYWdlcyB0aGF0IHVzZSBOb2RlIEFQSXMpLCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBTaG91bGQgdGhyb3cge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSB2YWx1ZXMgSlMgdmFsdWVzIHRvIGNvbnZlcnQgdG8gUGF5bG9hZHNcbiAqIEByZXR1cm4gbGlzdCBvZiB7QGxpbmsgUGF5bG9hZH1zXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIGZhaWxlZCBmb3IgYW55XG4gKiAgICAgcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXlsb2Fkcyhjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIC4uLnZhbHVlczogdW5rbm93bltdKTogUGF5bG9hZFtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvUGF5bG9hZHNXaXRoQ29udGV4dChjb252ZXJ0ZXIsIHVuZGVmaW5lZCwgdmFsdWVzKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGNvbnZlcnNpb24gb2YgYSBsaXN0IG9mIHZhbHVlcyB3aXRoIGFuIG9wdGlvbmFsIHNlcmlhbGl6YXRpb24gY29udGV4dC5cbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BheWxvYWRzV2l0aENvbnRleHQoXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgY29udGV4dDogU2VyaWFsaXphdGlvbkNvbnRleHQgfCB1bmRlZmluZWQsXG4gIHZhbHVlczogdW5rbm93bltdXG4pOiBQYXlsb2FkW10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBhbiBvcHRpb25hbCB2YWx1ZSwgYW5kIHRoZW4gZW5jb2RlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICB2YWx1ZTogdW5rbm93bixcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBQYXlsb2FkIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdmFsdWU7XG5cbiAgcmV0dXJuIHBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBlYWNoIHZhbHVlIGluIHRoZSBtYXAuXG4gKlxuICogQHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgY29udmVyc2lvbiBvZiBhbnkgdmFsdWUgaW4gdGhlIG1hcCBmYWlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nLCBUID0gYW55PihcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBtYXA6IFJlY29yZDxLLCBUPixcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBSZWNvcmQ8SywgUGF5bG9hZD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcCkubWFwKChbaywgdl0pOiBbSywgUGF5bG9hZF0gPT4gW2sgYXMgSywgY29udmVydGVyLnRvUGF5bG9hZCh2LCBjb250ZXh0KV0pXG4gICkgYXMgUmVjb3JkPEssIFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzLiBVc2VmdWwgZm9yIGRlc2VyaWFsaXppbmdcbiAqIGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBpbnZvY2F0aW9ucy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyXG4gKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIHZhbHVlIGluIHRoZSBwYXlsb2Fkc1xuICogQHBhcmFtIHBheWxvYWRzIHNlcmlhbGl6ZWQgdmFsdWUgdG8gY29udmVydCB0byBKUyB2YWx1ZXMuXG4gKiBAcmV0dXJuIGNvbnZlcnRlZCBKUyB2YWx1ZVxuICogQHRocm93cyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlckVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSBkYXRhIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUGF5bG9hZHNBdEluZGV4PFQ+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIHBheWxvYWRzPzogUGF5bG9hZFtdIHwgbnVsbCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBUIHtcbiAgLy8gVG8gbWFrZSBhZGRpbmcgYXJndW1lbnRzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlXG4gIGlmIChwYXlsb2FkcyA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWRzID09PSBudWxsIHx8IGluZGV4ID49IHBheWxvYWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBwYXlsb2Fkcz8uW2luZGV4XTtcbiAgaWYgKCFwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGcm9tUGF5bG9hZHMoXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgcGF5bG9hZHM/OiBQYXlsb2FkW10gfCBudWxsLFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IHVua25vd25bXSB7XG4gIGlmICghcGF5bG9hZHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIHBheWxvYWRzLm1hcCgocGF5bG9hZDogUGF5bG9hZCkgPT4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQsIGNvbnRleHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEZyb21QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nLCBUID0gdW5rbm93bj4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgbWFwPzogUmVjb3JkPEssIFBheWxvYWQ+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBSZWNvcmQ8SywgVD4gfCB1bmRlZmluZWQge1xuICBpZiAobWFwID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCBwYXlsb2FkXSk6IFtLLCB1bmtub3duXSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkIGFzIFBheWxvYWQsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtrIGFzIEssIHZhbHVlXTtcbiAgICB9KVxuICApIGFzIFJlY29yZDxLLCBUPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgY29uc3QgcmF3UGF5bG9hZFR5cGVCcmFuZDogdW5pcXVlIHN5bWJvbDtcbi8qKlxuICogUmF3VmFsdWUgaXMgYSB3cmFwcGVyIG92ZXIgYSBwYXlsb2FkLlxuICogQSBwYXlsb2FkIHRoYXQgYmVsb25ncyB0byBhIFJhd1ZhbHVlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBieXBhc3NlcyB1c2VyLWRlZmluZWQgcGF5bG9hZCBjb252ZXJ0ZXJzLFxuICogaW5zdGVhZCB1c2luZyB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlci4gVGhlIHBheWxvYWQgc3RpbGwgdW5kZXJnb2VzIGNvZGVjIGNvbnZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXdWYWx1ZTxUID0gdW5rbm93bj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXlsb2FkOiBQYXlsb2FkO1xuICBwcml2YXRlIHJlYWRvbmx5IFtyYXdQYXlsb2FkVHlwZUJyYW5kXTogVCA9IHVuZGVmaW5lZCBhcyBUO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyID0gZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSwgY29udGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVBheWxvYWQocDogUGF5bG9hZCk6IFJhd1ZhbHVlIHtcbiAgICByZXR1cm4gbmV3IFJhd1ZhbHVlKHAsIGlkZW50aXR5UGF5bG9hZENvbnZlcnRlcik7XG4gIH1cblxuICBnZXQgcGF5bG9hZCgpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0sIG9yIGB1bmRlZmluZWRgIGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUO1xuXG4gIHJlYWRvbmx5IGVuY29kaW5nVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyaWVzIHRvIGNvbnZlcnQgdmFsdWVzIHRvIHtAbGluayBQYXlsb2FkfXMgdXNpbmcgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nfXMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBpbiB0aGUgb3JkZXIgcHJvdmlkZWQuXG4gKlxuICogQ29udmVydHMgUGF5bG9hZHMgdG8gdmFsdWVzIGJhc2VkIG9uIHRoZSBgUGF5bG9hZC5tZXRhZGF0YS5lbmNvZGluZ2AgZmllbGQsIHdoaWNoIG1hdGNoZXMgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nLmVuY29kaW5nVHlwZX1cbiAqIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBjcmVhdGVkIHRoZSBQYXlsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICByZWFkb25seSBjb252ZXJ0ZXJzOiBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nW107XG4gIHJlYWRvbmx5IGNvbnZlcnRlckJ5RW5jb2Rpbmc6IE1hcDxzdHJpbmcsIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXSkge1xuICAgIGlmIChjb252ZXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFBheWxvYWRDb252ZXJ0ZXJFcnJvcignTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJ0ZXJzID0gY29udmVydGVycztcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlckJ5RW5jb2Rpbmcuc2V0KGNvbnZlcnRlci5lbmNvZGluZ1R5cGUsIGNvbnZlcnRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJ1biBgLnRvUGF5bG9hZCh2YWx1ZSlgIG9uIGVhY2ggY29udmVydGVyIGluIHRoZSBvcmRlciBwcm92aWRlZCBhdCBjb25zdHJ1Y3Rpb24uXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0LCB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciB0aGF0IGNhbiBoYW5kbGUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHRvUGF5bG9hZDxUPih2YWx1ZTogVCwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUGF5bG9hZCB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5wYXlsb2FkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0ICR7dmFsdWV9IHRvIHBheWxvYWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZnJvbVBheWxvYWR9IGJhc2VkIG9uIHRoZSBgZW5jb2RpbmdgIG1ldGFkYXRhIG9mIHRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkLm1ldGFkYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jb2RpbmcgPSBkZWNvZGUocGF5bG9hZC5tZXRhZGF0YVtNRVRBREFUQV9FTkNPRElOR19LRVldISk7XG4gICAgY29uc3QgY29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXJCeUVuY29kaW5nLmdldChlbmNvZGluZyk7XG4gICAgaWYgKGNvbnZlcnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5rbm93biBlbmNvZGluZzogJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkLCBjb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gSlMgdW5kZWZpbmVkIGFuZCBOVUxMIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTDtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihfY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55OyAvLyBKdXN0IHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gYmluYXJ5IGRhdGEgdHlwZXMgYW5kIFJBVyBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW5hcnlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVztcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19SQVcsXG4gICAgICB9LFxuICAgICAgZGF0YTogdmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIFdyYXAgd2l0aCBVaW50OEFycmF5IGZyb20gdGhpcyBjb250ZXh0IHRvIGVuc3VyZSBgaW5zdGFuY2VvZmAgd29ya3NcbiAgICAgIChcbiAgICAgICAgY29udGVudC5kYXRhID8gbmV3IFVpbnQ4QXJyYXkoY29udGVudC5kYXRhLmJ1ZmZlciwgY29udGVudC5kYXRhLmJ5dGVPZmZzZXQsIGNvbnRlbnQuZGF0YS5sZW5ndGgpIDogY29udGVudC5kYXRhXG4gICAgICApIGFzIGFueVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIG5vbi11bmRlZmluZWQgdmFsdWVzIGFuZCBzZXJpYWxpemVkIEpTT04gUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgSnNvblBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTjtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IGpzb247XG4gICAgdHJ5IHtcbiAgICAgIGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19KU09OLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IGVuY29kZShqc29uKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KGNvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAoY29udGVudC5kYXRhID09PSB1bmRlZmluZWQgfHwgY29udGVudC5kYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignR290IHBheWxvYWQgd2l0aCBubyBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZShjb250ZW50LmRhdGEpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgZXh0ZW5kcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIHtcbiAgLy8gTWF0Y2ggdGhlIG9yZGVyIHVzZWQgaW4gb3RoZXIgU0RLcywgYnV0IGV4Y2x1ZGUgUHJvdG9idWYgY29udmVydGVycyBzbyB0aGF0IHRoZSBjb2RlLCBpbmNsdWRpbmdcbiAgLy8gYHByb3RvMy1qc29uLXNlcmlhbGl6ZXJgLCBkb2Vzbid0IHRha2Ugc3BhY2UgaW4gV29ya2Zsb3cgYnVuZGxlcyB0aGF0IGRvbid0IHVzZSBQcm90b2J1ZnMuIFRvIHVzZSBQcm90b2J1ZnMsIHVzZVxuICAvLyB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJXaXRoUHJvdG9idWZzfS5cbiAgLy9cbiAgLy8gR28gU0RLOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVtcG9yYWxpby9zZGstZ28vYmxvYi81ZTU2NDVmMGM1NTBkY2Y3MTdjMDk1YWUzMmM3NmE3MDg3ZDJlOTg1L2NvbnZlcnRlci9kZWZhdWx0X2RhdGFfY29udmVydGVyLmdvI0wyOFxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihuZXcgVW5kZWZpbmVkUGF5bG9hZENvbnZlcnRlcigpLCBuZXcgQmluYXJ5UGF5bG9hZENvbnZlcnRlcigpLCBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0gdXNlZCBieSB0aGUgU0RLLiBTdXBwb3J0cyBgVWludDhBcnJheWAgYW5kIEpTT04gc2VyaWFsaXphYmxlcyAoc28gaWZcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9KU09OL3N0cmluZ2lmeSNkZXNjcmlwdGlvbiB8IGBKU09OLnN0cmluZ2lmeSh5b3VyQXJnT3JSZXR2YWwpYH1cbiAqIHdvcmtzLCB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlciB3aWxsIHdvcmspLlxuICpcbiAqIFRvIGFsc28gc3VwcG9ydCBQcm90b2J1ZnMsIGNyZWF0ZSBhIGN1c3RvbSBwYXlsb2FkIGNvbnZlcnRlciB3aXRoIHtAbGluayBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcn06XG4gKlxuICogYGNvbnN0IG15Q29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKHsgcHJvdG9idWZSb290IH0pYFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgcGF5bG9hZCBjb252ZXJ0ZXIgcmV0dXJucyB0aGUgaW5wdXRzIGl0IHdhcyBnaXZlbi5cbiAqL1xuY2xhc3MgSWRlbnRpdHlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQge1xuICAgIHJldHVybiB2YWx1ZSBhcyBQYXlsb2FkO1xuICB9XG5cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiBwYXlsb2FkIGFzIFQ7XG4gIH1cbn1cblxuY29uc3QgaWRlbnRpdHlQYXlsb2FkQ29udmVydGVyID0gbmV3IElkZW50aXR5UGF5bG9hZENvbnZlcnRlcigpO1xuIiwiaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hBdHRyaWJ1dGVzLCBTZWFyY2hBdHRyaWJ1dGVQYWlyLCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyIH0gZnJvbSAnLi4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHtcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBpc1ZhbGlkVmFsdWVGb3JUeXBlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlLFxufSBmcm9tICcuLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IEpzb25QYXlsb2FkQ29udmVydGVyLCBtYXBGcm9tUGF5bG9hZHMsIG1hcFRvUGF5bG9hZHMgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcblxuLyoqXG4gKiBDb252ZXJ0cyBTZWFyY2ggQXR0cmlidXRlIHZhbHVlcyB1c2luZyBKc29uUGF5bG9hZENvbnZlcnRlclxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG4gIHZhbGlkTm9uRGF0ZVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlczogdW5rbm93bik6IFBheWxvYWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgU2VhcmNoQXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBmaXJzdFR5cGUgPSB0eXBlb2YgZmlyc3RWYWx1ZTtcbiAgICAgIGlmIChmaXJzdFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBhcnJheXMgb2Ygc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIERhdGVzLiBUaGUgdmFsdWUgJHt2YWx1ZX0gYXQgaW5kZXggJHtpZHh9IGlzIG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZE5vbkRhdGVUeXBlcy5pbmNsdWRlcyhmaXJzdFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBmaXJzdFR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgQWxsIFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlLiBUaGUgZmlyc3QgdmFsdWUgJHtmaXJzdFZhbHVlfSBvZiB0eXBlICR7Zmlyc3RUeXBlfSBkb2Vzbid0IG1hdGNoIHZhbHVlICR7dmFsdWV9IG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9IGF0IGluZGV4ICR7aWR4fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgdGFrZXMgY2FyZSBvZiBjb252ZXJ0aW5nIERhdGVzIHRvIElTTyBzdHJpbmdzXG4gICAgY29uc3QgcmV0ID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZXMpO1xuICAgIGlmIChyZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHBheWxvYWRzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogRGF0ZXRpbWUgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBgRGF0ZWBzXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuanNvbkNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcbiAgICBsZXQgYXJyYXlXcmFwcGVkVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICBjb25zdCBzZWFyY2hBdHRyaWJ1dGVUeXBlID0gcGF5bG9hZC5tZXRhZGF0YS50eXBlID8gZGVjb2RlKHBheWxvYWQubWV0YWRhdGEudHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlYXJjaEF0dHJpYnV0ZVR5cGUgPT09ICdEYXRldGltZScpIHtcbiAgICAgIGFycmF5V3JhcHBlZFZhbHVlID0gYXJyYXlXcmFwcGVkVmFsdWUubWFwKChkYXRlU3RyaW5nKSA9PiBuZXcgRGF0ZShkYXRlU3RyaW5nKSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVdyYXBwZWRWYWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcigpO1xuXG5leHBvcnQgY2xhc3MgVHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKTtcblxuICBwdWJsaWMgdG9QYXlsb2FkPFQ+KGF0dHI6IFQpOiBQYXlsb2FkIHtcbiAgICBpZiAoIShhdHRyIGluc3RhbmNlb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSB8fCBhdHRyIGluc3RhbmNlb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgRXhwZWN0IGlucHV0IHRvIGJlIGluc3RhbmNlIG9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUgb3IgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSwgZ290OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF0dHJcbiAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdlIGNoZWNrIGZvciBkZWxldGlvbiBhcyB3ZWxsIGFzIHJlZ3VsYXIgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXMuXG4gICAgaWYgKGF0dHIudmFsdWUgIT09IG51bGwgJiYgIWlzVmFsaWRWYWx1ZUZvclR5cGUoYXR0ci50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgc2VhcmNoIGF0dHJpYnV0ZSB2YWx1ZSAke2F0dHIudmFsdWV9IGZvciBnaXZlbiB0eXBlICR7YXR0ci50eXBlfWApO1xuICAgIH1cblxuICAgIC8vIEZvciBzZXJ2ZXIgc2VhcmNoIGF0dHJpYnV0ZXMgdG8gd29yayBwcm9wZXJseSwgd2UgY2Fubm90IHNldCB0aGUgbWV0YWRhdGFcbiAgICAvLyB0eXBlIHdoZW4gd2Ugc2V0IG51bGxcbiAgICBpZiAoYXR0ci52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQoYXR0ci52YWx1ZSk7XG4gICAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCB0eXBlZCBzZWFyY2ggYXR0cmlidXRlIHRvIHBheWxvYWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cblxuICAgIC8vIEpTT04uc3RyaW5naWZ5IHRha2VzIGNhcmUgb2YgY29udmVydGluZyBEYXRlcyB0byBJU08gc3RyaW5nc1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKGF0dHIudmFsdWUpO1xuICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCB0eXBlZCBzZWFyY2ggYXR0cmlidXRlIHRvIHBheWxvYWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiB0aGlzIHNob3VsZG4ndCBiZSB0aGUgY2FzZSBidXQgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB3aXRob3V0IHRoaXMgY2hlY2suXG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cbiAgICAvLyBBZGQgZW5jb2RlZCB0eXBlIG9mIHNlYXJjaCBhdHRyaWJ1dGUgdG8gbWV0YXRkYXRhXG4gICAgcGF5bG9hZC5tZXRhZGF0YVsndHlwZSddID0gZW5jb2RlKFR5cGVkU2VhcmNoQXR0cmlidXRlcy50b01ldGFkYXRhVHlwZShhdHRyLnR5cGUpKTtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8vIE5vdGU6IHR5cGUgY2FzdGluZyB1bmRlZmluZWQgdmFsdWVzIGlzIG5vdCBjbGVhciB0byBjYWxsZXIuXG4gIC8vIFdlIGNhbid0IGNoYW5nZSB0aGUgdHlwaW5nIG9mIHRoZSBtZXRob2QgdG8gcmV0dXJuIHVuZGVmaW5lZCwgaXQncyBub3QgYWxsb3dlZCBieSB0aGUgaW50ZXJmYWNlLlxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyAndHlwZScgbWV0YWRhdGEgZmllbGQgb3Igbm8gZ2l2ZW4gdmFsdWUsIHdlIHNraXAuXG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEudHlwZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMudG9TZWFyY2hBdHRyaWJ1dGVUeXBlKGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpKTtcbiAgICAvLyBVbnJlY29nbml6ZWQgbWV0YWRhdGEgdHlwZSAoc2FuaXR5IGNoZWNrKS5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gdGhpcy5qc29uQ29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpO1xuXG4gICAgLy8gSGFuZGxlIGxlZ2FjeSB2YWx1ZXMgd2l0aG91dCBLRVlXT1JEX0xJU1QgdHlwZS5cbiAgICBpZiAodHlwZSAhPT0gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1QgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIENhbm5vdCBoYXZlIGFuIGFycmF5IHdpdGggbXVsdGlwbGUgdmFsdWVzIGZvciBub24tS0VZV09SRF9MSVNUIHR5cGUuXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgICB9XG4gICAgICAvLyBVbnBhY2sgc2luZ2xlIHZhbHVlIGFycmF5LlxuICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgJiYgdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZm9yIHRoZSBnaXZlbiB0eXBlLiBJZiBub3QsIHNraXAuXG4gICAgaWYgKCFpc1ZhbGlkVmFsdWVGb3JUeXBlKHR5cGUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUodHlwZSwgdmFsdWUpIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuLy8gSWYgYm90aCBwYXJhbXMgYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLlxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKFxuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcyxcbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaEF0dHJpYnV0ZXMgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpIDoge30pLFxuICAgIC4uLih0eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgID8gbWFwVG9QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+KFxuICAgICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0eXBlZFNlYXJjaEF0dHJpYnV0ZXMpID8gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzIDogdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldEFsbCgpKS5tYXAoXG4gICAgICAgICAgICAgIChwYWlyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYWlyLmtleS5uYW1lLCBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhpbmRleGVkRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB8IHVuZGVmaW5lZCB8IG51bGwpOiBTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgaWYgKCFpbmRleGVkRmllbGRzKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwRnJvbVBheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIGluZGV4ZWRGaWVsZHMpIGFzIFNlYXJjaEF0dHJpYnV0ZXMpLmZpbHRlcihcbiAgICAgIChbXywgdl0pID0+IHYgJiYgdi5sZW5ndGggPiAwXG4gICAgKSAvLyBGaWx0ZXIgb3V0IGVtcHR5IGFycmF5cyByZXR1cm5lZCBieSBwcmUgMS4xOCBzZXJ2ZXJzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoXG4gIGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbFxuKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgcmV0dXJuIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBtYXBGcm9tUGF5bG9hZHM8c3RyaW5nLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlPFNlYXJjaEF0dHJpYnV0ZVR5cGU+IHwgdW5kZWZpbmVkPihcbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxuICAgICAgICBpbmRleGVkRmllbGRzXG4gICAgICApID8/IHt9XG4gICAgKS5yZWR1Y2U8U2VhcmNoQXR0cmlidXRlUGFpcltdPigoYWNjLCBbaywgYXR0cl0pID0+IHtcbiAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIGNvbnZlcnRlci5cbiAgICAgIGlmICghYXR0cikge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0geyBuYW1lOiBrLCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIEVuc3VyZSBpcyB2YWxpZCBwYWlyLlxuICAgICAgaWYgKGlzVmFsaWRWYWx1ZUZvclR5cGUoa2V5LnR5cGUsIGF0dHIudmFsdWUpKSB7XG4gICAgICAgIGFjYy5wdXNoKHsga2V5LCB2YWx1ZTogYXR0ci52YWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVBhaXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX0VOQ09ESU5HX0tFWSA9ICdlbmNvZGluZyc7XG5leHBvcnQgY29uc3QgZW5jb2RpbmdUeXBlcyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogJ2JpbmFyeS9udWxsJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiAnYmluYXJ5L3BsYWluJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogJ2pzb24vcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRl9KU09OOiAnanNvbi9wcm90b2J1ZicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiAnYmluYXJ5L3Byb3RvYnVmJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBFbmNvZGluZ1R5cGUgPSAodHlwZW9mIGVuY29kaW5nVHlwZXMpW2tleW9mIHR5cGVvZiBlbmNvZGluZ1R5cGVzXTtcblxuZXhwb3J0IGNvbnN0IGVuY29kaW5nS2V5cyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1JBVzogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT04pLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUYpLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX01FU1NBR0VfVFlQRV9LRVkgPSAnbWVzc2FnZVR5cGUnO1xuIiwiaW1wb3J0ICogYXMgdGltZSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyB0eXBlIFRpbWVzdGFtcCB9IGZyb20gJy4vdGltZSc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUudHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNOdW1iZXJUb1RzKG1pbGxpcyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb1RzKHN0cjogRHVyYXRpb24gfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5tc09wdGlvbmFsVG9UcyhzdHIpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb051bWJlcih2YWwpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvTnVtYmVyKHZhbDogRHVyYXRpb24pOiBudW1iZXIge1xuICByZXR1cm4gdGltZS5tc1RvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9EYXRlKHRzOiBUaW1lc3RhbXApOiBEYXRlIHtcbiAgcmV0dXJuIHRpbWUudHNUb0RhdGUodHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm9wdGlvbmFsVHNUb0RhdGUodHMpO1xufVxuIiwiLy8gUGFzdGVkIHdpdGggbW9kaWZpY2F0aW9ucyBmcm9tOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYW5vbnljby9GYXN0ZXN0U21hbGxlc3RUZXh0RW5jb2RlckRlY29kZXIvbWFzdGVyL0VuY29kZXJEZWNvZGVyVG9nZXRoZXIuc3JjLmpzXG4vKiBlc2xpbnQgbm8tZmFsbHRocm91Z2g6IDAgKi9cblxuY29uc3QgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbmNvbnN0IGVuY29kZXJSZWdleHAgPSAvW1xceDgwLVxcdUQ3ZmZcXHVEQzAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0/L2c7XG5jb25zdCB0bXBCdWZmZXJVMTYgPSBuZXcgVWludDE2QXJyYXkoMzIpO1xuXG5leHBvcnQgY2xhc3MgVGV4dERlY29kZXIge1xuICBkZWNvZGUoaW5wdXRBcnJheU9yQnVmZmVyOiBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5wdXRBczggPSBpbnB1dEFycmF5T3JCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gaW5wdXRBcnJheU9yQnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5wdXRBcnJheU9yQnVmZmVyKTtcblxuICAgIGxldCByZXN1bHRpbmdTdHJpbmcgPSAnJyxcbiAgICAgIHRtcFN0ciA9ICcnLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbmV4dEVuZCA9IDAsXG4gICAgICBjcDAgPSAwLFxuICAgICAgY29kZVBvaW50ID0gMCxcbiAgICAgIG1pbkJpdHMgPSAwLFxuICAgICAgY3AxID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICB0bXAgPSAtMTtcbiAgICBjb25zdCBsZW4gPSBpbnB1dEFzOC5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGxlbk1pbnVzMzIgPSAobGVuIC0gMzIpIHwgMDtcbiAgICAvLyBOb3RlIHRoYXQgdG1wIHJlcHJlc2VudHMgdGhlIDJuZCBoYWxmIG9mIGEgc3Vycm9nYXRlIHBhaXIgaW5jYXNlIGEgc3Vycm9nYXRlIGdldHMgZGl2aWRlZCBiZXR3ZWVuIGJsb2Nrc1xuICAgIGZvciAoOyBpbmRleCA8IGxlbjsgKSB7XG4gICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICBmb3IgKDsgcG9zIDwgbmV4dEVuZDsgaW5kZXggPSAoaW5kZXggKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgY3AwID0gaW5wdXRBczhbaW5kZXhdICYgMHhmZjtcbiAgICAgICAgc3dpdGNoIChjcDAgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgaWYgKGNwMSA+PiA2ICE9PSAwYjEwIHx8IDBiMTExMTAxMTEgPCBjcDApIHtcbiAgICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZVBvaW50ID0gKChjcDAgJiAwYjExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gNTsgLy8gMjAgZW5zdXJlcyBpdCBuZXZlciBwYXNzZXMgLT4gYWxsIGludmFsaWQgcmVwbGFjZW1lbnRzXG4gICAgICAgICAgICBjcDAgPSAweDEwMDsgLy8gIGtlZXAgdHJhY2sgb2YgdGggYml0IHNpemVcbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gY3AxID4+IDYgPT09IDBiMTAgPyAobWluQml0cyArIDQpIHwgMCA6IDI0OyAvLyAyNCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IChjcDAgKyAweDEwMCkgJiAweDMwMDsgLy8ga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPDw9IDY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgfD0gKChjcDAgJiAwYjExMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSAobWluQml0cyArIDcpIHwgMDtcblxuICAgICAgICAgICAgLy8gTm93LCBwcm9jZXNzIHRoZSBjb2RlIHBvaW50XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsZW4gJiYgY3AxID4+IDYgPT09IDBiMTAgJiYgY29kZVBvaW50ID4+IG1pbkJpdHMgJiYgY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY3AwID0gY29kZVBvaW50O1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSAoY29kZVBvaW50IC0gMHgxMDAwMCkgfCAwO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb2RlUG9pbnQgLyoweGZmZmYgPCBjb2RlUG9pbnQqLykge1xuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICAgICAgLy9uZXh0RW5kID0gbmV4dEVuZCAtIDF8MDtcblxuICAgICAgICAgICAgICAgIHRtcCA9ICgoY29kZVBvaW50ID4+IDEwKSArIDB4ZDgwMCkgfCAwOyAvLyBoaWdoU3Vycm9nYXRlXG4gICAgICAgICAgICAgICAgY3AwID0gKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApIHwgMDsgLy8gbG93U3Vycm9nYXRlICh3aWxsIGJlIGluc2VydGVkIGxhdGVyIGluIHRoZSBzd2l0Y2gtc3RhdGVtZW50KVxuXG4gICAgICAgICAgICAgICAgaWYgKHBvcyA8IDMxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBub3RpY2UgMzEgaW5zdGVhZCBvZiAzMlxuICAgICAgICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSB0bXA7XG4gICAgICAgICAgICAgICAgICBwb3MgPSAocG9zICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgICAgdG1wID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIGVsc2UsIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dEFzOCBhbmQgbGV0IHRtcDAgYmUgZmlsbGVkIGluIGxhdGVyIG9uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFIHRoYXQgY3AxIGlzIGJlaW5nIHVzZWQgYXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIHRoZSBzd2FwcGluZyBvZiB0bXAgd2l0aCBjcDBcbiAgICAgICAgICAgICAgICAgIGNwMSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHRtcCA9IGNwMDtcbiAgICAgICAgICAgICAgICAgIGNwMCA9IGNwMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBuZXh0RW5kID0gKG5leHRFbmQgKyAxKSB8IDA7IC8vIGJlY2F1c2Ugd2UgYXJlIGFkdmFuY2luZyBpIHdpdGhvdXQgYWR2YW5jaW5nIHBvc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb2RlIHBvaW50IG1lYW5zIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgd2l0aCBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgY3AwID4+PSA4O1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIGNwMCAtIDEpIHwgMDsgLy8gcmVzZXQgaW5kZXggIGJhY2sgdG8gd2hhdCBpdCB3YXMgYmVmb3JlXG4gICAgICAgICAgICAgIGNwMCA9IDB4ZmZmZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluYWxseSwgcmVzZXQgdGhlIHZhcmlhYmxlcyBmb3IgdGhlIG5leHQgZ28tYXJvdW5kXG4gICAgICAgICAgICBtaW5CaXRzID0gMDtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDA7XG4gICAgICAgICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICAgICAgLypjYXNlIDExOlxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICBjYXNlIDk6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjb2RlUG9pbnQgPyBjb2RlUG9pbnQgPSAwIDogY3AwID0gMHhmZmZkOyAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgY29udGludWU7Ki9cbiAgICAgICAgICBkZWZhdWx0OiAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gY3AwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgIH1cbiAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgfVxuICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls1XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls4XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMThdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzFdXG4gICAgICApO1xuICAgICAgaWYgKHBvcyA8IDMyKSB0bXBTdHIgPSB0bXBTdHIuc2xpY2UoMCwgKHBvcyAtIDMyKSB8IDApOyAvLy0oMzItcG9zKSk7XG4gICAgICBpZiAoaW5kZXggPCBsZW4pIHtcbiAgICAgICAgLy9mcm9tQ2hhckNvZGUuYXBwbHkoMCwgdG1wQnVmZmVyVTE2IDogVWludDhBcnJheSA/ICB0bXBCdWZmZXJVMTYuc3ViYXJyYXkoMCxwb3MpIDogdG1wQnVmZmVyVTE2LnNsaWNlKDAscG9zKSk7XG4gICAgICAgIHRtcEJ1ZmZlclUxNlswXSA9IHRtcDtcbiAgICAgICAgcG9zID0gfnRtcCA+Pj4gMzE7IC8vdG1wICE9PSAtMSA/IDEgOiAwO1xuICAgICAgICB0bXAgPSAtMTtcblxuICAgICAgICBpZiAodG1wU3RyLmxlbmd0aCA8IHJlc3VsdGluZ1N0cmluZy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICh0bXAgIT09IC0xKSB7XG4gICAgICAgIHRtcFN0ciArPSBmcm9tQ2hhckNvZGUodG1wKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0aW5nU3RyaW5nICs9IHRtcFN0cjtcbiAgICAgIHRtcFN0ciA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdTdHJpbmc7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGVuY29kZXJSZXBsYWNlcihub25Bc2NpaUNoYXJzOiBzdHJpbmcpIHtcbiAgLy8gbWFrZSB0aGUgVVRGIHN0cmluZyBpbnRvIGEgYmluYXJ5IFVURi04IGVuY29kZWQgc3RyaW5nXG4gIGxldCBwb2ludCA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgwKSB8IDA7XG4gIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICBpZiAocG9pbnQgPD0gMHhkYmZmKSB7XG4gICAgICBjb25zdCBuZXh0Y29kZSA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgxKSB8IDA7IC8vIGRlZmF1bHRzIHRvIDAgd2hlbiBOYU4sIGNhdXNpbmcgbnVsbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblxuICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgcG9pbnQgPSAoKHBvaW50IDw8IDEwKSArIG5leHRjb2RlIC0gMHgzNWZkYzAwKSB8IDA7XG4gICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZilcbiAgICAgICAgICByZXR1cm4gZnJvbUNoYXJDb2RlKFxuICAgICAgICAgICAgKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gMTIpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH1cbiAgfVxuICAvKmlmIChwb2ludCA8PSAweDAwN2YpIHJldHVybiBub25Bc2NpaUNoYXJzO1xuICBlbHNlICovIGlmIChwb2ludCA8PSAweDA3ZmYpIHtcbiAgICByZXR1cm4gZnJvbUNoYXJDb2RlKCgweDYgPDwgNSkgfCAocG9pbnQgPj4gNiksICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKSk7XG4gIH0gZWxzZVxuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAoMHhlIC8qMGIxMTEwKi8gPDwgNCkgfCAocG9pbnQgPj4gMTIpLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqL1xuICAgICk7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0RW5jb2RlciB7XG4gIHB1YmxpYyBlbmNvZGUoaW5wdXRTdHJpbmc6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIC8vIDB4YzAgPT4gMGIxMTAwMDAwMDsgMHhmZiA9PiAwYjExMTExMTExOyAweGMwLTB4ZmYgPT4gMGIxMXh4eHh4eFxuICAgIC8vIDB4ODAgPT4gMGIxMDAwMDAwMDsgMHhiZiA9PiAwYjEwMTExMTExOyAweDgwLTB4YmYgPT4gMGIxMHh4eHh4eFxuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAnJyArIGlucHV0U3RyaW5nLFxuICAgICAgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwO1xuICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheSgoKGxlbiA8PCAxKSArIDgpIHwgMCk7XG4gICAgbGV0IHRtcFJlc3VsdDogVWludDhBcnJheTtcbiAgICBsZXQgaSA9IDAsXG4gICAgICBwb3MgPSAwLFxuICAgICAgcG9pbnQgPSAwLFxuICAgICAgbmV4dGNvZGUgPSAwO1xuICAgIGxldCB1cGdyYWRlZGVkQXJyYXlTaXplID0gIVVpbnQ4QXJyYXk7IC8vIG5vcm1hbCBhcnJheXMgYXJlIGF1dG8tZXhwYW5kaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwLCBwb3MgPSAocG9zICsgMSkgfCAwKSB7XG4gICAgICBwb2ludCA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKSB8IDA7XG4gICAgICBpZiAocG9pbnQgPD0gMHgwMDdmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gcG9pbnQ7XG4gICAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgICAgICByZXN1bHRbcG9zXSA9ICgweDYgPDwgNSkgfCAocG9pbnQgPj4gNik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkZW5DaGVjazoge1xuICAgICAgICAgIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICAgICAgICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgICAgICAgICAgbmV4dGNvZGUgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoKGkgPSAoaSArIDEpIHwgMCkpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICAgICAgICAgIGlmICgweGRjMDAgPD0gbmV4dGNvZGUgJiYgbmV4dGNvZGUgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3NdID0gKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrIHdpZGVuQ2hlY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdXBncmFkZWRlZEFycmF5U2l6ZSAmJiBpIDw8IDEgPCBwb3MgJiYgaSA8PCAxIDwgKChwb3MgLSA3KSB8IDApKSB7XG4gICAgICAgICAgICB1cGdyYWRlZGVkQXJyYXlTaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIHRtcFJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbiAqIDMpO1xuICAgICAgICAgICAgdG1wUmVzdWx0LnNldChyZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdG1wUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcG9zXSA9ICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVaW50OEFycmF5ID8gcmVzdWx0LnN1YmFycmF5KDAsIHBvcykgOiByZXN1bHQuc2xpY2UoMCwgcG9zKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmNvZGVJbnRvKGlucHV0U3RyaW5nOiBzdHJpbmcsIHU4QXJyOiBVaW50OEFycmF5KTogeyB3cml0dGVuOiBudW1iZXI7IHJlYWQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbmNvZGVkU3RyaW5nID0gaW5wdXRTdHJpbmcgPT09IHZvaWQgMCA/ICcnIDogKCcnICsgaW5wdXRTdHJpbmcpLnJlcGxhY2UoZW5jb2RlclJlZ2V4cCwgZW5jb2RlclJlcGxhY2VyKTtcbiAgICBsZXQgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwLFxuICAgICAgaSA9IDAsXG4gICAgICBjaGFyID0gMCxcbiAgICAgIHJlYWQgPSAwO1xuICAgIGNvbnN0IHU4QXJyTGVuID0gdThBcnIubGVuZ3RoIHwgMDtcbiAgICBjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0U3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgaWYgKHU4QXJyTGVuIDwgbGVuKSBsZW4gPSB1OEFyckxlbjtcbiAgICBwdXRDaGFyczoge1xuICAgICAgZm9yICg7IGkgPCBsZW47IGkgPSAoaSArIDEpIHwgMCkge1xuICAgICAgICBjaGFyID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgICAgc3dpdGNoIChjaGFyID4+IDQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgIC8vIGV4dGVuc2lvbiBwb2ludHM6XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBpZiAoKChpICsgMSkgfCAwKSA8IHU4QXJyTGVuKSB7XG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGlmICgoKGkgKyAyKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgLy9pZiAoIShjaGFyID09PSAweEVGICYmIGVuY29kZWRTdHJpbmcuc3Vic3RyKGkrMXwwLDIpID09PSBcIlxceEJGXFx4QkRcIikpXG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGlmICgoKGkgKyAzKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWsgcHV0Q2hhcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWFkID0gcmVhZCArICgoY2hhciA+PiA2KSAhPT0gMikgfDA7XG4gICAgICAgIHU4QXJyW2ldID0gY2hhcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogaSwgcmVhZDogaW5wdXRMZW5ndGggPCByZWFkID8gaW5wdXRMZW5ndGggOiByZWFkIH07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUocyk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgVWludDhBcnJheSBpbnRvIGEgVVRGLTggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoYTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlKGEpO1xufVxuIiwiaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8qKlxuICogVGhyb3duIGZyb20gY29kZSB0aGF0IHJlY2VpdmVzIGEgdmFsdWUgdGhhdCBpcyB1bmV4cGVjdGVkIG9yIHRoYXQgaXQncyB1bmFibGUgdG8gaGFuZGxlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1ZhbHVlRXJyb3InKVxuZXhwb3J0IGNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgUGF5bG9hZCBDb252ZXJ0ZXIgaXMgbWlzY29uZmlndXJlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdQYXlsb2FkQ29udmVydGVyRXJyb3InKVxuZXhwb3J0IGNsYXNzIFBheWxvYWRDb252ZXJ0ZXJFcnJvciBleHRlbmRzIFZhbHVlRXJyb3Ige31cblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbid0IGJlIGNvbXBsZXRlZCBiZWNhdXNlIGl0IGlzIGlsbGVnYWwgZ2l2ZW4gdGhlXG4gKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBvYmplY3Q7IGUuZy4gdHJ5aW5nIHRvIHVzZSBhIHJlc291cmNlIGFmdGVyIGl0IGhhcyBiZWVuIGNsb3NlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdJbGxlZ2FsU3RhdGVFcnJvcicpXG5leHBvcnQgY2xhc3MgSWxsZWdhbFN0YXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgV29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gSWQgaXMgbm90IGtub3duIHRvIFRlbXBvcmFsIFNlcnZlci5cbiAqIEl0IGNvdWxkIGJlIGJlY2F1c2U6XG4gKiAtIElkIHBhc3NlZCBpcyBpbmNvcnJlY3RcbiAqIC0gV29ya2Zsb3cgaXMgY2xvc2VkIChmb3Igc29tZSBjYWxscywgZS5nLiBgdGVybWluYXRlYClcbiAqIC0gV29ya2Zsb3cgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgU2VydmVyIGFmdGVyIHJlYWNoaW5nIGl0cyByZXRlbnRpb24gbGltaXRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd05vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ05hbWVzcGFjZU5vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHN1cGVyKGBOYW1lc3BhY2Ugbm90IGZvdW5kOiAnJHtuYW1lc3BhY2V9J2ApO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3cgdGhpcyBlcnJvciBmcm9tIGFuIEFjdGl2aXR5IGluIG9yZGVyIHRvIG1ha2UgdGhlIFdvcmtlciBmb3JnZXQgYWJvdXQgdGhpcyBBY3Rpdml0eS5cbiAqXG4gKiBUaGUgQWN0aXZpdHkgY2FuIHRoZW4gYmUgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5IChmcm9tIGFueXdoZXJl4oCUdXN1YWxseSBvdXRzaWRlIHRoZSBXb3JrZXIpIHVzaW5nXG4gKiB0aGUgQ2xpZW50J3MgYWN0aXZpdHkgaGFuZGxlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqaW1wb3J0IHsgQ29tcGxldGVBc3luY0Vycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vYWN0aXZpdHknO1xuICpcbiAqZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15QWN0aXZpdHkoKTogUHJvbWlzZTxuZXZlcj4ge1xuICogIC8vIC4uLlxuICogIHRocm93IG5ldyBDb21wbGV0ZUFzeW5jRXJyb3IoKTtcbiAqfVxuICogYGBgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29tcGxldGVBc3luY0Vycm9yJylcbmV4cG9ydCBjbGFzcyBDb21wbGV0ZUFzeW5jRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSwgaXNSZWNvcmQsIFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG5leHBvcnQgY29uc3QgRkFJTFVSRV9TT1VSQ0UgPSAnVHlwZVNjcmlwdFNESyc7XG5leHBvcnQgdHlwZSBQcm90b0ZhaWx1cmUgPSB0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5JRmFpbHVyZTtcblxuZXhwb3J0IGNvbnN0IFRpbWVvdXRUeXBlID0ge1xuICBTVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcbiAgU0NIRURVTEVfVE9fU1RBUlQ6ICdTQ0hFRFVMRV9UT19TVEFSVCcsXG4gIFNDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuICBIRUFSVEJFQVQ6ICdIRUFSVEJFQVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNUQVJUX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU1RBUlRfVE9fQ0xPU0U6ICdTVEFSVF9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU0NIRURVTEVfVE9fU1RBUlR9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19DTE9TRX0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEhFQVJUQkVBVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX0hFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUaW1lb3V0VHlwZSA9ICh0eXBlb2YgVGltZW91dFR5cGUpW2tleW9mIHR5cGVvZiBUaW1lb3V0VHlwZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlVGltZW91dFR5cGUsIGRlY29kZVRpbWVvdXRUeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIHR5cGVvZiBUaW1lb3V0VHlwZSxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4+KFxuICB7XG4gICAgW1RpbWVvdXRUeXBlLlNUQVJUX1RPX0NMT1NFXTogMSxcbiAgICBbVGltZW91dFR5cGUuU0NIRURVTEVfVE9fU1RBUlRdOiAyLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19DTE9TRV06IDMsXG4gICAgW1RpbWVvdXRUeXBlLkhFQVJUQkVBVF06IDQsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdUSU1FT1VUX1RZUEVfJ1xuKTtcblxuZXhwb3J0IGNvbnN0IFJldHJ5U3RhdGUgPSB7XG4gIElOX1BST0dSRVNTOiAnSU5fUFJPR1JFU1MnLFxuICBOT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuICBUSU1FT1VUOiAnVElNRU9VVCcsXG4gIE1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG4gIFJFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6ICdJTlRFUk5BTF9TRVJWRVJfRVJST1InLFxuICBDQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSU5fUFJPR1JFU1N9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOX1BST0dSRVNTOiAnSU5fUFJPR1JFU1MnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5PTl9SRVRSWUFCTEVfRkFJTFVSRX0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfTk9OX1JFVFJZQUJMRV9GQUlMVVJFOiAnTk9OX1JFVFJZQUJMRV9GQUlMVVJFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBUSU1FT1VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9USU1FT1VUOiAnVElNRU9VVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQ6ICdNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFVFJZX1BPTElDWV9OT1RfU0VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9SRVRSWV9QT0xJQ1lfTk9UX1NFVDogJ1JFVFJZX1BPTElDWV9OT1RfU0VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTlRFUk5BTF9TRVJWRVJfRVJST1J9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ0FOQ0VMX1JFUVVFU1RFRH0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfQ0FOQ0VMX1JFUVVFU1RFRDogJ0NBTkNFTF9SRVFVRVNURUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHVuZGVmaW5lZGAgaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZXRyeVN0YXRlID0gKHR5cGVvZiBSZXRyeVN0YXRlKVtrZXlvZiB0eXBlb2YgUmV0cnlTdGF0ZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlUmV0cnlTdGF0ZSwgZGVjb2RlUmV0cnlTdGF0ZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICB0eXBlb2YgUmV0cnlTdGF0ZSxcbiAgJ1JFVFJZX1NUQVRFXydcbj4oXG4gIHtcbiAgICBbUmV0cnlTdGF0ZS5JTl9QUk9HUkVTU106IDEsXG4gICAgW1JldHJ5U3RhdGUuTk9OX1JFVFJZQUJMRV9GQUlMVVJFXTogMixcbiAgICBbUmV0cnlTdGF0ZS5USU1FT1VUXTogMyxcbiAgICBbUmV0cnlTdGF0ZS5NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRURdOiA0LFxuICAgIFtSZXRyeVN0YXRlLlJFVFJZX1BPTElDWV9OT1RfU0VUXTogNSxcbiAgICBbUmV0cnlTdGF0ZS5JTlRFUk5BTF9TRVJWRVJfRVJST1JdOiA2LFxuICAgIFtSZXRyeVN0YXRlLkNBTkNFTF9SRVFVRVNURURdOiA3LFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUkVUUllfU1RBVEVfJ1xuKTtcblxuLyoqXG4gKiBBIGNhdGVnb3J5IHRvIGRlc2NyaWJlIHRoZSBzZXZlcml0eSBhbmQgY2hhbmdlIHRoZSBvYnNlcnZhYmlsaXR5IGJlaGF2aW9yIG9mIGFuIGFwcGxpY2F0aW9uIGZhaWx1cmUuXG4gKlxuICogQ3VycmVudGx5LCBvYnNlcnZhYmlsaXR5IGJlaGF2aW9yIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG86XG4gKiAtIGFjdGl2aXRpZXMgdGhhdCBmYWlsIGR1ZSB0byBhIEJFTklHTiBhcHBsaWNhdGlvbiBmYWlsdXJlIGVtaXQgREVCVUcgbGV2ZWwgbG9ncyBhbmQgZG8gbm90IHJlY29yZCBtZXRyaWNzXG4gKlxuICogQGV4cGVyaW1lbnRhbCBDYXRlZ29yeSBpcyBhIG5ldyBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSA9IHtcbiAgQkVOSUdOOiAnQkVOSUdOJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSA9ICh0eXBlb2YgQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkpW2tleW9mIHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgJ0FQUExJQ0FUSU9OX0VSUk9SX0NBVEVHT1JZXydcbj4oXG4gIHtcbiAgICBbQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkuQkVOSUdOXTogMSxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0FQUExJQ0FUSU9OX0VSUk9SX0NBVEVHT1JZXydcbik7XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RXhlY3V0aW9uID0gdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JV29ya2Zsb3dFeGVjdXRpb247XG5cbi8qKlxuICogUmVwcmVzZW50cyBmYWlsdXJlcyB0aGF0IGNhbiBjcm9zcyBXb3JrZmxvdyBhbmQgQWN0aXZpdHkgYm91bmRhcmllcy5cbiAqXG4gKiAqKk5ldmVyIGV4dGVuZCB0aGlzIGNsYXNzIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4uKipcbiAqXG4gKiBUaGUgb25seSBjaGlsZCBjbGFzcyB5b3Ugc2hvdWxkIGV2ZXIgdGhyb3cgZnJvbSB5b3VyIGNvZGUgaXMge0BsaW5rIEFwcGxpY2F0aW9uRmFpbHVyZX0uXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGVtcG9yYWxGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZW1wb3JhbEZhaWx1cmUgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgZmFpbHVyZSB0aGF0IGNvbnN0cnVjdGVkIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIE9ubHkgcHJlc2VudCBpZiB0aGlzIGVycm9yIHdhcyBnZW5lcmF0ZWQgZnJvbSBhbiBleHRlcm5hbCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmFpbHVyZT86IFByb3RvRmFpbHVyZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlID8/IHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuLyoqIEV4Y2VwdGlvbnMgb3JpZ2luYXRlZCBhdCB0aGUgVGVtcG9yYWwgc2VydmljZS4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignU2VydmVyRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgU2VydmVyRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbm9uUmV0cnlhYmxlOiBib29sZWFuLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogYEFwcGxpY2F0aW9uRmFpbHVyZWBzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZhaWx1cmVzIGluIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllcy5cbiAqXG4gKiBUaGUge0BsaW5rIHR5cGV9IHByb3BlcnR5IGlzIG1hdGNoZWQgYWdhaW5zdCB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30gdG8gZGV0ZXJtaW5lIGlmIGFuIGluc3RhbmNlXG4gKiBvZiB0aGlzIGVycm9yIGlzIHJldHJ5YWJsZS4gQW5vdGhlciB3YXkgdG8gYXZvaWQgcmV0cnlpbmcgaXMgYnkgc2V0dGluZyB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyB0byBgdHJ1ZWAuXG4gKlxuICogSW4gV29ya2Zsb3dzLCBpZiB5b3UgdGhyb3cgYSBub24tYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHRoZSBXb3JrZmxvdyBUYXNrIHdpbGwgZmFpbCBhbmQgYmUgcmV0cmllZC4gSWYgeW91IHRocm93IGFuXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiB3aWxsIGZhaWwuXG4gKlxuICogSW4gQWN0aXZpdGllcywgeW91IGNhbiBlaXRoZXIgdGhyb3cgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAgb3IgYW5vdGhlciBgRXJyb3JgIHRvIGZhaWwgdGhlIEFjdGl2aXR5IFRhc2suIEluIHRoZVxuICogbGF0dGVyIGNhc2UsIHRoZSBgRXJyb3JgIHdpbGwgYmUgY29udmVydGVkIHRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLiBUaGUgY29udmVyc2lvbiBpcyBkb25lIGFzIGZvbGxvd2luZzpcbiAqXG4gKiAtIGB0eXBlYCBpcyBzZXQgdG8gYGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWVgXG4gKiAtIGBtZXNzYWdlYCBpcyBzZXQgdG8gYGVycm9yLm1lc3NhZ2VgXG4gKiAtIGBub25SZXRyeWFibGVgIGlzIHNldCB0byBmYWxzZVxuICogLSBgZGV0YWlsc2AgYXJlIHNldCB0byBudWxsXG4gKiAtIHN0YWNrIHRyYWNlIGlzIGNvcGllZCBmcm9tIHRoZSBvcmlnaW5hbCBlcnJvclxuICpcbiAqIFdoZW4gYW4ge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9hY3Rpdml0eS1leGVjdXRpb24jYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkgfCB1bmRlZmluZWQgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgZnJvbSBhbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEZpcnN0IGNhbGxzIHtAbGluayBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUgfCBgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKWB9IGFuZCB0aGVuIG92ZXJyaWRlcyBhbnkgZmllbGRzXG4gICAqIHByb3ZpZGVkIGluIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yIHwgdW5rbm93biwgb3ZlcnJpZGVzPzogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcik7XG4gICAgT2JqZWN0LmFzc2lnbihmYWlsdXJlLCBvdmVycmlkZXMpO1xuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBiZSByZXRyeWFibGUgKHVubGVzcyBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSA9IGZhbHNlLCBkZXRhaWxzLCBuZXh0UmV0cnlEZWxheSwgY2F1c2UsIGNhdGVnb3J5IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSwgY2F0ZWdvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBjYXRlZ29yeSBvZiB0aGUgYXBwbGljYXRpb24gZXJyb3IuXG4gICAqIEFmZmVjdHMgd29ya2VyLXNpZGUgbG9nZ2luZyBhbmQgbWV0cmljcyBiZWhhdmlvciBvZiB0aGlzIGZhaWx1cmUuXG4gICAqL1xuICBjYXRlZ29yeT86IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5O1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIE5leHVzIE9wZXJhdGlvbiBleGVjdXRlZCBpbnNpZGUgYSBXb3JrZmxvdyBmYWlscy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOZXh1c09wZXJhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIE5leHVzT3BlcmF0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZEV2ZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgYWRkIGEgTmV4dXNIYW5kbGVyRmFpbHVyZSBjbGFzcyBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG5cbi8qKlxuICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gKiAgLSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElEIGlzIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGlzIGBXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfRkFJTGBcbiAqICAtIFRoZXJlIGlzIGEgY2xvc2VkIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWBcbiAqICAtIFRoZXJlIGlzIGNsb3NlZCBXb3JrZmxvdyBpbiB0aGUgYENvbXBsZXRlZGAgc3RhdGUgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFlgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBgZXJyb3JgIGlzIGFscmVhZHkgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHJldHVybnMgYGVycm9yYC5cbiAqXG4gKiBPdGhlcndpc2UsIGNvbnZlcnRzIGBlcnJvcmAgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoOlxuICpcbiAqIC0gYG1lc3NhZ2VgOiBgZXJyb3IubWVzc2FnZWAgb3IgYFN0cmluZyhlcnJvcilgXG4gKiAtIGB0eXBlYDogYGVycm9yLmNvbnN0cnVjdG9yLm5hbWVgIG9yIGBlcnJvci5uYW1lYFxuICogLSBgc3RhY2tgOiBgZXJyb3Iuc3RhY2tgIG9yIGAnJ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5tZXNzYWdlKSkgfHwgU3RyaW5nKGVycm9yKTtcbiAgY29uc3QgdHlwZSA9IChpc1JlY29yZChlcnJvcikgJiYgKGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlOiBmYWxzZSB9KTtcbiAgZmFpbHVyZS5zdGFjayA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLnN0YWNrKSkgfHwgJyc7XG4gIHJldHVybiBmYWlsdXJlO1xufVxuXG4vKipcbiAqIElmIGBlcnJgIGlzIGFuIEVycm9yIGl0IGlzIHR1cm5lZCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICpcbiAqIElmIGBlcnJgIHdhcyBhbHJlYWR5IGEgYFRlbXBvcmFsRmFpbHVyZWAsIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yLlxuICpcbiAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggYFN0cmluZyhlcnIpYCBhcyB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnI6IHVua25vd24pOiBUZW1wb3JhbEZhaWx1cmUge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICByZXR1cm4gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycik7XG59XG5cbi8qKlxuICogR2V0IHRoZSByb290IGNhdXNlIG1lc3NhZ2Ugb2YgZ2l2ZW4gYGVycm9yYC5cbiAqXG4gKiBJbiBjYXNlIGBlcnJvcmAgaXMgYSB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSwgcmVjdXJzZSB0aGUgYGNhdXNlYCBjaGFpbiBhbmQgcmV0dXJuIHRoZSByb290IGBjYXVzZS5tZXNzYWdlYC5cbiAqIE90aGVyd2lzZSwgcmV0dXJuIGBlcnJvci5tZXNzYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RDYXVzZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZSA/IHJvb3RDYXVzZShlcnJvci5jYXVzZSkgOiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIiwiLyoqXG4gKiBDb21tb24gbGlicmFyeSBmb3IgY29kZSB0aGF0J3MgdXNlZCBhY3Jvc3MgdGhlIENsaWVudCwgV29ya2VyLCBhbmQvb3IgV29ya2Zsb3dcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1vcHRpb25zJztcbmV4cG9ydCB7IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMsIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB9IGZyb20gJy4vYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMnO1xuZXhwb3J0IHsgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gfSBmcm9tICcuL2NvbnRpbnVlLWFzLW5ldyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgU2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG59IGZyb20gJy4vY29udmVydGVyL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2RlcHJlY2F0ZWQtdGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhaWx1cmUnO1xuZXhwb3J0IHsgSGVhZGVycywgTmV4dCB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3ByaW9yaXR5JztcbmV4cG9ydCAqIGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5leHBvcnQgdHlwZSB7IFRpbWVzdGFtcCwgRHVyYXRpb24sIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi90aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2VyLWRlcGxveW1lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctZGVmaW5pdGlvbi1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmV4cG9ydCB7XG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2RpbmcuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYXJyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShhcnIpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvckNvZGUoZXJyb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlGdW5jLCBPbWl0TGFzdFBhcmFtIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGludGVyY2VwdG9yIGZ1bmN0aW9uXG4gKlxuICogQ2FsbGVkIGZyb20gYW4gaW50ZXJjZXB0b3IgdG8gY29udGludWUgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG5leHBvcnQgdHlwZSBOZXh0PElGLCBGTiBleHRlbmRzIGtleW9mIElGPiA9IFJlcXVpcmVkPElGPltGTl0gZXh0ZW5kcyBBbnlGdW5jID8gT21pdExhc3RQYXJhbTxSZXF1aXJlZDxJRj5bRk5dPiA6IG5ldmVyO1xuXG4vKiogSGVhZGVycyBhcmUganVzdCBhIG1hcHBpbmcgb2YgaGVhZGVyIG5hbWUgdG8gUGF5bG9hZCAqL1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG50eXBlIFdyYXBOZXh0ID0gPEYgZXh0ZW5kcyBBbnlGdW5jPihuZXh0OiBGKSA9PiBGO1xuXG4vKipcbiAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJjZXB0b3IgY2hhaW5pbmcuXG4gKlxuICogVGhlIHdvcmtmbG93IHBhY2thZ2UgbmVlZHMgb25lIHNtYWxsIGJlaGF2aW9yYWwgZXh0ZW5zaW9uIG92ZXIgdGhlIGdlbmVyaWMgaW50ZXJjZXB0b3JcbiAqIHNlbWFudGljczogZXZlcnkgYG5leHQoLi4uKWAgY29udGludWF0aW9uIGl0IGhhbmRzIHRvIHdvcmtmbG93IGludGVyY2VwdG9ycyBtdXN0IGZpcnN0XG4gKiByZXN0b3JlIHRoZSB3b3JrZmxvdyByYW5kb20gc2NvcGUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHRoYXQgY29udGludWF0aW9uIHdhcyBjcmVhdGVkLlxuICpcbiAqIFdlIGtlZXAgdGhlIGNoYWluLWNvbnN0cnVjdGlvbiBsb29wIGhlcmUgYXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggc28gb3JkZXJpbmcgYW5kXG4gKiBiYXNpYyBjb21wb3NpdGlvbiBiZWhhdmlvciBjYW5ub3QgZHJpZnQgYmV0d2VlbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGNsaWVudCxcbiAqIHdvcmtlciwgYWN0aXZpdHksIGFuZCBuZXh1cyBjb2RlIGFuZCB0aGUgd29ya2Zsb3ctc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGhhdCBkZWNvcmF0ZXNcbiAqIGBuZXh0KC4uLilgIGF0IGVhY2ggYm91bmRhcnkuIFRoZSBvbmx5IGJlaGF2aW9yIHRoYXQgdmFyaWVzIGJldHdlZW4gY2FsbGVycyBpcyB0aGVcbiAqIGB3cmFwTmV4dGAgaG9vazogbW9zdCBwYWNrYWdlcyB1c2UgdGhlIGlkZW50aXR5IHdyYXBwZXIsIHdoaWxlIHdvcmtmbG93IGNvZGUgc3VwcGxpZXMgYVxuICogd3JhcHBlciB0aGF0IHJlLWVudGVycyB0aGUgY2FwdHVyZWQgd29ya2Zsb3cgYXN5bmMtbG9jYWwgcmFuZG9tIHNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUludGVyY2VwdG9yc1dpdGg8SSwgTSBleHRlbmRzIGtleW9mIEk+KFxuICBpbnRlcmNlcHRvcnM6IElbXSxcbiAgbWV0aG9kOiBNLFxuICBuZXh0OiBOZXh0PEksIE0+LFxuICB3cmFwTmV4dDogV3JhcE5leHRcbik6IE5leHQ8SSwgTT4ge1xuICBsZXQgY29tcG9zZWROZXh0OiBhbnkgPSBuZXh0O1xuICBmb3IgKGxldCBpID0gaW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcnNbaV07XG4gICAgaWYgKGludGVyY2VwdG9yPy5bbWV0aG9kXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcmV2ID0gd3JhcE5leHQoY29tcG9zZWROZXh0KTtcbiAgICAgIC8vIFdlIGxvc2UgdHlwZSBzYWZldHkgaGVyZSBiZWNhdXNlIFR5cGVzY3JpcHQgY2FuJ3QgZGVkdWNlIHRoYXQgaW50ZXJjZXB0b3JbbWV0aG9kXSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAgLy8gdGhlIHNhbWUgdHlwZSBhcyBOZXh0PEksIE0+XG4gICAgICBjb21wb3NlZE5leHQgPSAoKGlucHV0OiBhbnkpID0+IChpbnRlcmNlcHRvclttZXRob2RdIGFzIGFueSkoaW5wdXQsIHByZXYpKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wb3NlZE5leHQ7XG59XG5cbi8qKlxuICogQ29tcG9zZSBhbGwgaW50ZXJjZXB0b3IgbWV0aG9kcyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIENhbGxpbmcgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uIHJlc3VsdHMgaW4gY2FsbGluZyBlYWNoIG9mIHRoZSBwcm92aWRlZCBpbnRlcmNlcHRvciwgaW4gb3JkZXIgKGZyb20gdGhlIGZpcnN0IHRvXG4gKiB0aGUgbGFzdCksIGZvbGxvd2VkIGJ5IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBwcm92aWRlZCBhcyBhcmd1bWVudCB0byBgY29tcG9zZUludGVyY2VwdG9ycygpYC5cbiAqXG4gKiBAcGFyYW0gaW50ZXJjZXB0b3JzIGEgbGlzdCBvZiBpbnRlcmNlcHRvcnNcbiAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIG1ldGhvZCB0byBjb21wb3NlXG4gKiBAcGFyYW0gbmV4dCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW50ZXJjZXB0aW9uIGNoYWluXG4gKi9cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0IChpbXBvcnRlZCB2aWEgbGliL2ludGVyY2VwdG9ycylcbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIHJldHVybiBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aChpbnRlcmNlcHRvcnMsIG1ldGhvZCwgbmV4dCwgKCh3cmFwcGVkTmV4dCkgPT4gd3JhcHBlZE5leHQpIGFzIFdyYXBOZXh0KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbmV4cG9ydCB0eXBlIFBheWxvYWQgPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQYXlsb2FkO1xuXG4vKiogVHlwZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tIGEgV29ya2Zsb3cgYGV4ZWN1dGVgIGZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JldHVyblR5cGUgPSBQcm9taXNlPGFueT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZVR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55PiB8IGFueTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSA9IHtcbiAgaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgdmFsaWRhdG9yPzogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbFR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1NpZ25hbFR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5VHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGUgPSB7IGhhbmRsZXI6IFdvcmtmbG93UXVlcnlUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEJyb2FkIFdvcmtmbG93IGZ1bmN0aW9uIGRlZmluaXRpb24sIHNwZWNpZmljIFdvcmtmbG93cyB3aWxsIHR5cGljYWxseSB1c2UgYSBuYXJyb3dlciB0eXBlIGRlZmluaXRpb24sIGUuZzpcbiAqIGBgYHRzXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyhhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvdyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlO1xuXG5kZWNsYXJlIGNvbnN0IGFyZ3NCcmFuZDogdW5pcXVlIHN5bWJvbDtcbmRlY2xhcmUgY29uc3QgcmV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHVwZGF0ZSBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVVcGRhdGV9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSB1cGRhdGUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3VwZGF0ZSc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHNpZ25hbCBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWZpbml0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICdzaWduYWwnO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgU2lnbmFsRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyBxdWVyeSBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVF1ZXJ5fVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBhbmQgYFJldGAgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHF1ZXJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3F1ZXJ5JztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKiBHZXQgdGhlIFwidW53cmFwcGVkXCIgcmV0dXJuIHR5cGUgKHdpdGhvdXQgUHJvbWlzZSkgb2YgdGhlIGV4ZWN1dGUgaGFuZGxlciBmcm9tIFdvcmtmbG93IHR5cGUgYFdgICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdFR5cGU8VyBleHRlbmRzIFdvcmtmbG93PiA9IFJldHVyblR5cGU8Vz4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFI+ID8gUiA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RnVuY3Rpb248UCBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+IHtcbiAgKC4uLmFyZ3M6IFApOiBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICogQGRlcHJlY2F0ZWQgbm90IHJlcXVpcmVkIGFueW1vcmUsIGZvciB1bnR5cGVkIGFjdGl2aXRpZXMgdXNlIHtAbGluayBVbnR5cGVkQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2UgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVW50eXBlZEFjdGl2aXRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBBIHdvcmtmbG93J3MgaGlzdG9yeSBhbmQgSUQuIFVzZWZ1bCBmb3IgcmVwbGF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBbmRXb3JrZmxvd0lkIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBoaXN0b3J5OiB0ZW1wb3JhbC5hcGkuaGlzdG9yeS52MS5IaXN0b3J5IHwgdW5rbm93biB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZGVmaW5pbmcgYWN0aW9ucyB0YWtlbiB3aGVuIGEgd29ya2Zsb3cgZXhpdHMgd2hpbGUgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVubmluZy5cbiAqIFRoZSB3b3JrZmxvdyBleGl0IG1heSBiZSBkdWUgdG8gc3VjY2Vzc2Z1bCByZXR1cm4sIGZhaWx1cmUsIGNhbmNlbGxhdGlvbiwgb3IgY29udGludWUtYXMtbmV3LlxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaW4gYWRkaXRpb24gdG8gYWJhbmRvbmluZyB0aGUgaGFuZGxlciBleGVjdXRpb24uIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiB0aGUgd29ya2Zsb3cgZmFpbHMuXG4gICAqL1xuICBXQVJOX0FORF9BQkFORE9OOiAnV0FSTl9BTkRfQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIEFiYW5kb24gdGhlIGhhbmRsZXIgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBhbiB1cGRhdGUgaGFuZGxlciB0aGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW5cbiAgICogdGhlIHVwZGF0ZSByZXN1bHQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSAodHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5KVtrZXlvZiB0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ldO1xuIiwiaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEV4YWN0LCBSZW1vdmVQcmVmaXgsIFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgbnVtZXJpYyBgZW51bWAgdHlwZXMgcHJvZHVjZWQgYnkgb3VyXG4gKiBQcm90b2J1ZiBjb21waWxlciBhbmQgXCJjb25zdCBvYmplY3Qgb2Ygc3RyaW5nc1wiIGVudW0gdmFsdWVzIHRoYXQgd2UgZXhwb3NlIGluIG91ciBwdWJsaWMgQVBJcy5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBOZXdseSBpbnRyb2R1Y2VkIGVudW1zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gKiAgICAgICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuICogICAgICAgQUJBTkRPTjogJ0FCQU5ET04nLFxuICogICAgICAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG4gKiAgICAgfSBhcyBjb25zdDtcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqXG4gKiAgICAgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSAvL1xuICogICAgICAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gKiAgICAgICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nICAvLyBUaGlzIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3RvIGVudW0gZG9lc24ndCBhZGQgYSByZXBlYXRlZCBwcmVmaXggb24gdmFsdWVzXG4gKiAgICAgICA+KFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsIC8vIFRoZXNlIG51bWJlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBpbiB0aGUgcHJvdG8gZW51bVxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICpcbiAqICAgICAgICAgICBVTlNQRUNJRklFRDogMCxcbiAqICAgICAgICAgfSBhcyBjb25zdCxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuICogICAgICAgKTtcbiAqIGBgYFxuICpcbiAqIGBtYWtlUHJvdG9FbnVtQ29udmVydGVyc2Agc3VwcG9ydHMgb3RoZXIgdXNhZ2UgcGF0dGVybnMsIGJ1dCB0aGV5IGFyZSBvbmx5IG1lYW50IGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGZvcm1lciBlbnVtIGRlZmluaXRpb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBlbnVtcy5cbiAqXG4gKiAjIyMgQ29udGV4dFxuICpcbiAqIFRlbXBvcmFsJ3MgUHJvdG9idWYgQVBJcyBkZWZpbmUgc2V2ZXJhbCBgZW51bWAgdHlwZXM7IG91ciBQcm90b2J1ZiBjb21waWxlciB0cmFuc2Zvcm1zIHRoZXNlIHRvXG4gKiB0cmFkaXRpb25hbCAoaS5lLiBub24tY29uc3QpIFtUeXBlU2NyaXB0IG51bWVyaWMgYGVudW1gc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNudW1lcmljLWVudW1zKS5cbiAqXG4gKiBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIGZhciBmcm9tIGlkZWFsOlxuICpcbiAqICAtIER1ZSB0byB0aGUgZHVhbCBuYXR1cmUgb2Ygbm9uLWNvbnN0IFR5cGVTY3JpcHQgYGVudW1gcyAodGhleSBhcmUgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUpLFxuICogICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlZmVyIHRvIGFuIGVudW0gdmFsdWUgZnJvbSBjb2RlIHdpdGhvdXQgYSBcInJlYWxcIiBpbXBvcnQgb2YgdGhlIGVudW0gdHlwZVxuICogICAgKGkuZS4gY2FuJ3Qgc2ltcGx5IGRvIGBpbXBvcnQgdHlwZSAuLi5gKS4gSW4gV29ya2Zsb3cgY29kZSwgc3VjaCBhbiBpbXBvcnQgd291bGQgcmVzdWx0IGluXG4gKiAgICBsb2FkaW5nIG91ciBlbnRpcmUgUHJvdG9idWYgZGVmaW5pdGlvbnMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgYWRkaW5nIHNldmVyYWwgbWVnYWJ5dGVzIHRvXG4gKiAgICB0aGUgcGVyLXdvcmtmbG93IG1lbW9yeSBmb290cHJpbnQsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZTsgdG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBtYWludGFpblxuICogICAgYSBtaXJyb3IgY29weSBvZiBlYWNoIGVudW0gdHlwZXMgdXNlZCBieSBpbi13b3JrZmxvdyBBUElzLCBhbmQgZXhwb3J0IHRoZXNlIGZyb20gZWl0aGVyXG4gKiAgICBgQHRlbXBvcmFsaW8vY29tbW9uYCBvciBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgLlxuICogIC0gSXQgaXMgbm90IGRlc2lyYWJsZSBmb3IgdXNlcnMgdG8gbmVlZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGBAdGVtcG9yYWxpby9wcm90b2AganVzdCB0b1xuICogICAgZ2V0IGFjY2VzcyB0byB0aGVzZSBlbnVtIHR5cGVzOyB3ZSB0aGVyZWZvcmUgbWFkZSBpdCBhIGNvbW1vbiBwcmFjdGljZSB0byByZWV4cG9ydCB0aGVzZSBlbnVtc1xuICogICAgZnJvbSBvdXIgcHVibGljIGZhY2luZyBwYWNrYWdlcy4gSG93ZXZlciwgZXhwZXJpZW5jZSBkZW1vbnRyYXRlZCB0aGF0IHRoZXNlIHJlZXhwb3J0cyBlZmZlY3RpdmVseVxuICogICAgcmVzdWx0ZWQgaW4gcG9vciBhbmQgaW5jb25zaXN0ZW50IGRvY3VtZW50YXRpb24gY292ZXJhZ2UgY29tcGFyZWQgdG8gbWlycm9yZWQgZW51bXMgdHlwZXMuXG4gKiAgLSBPdXIgUHJvdG9idWYgZW51bSB0eXBlcyB0ZW5kIHRvIGZvbGxvdyBhIHZlcmJvc2UgYW5kIHJlZHVuZGFudCBuYW1pbmcgY29udmVudGlvbiwgd2hpY2ggZmVlbHNcbiAqICAgIHVuYXR1cmFsIGFuZCBleGNlc3NpdmUgYWNjb3JkaW5nIHRvIG1vc3QgVHlwZVNjcmlwdCBzdHlsZSBndWlkZXM7IGUuZy4gaW5zdGVhZCBvZlxuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYCxcbiAqICAgIGEgVHlwZVNjcmlwdCBkZXZlbG9wZXIgd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWV0aGluZyBzaW1pbGFyIHRvXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiAnUkVKRUNUX0RVUExJQ0FURSdgLlxuICogIC0gQmVjYXVzZSBvZiB0aGUgd2F5IFByb3RvYnVmIHdvcmtzLCBtYW55IG9mIG91ciBlbnVtIHR5cGVzIGNvbnRhaW4gYW4gYFVOU1BFQ0lGSUVEYCB2YWx1ZSwgd2hpY2hcbiAqICAgIGlzIHVzZWQgdG8gZXhwbGljaXRseSBpZGVudGlmeSBhIHZhbHVlIHRoYXQgaXMgdW5zZXQuIEluIFR5cGVTY3JpcHQgY29kZSwgdGhlIGB1bmRlZmluZWRgIHZhbHVlXG4gKiAgICBhbHJlYWR5IHNlcnZlcyB0aGF0IHB1cnBvc2UsIGFuZCBpcyBkZWZpbml0ZWx5IG1vcmUgaWRpb21hdGljIHRvIFRTIGRldmVsb3BlcnMsIHdoZXJlYXMgdGhlc2VcbiAqICAgIGBVTlNQRUNJRklFRGAgdmFsdWVzIGNyZWF0ZSBub2lzZSBhbmQgY29uZnVzaW9uIGluIG91ciBBUElzLlxuICogIC0gVHlwZVNjcmlwdCBlZGl0b3JzIGdlbmVyYWxseSBkbyBhIHZlcnkgYmFkIGpvYiBhdCBwcm92aWRpbmcgYXV0b2NvbXBsZXRpb24gdGhhdCBpbXBsaWVzIHJlYWNoaW5nXG4gKiAgICBmb3IgdmFsdWVzIG9mIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUsIGZvcmNpbmcgZGV2ZWxvcGVycyB0byBleHBsaWNpdGx5IHR5cGUgaW4gYXQgbGVhc3QgcGFydFxuICogICAgb2YgdGhlIG5hbWUgb2YgdGhlIGVudW0gdHlwZSBiZWZvcmUgdGhleSBjYW4gZ2V0IGF1dG9jb21wbGV0aW9uIGZvciBpdHMgdmFsdWVzLiBPbiB0aGUgb3RoZXJcbiAqICAgIGhhbmQsIGFsbCBUUyBlZGl0b3JzIGltbWVkaWF0ZWx5IHByb3ZpZGUgYXV0b2NvbXBsZXRpb24gZm9yIHN0cmluZyB1bmlvbiB0eXBlcy5cbiAqICAtIFRoZSBbVHlwZVNjcmlwdCdzIG9mZmljaWFsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjb2JqZWN0cy12cy1lbnVtcylcbiAqICAgIGl0c2VsZiBzdWdnZXN0cyB0aGF0LCBpbiBtb2Rlcm4gVHlwZVNjcmlwdCwgdGhlIHVzZSBvZiBgYXMgY29uc3RgIG9iamVjdHMgbWF5IGdlbmVyYWxseSBzdWZmaWNlXG4gKiAgICBhbmQgbWF5IGJlIGFkdmFudGFnZW91cyBvdmVyIHRoZSB1c2Ugb2YgYGVudW1gIHR5cGVzLlxuICpcbiAqIEEgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MsIGNvbWJpbmVkIHdpdGggYSB1bmlvbiB0eXBlIG9mIHBvc3NpYmxlIHN0cmluZyB2YWx1ZXMsIHByb3ZpZGVzIGEgbXVjaFxuICogbW9yZSBpZGlvbWF0aWMgc3ludGF4IGFuZCBhIGJldHRlciBEWCBmb3IgVHlwZVNjcmlwdCBkZXZlbG9wZXJzLiBUaGlzIGhvd2V2ZXIgcmVxdWlyZXMgYSB3YXkgdG9cbiAqIGNvbnZlcnQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgYGVudW1gIHZhbHVlcyBwcm9kdWNlZCBieSB0aGUgUHJvdG9idWYgY29tcGlsZXIgYW5kIHRoZVxuICogZXF1aXZhbGVudCBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFRoaXMgaGVscGVyIGR5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gUHJvdG9idWYgZW51bSB0eXBlLFxuICogc3Ryb25nbHkgYnVpbGRpbmcgdXBvbiBzcGVjaWZpYyBjb252ZW50aW9ucyB0aGF0IHdlIGhhdmUgYWRvcHRlZCBpbiBvdXIgUHJvdG9idWYgZGVmaW5pdGlvbnMuXG4gKlxuICogIyMjIFZhbGlkYXRpb25zXG4gKlxuICogVGhlIGNvbXBsZXggdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBoZWxwZXIgaXMgdGhlcmUgdG8gcHJldmVudCBtb3N0IHBvdGVudGlhbCBpbmNvaGVyZW5jaWVzXG4gKiB0aGF0IGNvdWxkIHJlc3VsdCBmcm9tIGhhdmluZyB0byBtYW51YWxseSBzeW5jaHJvbml6ZSB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBhbmQgdGhlXG4gKiBjb252ZXJzaW9uIHRhYmxlIHdpdGggdGhlIHByb3RvIGVudW0sIHdoaWxlIG5vdCByZXF1aXJpbmcgYSByZWd1bGFyIGltcG9ydCBvbiB0aGUgUHJvdG9idWYgZW51bVxuICogaXRzZWxmIChzbyBpdCBjYW4gYmUgdXNlZCBzYWZlbHkgZm9yIGVudW1zIG1lYW50IHRvIGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb2RlKS5cbiAqXG4gKiBJbiBwYXJ0aWN1bGFyLCBmYWlsaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgd2lsbCByZXN1bHQgaW4gYnVpbGQgdGltZSBlcnJvcnM6XG4gKlxuICogLSBGb3IgZXZlcnkga2V5IG9mIHRoZSBmb3JtIGBQUkVGSVhfS0VZOiBudW1iZXJgIGluIHRoZSBwcm90byBlbnVtLCBleGNsdWRpbmcgdGhlIGBVTlNQRUNJRklFRGAga2V5OlxuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6ICdLRVknYCBlbnRyeSBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bTtcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfS0VZOiAnS0VZJ2AgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqICAgICAodGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHN1Y2ggYWxpYXNlcyBzaG91bGRcbiAqICAgICBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBhbmQgZW51bSBlbnRyaWVzIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZCk7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogbnVtYmVyYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gSWYgdGhlIHByb3RvIGVudW0gY29udGFpbnMgYSBgUFJFRklYX1VOU1BFQ0lGSUVEYCBlbnRyeSwgdGhlbjpcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGAgYW5kL29yIGBVTlNQRUNJRklFRDogdW5kZWZpbmVkYFxuICogICAgIGVudHJpZXMgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0g4oCUIHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogICAgIHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHRoaXMgYWxpYXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZDtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGFuIGBVTlNQRUNJRklFRDogMGAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIFRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBvclxuICogICBvcHRpb25hbGx5IGFsbG93ZWQgYmUgdGhlIHByZWNlZWRpbmcgcnVsZXMuXG4gKiAtIFRoZSBtYXBwaW5nIHRhYmxlIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBhYm92ZS5cbiAqXG4gKiBUaGVzZSBydWxlcyBub3RhYmx5IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIFByb3RvIGVudW0sIHRoZSBjb2RlXG4gKiB3aWxsIGZhaWwgdG8gY29tcGlsZSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpcyBhZGRlZCBvbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogYW5kIHRoZSBtYXBwaW5nIHRhYmxlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBTdHJpbmdFbnVtVHlwZUFjdHVhbCBleHRlbmRzIEV4YWN0PFN0cmluZ0VudW1UeXBlLCBTdHJpbmdFbnVtVHlwZUFjdHVhbD4sXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgLy9cbiAgLy8gUGFyYW1ldGVycyBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgaW5mZXJyZWQ7IHRoZXkncmUgbm90IG1lYW50IG5vdCB0byBiZSBzcGVjaWZpZWQgYnkgZGV2ZWxvcGVyc1xuICBVbnNwZWNpZmllZCA9IFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH1VTlNQRUNJRklFRGAgPyAnVU5TUEVDSUZJRUQnIDogbmV2ZXIsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4gPSBFeGNsdWRlPFxuICAgIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4gICAgVW5zcGVjaWZpZWRcbiAgPixcbiAgU3RyaW5nRW51bVR5cGUgZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkXG4gID4gPSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBNYXBUYWJsZSBleHRlbmRzIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+ID0gUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4sXG4+KFxuICBtYXBUYWJsZTogTWFwVGFibGUsXG4gIHByZWZpeDogUHJlZml4XG4pOiBbXG4gIChcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSA9PiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCwgLy9cbiAgKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpID0+IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCwgLy9cbl0ge1xuICBjb25zdCByZXZlcnNlVGFibGU6IFJlY29yZDxQcm90b0VudW1WYWx1ZSwgU2hvcnRTdHJpbmdFbnVtS2V5PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBUYWJsZSkubWFwKChbaywgdl0pID0+IFt2LCBrXSlcbiAgKTtcbiAgY29uc3QgaGFzVW5zcGVjaWZpZWQgPSAobWFwVGFibGUgYXMgYW55KVsnVU5TUEVDSUZJRUQnXSA9PT0gMCB8fCAobWFwVGFibGUgYXMgYW55KVtgJHtwcmVmaXh9VU5TUEVDSUZJRURgXSA9PT0gMDtcblxuICBmdW5jdGlvbiBpc1Nob3J0U3RyaW5nRW51bUtleXMoeDogdW5rbm93bik6IHggaXMgU2hvcnRTdHJpbmdFbnVtS2V5IHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHggaW4gbWFwVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc051bWVyaWNFbnVtVmFsdWUoeDogdW5rbm93bik6IHggaXMgUHJvdG9FbnVtW2tleW9mIFByb3RvRW51bV0ge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCBpbiByZXZlcnNlVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGUoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBzaG9ydGVuOiBzdHJpbmcgPSBpbnB1dDtcbiAgICAgIGlmIChzaG9ydGVuLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBzaG9ydGVuID0gc2hvcnRlbi5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3J0U3RyaW5nRW51bUtleXMoc2hvcnRlbikpIHtcbiAgICAgICAgcmV0dXJuIG1hcFRhYmxlW3Nob3J0ZW5dO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9J2ApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGhhc1Vuc3BlY2lmaWVkICYmIGlucHV0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc051bWVyaWNFbnVtVmFsdWUoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlVGFibGVbaW5wdXRdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBnb3QgYSBwcm90byBlbnVtIHZhbHVlIHRoYXQgd2UgZG9uJ3QgeWV0IGtub3cgYWJvdXQgKGkuZS4gaXQgZGlkbid0IGV4aXN0IHdoZW4gdGhpcyBjb2RlXG4gICAgICAvLyB3YXMgY29tcGlsZWQpLiBUaGlzIGlzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgZ2l2ZW4gaG93IG91ciBBUElzIGV2b2x2ZSwgdGhpcyBpcyBpc1xuICAgICAgLy8gdW5saWtlbHkgdG8gYmUgYSB0ZXJyaWJseSBiYWQgdGhpbmcgYnkgaXRzZWxmICh3ZSBhdm9pZCBhZGRpbmcgbmV3IGVudW0gdmFsdWVzIGluIHBsYWNlc1xuICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgZGVwbG95ZWQgY29kZSkuIFRoZXJlZm9yZSwgdGhyb3dpbmdcbiAgICAgIC8vIG9uIFwidW5leHBlY3RlZFwiIHZhbHVlcyBpcyBsaWtlbHkgdG8gZW5kIHVwIGNhdXNpbmcgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IG1pZ2h0IGF2b2lkLFxuICAgICAgLy8gZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoZSBkZWNvZGVkIHZhbHVlIG1heSBhY3R1YWxseSBuZXZlciBnZXQgcmVhZCBhbnd5YXkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0ZWFkIGNoZWF0IG9uIHR5cGUgY29uc3RyYWludHMgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBcInVua25vd25fMjNcIi5cbiAgICAgIC8vIFRoYXQgc29tZXdoYXQgbWlycm9ycyB0aGUgYmVoYXZpb3Igd2UnZCBnZXQgd2l0aCB0aGUgcHVyZSBudW1lcmljYWwgYXBwcm9hY2guXG4gICAgICByZXR1cm4gYHVua25vd25fJHtpbnB1dH1gIGFzIFNob3J0U3RyaW5nRW51bUtleTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBwcm90byBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gIH1cblxuICByZXR1cm4gW2VuY29kZSwgZGVjb2RlXSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSxcbiAqIGUuZy4gdGhlIHR5cGUgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCI7XG4gKiAgIEFCQU5ET046IFwiQUJBTkRPTlwiO1xuICogICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU/OiBcIlRFUk1JTkFURVwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET04/OiBcIkFCQU5ET05cIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTD86IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ/OiB1bmRlZmluZWQ7XG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIHN0cmluZyxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCwgLy8gZS5nLiAnVU5TUEVDSUZJRUQnXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAgfCB7XG4gICAgICAvLyBlLmcuOiBcIlRFUk1JTkFURVwiOiBcIlRFUk1JTkFURVwiXG4gICAgICByZWFkb25seSBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBrO1xuICAgIH1cbiAgfCB7XG4gICAgICBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBQcmVmaXggZXh0ZW5kcyAnJ1xuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcIj86IFwiVEVSTUlOQVRFXCJcbiAgICAgICAgICAgIHJlYWRvbmx5IFtrayBpbiBgJHtQcmVmaXh9JHtrfWBdPzogaztcbiAgICAgICAgICB9O1xuICAgIH1bU2hvcnRTdHJpbmdFbnVtS2V5XVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtQcmVmaXh9JHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlVOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4+O1xuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXBwaW5nIHRhYmxlIHRoYXQgdGhlIHVzZXIgaXNcbiAqIGV4cGVjdGVkIHRvIHByb3ZpZGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgVEVSTUlOQVRFOiAxLFxuICogIEFCQU5ET046IDIsXG4gKiAgUkVRVUVTVF9DQU5DRUw6IDMsXG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gIF9TdHJpbmdFbnVtIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAge1xuICAgIFtrIGluIFByb3RvRW51bUtleV06IHtcbiAgICAgIFtrayBpbiBSZW1vdmVQcmVmaXg8UHJlZml4LCBrPl06IFByb3RvRW51bVtrXSBleHRlbmRzIG51bWJlciA/IFByb3RvRW51bVtrXSA6IG5ldmVyO1xuICAgIH07XG4gIH1bUHJvdG9FbnVtS2V5XVxuPjtcbiIsImV4cG9ydCAqIGZyb20gJy4vZW51bXMtaGVscGVycyc7XG5leHBvcnQge1xuICBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLFxuICBtZXJnZU9iamVjdHMsXG4gIC8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG4gIGRlZXBNZXJnZSxcbn0gZnJvbSAnLi9vYmplY3RzLWhlbHBlcnMnO1xuIiwiLyoqXG4gKiBIZWxwZXIgdG8gcHJldmVudCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHZhbHVlcyBvdmVycmlkaW5nIGRlZmF1bHRzIHdoZW4gbWVyZ2luZyBtYXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT0gbnVsbCkpIGFzIGFueTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb2JqZWN0cywgcG9zc2libHkgcmVtb3Zpbmcga2V5cy5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseTpcbiAqIC0gQW55IGtleS92YWx1ZSBwYWlyIGluIGBkZWx0YWAgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGtleS92YWx1ZSBwYWlyIGluIGBvcmlnaW5hbGA7XG4gKiAtIEEga2V5IHByZXNlbnQgaW4gYGRlbHRhYCB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIHJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByZXN1bHRpbmcgb2JqZWN0O1xuICogLSBJZiBgb3JpZ2luYWxgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYGRlbHRhYDtcbiAqIC0gSWYgYGRlbHRhYCBpcyBgdW5kZWZpbmVkYCBvciBlbXB0eSwgcmV0dXJuIGBvcmlnaW5hbGAgKG9yIHVuZGVmaW5lZCBpZiBgb3JpZ2luYWxgIGlzIGFsc28gdW5kZWZpbmVkKTtcbiAqIC0gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMsIHRoZW4gcmV0dXJuIGBvcmlnaW5hbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9yaWdpbmFsOiBULCBkZWx0YTogVCB8IHVuZGVmaW5lZCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWw6IFQgfCB1bmRlZmluZWQsXG4gIGRlbHRhOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybiBkZWx0YTtcbiAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybiBvcmlnaW5hbDtcblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLm9yaWdpbmFsIH07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgIGlmICh2ICE9PSBtZXJnZWRba10pIHtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSBtZXJnZWRba107XG4gICAgICBlbHNlIG1lcmdlZFtrXSA9IHY7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IChtZXJnZWQgYXMgVCkgOiBvcmlnaW5hbDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBQcm9wZXJ0aWVzIGZyb20gYHNvdXJjZWAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiBgdGFyZ2V0YC5cbiAqIE5lc3RlZCBvYmplY3RzIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuXG4gKlxuICogT2JqZWN0IGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFyZSByZWZlcmVuY2VzLCBhcyBpbixcbiAqIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBQYXJ0aWFsPFQ+KTogVCB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpICYmIGtleSBpbiB0YXJnZXQgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0gYXMgYW55KSkge1xuICAgICAgICBvdXRwdXRba2V5IGFzIGtleW9mIFRdID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAob3V0cHV0IGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIE5leHVzIE9wZXJhdGlvbiBIYW5kbGVyLCB1c2luZyB0aGUgTmV4dXMgY29udGV4dCBsb2dnZXIuXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBuZXh1cyA9ICduZXh1cycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBMb2dNZXRhT3JGdW5jID0gTG9nTWV0YWRhdGEgfCAoKCkgPT4gTG9nTWV0YWRhdGEpO1xuXG4vKipcbiAqIEEgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTG9nZ2VyfSB0aGF0IGFkZHMgbWV0YWRhdGEgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbG9nZ2VyLlxuICAgKlxuICAgKiBOZXcgbWV0YWRhdGEgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIGxvZyBpcyBlbWl0dGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIG1ldGFkYXRhIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShsb2dnZXI6IExvZ2dlciwgbWV0YU9yRnVuYzogTG9nTWV0YU9yRnVuYyk6IExvZ2dlciB7XG4gICAgLy8gRmxhdHRlbiByZWN1cnNpdmUgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEgaW5zdGFuY2VzXG4gICAgaWYgKGxvZ2dlciBpbnN0YW5jZW9mIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKGxvZ2dlci5jb250cmlidXRvcnMsIG1ldGFPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbG9nZ2VyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiBsb2dnZXI7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKGxvZ2dlci5wYXJlbnRMb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCBtZXRhT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLCBjb250cmlidXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXVxuICApIHt9XG5cbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci50cmFjZShtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5pbmZvKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci53YXJuKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZXJyb3IobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWV0YWRhdGEoY29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10sIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogTG9nTWV0YWRhdGEge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFNZXRhKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIG1ldGFkYXRhIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvQ2hhaW4oXG4gIGV4aXN0aW5nQ29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQsXG4gIG5ld0NvbnRyaWJ1dG9yOiBMb2dNZXRhT3JGdW5jXG4pOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIGFuIGVtcHR5IG9iamVjdCwgdGhlbiBpdCByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluXG4gIGlmICh0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG5ld0NvbnRyaWJ1dG9yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gIH1cblxuICAvLyBJZiBleGlzdGluZyBjaGFpbiBpcyBlbXB0eSwgdGhlbiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIHRoZSBjaGFpblxuICBpZiAoZXhpc3RpbmdDb250cmlidXRvcnMgPT0gbnVsbCB8fCBleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW25ld0NvbnRyaWJ1dG9yXTtcbiAgfVxuXG4gIC8vIElmIGJvdGggbGFzdCBjb250cmlidXRvciBhbmQgbmV3IGNvbnRyaWJ1dG9yIGFyZSBwbGFpbiBvYmplY3RzLCBtZXJnZSB0aGVtIHRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29uc3QgbGFzdCA9IGV4aXN0aW5nQ29udHJpYnV0b3JzW2V4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU9iamVjdHMobGFzdCwgbmV3Q29udHJpYnV0b3IpO1xuICAgIGlmIChtZXJnZWQgPT09IGxhc3QpIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgICByZXR1cm4gWy4uLmV4aXN0aW5nQ29udHJpYnV0b3JzLnNsaWNlKDAsIC0xKSwgbWVyZ2VkXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIEEgbWV0ZXIgZm9yIGNyZWF0aW5nIG1ldHJpY3MgdG8gcmVjb3JkIHZhbHVlcyBvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gcmVjb3JkLiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdhdWdlIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgZ2F1Z2UgbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVHYXVnZShuYW1lOiBzdHJpbmcsIHZhbHVlVHlwZT86IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljR2F1Z2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1cC1kb3duIGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHNpZ25lZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSB1cC1kb3duIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgdXAtZG93biBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIHVwLWRvd24gY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKi9cbiAgY3JlYXRlVXBEb3duQ291bnRlcj8obmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgbWV0ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLiBBbGwgbWV0cmljcyBjcmVhdGVkIG9mZiB0aGUgbWV0ZXIgd2lsbFxuICAgKiBoYXZlIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZC5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIG1ldHJpY3MuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pdCBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICB1bml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldHJpYywgaWYgYW55LlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBtZXRyaWMgKGUuZy4gYGNvdW50ZXJgLCBgaGlzdG9ncmFtYCwgYGdhdWdlYCkuXG4gICAqL1xuICBraW5kOiBNZXRyaWNLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB2YWx1ZSByZWNvcmRlZCBieSB0aGUgbWV0cmljLiBFaXRoZXIgYGludGAgb3IgYGZsb2F0YC5cbiAgICovXG4gIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBUYWdzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWUgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIG9mIG51bWVyaWNhbCB2YWx1ZXMgcmVjb3JkZWQgYnkgYSBtZXRyaWMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgcmVwcmVzZW50cyB0aGUgX2NvbmZpZ3VyYXRpb25fIG9mIHRoZSBtZXRyaWM7IGhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZG9lc24ndFxuICogaGF2ZSBkaWZmZXJlbnQgcnVudGltZSByZXByZXNlbnRhdGlvbiBmb3IgaW50ZWdlcnMgYW5kIGZsb2F0cywgdGhlIGFjdHVhbCB2YWx1ZSB0eXBlIGlzIGFsd2F5c1xuICogYSBKUyAnbnVtYmVyJy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyB8ICdmbG9hdCc7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYSBtZXRyaWMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSBNZXRyaWNLaW5kID0gJ2NvdW50ZXInIHwgJ2hpc3RvZ3JhbScgfCAnZ2F1Z2UnIHwgJ3VwLWRvd24tY291bnRlcic7XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgdmFsdWVzIGFzIGEgY291bnRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljQ291bnRlciBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBjb3VudGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYWRkLlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGNvdW50ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0NvdW50ZXI7XG5cbiAga2luZDogJ2NvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgcmVjb3JkaW5nIHZhbHVlcyBvbiBhIGhpc3RvZ3JhbS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljSGlzdG9ncmFtIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGhpc3RvZ3JhbS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHJlY29yZC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFZhbHVlIHdpbGwgYmUgY2FzdGVkIHRvIHRoZSBnaXZlblxuICAgKiAgICAgICAgICAgICAge0BsaW5rIHZhbHVlVHlwZX0uIExvc3Mgb2YgcHJlY2lzaW9uIG1heSBvY2N1ciBpZiB0aGUgdmFsdWUgaXMgbm90IGFscmVhZHkgb2YgdGhlXG4gICAqICAgICAgICAgICAgICBjb3JyZWN0IHR5cGUuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgaGlzdG9ncmFtLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW07XG5cbiAga2luZDogJ2hpc3RvZ3JhbSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBzZXR0aW5nIHZhbHVlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljR2F1Z2UgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgZ2F1Z2UuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXQuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBzZXQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgZ2F1Z2UsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlO1xuXG4gIGtpbmQ6ICdnYXVnZSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgc2lnbmVkIHZhbHVlcyBhcyBhbiB1cC1kb3duIGNvdW50ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1VwRG93bkNvdW50ZXIgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgdXAtZG93biBjb3VudGVyLiBWYWx1ZSBtYXkgYmUgbmVnYXRpdmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQgKGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgdXAtZG93biBjb3VudGVyLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNVcERvd25Db3VudGVyO1xuXG4gIGtpbmQ6ICd1cC1kb3duLWNvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuY2xhc3MgTm9vcE1ldHJpY01ldGVyIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2NvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2hpc3RvZ3JhbScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHJlY29yZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnZ2F1Z2UnLFxuICAgICAgdmFsdWVUeXBlLFxuXG4gICAgICBzZXQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAndXAtZG93bi1jb3VudGVyJyxcbiAgICAgIHZhbHVlVHlwZTogJ2ludCcsXG5cbiAgICAgIGFkZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgd2l0aFRhZ3MoX2V4dHJhVGFnczogTWV0cmljVGFncyk6IE1ldHJpY01ldGVyIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgbm9vcE1ldHJpY01ldGVyID0gbmV3IE5vb3BNZXRyaWNNZXRlcigpO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3NPckZ1bmMgPSBNZXRyaWNUYWdzIHwgKCgpID0+IE1ldHJpY1RhZ3MpO1xuXG4vKipcbiAqIEEgbWV0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhZGRzIHRhZ3MgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbWV0ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTWV0cmljTWV0ZXJ9IHRoYXQgYWRkcyB0YWdzIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IG1ldGVyLlxuICAgKlxuICAgKiBOZXcgdGFncyBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uIGV2YWx1YXRlZFxuICAgKiBldmVyeSB0aW1lIGEgbWV0cmljIGlzIHJlY29yZGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIHRhZ3MgYXMgbG93IGFzIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0ZXIgVGhlIHBhcmVudCBtZXRlciB0byBkZWxlZ2F0ZSBjYWxscyB0by5cbiAgICogQHBhcmFtIHRhZ3NPckZ1bmMgTmV3IHRhZ3MgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyByZWNvcmRlZCB0aGF0IHdpbGwgcmV0dXJuIGEgZGVsdGEgb2JqZWN0LlxuICAgKiBAcGFyYW0gZm9yY2UgaWYgYHRydWVgLCB0aGVuIGEgYE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFnc2Agd2lsbCBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlcmVcbiAgICogICAgICAgICAgICAgIGlzIG5vIHRhZ3MgdG8gYWRkLiBUaGlzIGlzIHVzZWZ1bCB0byBhZGQgdGFncyBzdXBwb3J0IHRvIGFuIHVuZGVybHlpbmcgbWV0ZXJcbiAgICogICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb21wb3NlKG1ldGVyOiBNZXRyaWNNZXRlciwgdGFnc09yRnVuYzogTWV0cmljVGFnc09yRnVuYywgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IE1ldHJpY01ldGVyIHtcbiAgICBpZiAobWV0ZXIgaW5zdGFuY2VvZiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MpIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4obWV0ZXIuY29udHJpYnV0b3JzLCB0YWdzT3JGdW5jKTtcbiAgICAgIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpbiwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3IG1ldGVyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gbWV0ZXI7XG4gICAgICByZXR1cm4gbmV3IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyhtZXRlci5wYXJlbnRNZXRlciwgY29udHJpYnV0b3JzID8/IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih1bmRlZmluZWQsIHRhZ3NPckZ1bmMpO1xuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIG1ldGVyO1xuICAgICAgcmV0dXJuIG5ldyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MobWV0ZXIsIGNvbnRyaWJ1dG9ycyA/PyBbXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1ldGVyOiBNZXRyaWNNZXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBwYXJlbnRDb3VudGVyID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVDb3VudGVyKG5hbWUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0NvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHBhcmVudENvdW50ZXIsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIGNvbnN0IHBhcmVudEhpc3RvZ3JhbSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlSGlzdG9ncmFtKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyhwYXJlbnRIaXN0b2dyYW0sIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBjb25zdCBwYXJlbnRHYXVnZSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlR2F1Z2UobmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNHYXVnZVdpdGhDb21wb3NlZFRhZ3MocGFyZW50R2F1Z2UsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBndWFyZCBvbmNlIHVwLWRvd24tY291bnRlciBzdXBwb3J0IGlzIGNvbXBsZXRlIG9uIGFsbCBNZXRyaWNNZXRlclxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBhbmQgYGNyZWF0ZVVwRG93bkNvdW50ZXJgIGlzIG5vIGxvbmdlciBvcHRpb25hbCBvbiBNZXRyaWNNZXRlci5cbiAgICBpZiAoIXRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVVcERvd25Db3VudGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgbWV0ZXInKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q291bnRlciA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyhwYXJlbnRDb3VudGVyLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MuY29tcG9zZSh0aGlzLCB0YWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY0NvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRIaXN0b2dyYW06IE1ldHJpY0hpc3RvZ3JhbSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50SGlzdG9ncmFtLnJlY29yZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50SGlzdG9ncmFtLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0ubmFtZTtcbiAgfVxuXG4gIGdldCB2YWx1ZVR5cGUoKTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0uZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRHYXVnZTogTWV0cmljR2F1Z2UsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEdhdWdlLnNldCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudEdhdWdlLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS52YWx1ZVR5cGU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5jbGFzcyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICd1cC1kb3duLWNvdW50ZXInO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlID0gJ2ludCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRDb3VudGVyOiBNZXRyaWNVcERvd25Db3VudGVyLFxuICAgIHByaXZhdGUgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRDb3VudGVyLmFkZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKTtcbiAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBuZXcgTWV0cmljVXBEb3duQ291bnRlcldpdGhDb21wb3NlZFRhZ3ModGhpcy5wYXJlbnRDb3VudGVyLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLm5hbWU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIudW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIuZGVzY3JpcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ3MoY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW10sIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiBNZXRyaWNUYWdzIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7fTtcbiAgZm9yIChjb25zdCBjb250cmlidXRvciBvZiBjb250cmlidXRvcnMpIHtcbiAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkLCB0eXBlb2YgY29udHJpYnV0b3IgPT09ICdmdW5jdGlvbicgPyBjb250cmlidXRvcigpIDogY29udHJpYnV0b3IpO1xuICB9XG4gIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIGV4dHJhVGFncyk7XG4gIHJldHVybiBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkKHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBBcHBlbmQgYSB0YWdzIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBwb3NzaWJsZS5cbiAqXG4gKiBJZiBhcHBlbmRpbmcgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluIG9mIGNvbnRyaWJ1dG9ycywgcmV0dXJuXG4gKiBgZXhpc3RpbmdDb250cmlidXRvcnNgOyBpbiB0aGF0IGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBpZiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9DaGFpbihcbiAgZXhpc3RpbmdDb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCxcbiAgbmV3Q29udHJpYnV0b3I6IE1ldHJpY1RhZ3NPckZ1bmNcbik6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCB7XG4gIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgYW4gZW1wdHkgb2JqZWN0LCB0aGVuIGl0IHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW5cbiAgaWYgKHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobmV3Q29udHJpYnV0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgfVxuXG4gIC8vIElmIGV4aXN0aW5nIGNoYWluIGlzIGVtcHR5LCB0aGVuIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgdGhlIGNoYWluXG4gIGlmIChleGlzdGluZ0NvbnRyaWJ1dG9ycyA9PSBudWxsIHx8IGV4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbbmV3Q29udHJpYnV0b3JdO1xuICB9XG5cbiAgLy8gSWYgYm90aCBsYXN0IGNvbnRyaWJ1dG9yIGFuZCBuZXcgY29udHJpYnV0b3IgYXJlIHBsYWluIG9iamVjdHMsIG1lcmdlIHRoZW0gdG8gYSBzaW5nbGUgb2JqZWN0LlxuICBjb25zdCBsYXN0ID0gZXhpc3RpbmdDb250cmlidXRvcnNbZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoIC0gMV07XG4gIGlmICh0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlT2JqZWN0cyhsYXN0LCBuZXdDb250cmlidXRvcik7XG4gICAgaWYgKG1lcmdlZCA9PT0gbGFzdCkgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICAgIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMuc2xpY2UoMCwgLTEpLCBtZXJnZWQhXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogUHJpb3JpdHkgY29udGFpbnMgbWV0YWRhdGEgdGhhdCBjb250cm9scyByZWxhdGl2ZSBvcmRlcmluZyBvZiB0YXNrIHByb2Nlc3Npbmcgd2hlbiB0YXNrcyBhcmVcbiAqIGJhY2tsb2dnZWQgaW4gYSBxdWV1ZS4gSW5pdGlhbGx5LCBQcmlvcml0eSB3aWxsIGJlIHVzZWQgaW4gYWN0aXZpdHkgYW5kIHdvcmtmbG93IHRhc2sgcXVldWVzLFxuICogd2hpY2ggYXJlIHR5cGljYWxseSB3aGVyZSBiYWNrbG9ncyBleGlzdC5cbiAqIFByaW9yaXR5IGlzIChmb3Igbm93KSBhdHRhY2hlZCB0byB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuIEFjdGl2aXRpZXMgYW5kIGNoaWxkIHdvcmtmbG93c1xuICogaW5oZXJpdCBQcmlvcml0eSBmcm9tIHRoZSB3b3JrZmxvdyB0aGF0IGNyZWF0ZWQgdGhlbSwgYnV0IG1heSBvdmVycmlkZSBmaWVsZHMgd2hlbiB0aGV5IGFyZVxuICogc3RhcnRlZCBvciBtb2RpZmllZC4gRm9yIGVhY2ggZmllbGQgb2YgYSBQcmlvcml0eSBvbiBhbiBhY3Rpdml0eS93b3JrZmxvdywgbm90IHByZXNlbnQgb3IgZXF1YWxcbiAqIHRvIHplcm8vZW1wdHkgc3RyaW5nIG1lYW5zIHRvIGluaGVyaXQgdGhlIHZhbHVlIGZyb20gdGhlIGNhbGxpbmcgd29ya2Zsb3csIG9yIGlmIHRoZXJlIGlzIG5vXG4gKiBjYWxsaW5nIHdvcmtmbG93LCB0aGVuIHVzZSB0aGUgZGVmYXVsdCAoZG9jdW1lbnRlZCBvbiB0aGUgZmllbGQpLlxuICogVGhlIG92ZXJhbGwgc2VtYW50aWNzIG9mIFByaW9yaXR5IGFyZTpcbiAqIDEuIEZpcnN0LCBjb25zaWRlciBcInByaW9yaXR5X2tleVwiOiBsb3dlciBudW1iZXIgZ29lcyBmaXJzdC5cbiAqIDIuIFRoZW4sIGNvbnNpZGVyIGZhaXJuZXNzOiB0aGUgZmFpcm5lc3MgbWVjaGFuaXNtIGF0dGVtcHRzIHRvIGRpc3BhdGNoIHRhc2tzIGZvciBhIGdpdmVuIGtleSBpblxuICogICAgcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW9yaXR5IHtcbiAgLyoqXG4gICAqIFByaW9yaXR5IGtleSBpcyBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSAxIHRvIG4sIHdoZXJlIHNtYWxsZXIgaW50ZWdlcnNcbiAgICogY29ycmVzcG9uZCB0byBoaWdoZXIgcHJpb3JpdGllcyAodGFza3MgcnVuIHNvb25lcikuIEluIGdlbmVyYWwsIHRhc2tzIGluXG4gICAqIGEgcXVldWUgc2hvdWxkIGJlIHByb2Nlc3NlZCBpbiBjbG9zZSB0byBwcmlvcml0eSBvcmRlciwgYWx0aG91Z2ggc21hbGxcbiAgICogZGV2aWF0aW9ucyBhcmUgcG9zc2libGUuXG4gICAqXG4gICAqIFRoZSBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIChtaW5pbXVtIHByaW9yaXR5KSBpcyBkZXRlcm1pbmVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmRcbiAgICogZGVmYXVsdHMgdG8gNS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgKG1pbittYXgpLzIuIFdpdGggdGhlIGRlZmF1bHQgbWF4IG9mIDUgYW5kIG1pbiBvZiAxLCB0aGF0IGNvbWVzIG91dCB0byAzLlxuICAgKi9cbiAgcHJpb3JpdHlLZXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzS2V5IGlzIGEgc2hvcnQgc3RyaW5nIHRoYXQncyB1c2VkIGFzIGEga2V5IGZvciBhIGZhaXJuZXNzXG4gICAqIGJhbGFuY2luZyBtZWNoYW5pc20uIEl0IG1heSBjb3JyZXNwb25kIHRvIGEgdGVuYW50IGlkLCBvciB0byBhIGZpeGVkXG4gICAqIHN0cmluZyBsaWtlIFwiaGlnaFwiIG9yIFwibG93XCIuIFRoZSBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gICAqIHByb3BvcnRpb24gdG8gaXRzIHdlaWdodC4gRm9yIGV4YW1wbGUsIHVzaW5nIGEgdGhvdXNhbmQgZGlzdGluY3QgdGVuYW50XG4gICAqIGlkcywgZWFjaCB3aXRoIGEgd2VpZ2h0IG9mIDEuMCAodGhlIGRlZmF1bHQpIHdpbGwgcmVzdWx0IGluIGVhY2ggdGVuYW50XG4gICAqIGdldHRpbmcgYSByb3VnaGx5IGVxdWFsIHNoYXJlIG9mIHRhc2sgZGlzcGF0Y2ggdGhyb3VnaHB1dC5cbiAgICpcbiAgICogRmFpcm5lc3Mga2V5cyBhcmUgbGltaXRlZCB0byA2NCBieXRlcy5cbiAgICovXG4gIGZhaXJuZXNzS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlybmVzc1dlaWdodCBmb3IgYSB0YXNrIGNhbiBjb21lIGZyb20gbXVsdGlwbGUgc291cmNlcyBmb3JcbiAgICogZmxleGliaWxpdHkuIEZyb20gaGlnaGVzdCB0byBsb3dlc3QgcHJlY2VkZW5jZTpcbiAgICogMS4gV2VpZ2h0cyBmb3IgYSBzbWFsbCBzZXQgb2Yga2V5cyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0YXNrIHF1ZXVlXG4gICAqICAgIGNvbmZpZ3VyYXRpb24gd2l0aCBhbiBBUEkuXG4gICAqIDIuIEl0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgd29ya2Zsb3cvYWN0aXZpdHkgaW4gdGhpcyBmaWVsZC5cbiAgICogMy4gVGhlIGRlZmF1bHQgd2VpZ2h0IG9mIDEuMCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFdlaWdodCB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gdGhlIHJhbmdlIFswLjAwMSwgMTAwMF0uXG4gICAqL1xuICBmYWlybmVzc1dlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUdXJuIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eSBpbnRvIGEgVFMgUHJpb3JpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVByaW9yaXR5KHByaW9yaXR5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkgfCBudWxsKTogUHJpb3JpdHkge1xuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eT8ucHJpb3JpdHlLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eT8uZmFpcm5lc3NLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzV2VpZ2h0OiBwcmlvcml0eT8uZmFpcm5lc3NXZWlnaHQgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBQcmlvcml0eSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByaW9yaXR5KHByaW9yaXR5OiBQcmlvcml0eSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVByaW9yaXR5IHtcbiAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5ICE9PSB1bmRlZmluZWQgJiYgcHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IG51bGwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocHJpb3JpdHkucHJpb3JpdHlLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmlvcml0eUtleSBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcmlvcml0eUtleTogcHJpb3JpdHkucHJpb3JpdHlLZXkgPz8gMCxcbiAgICBmYWlybmVzc0tleTogcHJpb3JpdHkuZmFpcm5lc3NLZXkgPz8gJycsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5LmZhaXJuZXNzV2VpZ2h0ID8/IDAsXG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYID0gJ19fdGVtcG9yYWxfJztcbmV4cG9ydCBjb25zdCBTVEFDS19UUkFDRV9RVUVSWV9OQU1FID0gJ19fc3RhY2tfdHJhY2UnO1xuZXhwb3J0IGNvbnN0IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19lbmhhbmNlZF9zdGFja190cmFjZSc7XG5cbi8qKlxuICogVmFsaWQgZW50aXR5IHR5cGVzIHRoYXQgY2FuIGJlIGNoZWNrZWQgZm9yIHJlc2VydmVkIG5hbWUgdmlvbGF0aW9uc1xuICovXG5leHBvcnQgdHlwZSBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlID0gJ3F1ZXJ5JyB8ICdzaWduYWwnIHwgJ3VwZGF0ZScgfCAnYWN0aXZpdHknIHwgJ3Rhc2sgcXVldWUnIHwgJ3NpbmsnIHwgJ3dvcmtmbG93JztcblxuLyoqXG4gKiBXaXJlIGlkZW50aWZpZXJzIHVzZWQgYnkgZmlyc3QtcGFydHkgU0RLIGNvbnRyaWIgcGFja2FnZXMuIEVhY2ggZW50cnkgcGFpcnNcbiAqIGEgbmFtZSB3aXRoIHRoZSBlbnRpdHkgdHlwZSBpdCdzIGFsbG93ZWQgdG8gcmVnaXN0ZXIgYXM7IHRoYXQgcGFpciBieXBhc3Nlc1xuICogdGhlIHtAbGluayBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9IGNoZWNrIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiBSZWdpc3RlcmluZ1xuICogdGhlIHNhbWUgbmFtZSBhcyBhIGRpZmZlcmVudCBlbnRpdHkgdHlwZSBpcyBzdGlsbCByZWplY3RlZC5cbiAqL1xuY29uc3QgSU5URVJOQUxfSEFORExFUl9OQU1FX0FMTE9XTElTVDogUmVhZG9ubHlNYXA8c3RyaW5nLCBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlPiA9IG5ldyBNYXAoW1xuICAvLyBAdGVtcG9yYWxpby93b3JrZmxvdy1zdHJlYW1zXG4gIFsnX190ZW1wb3JhbF93b3JrZmxvd19zdHJlYW1fcHVibGlzaCcsICdzaWduYWwnXSxcbiAgWydfX3RlbXBvcmFsX3dvcmtmbG93X3N0cmVhbV9wb2xsJywgJ3VwZGF0ZSddLFxuICBbJ19fdGVtcG9yYWxfd29ya2Zsb3dfc3RyZWFtX29mZnNldCcsICdxdWVyeSddLFxuXSk7XG5cbi8qKlxuICogVmFsaWRhdGVzIGlmIHRoZSBwcm92aWRlZCBuYW1lIGNvbnRhaW5zIGFueSByZXNlcnZlZCBwcmVmaXhlcyBvciBtYXRjaGVzIGFueSByZXNlcnZlZCBuYW1lcy5cbiAqIFRocm93cyBhIFR5cGVFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLCB3aXRoIGEgc3BlY2lmaWMgbWVzc2FnZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGlzc3VlXG4gKiBpcyB3aXRoIGEgcmVzZXJ2ZWQgcHJlZml4IG9yIGFuIGV4YWN0IG1hdGNoIHRvIGEgcmVzZXJ2ZWQgbmFtZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUaGUgZW50aXR5IHR5cGUgYmVpbmcgY2hlY2tlZFxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gY2hlY2sgYWdhaW5zdCByZXNlcnZlZCBwcmVmaXhlcy9uYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZlJlc2VydmVkTmFtZSh0eXBlOiBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmIElOVEVSTkFMX0hBTkRMRVJfTkFNRV9BTExPV0xJU1QuZ2V0KG5hbWUpICE9PSB0eXBlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSAke3R5cGV9IG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gIH1cblxuICBpZiAobmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fCBuYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSAke3R5cGV9IG5hbWU6ICcke25hbWV9Jywgd2hpY2ggaXMgYSByZXNlcnZlZCBuYW1lYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9OdW1iZXIsIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIG9wdGlvbmFsVHNUb01zIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXRyeWluZyBXb3JrZmxvd3MgYW5kIEFjdGl2aXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBDb2VmZmljaWVudCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV4dCByZXRyeSBpbnRlcnZhbC5cbiAgICogVGhlIG5leHQgcmV0cnkgaW50ZXJ2YWwgaXMgcHJldmlvdXMgaW50ZXJ2YWwgbXVsdGlwbGllZCBieSB0aGlzIGNvZWZmaWNpZW50LlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIGJhY2tvZmZDb2VmZmljaWVudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludGVydmFsIG9mIHRoZSBmaXJzdCByZXRyeS5cbiAgICogSWYgY29lZmZpY2llbnQgaXMgMSB0aGVuIGl0IGlzIHVzZWQgZm9yIGFsbCByZXRyaWVzXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiBAZGVmYXVsdCAxIHNlY29uZFxuICAgKi9cbiAgaW5pdGlhbEludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cy4gV2hlbiBleGNlZWRlZCwgcmV0cmllcyBzdG9wIChldmVuIGlmIHtAbGluayBBY3Rpdml0eU9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dH1cbiAgICogaGFzbid0IGJlZW4gcmVhY2hlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEluZmluaXR5XG4gICAqL1xuICBtYXhpbXVtQXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGludGVydmFsIGJldHdlZW4gcmV0cmllcy5cbiAgICogRXhwb25lbnRpYWwgYmFja29mZiBsZWFkcyB0byBpbnRlcnZhbCBpbmNyZWFzZS5cbiAgICogVGhpcyB2YWx1ZSBpcyB0aGUgY2FwIG9mIHRoZSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAweCBvZiB7QGxpbmsgaW5pdGlhbEludGVydmFsfVxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIG1heGltdW1JbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFwcGxpY2F0aW9uIGZhaWx1cmVzIHR5cGVzIHRvIG5vdCByZXRyeS5cbiAgICovXG4gIG5vblJldHJ5YWJsZUVycm9yVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgVFMgUmV0cnlQb2xpY3kgaW50byBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVSZXRyeVBvbGljeShyZXRyeVBvbGljeTogUmV0cnlQb2xpY3kpOiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB7XG4gIGlmIChyZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgIT0gbnVsbCAmJiByZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICB9XG4gIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgIT0gbnVsbCkge1xuICAgIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgLy8gZHJvcCBmaWVsZCAoSW5maW5pdHkgaXMgdGhlIGRlZmF1bHQpXG4gICAgICBjb25zdCB7IG1heGltdW1BdHRlbXB0czogXywgLi4ud2l0aG91dCB9ID0gcmV0cnlQb2xpY3k7XG4gICAgICByZXRyeVBvbGljeSA9IHdpdGhvdXQ7XG4gICAgfSBlbHNlIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIocmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF4aW11bUludGVydmFsID0gbXNPcHRpb25hbFRvTnVtYmVyKHJldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCk7XG4gIGNvbnN0IGluaXRpYWxJbnRlcnZhbCA9IG1zVG9OdW1iZXIocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsID8/IDEwMDApO1xuICBpZiAobWF4aW11bUludGVydmFsID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgMCcpO1xuICB9XG4gIGlmIChpbml0aWFsSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKG1heGltdW1JbnRlcnZhbCAhPSBudWxsICYmIG1heGltdW1JbnRlcnZhbCA8IGluaXRpYWxJbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwgY2Fubm90IGJlIGxlc3MgdGhhbiBpdHMgaW5pdGlhbEludGVydmFsJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG1zVG9Ucyhpbml0aWFsSW50ZXJ2YWwpLFxuICAgIG1heGltdW1JbnRlcnZhbDogbXNPcHRpb25hbFRvVHMobWF4aW11bUludGVydmFsKSxcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFJldHJ5UG9saWN5IGludG8gYSBUUyBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb21waWxlUmV0cnlQb2xpY3koXG4gIHJldHJ5UG9saWN5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUmV0cnlQb2xpY3kgfCBudWxsXG4pOiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmV0cnlQb2xpY3kpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUF0dGVtcHRzOiByZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPz8gdW5kZWZpbmVkLFxuICAgIG1heGltdW1JbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKSxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG9wdGlvbmFsVHNUb01zKHJldHJ5UG9saWN5LmluaXRpYWxJbnRlcnZhbCksXG4gICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogcmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlcyA/PyB1bmRlZmluZWQsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5ID0gU2VhcmNoQXR0cmlidXRlVmFsdWUgfCBSZWFkb25seTxTZWFyY2hBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVzID0gUmVjb3JkPHN0cmluZywgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5Pjtcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVbXTtcblxuZXhwb3J0IGNvbnN0IFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSB7XG4gIFRFWFQ6ICdURVhUJyxcbiAgS0VZV09SRDogJ0tFWVdPUkQnLFxuICBJTlQ6ICdJTlQnLFxuICBET1VCTEU6ICdET1VCTEUnLFxuICBCT09MOiAnQk9PTCcsXG4gIERBVEVUSU1FOiAnREFURVRJTUUnLFxuICBLRVlXT1JEX0xJU1Q6ICdLRVlXT1JEX0xJU1QnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSAodHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGUpW2tleW9mIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuLy8gTm90ZTogZW5jb2RlU2VhcmNoQXR0cmlidXRlSW5kZXhlZFZhbHVlVHlwZSBleHBvcnRlZCBmb3IgdXNlIGluIHRlc3RzIHRvIHJlZ2lzdGVyIHNlYXJjaCBhdHRyaWJ1dGVzXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVTZWFyY2hBdHRyaWJ1dGVJbmRleGVkVmFsdWVUeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICAnSU5ERVhFRF9WQUxVRV9UWVBFXydcbj4oXG4gIHtcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUXTogMSxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEXTogMixcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5JTlRdOiAzLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRV06IDQsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTF06IDUsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUVdOiA2LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdJTkRFWEVEX1ZBTFVFX1RZUEVfJ1xuKTtcblxuaW50ZXJmYWNlIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nIHtcbiAgVEVYVDogc3RyaW5nO1xuICBLRVlXT1JEOiBzdHJpbmc7XG4gIElOVDogbnVtYmVyO1xuICBET1VCTEU6IG51bWJlcjtcbiAgQk9PTDogYm9vbGVhbjtcbiAgREFURVRJTUU6IERhdGU7XG4gIEtFWVdPUkRfTElTVDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVmFsdWVGb3JUeXBlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihcbiAgdHlwZTogVCxcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUU6XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEF0dHJpYnV0ZUtleTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZWFyY2hBdHRyaWJ1dGVLZXk8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KG5hbWU6IHN0cmluZywgdHlwZTogVCk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPiB7XG4gIHJldHVybiB7IG5hbWUsIHR5cGUgfTtcbn1cblxuY2xhc3MgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlLCBWID0gSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZTogVDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFY7XG5cbiAgY29uc3RydWN0b3IodHlwZTogVCwgdmFsdWU6IFYpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogViB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG59XG5cbi8vIEludGVybmFsIHR5cGUgZm9yIGNsYXNzIHByaXZhdGUgZGF0YS5cbi8vIEV4cG9ydGVkIGZvciB1c2UgaW4gcGF5bG9hZCBjb252ZXJzaW9uLlxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQ+IHt9XG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFxuICBULFxuICBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGxcbj4ge31cblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB9O1xufVtTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGwgfTtcbn1bU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICBwcml2YXRlIHNlYXJjaEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10pIHtcbiAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcGFpciBvZiBpbml0aWFsQXR0cmlidXRlcykge1xuICAgICAgaWYgKHBhaXIua2V5Lm5hbWUgaW4gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHNlYXJjaCBhdHRyaWJ1dGUga2V5OiAke3BhaXIua2V5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQ8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+KTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNba2V5Lm5hbWVdO1xuICAgIC8vIEtleSBub3QgZm91bmQgb3IgdHlwZSBtaXNtYXRjaC5cbiAgICBpZiAoYXR0ciA9PT0gdW5kZWZpbmVkIHx8ICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGtleS50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHIudmFsdWU7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIGluc3RhbmNlICovXG4gIGNvcHkoKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgbGV0IHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIC8vIEZvciBub24tcHJpbWl0aXZlIHR5cGVzLCBjcmVhdGUgYSBkZWVwIGNvcHlcbiAgICAgIGlmIChhdHRyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKGF0dHIudmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGF0dHIudmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gWy4uLmF0dHIudmFsdWVdO1xuICAgICAgfVxuICAgICAgc3RhdGVba2V5XSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKGF0dHIudHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXR1cm4gdmFsdWUgd2l0aCBtYW51YWxseSBhc3NpZ25lZCBzdGF0ZS5cbiAgICBjb25zdCByZXMgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKCk7XG4gICAgcmVzLnNlYXJjaEF0dHJpYnV0ZXMgPSBzdGF0ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICogUmV0dXJuIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBhcyBTZWFyY2hBdHRyaWJ1dGVQYWlyW11cbiAgICogRGVmYXVsdCB0b0pTT04gbWV0aG9kIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQncyBKU09OIHJlcHJlc2VudGF0aW9uIGluY2x1ZGVzIHByaXZhdGUgc3RhdGUuXG4gICAqL1xuICB0b0pTT04oKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgaW5zdGFuY2Ugd2l0aCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGVzLiAqL1xuICB1cGRhdGVDb3B5KHVwZGF0ZXM6IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgIGNvbnN0IHJlcyA9IHRoaXMuY29weSgpO1xuICAgIC8vIEFwcGx5IHVwZGF0ZXMuXG4gICAgcmVzLnVwZGF0ZSh1cGRhdGVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gUGVyZm9ybXMgZGlyZWN0IG11dGF0aW9uIG9uIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICBwcml2YXRlIHVwZGF0ZSh1cGRhdGVzOiBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pIHtcbiAgICAvLyBBcHBseSB1cGRhdGVzLlxuICAgIGZvciAoY29uc3QgcGFpciBvZiB1cGRhdGVzKSB7XG4gICAgICAvLyBEZWxldGUgYXR0cmlidXRlLlxuICAgICAgaWYgKHBhaXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRGVsZXRlIG9ubHkgaWYgdGhlIHVwZGF0ZSBtYXRjaGVzIGEga2V5IGFuZCB0eXBlLlxuICAgICAgICBjb25zdCBhdHRyVmFsID0gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbCAmJiBhdHRyVmFsLnR5cGUgPT09IHBhaXIua2V5LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSBhdHRyaWJ1dGUuXG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwoKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICBjb25zdCByZXM6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cktleSA9IHsgbmFtZToga2V5LCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIFNhbml0eSBjaGVjaywgc2hvdWxkIGFsd2F5cyBiZSBsZWdhbC5cbiAgICAgIGlmIChpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHJLZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgcmVzLnB1c2goeyBrZXk6IGF0dHJLZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0S2V5RnJvbVVudHlwZWQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seVxuICApOiBTZWFyY2hBdHRyaWJ1dGVLZXk8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5wYWNrIHNpbmdsZS1lbGVtZW50IGFycmF5cy5cbiAgICBjb25zdCB2YWwgPSB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbCkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgLy8gQ2hlY2sgaWYgdmFsIGlzIGFuIElTTyBzdHJpbmcsIGlmIHNvLCByZXR1cm4gYSBEQVRFVElNRSBrZXkuXG4gICAgICAgIGlmICghaXNOYU4oRGF0ZS5wYXJzZSh2YWwpKSAmJiBEYXRlLnBhcnNlKHZhbCkgPT09IG5ldyBEYXRlKHZhbCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQgfTtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHR5cGU6IE51bWJlci5pc0ludGVnZXIodmFsKSA/IFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UIDogU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEUsXG4gICAgICAgIH07XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0wgfTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b01ldGFkYXRhVHlwZSh0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUOlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICAgIHJldHVybiAnS2V5d29yZCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgICByZXR1cm4gJ0ludCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFOlxuICAgICAgICByZXR1cm4gJ0RvdWJsZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgICAgcmV0dXJuICdCb29sJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTpcbiAgICAgICAgcmV0dXJuICdEYXRldGltZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUOlxuICAgICAgICByZXR1cm4gJ0tleXdvcmRMaXN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWFyY2ggYXR0cmlidXRlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdG9TZWFyY2hBdHRyaWJ1dGVUeXBlKHR5cGU6IHN0cmluZyk6IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIFRoZSB0eXBlIG1ldGFkYXRhIGlzIHVzdWFsbHkgaW4gUGFzY2FsQ2FzZSAoZS5nLiBcIktleXdvcmRMaXN0XCIpIGJ1dCBpblxuICAgIC8vIHJhcmUgY2FzZXMgbWF5IGJlIGluIFNDUkVBTUlOR19TTkFLRV9DQVNFIChlLmcuIFwiSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVFwiKS5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ1RleHQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX1RFWFQnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUO1xuICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ7XG4gICAgICBjYXNlICdJbnQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0lOVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLklOVDtcbiAgICAgIGNhc2UgJ0RvdWJsZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfRE9VQkxFJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFO1xuICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfQk9PTCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0w7XG4gICAgICBjYXNlICdEYXRldGltZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfREFURVRJTUUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTtcbiAgICAgIGNhc2UgJ0tleXdvcmRMaXN0JzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEX0xJU1QnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5pbXBvcnQgbXMgZnJvbSAnbXMnO1xuaW1wb3J0IHR5cGUgeyBnb29nbGUgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBOT1RFOiB0aGVzZSBhcmUgdGhlIHNhbWUgaW50ZXJmYWNlIGluIEpTXG4vLyBnb29nbGUucHJvdG9idWYuSUR1cmF0aW9uO1xuLy8gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG4vLyBUaGUgY29udmVyc2lvbiBmdW5jdGlvbnMgYmVsb3cgc2hvdWxkIHdvcmsgZm9yIGJvdGhcblxuZXhwb3J0IHR5cGUgVGltZXN0YW1wID0gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG5cbi8qKlxuICogQSBkdXJhdGlvbiwgZXhwcmVzc2VkIGVpdGhlciBhcyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIG9yIGFzIGEge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uID0gU3RyaW5nVmFsdWUgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCwgdGhyb3dzIGEgVHlwZUVycm9yLCB3aXRoIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJHtmaWVsZE5hbWV9IHRvIGJlIGEgdGltZXN0YW1wLCBnb3QgJHt0c31gKTtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIGNvbnN0IHsgc2Vjb25kcywgbmFub3MgfSA9IHRzO1xuICByZXR1cm4gKHNlY29uZHMgfHwgTG9uZy5VWkVSTylcbiAgICAubXVsKDEwMDApXG4gICAgLmFkZChNYXRoLmZsb29yKChuYW5vcyB8fCAwKSAvIDEwMDAwMDApKVxuICAgIC50b051bWJlcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7XG4gIGNvbnN0IG5hbm9zID0gKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMDtcbiAgaWYgKE51bWJlci5pc05hTihzZWNvbmRzKSB8fCBOdW1iZXIuaXNOYU4obmFub3MpKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgbWlsbGlzICR7bWlsbGlzfWApO1xuICB9XG4gIHJldHVybiB7IHNlY29uZHM6IExvbmcuZnJvbU51bWJlcihzZWNvbmRzKSwgbmFub3MgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIG1zTnVtYmVyVG9Ucyhtc1RvTnVtYmVyKHN0cikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyID8gbXNUb1RzKHN0cikgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1zVG9OdW1iZXIodmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcmV0dXJuIG1zV2l0aFZhbGlkYXRpb24odmFsKTtcbn1cblxuZnVuY3Rpb24gbXNXaXRoVmFsaWRhdGlvbihzdHI6IFN0cmluZ1ZhbHVlKTogbnVtYmVyIHtcbiAgY29uc3QgbWlsbGlzID0gbXMoc3RyKTtcbiAgaWYgKG1pbGxpcyA9PSBudWxsIHx8IGlzTmFOKG1pbGxpcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGR1cmF0aW9uIHN0cmluZzogJyR7c3RyfSdgKTtcbiAgfVxuICByZXR1cm4gbWlsbGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUodHNUb01zKHRzKSk7XG59XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHJlcXVpcmVkVHNUb01zKHRzLCBmaWVsZE5hbWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHQgKGltcG9ydGVkIHZpYSBzY2hlZHVsZS1oZWxwZXJzLnRzKVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRGF0ZVRvVHMoZGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICBpZiAoZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IGRhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBtc1RvVHMoZGF0ZS5nZXRUaW1lKCkpO1xufVxuIiwiZXhwb3J0IHR5cGUgTm9uTnVsbGFibGVPYmplY3Q8VD4gPSB7IFtQIGluIGtleW9mIFRdLT86IE5vbk51bGxhYmxlPFRbUF0+IH07XG5cbi8qKiBTaG9ydGhhbmQgYWxpYXMgKi9cbmV4cG9ydCB0eXBlIEFueUZ1bmMgPSAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuLyoqIEEgdHVwbGUgd2l0aG91dCBpdHMgbGFzdCBlbGVtZW50ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdDxUPiA9IFQgZXh0ZW5kcyBbLi4uaW5mZXIgUkVTVCwgYW55XSA/IFJFU1QgOiBuZXZlcjtcblxuLyoqIEYgd2l0aCBhbGwgYXJndW1lbnRzIGJ1dCB0aGUgbGFzdCAqL1xuZXhwb3J0IHR5cGUgT21pdExhc3RQYXJhbTxGIGV4dGVuZHMgQW55RnVuYz4gPSAoLi4uYXJnczogT21pdExhc3Q8UGFyYW1ldGVyczxGPj4pID0+IFJldHVyblR5cGU8Rj47XG5cbmV4cG9ydCB0eXBlIE9taXRGaXJzdDxUPiA9IFQgZXh0ZW5kcyBbYW55LCAuLi5pbmZlciBSRVNUXSA/IFJFU1QgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgT21pdEZpcnN0UGFyYW08VD4gPSBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgPyAoLi4uYXJnczogT21pdEZpcnN0PFBhcmFtZXRlcnM8VD4+KSA9PiBSZXR1cm5UeXBlPFQ+XG4gIDogbmV2ZXI7XG5cbi8qKiBSZXF1aXJlIHRoYXQgVCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGRlZmluZWQgKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVBdExlYXN0T25lPFQsIEtleXMgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4gPSBQaWNrPFQsIEV4Y2x1ZGU8a2V5b2YgVCwgS2V5cz4+ICZcbiAge1xuICAgIFtLIGluIEtleXNdLT86IFJlcXVpcmVkPFBpY2s8VCwgSz4+ICYgUGFydGlhbDxQaWNrPFQsIEV4Y2x1ZGU8S2V5cywgSz4+PjtcbiAgfVtLZXlzXTtcblxuLyoqIFZlcmlmeSB0aGF0IGFuIHR5cGUgX0NvcHkgZXh0ZW5kcyBfT3JpZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRXh0ZW5kczxfT3JpZywgX0NvcHkgZXh0ZW5kcyBfT3JpZz4oKTogdm9pZCB7XG4gIC8vIG5vb3AsIGp1c3QgdHlwZSBjaGVja1xufVxuXG5leHBvcnQgdHlwZSBSZXBsYWNlPEJhc2UsIE5ldz4gPSBPbWl0PEJhc2UsIGtleW9mIE5ldz4gJiBOZXc7XG5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS91bmlvbi10by1pbnRlcnNlY3Rpb24uZC50c1xuLy8gTUlUIG9yIENDMC0xLjAg4oCUIEl0IGlzIG1lYW50IHRvIGJlIGNvcGllZCBpbnRvIHlvdXIgY29kZWJhc2UgcmF0aGVyIHRoYW4gYmVpbmcgdXNlZCBhcyBhIGRlcGVuZGVuY3kuXG5leHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9XG4gIC8vIGBleHRlbmRzIHVua25vd25gIGlzIGFsd2F5cyBnb2luZyB0byBiZSB0aGUgY2FzZSBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBgVW5pb25gIGludG8gYVxuICAvLyBbZGlzdHJpYnV0aXZlIGNvbmRpdGlvbmFsIHR5cGVdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3JlbGVhc2Utbm90ZXMvdHlwZXNjcmlwdC0yLTguaHRtbCNkaXN0cmlidXRpdmUtY29uZGl0aW9uYWwtdHlwZXMpLlxuICAoXG4gICAgVW5pb24gZXh0ZW5kcyB1bmtub3duXG4gICAgICA/IC8vIFRoZSB1bmlvbiB0eXBlIGlzIHVzZWQgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gYSBmdW5jdGlvbiBzaW5jZSB0aGUgdW5pb25cbiAgICAgICAgLy8gb2YgZnVuY3Rpb24gYXJndW1lbnRzIGlzIGFuIGludGVyc2VjdGlvbi5cbiAgICAgICAgKGRpc3RyaWJ1dGVkVW5pb246IFVuaW9uKSA9PiB2b2lkXG4gICAgICA6IC8vIFRoaXMgd29uJ3QgaGFwcGVuLlxuICAgICAgICBuZXZlclxuICApIGV4dGVuZHMgLy8gSW5mZXIgdGhlIGBJbnRlcnNlY3Rpb25gIHR5cGUgc2luY2UgVHlwZVNjcmlwdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbmFsXG4gIC8vIGFyZ3VtZW50cyBvZiB1bmlvbnMgb2YgZnVuY3Rpb25zIGFzIGFuIGludGVyc2VjdGlvbiBvZiB0aGUgdW5pb24uXG4gIChtZXJnZWRJbnRlcnNlY3Rpb246IGluZmVyIEludGVyc2VjdGlvbikgPT4gdm9pZFxuICAgID8gLy8gVGhlIGAmIFVuaW9uYCBpcyB0byBhbGxvdyBpbmRleGluZyBieSB0aGUgcmVzdWx0aW5nIHR5cGVcbiAgICAgIEludGVyc2VjdGlvbiAmIFVuaW9uXG4gICAgOiBuZXZlcjtcblxudHlwZSBJc0VxdWFsPEEsIEI+ID0gKDxHPigpID0+IEcgZXh0ZW5kcyBBID8gMSA6IDIpIGV4dGVuZHMgPEc+KCkgPT4gRyBleHRlbmRzIEIgPyAxIDogMiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN5bWJvbCB8IGJpZ2ludDtcblxudHlwZSBJc051bGw8VD4gPSBbVF0gZXh0ZW5kcyBbbnVsbF0gPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNVbmtub3duPFQ+ID0gdW5rbm93biBleHRlbmRzIFQgLy8gYFRgIGNhbiBiZSBgdW5rbm93bmAgb3IgYGFueWBcbiAgPyBJc051bGw8VD4gZXh0ZW5kcyBmYWxzZSAvLyBgYW55YCBjYW4gYmUgYG51bGxgLCBidXQgYHVua25vd25gIGNhbid0IGJlXG4gICAgPyB0cnVlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG50eXBlIE9iamVjdFZhbHVlPFQsIEs+ID0gSyBleHRlbmRzIGtleW9mIFRcbiAgPyBUW0tdXG4gIDogVG9TdHJpbmc8Sz4gZXh0ZW5kcyBrZXlvZiBUXG4gICAgPyBUW1RvU3RyaW5nPEs+XVxuICAgIDogSyBleHRlbmRzIGAke2luZmVyIE51bWJlcksgZXh0ZW5kcyBudW1iZXJ9YFxuICAgICAgPyBOdW1iZXJLIGV4dGVuZHMga2V5b2YgVFxuICAgICAgICA/IFRbTnVtYmVyS11cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBuZXZlcjtcblxudHlwZSBUb1N0cmluZzxUPiA9IFQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgPyBgJHtUfWAgOiBuZXZlcjtcblxudHlwZSBLZXlzT2ZVbmlvbjxPYmplY3RUeXBlPiA9IE9iamVjdFR5cGUgZXh0ZW5kcyB1bmtub3duID8ga2V5b2YgT2JqZWN0VHlwZSA6IG5ldmVyO1xuXG50eXBlIEFycmF5RWxlbWVudDxUPiA9IFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gPyBUWzBdIDogbmV2ZXI7XG5cbnR5cGUgRXhhY3RPYmplY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9IHtcbiAgW0tleSBpbiBrZXlvZiBQYXJhbWV0ZXJUeXBlXTogRXhhY3Q8UGFyYW1ldGVyVHlwZVtLZXldLCBPYmplY3RWYWx1ZTxJbnB1dFR5cGUsIEtleT4+O1xufSAmIFJlY29yZDxFeGNsdWRlPGtleW9mIElucHV0VHlwZSwgS2V5c09mVW5pb248UGFyYW1ldGVyVHlwZT4+LCBuZXZlcj47XG5cbmV4cG9ydCB0eXBlIEV4YWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gPVxuICAvLyBCZWZvcmUgZGlzdHJpYnV0aW5nLCBjaGVjayBpZiB0aGUgdHdvIHR5cGVzIGFyZSBlcXVhbCBhbmQgaWYgc28sIHJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGUgaW1tZWRpYXRlbHlcbiAgSXNFcXVhbDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGFyYW1ldGVyVHlwZVxuICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIHByaW1pdGl2ZSwgcmV0dXJuIGl0IGFzIGlzIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGl0IGJlaW5nIGNvbnZlcnRlZCB0byBhIGNvbXBsZXggdHlwZVxuICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIFByaW1pdGl2ZVxuICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gdW5rbm93biwgcmV0dXJuIGl0IGFzIGlzIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGl0IGJlaW5nIGNvbnZlcnRlZCB0byBhIGNvbXBsZXggdHlwZVxuICAgICAgICBJc1Vua25vd248UGFyYW1ldGVyVHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgICAgID8gdW5rbm93blxuICAgICAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBGdW5jdGlvbiwgcmV0dXJuIGl0IGFzIGlzIGJlY2F1c2UgdGhpcyB0eXBlIGlzIG5vdCBjYXBhYmxlIG9mIGhhbmRsaW5nIGZ1bmN0aW9uLCBsZWF2ZSBpdCB0byBUeXBlU2NyaXB0XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBGdW5jdGlvblxuICAgICAgICAgID8gUGFyYW1ldGVyVHlwZVxuICAgICAgICAgIDogLy8gQ29udmVydCB1bmlvbiBvZiBhcnJheSB0byBhcnJheSBvZiB1bmlvbjogQVtdICYgQltdID0+IChBICYgQilbXVxuICAgICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIHVua25vd25bXVxuICAgICAgICAgICAgPyBBcnJheTxFeGFjdDxBcnJheUVsZW1lbnQ8UGFyYW1ldGVyVHlwZT4sIEFycmF5RWxlbWVudDxJbnB1dFR5cGU+Pj5cbiAgICAgICAgICAgIDogLy8gSW4gVHlwZVNjcmlwdCwgQXJyYXkgaXMgYSBzdWJ0eXBlIG9mIFJlYWRvbmx5QXJyYXksIHNvIGFsd2F5cyB0ZXN0IEFycmF5IGJlZm9yZSBSZWFkb25seUFycmF5LlxuICAgICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdXG4gICAgICAgICAgICAgID8gUmVhZG9ubHlBcnJheTxFeGFjdDxBcnJheUVsZW1lbnQ8UGFyYW1ldGVyVHlwZT4sIEFycmF5RWxlbWVudDxJbnB1dFR5cGU+Pj5cbiAgICAgICAgICAgICAgOiBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+O1xuLy8gRW5kIG9mIGJvcnJvdyBmcm9tICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG5cbmV4cG9ydCB0eXBlIFJlbW92ZVByZWZpeDxQcmVmaXggZXh0ZW5kcyBzdHJpbmcsIEtleXMgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBbayBpbiBLZXlzXTogayBleHRlbmRzIGAke1ByZWZpeH0ke2luZmVyIFN1ZmZpeH1gID8gU3VmZml4IDogbmV2ZXI7XG59W0tleXNdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICByZWNvcmQ6IFgsXG4gIHByb3A6IFlcbik6IHJlY29yZCBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIHByb3AgaW4gcmVjb3JkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydGllczxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcHM6IFlbXVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcHMuZXZlcnkoKHByb3ApID0+IHByb3AgaW4gcmVjb3JkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciB7XG4gIHJldHVybiAoXG4gICAgaXNSZWNvcmQoZXJyb3IpICYmXG4gICAgdHlwZW9mIGVycm9yLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgKGVycm9yLnN0YWNrID09IG51bGwgfHwgdHlwZW9mIGVycm9yLnN0YWNrID09PSAnc3RyaW5nJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yICYgeyBuYW1lOiAnQWJvcnRFcnJvcicgfSB7XG4gIHJldHVybiBpc0Vycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcic7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5tZXNzYWdlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBFcnJvcldpdGhDb2RlIHtcbiAgY29kZTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvcldpdGhDb2RlIHtcbiAgcmV0dXJuIGlzUmVjb3JkKGVycm9yKSAmJiB0eXBlb2YgZXJyb3IuY29kZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5jb2RlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgc29tZSB0eXBlIGlzIHRoZSBuZXZlciB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROZXZlcihtc2c6IHN0cmluZywgeDogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IobXNnICsgJzogJyArIHgpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzczxFIGV4dGVuZHMgRXJyb3I+ID0ge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogRTtcbiAgcHJvdG90eXBlOiBFO1xufTtcblxuLyoqXG4gKiBBIGRlY29yYXRvciB0byBiZSB1c2VkIG9uIGVycm9yIGNsYXNzZXMuIEl0IGFkZHMgdGhlICduYW1lJyBwcm9wZXJ0eSBBTkQgcHJvdmlkZXMgYSBjdXN0b21cbiAqICdpbnN0YW5jZW9mJyBoYW5kbGVyIHRoYXQgd29ya3MgY29ycmVjdGx5IGFjcm9zcyBleGVjdXRpb24gY29udGV4dHMuXG4gKlxuICogIyMjIERldGFpbHMgIyMjXG4gKlxuICogQWNjb3JkaW5nIHRvIHRoZSBFY21hU2NyaXB0J3Mgc3BlYywgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSmF2YVNjcmlwdCdzIGB4IGluc3RhbmNlb2YgWWAgb3BlcmF0b3IgaXMgdG8gd2FsayB1cCB0aGVcbiAqIHByb3RvdHlwZSBjaGFpbiBvZiBvYmplY3QgJ3gnLCBjaGVja2luZyBpZiBhbnkgY29uc3RydWN0b3IgaW4gdGhhdCBoaWVyYXJjaHkgaXMgX2V4YWN0bHkgdGhlIHNhbWUgb2JqZWN0XyBhcyB0aGVcbiAqIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICdZJy5cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCBpdCBoYXBwZW5zIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGF0IGRpZmZlcmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBvYmplY3RzIGdldCBjcmVhdGVkIGZvciB3aGF0XG4gKiBhcHBlYXJzIHRvIGJlIHRoZSB2ZXJ5IHNhbWUgY2xhc3MuIFRoaXMgbGVhZHMgdG8gc3VycHJpc2luZyBiZWhhdmlvciB3aGVyZSBgaW5zdGFuY2VvZmAgcmV0dXJucyBmYWxzZSB0aG91Z2ggaXQgaXNcbiAqIGtub3duIHRoYXQgdGhlIG9iamVjdCBpcyBpbmRlZWQgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4gT25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgd2hlbiBjb25zdHJ1Y3RvclxuICogJ1knIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGUgY29uc3R1Y3RvciB3aXRoIHdoaWNoICd4JyB3YXMgaW5zdGFudGlhdGVkLiBBbm90aGVyIGNhc2UgaXMgd2hlbiB0d28gY29waWVzXG4gKiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGdldHMgbG9hZGVkIGluIHRoZSBzYW1lIHJlYWxtLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIHRlbmRzIHRvIGNhdXNlIGlzc3VlcyB3aGVuIGNyb3NzaW5nIHRoZSB3b3JrZmxvdy1zYW5kYm94aW5nIGJvdW5kYXJ5IChzaW5jZSBOb2RlJ3Mgdm0gbW9kdWxlXG4gKiByZWFsbHkgY3JlYXRlcyBuZXcgZXhlY3V0aW9uIHJlYWxtcyksIGFzIHdlbGwgYXMgd2hlbiBydW5uaW5nIHRlc3RzIHVzaW5nIEplc3QgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdGpzL2plc3QvaXNzdWVzLzI1NDlcbiAqIGZvciBzb21lIGRldGFpbHMgb24gdGhhdCBvbmUpLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW5qZWN0cyBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBpbnRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6Jywgd2hpY2ggaXMgYm90aCBjcm9zcy1yZWFsbSBzYWZlIGFuZFxuICogY3Jvc3MtY29waWVzLW9mLXRoZS1zYW1lLWxpYiBzYWZlLiBJdCB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIHN5bWJvbCBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIGFuZCB0aGVuXG4gKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoYXQgc3ltYm9sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3I8RSBleHRlbmRzIEVycm9yPihtYXJrZXJOYW1lOiBzdHJpbmcpOiAoY2xheno6IENsYXNzPEU+KSA9PiB2b2lkIHtcbiAgcmV0dXJuIChjbGF6ejogQ2xhc3M8RT4pOiB2b2lkID0+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBTeW1ib2wuZm9yKGBfX3RlbXBvcmFsX2lzJHttYXJrZXJOYW1lfWApO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgJ25hbWUnLCB7IHZhbHVlOiBtYXJrZXJOYW1lLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYmplY3Qtc2hvcnRoYW5kXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKHRoaXM6IGFueSwgZXJyb3I6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcyA9PT0gY2xhenopIHtcbiAgICAgICAgICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIChlcnJvciBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gJ3RoaXMnIG11c3QgYmUgYSBfc3ViY2xhc3NfIG9mIGNsYXp6IHRoYXQgZG9lc24ndCByZWRlZmluZWQgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIHNvIHRoYXQgaXQgaW5oZXJpdGVkXG4gICAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAgIC8vIGB4IGluc3RhbmNlb2YgU3ViY2xhc3NPZlBhcmVudGAgd291bGQgcmV0dXJuIHRydWUgZm9yIGFueSBpbnN0YW5jZSBvZiAnUGFyZW50Jywgd2hpY2ggaXMgY2xlYXJseSB3cm9uZy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAgIC8vIHJlZGVmaW5lIFtTeW1ib2wuaGFzSW5zdGFuY2VdLCBidXQgd2UgY2FuJ3QgZW5mb3JjZSB0aGF0LiBXZSB0aGVyZWZvcmUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2VvZlxuICAgICAgICAgIC8vIGJlaGF2aW9yICh3aGljaCBpcyBOT1QgY3Jvc3MtcmVhbG0gc2FmZSkuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZXJyb3IpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZCB9IGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL2NvbnZlcnRlci9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuXG4vKipcbiAqIFVzZXIgbWV0YWRhdGEgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gd29ya2Zsb3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1ldGFkYXRhIHtcbiAgLyoqIEBleHBlcmltZW50YWwgQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2UgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcbiAgLyoqIEBleHBlcmltZW50YWwgRml4ZWQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjb21tYW5kIGZvciBsb25nZXItdGV4dCBkZXNjcmlwdGlvbiwgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJNZXRhZGF0YVRvUGF5bG9hZChcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgc3RhdGljU3VtbWFyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdGF0aWNEZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuKTogdGVtcG9yYWwuYXBpLnNkay52MS5JVXNlck1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN0YXRpY1N1bW1hcnkgPT0gbnVsbCAmJiBzdGF0aWNEZXRhaWxzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3VtbWFyeSA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNTdW1tYXJ5LCBjb250ZXh0KTtcbiAgY29uc3QgZGV0YWlscyA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNEZXRhaWxzLCBjb250ZXh0KTtcblxuICBpZiAoc3VtbWFyeSA9PSBudWxsICYmIGRldGFpbHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBzdW1tYXJ5LCBkZXRhaWxzIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgYXMgVmVyc2lvbmluZ0ludGVudFN0cmluZyB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGNoZWNrRXh0ZW5kcyB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLy8gQXZvaWQgaW1wb3J0aW5nIHRoZSBwcm90byBpbXBsZW1lbnRhdGlvbiB0byByZWR1Y2Ugd29ya2Zsb3cgYnVuZGxlIHNpemVcbi8vIENvcGllZCBmcm9tIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnRcbi8qKlxuICogUHJvdG9idWYgZW51bSByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgVmVyc2lvbmluZ0ludGVudFN0cmluZ30uXG4gKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25pbmdJbnRlbnQge1xuICBVTlNQRUNJRklFRCA9IDAsXG4gIENPTVBBVElCTEUgPSAxLFxuICBERUZBVUxUID0gMixcbn1cblxuY2hlY2tFeHRlbmRzPGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQsIFZlcnNpb25pbmdJbnRlbnQ+KCk7XG5jaGVja0V4dGVuZHM8VmVyc2lvbmluZ0ludGVudCwgY29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudD4oKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKGludGVudDogVmVyc2lvbmluZ0ludGVudFN0cmluZyB8IHVuZGVmaW5lZCk6IFZlcnNpb25pbmdJbnRlbnQge1xuICBzd2l0Y2ggKGludGVudCkge1xuICAgIGNhc2UgJ0RFRkFVTFQnOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuREVGQVVMVDtcbiAgICBjYXNlICdDT01QQVRJQkxFJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkNPTVBBVElCTEU7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5VTlNQRUNJRklFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIoJ1VuZXhwZWN0ZWQgVmVyc2lvbmluZ0ludGVudCcsIGludGVudCk7XG4gIH1cbn1cbiIsIi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaW50ZW5kcyBjZXJ0YWluIGNvbW1hbmRzIHRvIGJlIHJ1biBvbiBhIGNvbXBhdGlibGUgd29ya2VyIEJ1aWxkIElkIHZlcnNpb24gb3Igbm90LlxuICpcbiAqIGBDT01QQVRJQkxFYCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcnVuIG9uIGEgd29ya2VyIHdpdGggY29tcGF0aWJsZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLiBJdCBtYXkgbm90IGJlXG4gKiBwb3NzaWJsZSBpZiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUgZG9lcyBub3QgYWxzbyBoYXZlIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCB3b3JrZXIncyBCdWlsZCBJZC5cbiAqXG4gKiBgREVGQVVMVGAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUncyBjdXJyZW50IG92ZXJhbGwtZGVmYXVsdCBCdWlsZCBJZC5cbiAqXG4gKiBXaGVyZSB0aGlzIHR5cGUgaXMgYWNjZXB0ZWQgb3B0aW9uYWxseSwgYW4gdW5zZXQgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIFNESyBzaG91bGQgY2hvb3NlIHRoZSBtb3N0IHNlbnNpYmxlIGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGUgdHlwZSBvZiBjb21tYW5kLCBhY2NvdW50aW5nIGZvciB3aGV0aGVyIHRoZSBjb21tYW5kIHdpbGwgYmUgcnVuIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgdGhlXG4gKiBjdXJyZW50IHdvcmtlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHN0YXJ0aW5nIFdvcmtmbG93cyBpcyBgREVGQVVMVGAuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBXb3JrZmxvd3Mgc3RhcnRpbmdcbiAqIEFjdGl2aXRpZXMsIHN0YXJ0aW5nIENoaWxkIFdvcmtmbG93cywgb3IgQ29udGludWluZyBBcyBOZXcgaXMgYENPTVBBVElCTEVgLlxuICpcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nSW50ZW50ID0gJ0NPTVBBVElCTEUnIHwgJ0RFRkFVTFQnO1xuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBhIHNwZWNpZmljIHdvcmtlciBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICByZWFkb25seSBkZXBsb3ltZW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkZXBsb3ltZW50IHZlcnNpb24sIHdoaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXRcbiAqIGBkZXBsb3ltZW50TmFtZS5idWlsZElkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsU3RyaW5nKHZlcnNpb246IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3ZlcnNpb24uZGVwbG95bWVudE5hbWV9LiR7dmVyc2lvbi5idWlsZElkfWA7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHdoZW4gYSB3b3JrZmxvdyBtaWdodCBtb3ZlIGZyb20gYSB3b3JrZXIgb2Ygb25lIEJ1aWxkIElkIHRvIGFub3RoZXIuXG4gKlxuICogKiAnUElOTkVEJyAtIFRoZSB3b3JrZmxvdyB3aWxsIGJlIHBpbm5lZCB0byB0aGUgY3VycmVudCBCdWlsZCBJRCB1bmxlc3MgbWFudWFsbHkgbW92ZWQuXG4gKiAqICdBVVRPX1VQR1JBREUnIC0gVGhlIHdvcmtmbG93IHdpbGwgYXV0b21hdGljYWxseSBtb3ZlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiAoZGVmYXVsdCBCdWlsZCBJRFxuICogICAgb2YgdGhlIHRhc2sgcXVldWUpIHdoZW4gdGhlIG5leHQgdGFzayBpcyBkaXNwYXRjaGVkLlxuICovXG5leHBvcnQgY29uc3QgVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBQSU5ORUQ6ICdQSU5ORUQnLFxuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yKVtrZXlvZiB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZVZlcnNpb25pbmdCZWhhdmlvcl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW1ZlcnNpb25pbmdCZWhhdmlvci5QSU5ORURdOiAxLFxuICAgIFtWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHZlcnNpb25pbmcgb3ZlcnJpZGVzLiBGb3IgZXhhbXBsZSwgd2hlbiBzdGFydGluZyB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdPdmVycmlkZSA9IFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB8ICdBVVRPX1VQR1JBREUnO1xuXG4vKipcbiAqIFdvcmtmbG93IHdpbGwgYmUgcGlubmVkIHRvIGEgc3BlY2lmaWMgZGVwbG95bWVudCB2ZXJzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2VyIGRlcGxveW1lbnQgdmVyc2lvbiB0byBwaW4gdGhlIHdvcmtmbG93IHRvLlxuICAgKi9cbiAgcGlubmVkVG86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdyB3aWxsIGF1dG8tdXBncmFkZSB0byB0aGUgY3VycmVudCBkZXBsb3ltZW50IHZlcnNpb24gb24gdGhlIG5leHQgd29ya2Zsb3cgdGFzay5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b1VwZ3JhZGVWZXJzaW9uaW5nT3ZlcnJpZGUgPSAnQVVUT19VUEdSQURFJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2ZXJzaW9uaW5nIGJlaGF2aW9yIHRvIGJlIHVzZWQgYnkgdGhlIGZpcnN0IHRhc2sgb2YgYSBuZXcgd29ya2Zsb3cgcnVuIGluIGEgY29udGludWUtYXMtbmV3IGNoYWluLlxuICpcbiAqIEFVVE9fVVBHUkFERSAtIFN0YXJ0IHRoZSBuZXcgcnVuIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IuIFVzZSB0aGUgVGFyZ2V0IFZlcnNpb24gb2YgdGhlIHdvcmtmbG93J3MgdGFzayBxdWV1ZSBhdFxuICogICBzdGFydC10aW1lLCBhcyBBdXRvVXBncmFkZSB3b3JrZmxvd3MgZG8uIEFmdGVyIHRoZSBmaXJzdCB3b3JrZmxvdyB0YXNrIGNvbXBsZXRlcywgdXNlIHdoYXRldmVyXG4gKiAgIFZlcnNpb25pbmcgQmVoYXZpb3IgdGhlIHdvcmtmbG93IGlzIGFubm90YXRlZCB3aXRoIGluIHRoZSB3b3JrZmxvdyBjb2RlLlxuICpcbiAqICAgTm90ZSB0aGF0IGlmIHRoZSBwcmV2aW91cyB3b3JrZmxvdyBoYWQgYSBQaW5uZWQgb3ZlcnJpZGUsIHRoYXQgb3ZlcnJpZGUgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlXG4gKiAgIG5ldyB3b3JrZmxvdyBydW4gcmVnYXJkbGVzcyBvZiB0aGUgQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvciBzcGVjaWZpZWQgaW4gdGhlIGNvbnRpbnVlLWFzLW5ld1xuICogICBjb21tYW5kLiBJZiBhIFBpbm5lZCBvdmVycmlkZSBpcyBpbmhlcml0ZWQgYnkgdGhlIG5ldyBydW4sIGFuZCB0aGUgbmV3IHJ1biBzdGFydHMgd2l0aCBBdXRvVXBncmFkZVxuICogICBiZWhhdmlvciwgdGhlIGJhc2UgdmVyc2lvbiBvZiB0aGUgbmV3IHJ1biB3aWxsIGJlIHRoZSBUYXJnZXQgVmVyc2lvbiBhcyBkZXNjcmliZWQgYWJvdmUsIGJ1dCB0aGVcbiAqICAgZWZmZWN0aXZlIHZlcnNpb24gd2lsbCBiZSB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIFZlcnNpb25pbmcgT3ZlcnJpZGUgdW50aWwgdGhlIG92ZXJyaWRlIGlzIHJlbW92ZWQuXG4gKlxuICogVVNFX1JBTVBJTkdfVkVSU0lPTiAtIFVzZSB0aGUgUmFtcGluZyBWZXJzaW9uIG9mIHRoZSB3b3JrZmxvdydzIHRhc2sgcXVldWUgYXQgc3RhcnQgdGltZSwgcmVnYXJkbGVzcyBvZiB0aGUgd29ya2Zsb3cnc1xuICogICBUYXJnZXQgVmVyc2lvbiAoYWNjb3JkaW5nIHRvIGYod29ya2Zsb3dfaWQsIHJhbXBfcGVyY2VudGFnZSkpLiBBZnRlciB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBjb21wbGV0ZXMsXG4gKiAgIHRoZSB3b3JrZmxvdyB3aWxsIHVzZSB3aGF0ZXZlciBWZXJzaW9uaW5nIEJlaGF2aW9yIGl0IGlzIGFubm90YXRlZCB3aXRoLiBJZiB0aGVyZSBpcyBubyBSYW1waW5nXG4gKiAgIFZlcnNpb24gYnkgdGhlIHRpbWUgdGhhdCB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBpcyBkaXNwYXRjaGVkLCBpdCB3aWxsIGJlIHNlbnQgdG8gdGhlIEN1cnJlbnQgVmVyc2lvbi5cbiAqXG4gKiAgIEl0IGlzIGhpZ2hseSBkaXNjb3VyYWdlZCB0byB1c2UgdGhpcyBpZiB0aGUgd29ya2Zsb3cgaXMgYW5ub3RhdGVkIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IsIGJlY2F1c2VcbiAqICAgdGhpcyBzZXR0aW5nIE9OTFkgYXBwbGllcyB0byB0aGUgZmlyc3QgdGFzayBvZiB0aGUgd29ya2Zsb3cuIElmLCBhZnRlciB0aGUgZmlyc3QgdGFzaywgdGhlIHdvcmtmbG93XG4gKiAgIGlzIEF1dG9VcGdyYWRlLCBpdCB3aWxsIGJlaGF2ZSBsaWtlIGEgbm9ybWFsIEF1dG9VcGdyYWRlIHdvcmtmbG93IGFuZCBnbyB0byB0aGUgVGFyZ2V0IFZlcnNpb24sIHdoaWNoXG4gKiAgIG1heSBiZSB0aGUgQ3VycmVudCBWZXJzaW9uIGluc3RlYWQgb2YgdGhlIFJhbXBpbmcgVmVyc2lvbi5cbiAqXG4gKiAgIE5vdGUgdGhhdCBpZiB0aGUgd29ya2Zsb3cgYmVpbmcgY29udGludWVkIGhhcyBhIFBpbm5lZCBvdmVycmlkZSwgdGhhdCBvdmVycmlkZSB3aWxsIGJlIGluaGVyaXRlZCBieSB0aGVcbiAqICAgbmV3IHdvcmtmbG93IHJ1biByZWdhcmRsZXNzIG9mIHRoZSBDb250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yIHNwZWNpZmllZCBpbiB0aGUgY29udGludWUtYXMtbmV3XG4gKiAgIGNvbW1hbmQuIFZlcnNpb25pbmcgT3ZlcnJpZGUgYWx3YXlzIHRha2VzIHByZWNlZGVuY2UgdW50aWwgaXQncyByZW1vdmVkIG1hbnVhbGx5IHZpYSBVcGRhdGVXb3JrZmxvd0V4ZWN1dGlvbk9wdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxuICBVU0VfUkFNUElOR19WRVJTSU9OOiAnVVNFX1JBTVBJTkdfVkVSU0lPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcilba2V5b2YgdHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3JdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gICdDT05USU5VRV9BU19ORVdfVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW0luaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMSxcbiAgICBbSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvci5VU0VfUkFNUElOR19WRVJTSU9OXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0NPTlRJTlVFX0FTX05FV19WRVJTSU9OSU5HX0JFSEFWSU9SXydcbik7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGVwbG95bWVudFZlcnNpb24oXG4gIHY6IGNvcmVzZGsuY29tbW9uLklXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB8IG51bGwgfCB1bmRlZmluZWRcbik6IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2IHx8ICF2LmJ1aWxkSWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBidWlsZElkOiB2LmJ1aWxkSWQsXG4gICAgZGVwbG95bWVudE5hbWU6IHYuZGVwbG95bWVudE5hbWUgPz8gJycsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdCZWhhdmlvciB9IGZyb20gJy4vd29ya2VyLWRlcGxveW1lbnRzJztcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBkZWZpbmluZyBhIHdvcmtmbG93IHZpYSB7QGxpbmsgc2V0V29ya2Zsb3dPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIHtcbiAgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZXMgb2YgZXJyb3JzIHRoYXQsIGlmIHRocm93biBieSB0aGUgV29ya2Zsb3cgZnVuY3Rpb24sIGEgc2lnbmFsIGhhbmRsZXIsIG9yIGFuIHVwZGF0ZVxuICAgKiBoYW5kbGVyLCB3aWxsIGNhdXNlIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gb3IgdGhlIFVwZGF0ZSB0byBmYWlsIGluc3RlYWQgb2YgZmFpbGluZyB0aGVcbiAgICogV29ya2Zsb3cgVGFzayAod2hpY2ggd291bGQgcmVzdWx0IGluIHJldHJ5aW5nIHRoZSBXb3JrZmxvdyBUYXNrIHVudGlsIGl0IGV2ZW50dWFsbHkgc3VjY2VlZHMpLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgcGVyLVdvcmtmbG93LXR5cGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfS5cbiAgICogQm90aCBzZXR0aW5ncyBhcmUgZXZhbHVhdGVkOyBhbiBlcnJvciBtYXRjaGluZyBlaXRoZXIgd2lsbCBjYXVzZSBXb3JrZmxvdyBmYWlsdXJlLlxuICAgKiBVbmxpa2UgdGhlIHN0cmluZy1iYXNlZCB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSwgdGhpcyBhY2NlcHRzXG4gICAqIGFjdHVhbCBjbGFzcyByZWZlcmVuY2VzLCBlbmFibGluZyBzdWJjbGFzcyBtYXRjaGluZyB2aWEgYGluc3RhbmNlb2ZgLCBidXQgZG9lc24ndCBhbGxvd1xuICAgKiBmYWlsaW5nIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gb24gX25vbi1kZXRlcm1pbmlzbSBlcnJvcnNfLiBGYWlsaW5nIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gb25cbiAgICogbm9uLWRldGVybWluaXNtIGVycm9ycyBjYW4gb25seSBiZSBzZXQgdmlhIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9LlxuICAgKlxuICAgKiBQYXNzaW5nIHRoZSBgRXJyb3JgIGNsYXNzIHRvIHRoaXMgc2V0dGluZyB3aWxsIGZhaWwgdGhlIFdvcmtmbG93IG9uIGFueSBlcnJvciwgZXhjZXB0XG4gICAqIG5vbi1kZXRlcm1pbmlzbSBlcnJvcnMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSBzdWJjbGFzc2VzIGFuZCBjYW5jZWxsYXRpb24gZXJyb3JzIHRoYXQgYnViYmxlcyBvdXRcbiAgICogb2YgdGhlIFdvcmtmbG93IGFsd2F5cyBmYWlsIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgZWl0aGVyIHRoaXMgYW5kIHRoZVxuICAgKiB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzPzogQXJyYXk8bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gRXJyb3I+O1xufVxuXG50eXBlIEFzeW5jRnVuY3Rpb248QXJncyBleHRlbmRzIGFueVtdLCBSZXR1cm5UeXBlPiA9ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJldHVyblR5cGU+O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyID0gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyB8ICgoKSA9PiBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zKTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqIEEgd29ya2Zsb3cgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiBkZWZpbmVkIHdpdGggb3B0aW9ucyBmcm9tIHtAbGluayBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdLCBSZXR1cm5UeXBlPiBleHRlbmRzIEFzeW5jRnVuY3Rpb248QXJncywgUmV0dXJuVHlwZT4ge1xuICB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zOiBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zT3JHZXR0ZXI7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93LCBXb3JrZmxvd1Jlc3VsdFR5cGUsIFNpZ25hbERlZmluaXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEJhc2UgV29ya2Zsb3dIYW5kbGUgaW50ZXJmYWNlLCBleHRlbmRlZCBpbiB3b3JrZmxvdyBhbmQgY2xpZW50IGxpYnMuXG4gKlxuICogVHJhbnNmb3JtcyBhIHdvcmtmbG93IGludGVyZmFjZSBgVGAgaW50byBhIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVdvcmtmbG93SGFuZGxlPFQgZXh0ZW5kcyBXb3JrZmxvdz4ge1xuICAvKipcbiAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlc1xuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuICAvKipcbiAgICogU2lnbmFsIGEgcnVubmluZyBXb3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGRlZiBhIHNpZ25hbCBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogYXdhaXQgaGFuZGxlLnNpZ25hbChpbmNyZW1lbnRTaWduYWwsIDMpO1xuICAgKiBgYGBcbiAgICovXG4gIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHwgc3RyaW5nLFxuICAgIC4uLmFyZ3M6IEFyZ3NcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIHdvcmtmbG93SWQgb2YgdGhlIGN1cnJlbnQgV29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZztcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEF0dHJpYnV0ZVBhaXIsIFNlYXJjaEF0dHJpYnV0ZXMsIFR5cGVkU2VhcmNoQXR0cmlidXRlcyB9IGZyb20gJy4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBQcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMgfSBmcm9tICcuL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucyc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGFcbiAqIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogQ29uY2VwdDoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvdy1leGVjdXRpb24vd29ya2Zsb3dpZC1ydW5pZCN3b3JrZmxvdy1pZC1yZXVzZS1wb2xpY3kgfCBXb3JrZmxvdyBJZCBSZXVzZSBQb2xpY3l9XG4gKlxuICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlLlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZSB0aGF0IGlzIG5vdCBDb21wbGV0ZWQuXG4gICAqL1xuICBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2Fubm90IGJlIHN0YXJ0ZWQuXG4gICAqL1xuICBSRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBXb3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nOyBvdGhlcndpc2UgYWxsb3cgcmV1c2luZyB0aGUgV29ya2Zsb3cgSUQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURX0gaW5zdGVhZCwgYW5kXG4gICAqICAgICAgICAgICAgIHNldCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgdG9cbiAgICogICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVEVSTUlOQVRFX0VYSVNUSU5HfS5cbiAgICogICAgICAgICAgICAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIG11c3QgYmUgbGVmdCB1bnNwZWNpZmllZC5cbiAgICovXG4gIFRFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBObyBuZWVkIHRvIHVzZSB0aGlzLiBJZiBhIGBXb3JrZmxvd0lkUmV1c2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFl9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFSkVDVF9EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVEVSTUlOQVRFX0lGX1JVTk5JTkd9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9URVJNSU5BVEVfSUZfUlVOTklORzogJ1RFUk1JTkFURV9JRl9SVU5OSU5HJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSAodHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSlba2V5b2YgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVdOiAxLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZXTogMixcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlJFSkVDVF9EVVBMSUNBVEVdOiAzLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuVEVSTUlOQVRFX0lGX1JVTk5JTkddOiA0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuKTtcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3dcbiAqIHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiAqTm90ZTogSXQgaXMgbmV2ZXIgcG9zc2libGUgdG8gaGF2ZSB0d28gX2FjdGl2ZWx5IHJ1bm5pbmdfIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByYWlzZSBhIGBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3JgLlxuICAgKi9cbiAgRkFJTDogJ0ZBSUwnLFxuXG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmV0dXJuIGEgV29ya2Zsb3cgSGFuZGxlIGZvciB0aGUgYWxyZWFkeSBSdW5uaW5nIFdvcmtmbG93LlxuICAgKi9cbiAgVVNFX0VYSVNUSU5HOiAnVVNFX0VYSVNUSU5HJyxcblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgV29ya2Zsb3csIHRlcm1pbmF0aW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqL1xuICBURVJNSU5BVEVfRVhJU1RJTkc6ICdURVJNSU5BVEVfRVhJU1RJTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LkZBSUxdOiAxLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVVNFX0VYSVNUSU5HXTogMixcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlRFUk1JTkFURV9FWElTVElOR106IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICAgKlxuICAgKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICAgKlxuICAgKiBAZGVmYXVsdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURVxuICAgKi9cbiAgd29ya2Zsb3dJZFJldXNlUG9saWN5PzogV29ya2Zsb3dJZFJldXNlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVU5TUEVDSUZJRURcbiAgICovXG4gIHdvcmtmbG93SWRDb25mbGljdFBvbGljeT86IFdvcmtmbG93SWRDb25mbGljdFBvbGljeTtcblxuICAvKipcbiAgICogQ29udHJvbHMgaG93IGEgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIHJldHJpZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFdvcmtmbG93IEV4ZWN1dGlvbnMgYXJlIG5vdCByZXRyaWVkLiBEbyBub3Qgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZW5jeWNsb3BlZGlhL3JldHJ5LXBvbGljaWVzIHwgTW9yZSBpbmZvcm1hdGlvbn0uXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjcm9uIHNjaGVkdWxlIGZvciBXb3JrZmxvdy4gSWYgYSBjcm9uIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIFdvcmtmbG93IHdpbGwgcnVuIGFzIGEgY3JvbiBiYXNlZCBvbiB0aGVcbiAgICogc2NoZWR1bGUuIFRoZSBzY2hlZHVsaW5nIHdpbGwgYmUgYmFzZWQgb24gVVRDIHRpbWUuIFRoZSBzY2hlZHVsZSBmb3IgdGhlIG5leHQgcnVuIG9ubHkgaGFwcGVucyBhZnRlciB0aGUgY3VycmVudFxuICAgKiBydW4gaXMgY29tcGxldGVkL2ZhaWxlZC90aW1lb3V0LiBJZiBhIFJldHJ5UG9saWN5IGlzIGFsc28gc3VwcGxpZWQsIGFuZCB0aGUgV29ya2Zsb3cgZmFpbGVkIG9yIHRpbWVkIG91dCwgdGhlXG4gICAqIFdvcmtmbG93IHdpbGwgYmUgcmV0cmllZCBiYXNlZCBvbiB0aGUgcmV0cnkgcG9saWN5LiBXaGlsZSB0aGUgV29ya2Zsb3cgaXMgcmV0cnlpbmcsIGl0IHdvbid0IHNjaGVkdWxlIGl0cyBuZXh0IHJ1bi5cbiAgICogSWYgdGhlIG5leHQgc2NoZWR1bGUgaXMgZHVlIHdoaWxlIHRoZSBXb3JrZmxvdyBpcyBydW5uaW5nIChvciByZXRyeWluZyksIHRoZW4gaXQgd2lsbCBza2lwIHRoYXQgc2NoZWR1bGUuIENyb25cbiAgICogV29ya2Zsb3cgd2lsbCBub3Qgc3RvcCB1bnRpbCBpdCBpcyB0ZXJtaW5hdGVkIG9yIGNhbmNlbGxlZCAoYnkgcmV0dXJuaW5nIHRlbXBvcmFsLkNhbmNlbGVkRXJyb3IpLlxuICAgKiBodHRwczovL2Nyb250YWIuZ3VydS8gaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHlvdXIgY3JvbiBleHByZXNzaW9ucy5cbiAgICovXG4gIGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgbm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIFRoZSB2YWx1ZXMgY2FuIGJlIGFueXRoaW5nIHRoYXRcbiAgICogaXMgc2VyaWFsaXphYmxlIGJ5IHtAbGluayBEYXRhQ29udmVydGVyfS5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIEdlbmVyYWwgZml4ZWQgZGV0YWlscyBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0IGFuZCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgc2luZ2xlLWxpbmUgZml4ZWQgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgYSB3b3JrZmxvd1xuICAgKi9cbiAgcHJpb3JpdHk/OiBQcmlvcml0eTtcbn1cblxuZXhwb3J0IHR5cGUgV2l0aFdvcmtmbG93QXJnczxXIGV4dGVuZHMgV29ya2Zsb3csIFQ+ID0gVCAmXG4gIChQYXJhbWV0ZXJzPFc+IGV4dGVuZHMgW2FueSwgLi4uYW55W11dXG4gICAgPyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M6IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBXb3JrZmxvd1xuICAgICAgICAgKi9cbiAgICAgICAgYXJncz86IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdvcmtmbG93IHJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90XG4gICAqIHJlbHkgb24gcnVuIHRpbWVvdXQgZm9yIGJ1c2luZXNzIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVyc1xuICAgKiBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBleGVjdXRpb24gKHdoaWNoIGluY2x1ZGVzIHJ1biByZXRyaWVzIGFuZCBjb250aW51ZSBhcyBuZXcpIGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBzZXJ2aWNlLiBEbyBub3QgcmVseSBvbiBleGVjdXRpb24gdGltZW91dCBmb3IgYnVzaW5lc3NcbiAgICogbGV2ZWwgdGltZW91dHMuIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgaW4gd29ya2Zsb3cgdGltZXJzIGZvciB0aGlzIHB1cnBvc2UuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgb2YgYSBzaW5nbGUgd29ya2Zsb3cgdGFzay4gRGVmYXVsdCBpcyAxMCBzZWNvbmRzLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93VGFza1RpbWVvdXQ/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tbW9uV29ya2Zsb3dPcHRpb25zID0gQmFzZVdvcmtmbG93T3B0aW9ucyAmIFdvcmtmbG93RHVyYXRpb25PcHRpb25zO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFdvcmtmbG93VHlwZTxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT5cbik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnc3RyaW5nJykgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYyBhcyBzdHJpbmc7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHdvcmtmbG93VHlwZU9yRnVuYz8ubmFtZSkgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYy5uYW1lO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd29ya2Zsb3cgdHlwZTogdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGFub255bW91cycpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYEludmFsaWQgd29ya2Zsb3cgdHlwZTogZXhwZWN0ZWQgZWl0aGVyIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24sIGdvdCAnJHt0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jfSdgXG4gICk7XG59XG4iLCIvLyBBIHBvcnQgb2YgYW4gYWxnb3JpdGhtIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxuLy8gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25xdWlubGFuL2JldHRlci1yYW5kb20tbnVtYmVycy1mb3ItamF2YXNjcmlwdC1taXJyb3Jcbi8vIE9yaWdpbmFsIHdvcmsgaXMgdW5kZXIgTUlUIGxpY2Vuc2UgLVxuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5vcmc+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLy8gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkYmF1L3NlZWRyYW5kb20vYmxvYi9yZWxlYXNlZC9saWIvYWxlYS5qc1xuXG5jbGFzcyBBbGVhIHtcbiAgcHVibGljIGM6IG51bWJlcjtcbiAgcHVibGljIHMwOiBudW1iZXI7XG4gIHB1YmxpYyBzMTogbnVtYmVyO1xuICBwdWJsaWMgczI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZWVkOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG1hc2ggPSBuZXcgTWFzaCgpO1xuICAgIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgICB0aGlzLmMgPSAxO1xuICAgIHRoaXMuczAgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMSA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMyID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczAgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMwIDwgMCkge1xuICAgICAgdGhpcy5zMCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnMxIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMSA8IDApIHtcbiAgICAgIHRoaXMuczEgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMiAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczIgPCAwKSB7XG4gICAgICB0aGlzLnMyICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ID0gMjA5MTYzOSAqIHRoaXMuczAgKyB0aGlzLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIHRoaXMuczAgPSB0aGlzLnMxO1xuICAgIHRoaXMuczEgPSB0aGlzLnMyO1xuICAgIHJldHVybiAodGhpcy5zMiA9IHQgLSAodGhpcy5jID0gdCB8IDApKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSTkcgPSAoKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGVhKHNlZWQ6IG51bWJlcltdKTogUk5HIHtcbiAgY29uc3QgeGcgPSBuZXcgQWxlYShzZWVkKTtcbiAgcmV0dXJuIHhnLm5leHQuYmluZCh4Zyk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXNoIHtcbiAgcHJpdmF0ZSBuID0gMHhlZmM4MjQ5ZDtcblxuICBwdWJsaWMgbWFzaChkYXRhOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgbGV0IHsgbiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG4gKz0gZGF0YVtpXSE7XG4gICAgICBsZXQgaCA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBoICo9IG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXG4gICAgfVxuICAgIHRoaXMubiA9IG47XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IENhbmNlbGxlZEZhaWx1cmUsIElsbGVnYWxTdGF0ZUVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb051bWJlciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFNka0ZsYWdzIH0gZnJvbSAnLi9mbGFncyc7XG5cbi8vIEFzeW5jTG9jYWxTdG9yYWdlIGlzIGluamVjdGVkIHZpYSB2bSBtb2R1bGUgaW50byBnbG9iYWwgc2NvcGUuXG4vLyBJbiBjYXNlIFdvcmtmbG93IGNvZGUgaXMgaW1wb3J0ZWQgaW4gTm9kZS5qcyBjb250ZXh0LCByZXBsYWNlIHdpdGggYW4gZW1wdHkgY2xhc3MuXG5leHBvcnQgY29uc3QgQXN5bmNMb2NhbFN0b3JhZ2U6IG5ldyA8VD4oKSA9PiBBTFM8VD4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLkFzeW5jTG9jYWxTdG9yYWdlID8/IGNsYXNzIHt9O1xuXG4vKiogTWFnaWMgc3ltYm9sIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IHNjb3BlIC0gaW50ZW50aW9uYWxseSBub3QgZXhwb3J0ZWQgKi9cbmNvbnN0IE5PX1BBUkVOVCA9IFN5bWJvbCgnTk9fUEFSRU5UJyk7XG5cbi8qKlxuICogT3B0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBDYW5jZWxsYXRpb25TY29wZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgcHJldmVudCBvdXRlciBjYW5jZWxsYXRpb24gZnJvbSBwcm9wYWdhdGluZyB0byBpbm5lciBzY29wZXMsIEFjdGl2aXRpZXMsIHRpbWVycywgYW5kIFRyaWdnZXJzLCBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiAoU2NvcGUgc3RpbGwgcHJvcGFnYXRlcyBDYW5jZWxsZWRGYWlsdXJlIHRocm93biBmcm9tIHdpdGhpbikuXG4gICAqL1xuICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENhbmNlbGxhdGlvblNjb3BlICh1c2VmdWwgZm9yIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrcykuXG4gICAqIFRoZSBgTk9fUEFSRU5UYCBzeW1ib2wgaXMgcmVzZXJ2ZWQgZm9yIHRoZSByb290IHNjb3BlLlxuICAgKi9cbiAgcGFyZW50PzogQ2FuY2VsbGF0aW9uU2NvcGUgfCB0eXBlb2YgTk9fUEFSRU5UO1xufVxuXG4vKipcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgcHJvdmlkZSB0aGUgbWVjaGFuaWMgYnkgd2hpY2ggYSBXb3JrZmxvdyBtYXkgZ3JhY2VmdWxseSBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMgZm9yIGNhbmNlbGxhdGlvblxuICogKGUuZy4gaW4gcmVzcG9uc2UgdG8ge0BsaW5rIFdvcmtmbG93SGFuZGxlLmNhbmNlbH0gb3IgdGhyb3VnaCB0aGUgVUkgb3IgQ0xJKSwgYXMgd2VsbCBhcyByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZlxuICogY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBpdCBvd25zIChlLmcuIEFjdGl2aXRpZXMsIFRpbWVycywgQ2hpbGQgV29ya2Zsb3dzLCBldGMpLlxuICpcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgZm9ybSBhIHRyZWUsIHdpdGggdGhlIFdvcmtmbG93J3MgbWFpbiBmdW5jdGlvbiBydW5uaW5nIGluIHRoZSByb290IHNjb3BlIG9mIHRoYXQgdHJlZS5cbiAqIEJ5IGRlZmF1bHQsIGNhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIGRvd24gZnJvbSBhIHBhcmVudCBzY29wZSB0byBpdHMgY2hpbGRyZW4gYW5kIGl0cyBjYW5jZWxsYWJsZSBvcGVyYXRpb25zLlxuICogQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIHJlY2VpdmUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLCBidXQgaXMgbmV2ZXIgZWZmZWN0aXZlbHkgY29uc2lkZXJlZCBhcyBjYW5jZWxsZWQsXG4gKiB0aHVzIHNoaWVsZGRpbmcgaXRzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGl0IHJlY2VpdmVzLlxuICpcbiAqIFNjb3BlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBjb25zdHJ1Y3RvciBvciB0aGUgc3RhdGljIGhlbHBlciBtZXRob2RzIHtAbGluayBjYW5jZWxsYWJsZX0sXG4gKiB7QGxpbmsgbm9uQ2FuY2VsbGFibGV9IGFuZCB7QGxpbmsgd2l0aFRpbWVvdXR9LiBgd2l0aFRpbWVvdXRgIGNyZWF0ZXMgYSBzY29wZSB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGYgYWZ0ZXJcbiAqIHNvbWUgZHVyYXRpb24uXG4gKlxuICogQ2FuY2VsbGF0aW9uIG9mIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVzdWx0cyBpbiBhbGwgb3BlcmF0aW9ucyBjcmVhdGVkIGRpcmVjdGx5IGluIHRoYXQgc2NvcGUgdG8gdGhyb3cgYVxuICoge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IChlaXRoZXIgZGlyZWN0bHksIG9yIGFzIHRoZSBgY2F1c2VgIG9mIGFuIHtAbGluayBBY3Rpdml0eUZhaWx1cmV9IG9yIGFcbiAqIHtAbGluayBDaGlsZFdvcmtmbG93RmFpbHVyZX0pLiBGdXJ0aGVyIGF0dGVtcHQgdG8gY3JlYXRlIG5ldyBjYW5jZWxsYWJsZSBzY29wZXMgb3IgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyB3aXRoaW4gYVxuICogc2NvcGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZCB3aWxsIGFsc28gaW1tZWRpYXRlbHkgdGhyb3cgYSB7QGxpbmsgQ2FuY2VsbGVkRmFpbHVyZX0gZXhjZXB0aW9uLiBJdCBpcyBob3dldmVyXG4gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgYXQgdGhhdCBwb2ludDsgdGhpcyBpcyBvZnRlbiB1c2VkIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb3IgY2xlYW51cFxuICogb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coLi4uKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIHRyeSB7XG4gKiAgICAgLy8gVGhpcyBhY3Rpdml0eSBydW5zIGluIHRoZSByb290IGNhbmNlbGxhdGlvbiBzY29wZS4gVGhlcmVmb3JlLCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IG9uXG4gKiAgICAgLy8gdGhlIFdvcmtmbG93IGV4ZWN1dGlvbiAoZS5nLiB0aHJvdWdoIHRoZSBVSSBvciBDTEkpIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlcyB0byB0aGlzXG4gKiAgICAgLy8gYWN0aXZpdHkuIEFzc3VtaW5nIHRoYXQgdGhlIGFjdGl2aXR5IHByb3Blcmx5IGhhbmRsZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIHRoZW4gdGhlXG4gKiAgICAgLy8gY2FsbCBiZWxvdyB3aWxsIHRocm93IGFuIGBBY3Rpdml0eUZhaWx1cmVgIGV4Y2VwdGlvbiwgd2l0aCBgY2F1c2VgIHNldHMgdG8gYW5cbiAqICAgICAvLyBpbnN0YW5jZSBvZiBgQ2FuY2VsbGVkRmFpbHVyZWAuXG4gKiAgICAgYXdhaXQgc29tZUFjdGl2aXR5KCk7XG4gKiAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZSkpIHtcbiAqICAgICAgIC8vIFJ1biBjbGVhbnVwIGFjdGl2aXR5IGluIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlXG4gKiAgICAgICBhd2FpdCBDYW5jZWxsYXRpb25TY29wZS5ub25DYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gKiAgICAgICAgIGF3YWl0IGNsZWFudXBBY3Rpdml0eSgpO1xuICogICAgICAgfVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aHJvdyBlO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQSBjYW5jZWxsYWJsZSBzY29wZSBtYXkgYmUgcHJvZ3JhbWF0aWNhbGx5IGNhbmNlbGxlZCBieSBjYWxsaW5nIHtAbGluayBjYW5jZWx8YHNjb3BlLmNhbmNlbCgpYH1gLiBUaGlzIG1heSBiZSB1c2VkLFxuICogZm9yIGV4YW1wbGUsIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gQWN0aXZpdHkgb3IgQ2hpbGQgV29ya2Zsb3c6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICogY29uc3QgYWN0aXZpdHlQcm9taXNlID0gY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlLnJ1bigoKSA9PiBzb21lQWN0aXZpdHkoKSk7XG4gKiBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUuY2FuY2VsKCk7IC8vIENhbmNlbHMgdGhlIGFjdGl2aXR5XG4gKiBhd2FpdCBhY3Rpdml0eVByb21pc2U7IC8vIFRocm93cyBgQWN0aXZpdHlGYWlsdXJlYCB3aXRoIGBjYXVzZWAgc2V0IHRvIGBDYW5jZWxsZWRGYWlsdXJlYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCB0aGVuIHRoaXMgc2NvcGUgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIGNhbmNlbGxlZCwgZXZlbiBpZiBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGlzIHJlY2VpdmVkIChlaXRoZXJcbiAgICogZGlyZWN0bHkgYnkgY2FsbGluZyBgc2NvcGUuY2FuY2VsKClgIG9yIGluZGlyZWN0bHkgYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuIFRoaXMgZWZmZWN0aXZlbHlcbiAgICogc2hpZWxkcyB0aGUgc2NvcGUncyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBtYWRlIG9uIHRoZVxuICAgKiBub24tY2FuY2VsbGFibGUgc2NvcGUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgUHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYHJ1bmAgZnVuY3Rpb24gb2Ygbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSBzdGlsbCB0aHJvdyBhIGBDYW5jZWxsZWRGYWlsdXJlYFxuICAgKiBpZiBzdWNoIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB3aXRoaW4gdGhhdCBzY29wZSAoZS5nLiBieSBkaXJlY3RseSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgY2hpbGQgc2NvcGUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbGxhYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLCBkZWZhdWx0cyB0byB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudH0oKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlO1xuXG4gIC8qKlxuICAgKiBBIFByb21pc2UgdGhhdCB0aHJvd3Mgd2hlbiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlY2VpdmVzIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIGVpdGhlciBkaXJlY3RseVxuICAgKiAoaS5lLiBgc2NvcGUuY2FuY2VsKClgKSwgb3IgaW5kaXJlY3RseSAoYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBtYXkgcmVjZWl2ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMsIHJlc3VsdGluZyBpbiB0aGUgYGNhbmNlbFJlcXVlc3RlZGAgcHJvbWlzZSBmb3JcbiAgICogdGhhdCBzY29wZSB0byB0aHJvdywgdGhvdWdoIHRoZSBzY29wZSB3aWxsIG5vdCBlZmZlY3RpdmVseSBnZXQgY2FuY2VsbGVkIChpLmUuIGBjb25zaWRlcmVkQ2FuY2VsbGVkYCB3aWxsIHN0aWxsXG4gICAqIHJldHVybiBgZmFsc2VgLCBhbmQgY2FuY2VsbGF0aW9uIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gY2hpbGQgc2NvcGVzIGFuZCBjb250YWluZWQgb3BlcmF0aW9ucykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBQcm9taXNlPG5ldmVyPjtcblxuICAjY2FuY2VsUmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gbXNPcHRpb25hbFRvTnVtYmVyKG9wdGlvbnM/LnRpbWVvdXQpO1xuICAgIHRoaXMuY2FuY2VsbGFibGUgPSBvcHRpb25zPy5jYW5jZWxsYWJsZSA/PyB0cnVlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUU0MgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5XG4gICAgICB0aGlzLnJlamVjdCA9IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkKTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICAgIGlmIChvcHRpb25zPy5wYXJlbnQgIT09IE5PX1BBUkVOVCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zPy5wYXJlbnQgfHwgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxsYWJsZSB8fFxuICAgICAgICAodGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZCAmJlxuICAgICAgICAgICFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCA9IHRoaXMucGFyZW50LiNjYW5jZWxSZXF1ZXN0ZWQ7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdChlcnIpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2NvcGUgd2FzIGVmZmVjdGl2ZWx5IGNhbmNlbGxlZC4gQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25zaWRlcmVkQ2FuY2VsbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgJiYgdGhpcy5jYW5jZWxsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc2NvcGUgYXMgY3VycmVudCBhbmQgcnVuICBgZm5gXG4gICAqXG4gICAqIEFueSB0aW1lcnMsIEFjdGl2aXRpZXMsIFRyaWdnZXJzIGFuZCBDYW5jZWxsYXRpb25TY29wZXMgY3JlYXRlZCBpbiB0aGUgYm9keSBvZiBgZm5gXG4gICAqIGF1dG9tYXRpY2FsbHkgbGluayB0aGVpciBjYW5jZWxsYXRpb24gdG8gdGhpcyBzY29wZS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCB0aGlzLnJ1bkluQ29udGV4dC5iaW5kKHRoaXMsIGZuKSBhcyAoKSA9PiBQcm9taXNlPFQ+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdGhhdCBydW5zIGEgZnVuY3Rpb24gaW4gQXN5bmNMb2NhbFN0b3JhZ2UgY29udGV4dC5cbiAgICpcbiAgICogQ291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gYXMgYW5vbnltb3VzIGZ1bmN0aW9uLCBtYWRlIGludG8gYSBtZXRob2QgZm9yIGltcHJvdmVkIHN0YWNrIHRyYWNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBydW5JbkNvbnRleHQ8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGltZXJTY29wZTogQ2FuY2VsbGF0aW9uU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHRpbWVyU2NvcGVcbiAgICAgICAgICAucnVuKCgpID0+IHNsZWVwKHRoaXMudGltZW91dCBhcyBudW1iZXIpKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5jYW5jZWwoKSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gc2NvcGUgd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBpZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGltZXJTY29wZSAmJlxuICAgICAgICAhdGltZXJTY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkICYmXG4gICAgICAgIGdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aW1lclNjb3BlLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIGNhbmNlbCB0aGUgc2NvcGUgYW5kIGxpbmtlZCBjaGlsZHJlblxuICAgKi9cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdDYW5jZWxsYXRpb24gc2NvcGUgY2FuY2VsbGVkJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHNjb3BlXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpOiBDYW5jZWxsYXRpb25TY29wZSB7XG4gICAgLy8gVXNpbmcgZ2xvYmFscyBkaXJlY3RseSBpbnN0ZWFkIG9mIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydFxuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCkgPz8gKGdsb2JhbFRoaXMgYXMgYW55KS5fX1RFTVBPUkFMX0FDVElWQVRPUl9fLnJvb3RTY29wZTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIGNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyBub25DYW5jZWxsYWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiBmYWxzZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgd2l0aFRpbWVvdXQ8VD4odGltZW91dDogRHVyYXRpb24sIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUsIHRpbWVvdXQgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlOiBBTFM8Q2FuY2VsbGF0aW9uU2NvcGU+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbmV4cG9ydCBjbGFzcyBSb290Q2FuY2VsbGF0aW9uU2NvcGUgZXh0ZW5kcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgY2FuY2VsbGFibGU6IHRydWUsIHBhcmVudDogTk9fUEFSRU5UIH0pO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdXb3JrZmxvdyBjYW5jZWxsZWQnKSk7XG4gIH1cbn1cblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGlzIG1vZHVsZSBhbmQgd29ya2Zsb3cudHMgKi9cbmxldCBzbGVlcCA9IChfOiBEdXJhdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGhhcyBub3QgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZCcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbihmbjogdHlwZW9mIHNsZWVwKTogdm9pZCB7XG4gIHNsZWVwID0gZm47XG59XG4iLCJpbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFJhbmRvbSgpOiBudW1iZXIge1xuICByZXR1cm4gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93IHJhbmRvbSBBUElzIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpLmN1cnJlbnRSYW5kb20oKTtcbn1cbiIsImltcG9ydCB7IEFjdGl2aXR5RmFpbHVyZSwgQ2FuY2VsbGVkRmFpbHVyZSwgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsIE5leHVzT3BlcmF0aW9uRmFpbHVyZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgd29ya2Zsb3cgZXJyb3JzXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIGluIHdvcmtmbG93IHdoZW4gaXQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIHRoYXQgbm9uLWRldGVybWluaXN0aWMgc3VjaCBhcyBjb25zdHJ1Y3QgYSBXZWFrUmVmKClcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yJylcbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7fVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgbWFya2VyIGZvciB0aGlzIHNwZWNpYWwgcmVzdWx0IHR5cGVcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmJylcbmV4cG9ydCBjbGFzcyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmFja29mZjogY29yZXNkay5hY3Rpdml0eV9yZXN1bHQuSURvQmFja29mZikge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgcHJvdmlkZWQgYGVycmAgaXMgY2F1c2VkIGJ5IGNhbmNlbGxhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb24oZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSB8fFxuICAgICgoZXJyIGluc3RhbmNlb2YgQWN0aXZpdHlGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIE5leHVzT3BlcmF0aW9uRmFpbHVyZSkgJiZcbiAgICAgIGVyci5jYXVzZSBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUpXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIFNka0ZsYWcgPSB7XG4gIGdldCBpZCgpOiBudW1iZXI7XG4gIGdldCBkZWZhdWx0KCk6IGJvb2xlYW47XG4gIGdldCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnMoKTogQWx0Q29uZGl0aW9uRm5bXSB8IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGZsYWdzUmVnaXN0cnk6IE1hcDxudW1iZXIsIFNka0ZsYWc+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgY29uc3QgU2RrRmxhZ3MgPSB7XG4gIC8qKlxuICAgKiBUaGlzIGZsYWcgZ2F0ZXMgbXVsdGlwbGUgZml4ZXMgcmVsYXRlZCB0byBjYW5jZWxsYXRpb24gc2NvcGVzIGFuZCB0aW1lcnMgaW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wOlxuICAgKiAtIENhbmNlbGxhdGlvbiBvZiBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBubyBsb25nZXIgcHJvcGFnYXRlcyB0byBjaGlsZHJlbiBzY29wZXNcbiAgICogICAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW1wb3JhbGlvL3Nkay10eXBlc2NyaXB0L2lzc3Vlcy8xNDIzKS5cbiAgICogLSBDYW5jZWxsYXRpb25TY29wZS53aXRoVGltZW91dChmbikgbm93IGNhbmNlbCB0aGUgdGltZXIgaWYgYGZuYCBjb21wbGV0ZXMgYmVmb3JlIGV4cGlyYXRpb25cbiAgICogICBvZiB0aGUgdGltZW91dCwgc2ltaWxhciB0byBob3cgYGNvbmRpdGlvbihmbiwgdGltZW91dClgIHdvcmtzLlxuICAgKiAtIFRpbWVycyBjcmVhdGVkIHVzaW5nIHNldFRpbWVvdXQgY2FuIG5vdyBiZSBpbnRlcmNlcHRlZC5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMC4yLzEuMTEuMC4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3MgdjEuMTEuMCBhbmQgdjEuMTEuMSB3ZXJlIG5vdFxuICAgKiAgICAgICAgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmcgaW4gTkRFIG9uIHJlcGxheS4gV2UgdGhlcmVmb3JlXG4gICAqICAgICAgICBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMSB0byBpbXBsaWNpdGx5IGhhdmUgdGhpcyBmbGFnIG9uLlxuICAgKi9cbiAgTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbjogZGVmaW5lRmxhZygxLCB0cnVlLCBbYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKC8xXFwuMTFcXC5bMDFdLyldKSxcblxuICAvKipcbiAgICogUHJpb3IgdG8gMS4xMS4wLCB3aGVuIHByb2Nlc3NpbmcgYSBXb3JrZmxvdyBhY3RpdmF0aW9uLCB0aGUgU0RLIHdvdWxkIGV4ZWN1dGUgYG5vdGlmeUhhc1BhdGNoYFxuICAgKiBhbmQgYHNpZ25hbFdvcmtmbG93YCBqb2JzIGluIGRpc3RpbmN0IHBoYXNlcywgYmVmb3JlIG90aGVyIHR5cGVzIG9mIGpvYnMuIFRoZSBwcmltYXJ5IHJlYXNvblxuICAgKiBiZWhpbmQgdGhhdCBtdWx0aS1waGFzZSBhbGdvcml0aG0gd2FzIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGEgV29ya2Zsb3cgZXhlY3V0aW9uIG1pZ2h0XG4gICAqIGNvbXBsZXRlIGJlZm9yZSBhbGwgaW5jb21pbmcgc2lnbmFscyBoYXZlIGJlZW4gZGlzcGF0Y2hlZCAoYXQgbGVhc3QgdG8gdGhlIHBvaW50IHRoYXQgdGhlXG4gICAqIF9zeW5jaHJvbm91c18gcGFydCBvZiB0aGUgaGFuZGxlciBmdW5jdGlvbiBoYXMgYmVlbiBleGVjdXRlZCkuXG4gICAqXG4gICAqIFRoaXMgZmxhZyByZXBsYWNlcyB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3aXRoIGEgc2ltcGxlciBvbmUgd2hlcmUgam9icyBhcmUgc2ltcGx5IHNvcnRlZCBhc1xuICAgKiBgKHNpZ25hbHMgYW5kIHVwZGF0ZXMpIC0+IG90aGVyc2AsIGJ1dCB3aXRob3V0IHByb2Nlc3NpbmcgdGhlbSBhcyBkaXN0aW5jdCBiYXRjaGVzIChpLmUuIHdpdGhvdXRcbiAgICogbGVhdmluZy9yZWVudGVyaW5nIHRoZSBWTSBjb250ZXh0IGJldHdlZW4gZWFjaCBncm91cCwgd2hpY2ggYXV0b21hdGljYWxseSB0cmlnZ2VycyB0aGUgZXhlY3V0aW9uXG4gICAqIG9mIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzKS4gVGhhdCBzaW5nbGUtcGhhc2UgYXBwcm9hY2ggcmVzb2x2ZXMgYSBudW1iZXIgb2YgcXVpcmtzIG9mIHRoZVxuICAgKiBmb3JtZXIgYWxnb3JpdGhtLCBhbmQgeWV0IHN0aWxsIHNhdGlzZmllcyB0byB0aGUgb3JpZ2luYWwgcmVxdWlyZW1lbnQgb2YgZW5zdXJpbmcgdGhhdCBldmVyeVxuICAgKiBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgLSBhbmQgbm93IGBkb1VwZGF0ZWAgam9icyBhcyB3ZWxsIC0gaGF2ZSBiZWVuIGdpdmVuIGEgcHJvcGVyIGNoYW5jZSB0b1xuICAgKiBleGVjdXRlIGJlZm9yZSB0aGUgV29ya2Zsb3cgbWFpbiBmdW5jdGlvbiBtaWdodCBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTEuMC4gVGhpcyBjaGFuZ2UgaXMgbm90IHJvbGxiYWNrLXNhZmUuIEhvd2V2ZXIsIGR1ZSB0byBhbiBTREsgYnVnLCBTREtzXG4gICAqICAgICAgICB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90IHByb3Blcmx5IHdyaXRpbmcgYmFjayB0aGUgZmxhZ3MgdG8gaGlzdG9yeSwgcG9zc2libHkgcmVzdWx0aW5nXG4gICAqICAgICAgICBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmUgY29uc2lkZXIgdGhhdCBhIFdGVCBlbWl0dGVkIGJ5IFdvcmtlciB2MS4xMS4wIG9yIHYxLjExLjFcbiAgICogICAgICAgIHRvIGltcGxpY2l0ZWx5IGhhdmUgdGhpcyBmbGFnIG9uLlxuICAgKi9cbiAgUHJvY2Vzc1dvcmtmbG93QWN0aXZhdGlvbkpvYnNBc1NpbmdsZUJhdGNoOiBkZWZpbmVGbGFnKDIsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjExLjUgdGhlIGBoYW5kbGVTaWduYWxgIGludGVyY2VwdG9yIHdhcyBhZGRlZCB0byBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeVxuICAgKiB3aGljaCBhZGRlZCBhIHlpZWxkIHBvaW50LiBUaGUgYWRkZWQgeWllbGQgcG9pbnQgY2FuIGNhdXNlIE5ERSBpZiB0aGVyZSB3YXMgYSBzaWduYWwgaGFuZGxlciBhbmRcbiAgICogdGhlIHdvcmtmbG93IHdhcyBzdGFydGVkIHdpdGggYSBzaWduYWwuXG4gICAqXG4gICAqIFRoaXMgeWllbGQgcG9pbnQgd2FzIHJlbW92ZWQgaW4gMS4xMy4yLCBidXQgaW4gb3JkZXIgdG8gcHJldmVudCB3b3JrZmxvd3MgZnJvbSB0aGVcbiAgICogYWZmZWN0ZWQgdmVyc2lvbnMgcmVzdWx0aW5nIGluIE5ERSwgd2UgaGF2ZSB0byBpbmplY3QgdGhlIHlpZWxkIHBvaW50IG9uIHJlcGxheS5cbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yLlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc1RyYWNlc0luYm91bmRTaWduYWxzOiBkZWZpbmVGbGFnKDMsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDExLCBwYXRjaDogNSB9KV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjExLjYsIHRoZSBgc2NoZWR1bGVMb2NhbEFjdGl2aXR5YCBpbnRlcmNlcHRvciB3YXMgYWRkZWQgdG9cbiAgICogYEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5YCB3aGljaCBhZGRlZCBhIHlpZWxkIHBvaW50IHRvIHRoZVxuICAgKiBvdXRib3VuZCBpbnRlcmNlcHRvci4gVGhpcyB5aWVsZCBwb2ludCB3YXMgcmVtb3ZlZCBpbiAxLjEzLjIuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuMlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc1RyYWNlc0xvY2FsQWN0aXZpdGllczogZGVmaW5lRmxhZyg0LCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMSwgcGF0Y2g6IDYgfSldKSxcblxuICAvKipcbiAgICogVGhlIGludGVyY2VwdG9ycyBwcm92aWRlZCBieSBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeSBpbml0aWFsbHkgaGFkIHVubmVjZXNzYXJ5XG4gICAqIHlpZWxkIHBvaW50cyBvbiBjYWxsaW5nIHRvIGBleHRyYWN0Q29udGV4dEZyb21IZWFkZXJzYC5cbiAgICogSWYgcmVwbGF5aW5nIGEgd29ya2Zsb3cgY3JlYXRlZCBmcm9tIHRoZXNlIHZlcnNpb25zIGEgeWllbGQgcG9pbnQgaXMgaW5qZWN0ZWQgdG8gcHJldmVudCBhbnkgTkRFLlxuICAgKlxuICAgKiBJZiB0aGUgaGlzdG9yeSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBTREsgdmVyc2lvbiwgZGVmYXVsdCB0byBleHRyYSB5aWVsZHMgc2luY2UgdGhlIHlpZWxkcyB3ZXJlIHByZXNlbnQgc2luY2UgdGhlIE9URUxcbiAgICogcGFja2FnZSB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXBvcnNBdm9pZHNFeHRyYVlpZWxkczogZGVmaW5lRmxhZyg1LCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgcGF0Y2g6IDIgfSldKSxcblxuICAvKipcbiAgICogSW4gMS4xMy4zLCBhbGwgcmVtYWluaW5nIGludGVyY2VwdG9yIG1ldGhvZHMgd2VyZSBpbXBsZW1lbnRlZCBpbiBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeVxuICAgKiBpbmNsdWRpbmcgYGhhbmRsZVVwZGF0ZWAsIGB2YWxpZGF0ZVVwZGF0ZWAsIGBoYW5kbGVRdWVyeWAsIGBzdGFydFRpbWVyYCwgYW5kIGBzdGFydE5leHVzT3BlcmF0aW9uYC5cbiAgICogVGhlc2UgYWRkIGluc3RydW1lbnRhdGlvbiBhbmQgeWllbGQgcG9pbnRzIHRoYXQgd2VyZSBub3QgcHJlc2VudCBpbiBlYXJsaWVyIHZlcnNpb25zLlxuICAgKiBUaGlzIGZsYWcgZ2F0ZXMgdGhlc2UgbmV3IGludGVyY2VwdG9yIG1ldGhvZHMgdG8gcHJldmVudCBOREUgb24gcmVwbGF5IG9mIHdvcmtmbG93cyBmcm9tIGVhcmxpZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuM1xuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc0luc3RydW1lbnRzQWxsTWV0aG9kczogZGVmaW5lRmxhZyg2LCB0cnVlKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGRlZmluZUZsYWcoaWQ6IG51bWJlciwgZGVmOiBib29sZWFuLCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnM/OiBBbHRDb25kaXRpb25GbltdKTogU2RrRmxhZyB7XG4gIGNvbnN0IGZsYWcgPSB7IGlkLCBkZWZhdWx0OiBkZWYsIGFsdGVybmF0aXZlQ29uZGl0aW9ucyB9O1xuICBmbGFnc1JlZ2lzdHJ5LnNldChpZCwgZmxhZyk7XG4gIHJldHVybiBmbGFnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRGbGFnKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFmbGFnc1JlZ2lzdHJ5LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gU0RLIGZsYWc6ICR7aWR9YCk7XG59XG5cbi8qKlxuICogQW4gU0RLIEZsYWcgQWx0ZXJuYXRlIENvbmRpdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZsYWdcbiAqIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREtcbiAqIHRoYXQgZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVFxuICogZW1pdHRlZCBieSBwcmV2aW91cyBTREtzIHRoYXQgY29udGFpbmVkIGEgYnVnLlxuICpcbiAqIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcsIGFuZCBvbmx5IGlmIHRoZSBjb3JyZXNwb25pbmcgZmxhZyBpc1xuICogbm90IGFscmVhZHkgc2V0LiBBbHNvLCBhbHRlcm5hdGUgY29uZGl0aW9ucyB3aWxsIG5vdCBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlXG4gKiBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrcyBtYXkgbm90IHJlZmxlY3QgdGhpcyBmbGFnIGlmIHRoZVxuICogY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3QgYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvd1xuICogRXhlY3V0aW9uIGhhcyBnb25lIHRocm91Z2ggYSBuZXdlciBTREsgdmVyc2lvbiB0aGVuIGFnYWluIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICovXG50eXBlIEFsdENvbmRpdGlvbkZuID0gKGN0eDogeyBpbmZvOiBXb3JrZmxvd0luZm87IHNka1ZlcnNpb24/OiBzdHJpbmcgfSkgPT4gYm9vbGVhbjtcblxuZnVuY3Rpb24gYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKHZlcnNpb246IFJlZ0V4cCk6IEFsdENvbmRpdGlvbkZuIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeQHRlbXBvcmFsaW8vd29ya2VyQCgke3ZlcnNpb24uc291cmNlfSlbK11gKTtcbiAgcmV0dXJuICh7IGluZm8gfSkgPT4gaW5mby5jdXJyZW50QnVpbGRJZCAhPSBudWxsICYmIHJlZ2V4LnRlc3QoaW5mby5jdXJyZW50QnVpbGRJZCk7XG59XG5cbnR5cGUgU2VtVmVyID0ge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGBBbHRDb25kaXRpb25GbmAgdGhhdCBjaGVja3MgaWYgdGhlIFNESyB2ZXJzaW9uIGlzIGVxdWFsIHRvIG9yIGFmdGVyIHRoZSBwcm92aWRlZCB2ZXJzaW9uLlxuICogQW4gb3B0aW9uYWwgZGVmYXVsdCBjYW4gYmUgcHJvdmlkZWQgaW4gY2FzZSB0aGUgU0RLIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNBdExlYXN0KGNvbXBhcmU6IFNlbVZlciwgbWlzc2luZ0RlZmF1bHQ/OiBib29sZWFuKTogQWx0Q29uZGl0aW9uRm4ge1xuICByZXR1cm4gKGN0eCkgPT4ge1xuICAgIHJldHVybiBpc0NvbXBhcmVkKGNvbXBhcmUsIC0xLCBtaXNzaW5nRGVmYXVsdCkoY3R4KSB8fCBpc0NvbXBhcmVkKGNvbXBhcmUsIDAsIG1pc3NpbmdEZWZhdWx0KShjdHgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc0NvbXBhcmVkKGNvbXBhcmU6IFNlbVZlciwgY29tcGFyaXNvbjogLTEgfCAwIHwgMSwgbWlzc2luZ0RlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IEFsdENvbmRpdGlvbkZuIHtcbiAgcmV0dXJuICh7IHNka1ZlcnNpb24gfSkgPT4ge1xuICAgIGlmICghc2RrVmVyc2lvbikgcmV0dXJuIG1pc3NpbmdEZWZhdWx0O1xuICAgIGNvbnN0IHZlcnNpb24gPSBwYXJzZVNlbXZlcihzZGtWZXJzaW9uKTtcbiAgICBpZiAoIXZlcnNpb24pIHJldHVybiBtaXNzaW5nRGVmYXVsdDtcbiAgICByZXR1cm4gY29tcGFyZVNlbXZlcihjb21wYXJlLCB2ZXJzaW9uKSA9PT0gY29tcGFyaXNvbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTZW12ZXIodmVyc2lvbjogc3RyaW5nKTogU2VtVmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBbXywgbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uLm1hdGNoKC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvKSE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBOdW1iZXIucGFyc2VJbnQobWFqb3IhKSxcbiAgICAgIG1pbm9yOiBOdW1iZXIucGFyc2VJbnQobWlub3IhKSxcbiAgICAgIHBhdGNoOiBOdW1iZXIucGFyc2VJbnQocGF0Y2ghKSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogU2VtVmVyLCBiOiBTZW1WZXIpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEubWFqb3IgPCBiLm1ham9yKSByZXR1cm4gLTE7XG4gIGlmIChhLm1ham9yID4gYi5tYWpvcikgcmV0dXJuICsxO1xuICBpZiAoYS5taW5vciA8IGIubWlub3IpIHJldHVybiAtMTtcbiAgaWYgKGEubWlub3IgPiBiLm1pbm9yKSByZXR1cm4gKzE7XG4gIGlmIChhLnBhdGNoIDwgYi5wYXRjaCkgcmV0dXJuIC0xO1xuICBpZiAoYS5wYXRjaCA+IGIucGF0Y2gpIHJldHVybiArMTtcbiAgcmV0dXJuIDA7XG59XG4iLCJpbXBvcnQgeyBJbGxlZ2FsU3RhdGVFcnJvciwgdHlwZSBXb3JrZmxvdyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoZSBfX1RFTVBPUkFMX18gb2JqZWN0IHdpbGwgYmUgYXNzaWduZWQgYnkgV2VicGFjayB0byB0aGUgZXhwb3J0cyBvZiB0aGUgZW50cnlwb2ludCBtb2R1bGVcbiAgLy8gZmlsZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGJ1bmRsZXIgKHNlZSB3b3JrZmxvdy9idW5kbGVyLnRzI2dlbkVudHJ5cG9pbnQoKSkuXG4gIC8vXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLiBJIHByZXNlcnZlZCB0aGUgdXBwZXJjYXNlIG5hbWUgZm9yIGJhY2t3YXJkXG4gIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBidW5kbGVzIGdlbmVyYXRlZCBieSAxLjE0LjAuIFdlIGdlbmVyYWxseSBkbyBub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgb2ZcbiAgLy8gYnVuZGxlcyB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgU0RLLCBidXQgaW4gdGhpcyBzcGVjaWZpYyBjYXNlLCB0aGVyZSdzIHJlYWxseSBub1xuICAvLyB1c2VyLXNpZGUgdmFsdWUgaW4gcmVuYW1pbmcgdGhpcywgc28gbWFraW5nIGEgYnJlYWtpbmcgY2hhbmdlIGZvciB0aGF0IHdvdWxkIG5vdCBiZSBqdXN0aWZpZWQuXG4gIC8vXG5cbiAgdmFyIF9fVEVNUE9SQUxfXzoge1xuICAgIGFwaTogdHlwZW9mIGltcG9ydCgnLi93b3JrZXItaW50ZXJmYWNlLnRzJyk7XG4gICAgcHJlbG9hZE1vZHVsZXM/OiAoKSA9PiB2b2lkO1xuICAgIGltcG9ydFdvcmtmbG93czogKCkgPT4gUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+O1xuICAgIGltcG9ydEludGVyY2VwdG9yczogKCkgPT4gW3sgaW50ZXJjZXB0b3JzOiBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfV07XG4gIH07XG5cbiAgLy8gRGVzdHJ1Y3RvcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNoYXJlZCBzYW5kYm94IGlzIGRlc3Ryb3llZC5cblxuICB2YXIgX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM6ICgoKSA9PiB2b2lkKVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLlxuXG4gIHZhciBfX1RFTVBPUkFMX0FDVElWQVRPUl9fOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX0FDVElWQVRPUl9fID0gYWN0aXZhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF5YmVHZXRBY3RpdmF0b3IoKTogQWN0aXZhdG9yIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuX19URU1QT1JBTF9BQ1RJVkFUT1JfXztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyk6IEFjdGl2YXRvciB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UpO1xuICByZXR1cm4gYWN0aXZhdG9yO1xufVxuXG4vLyBUaGlzIGlzIHJlYWxseSBqdXN0IGFuIGFsaWFzIGZvciBgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHRgIHdpdGggYSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UsXG4vLyBiZWNhdXNlIHRoYXQgbmFtZSBiZXR0ZXIgY29udmV5cyB0aGUgaW50ZW50IGluIHNvbWUgdmVyeSBjb21tb24gdXNlIGNhc2VzLlxuZXhwb3J0IGNvbnN0IGdldEFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LmJpbmQobnVsbCwgJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiIsIi8qKlxuICogT3ZlcnJpZGVzIHNvbWUgZ2xvYmFsIG9iamVjdHMgdG8gbWFrZSB0aGVtIGRldGVybWluaXN0aWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtc1RvVHMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBjdXJyZW50UmFuZG9tIH0gZnJvbSAnLi9jdXJyZW50LXJhbmRvbSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5jb25zdCBPcmlnaW5hbERhdGUgPSBnbG9iYWxUaGlzLkRhdGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUdsb2JhbHMoKTogdm9pZCB7XG4gIC8vIE1vY2sgYW55IHdlYWsgcmVmZXJlbmNlIGJlY2F1c2UgR0MgaXMgbm9uLWRldGVybWluaXN0aWMgYW5kIHRoZSBlZmZlY3QgaXMgb2JzZXJ2YWJsZSBmcm9tIHRoZSBXb3JrZmxvdy5cbiAgLy8gV29ya2Zsb3cgZGV2ZWxvcGVyIHdpbGwgZ2V0IGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaWYgdGhleSB0cnkgdG8gdXNlIHRoZXNlLlxuICBnbG9iYWwuV2Vha1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcignV2Vha1JlZiBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYycpO1xuICB9O1xuICBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoXG4gICAgICAnRmluYWxpemF0aW9uUmVnaXN0cnkgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnXG4gICAgKTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IChPcmlnaW5hbERhdGUgYXMgYW55KSguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5hbERhdGUoZ2V0QWN0aXZhdG9yKCkubm93KTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEFjdGl2YXRvcigpLm5vdztcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5wYXJzZSA9IE9yaWdpbmFsRGF0ZS5wYXJzZS5iaW5kKE9yaWdpbmFsRGF0ZSk7XG4gIGdsb2JhbC5EYXRlLlVUQyA9IE9yaWdpbmFsRGF0ZS5VVEMuYmluZChPcmlnaW5hbERhdGUpO1xuXG4gIGdsb2JhbC5EYXRlLnByb3RvdHlwZSA9IE9yaWdpbmFsRGF0ZS5wcm90b3R5cGU7XG5cbiAgY29uc3QgdGltZW91dENhbmNlbGxhdGlvblNjb3BlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW5jZWxsYXRpb25TY29wZT4oKTtcblxuICAvKipcbiAgICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICAgKi9cbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoY2I6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtczogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IG51bWJlciB7XG4gICAgbXMgPSBNYXRoLm1heCgxLCBtcyk7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gICAgaWYgKGFjdGl2YXRvci5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAvLyBDYXB0dXJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgdGhhdCBzbGVlcCB3aWxsIGFsbG9jYXRlXG4gICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXI7XG4gICAgICBjb25zdCB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSk7XG4gICAgICBjb25zdCBzbGVlcFByb21pc2UgPSB0aW1lclNjb3BlLnJ1bigoKSA9PiBzbGVlcChtcykpO1xuICAgICAgc2xlZXBQcm9taXNlLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgIGNiKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNsZWVwUHJvbWlzZSk7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLnNldChzZXEsIHRpbWVyU2NvcGUpO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG4gICAgICAvLyBDcmVhdGUgYSBQcm9taXNlIGZvciBBc3luY0xvY2FsU3RvcmFnZSB0byBiZSBhYmxlIHRvIHRyYWNrIHRoaXMgY29tcGxldGlvbiB1c2luZyBwcm9taXNlIGhvb2tzLlxuICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgc3RhcnRUb0ZpcmVUaW1lb3V0OiBtc1RvVHMobXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSkudGhlbihcbiAgICAgICAgKCkgPT4gY2IoLi4uYXJncyksXG4gICAgICAgICgpID0+IHVuZGVmaW5lZCAvKiBpZ25vcmUgY2FuY2VsbGF0aW9uICovXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gIH07XG5cbiAgZ2xvYmFsLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIChoYW5kbGU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGNvbnN0IHRpbWVyU2NvcGUgPSB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmdldChoYW5kbGUpO1xuICAgIGlmICh0aW1lclNjb3BlKSB7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7IC8vIFNob3VsZG4ndCBpbmNyZWFzZSBzZXEgbnVtYmVyLCBidXQgdGhhdCdzIHRoZSBsZWdhY3kgYmVoYXZpb3JcbiAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5kZWxldGUoaGFuZGxlKTtcbiAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgc2VxOiBoYW5kbGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gY3VycmVudFJhbmRvbSgpIGRpc3BhdGNoZXMgdG8gYSBzY29wZWQgc3RyZWFtIHdoZW4gV29ya2Zsb3dSYW5kb21TdHJlYW0ud2l0aCguLi4pIGlzIGFjdGl2ZS5cbiAgTWF0aC5yYW5kb20gPSBjdXJyZW50UmFuZG9tO1xufVxuIiwiLyoqXG4gKiBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdG9vbHMgcmVxdWlyZWQgZm9yIGF1dGhvcmluZyB3b3JrZmxvd3MuXG4gKlxuICogIyMgVXNhZ2VcbiAqIFNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2hlbGxvLXdvcmxkI3dvcmtmbG93cyB8IHR1dG9yaWFsfSBmb3Igd3JpdGluZyB5b3VyIGZpcnN0IHdvcmtmbG93LlxuICpcbiAqICMjIyBUaW1lcnNcbiAqXG4gKiBUaGUgcmVjb21tZW5kZWQgd2F5IG9mIHNjaGVkdWxpbmcgdGltZXJzIGlzIGJ5IHVzaW5nIHRoZSB7QGxpbmsgc2xlZXB9IGZ1bmN0aW9uLiBXZSd2ZSByZXBsYWNlZCBgc2V0VGltZW91dGAgYW5kXG4gKiBgY2xlYXJUaW1lb3V0YCB3aXRoIGRldGVybWluaXN0aWMgdmVyc2lvbnMgc28gdGhlc2UgYXJlIGFsc28gdXNhYmxlIGJ1dCBoYXZlIGEgbGltaXRhdGlvbiB0aGF0IHRoZXkgZG9uJ3QgcGxheSB3ZWxsXG4gKiB3aXRoIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzIHwgY2FuY2VsbGF0aW9uIHNjb3Blc30uXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNsZWVwIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcGVyKG1zID0gMTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGF3YWl0IHNsZWVwKG1zKTtcbiAqICAgY29uc29sZS5sb2coJ3NsZXB0Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgQWN0aXZpdGllc1xuICpcbiAqIFRvIHNjaGVkdWxlIEFjdGl2aXRpZXMsIHVzZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBvYnRhaW4gYW4gQWN0aXZpdHkgZnVuY3Rpb24gYW5kIGNhbGwuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB0eXBlICogYXMgYWN0aXZpdGllcyBmcm9tICcuL2FjdGl2aXRpZXMnO1xuICpcbiAqIGNvbnN0IHsgc2VuZEVtYWlsIH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEgbWludXRlJyxcbiAqIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FtcGxlV29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgc2VuZEVtYWlsKFwidG9AZXhhbXBsZS5jb21cIixcIkhlbGxvLCBUZW1wb3JhbCFcIik7XG59XG5cbiAqIGBgYFxuICogXG4gKiAjIyMgVXBkYXRlcywgU2lnbmFscyBhbmQgUXVlcmllc1xuICpcbiAqIFVzZSB7QGxpbmsgc2V0SGFuZGxlcn0gdG8gc2V0IGhhbmRsZXJzIGZvciBVcGRhdGVzLCBTaWduYWxzLCBhbmQgUXVlcmllcy5cbiAqXG4gKiBVcGRhdGUgYW5kIFNpZ25hbCBoYW5kbGVycyBjYW4gYmUgZWl0aGVyIGFzeW5jIG9yIG5vbi1hc3luYyBmdW5jdGlvbnMuIFVwZGF0ZSBoYW5kbGVycyBtYXkgcmV0dXJuIGEgdmFsdWUsIGJ1dCBzaWduYWxcbiAqIGhhbmRsZXJzIG1heSBub3QgKHJldHVybiBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gKS4gWW91IG1heSB1c2UgQWN0aXZpdGllcywgVGltZXJzLCBjaGlsZCBXb3JrZmxvd3MsIGV0YyBpbiBVcGRhdGVcbiAqIGFuZCBTaWduYWwgaGFuZGxlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZSBkb25lIGNhdXRpb3VzbHk6IGZvciBleGFtcGxlLCBub3RlIHRoYXQgaWYgeW91IGF3YWl0IGFzeW5jIG9wZXJhdGlvbnMgc3VjaCBhc1xuICogdGhlc2UgaW4gYW4gVXBkYXRlIG9yIFNpZ25hbCBoYW5kbGVyLCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHdvcmtmbG93IGRvZXMgbm90IGNvbXBsZXRlIGZpcnN0LlxuICpcbiAqIFF1ZXJ5IGhhbmRsZXJzIG1heSAqKm5vdCoqIGJlIGFzeW5jIGZ1bmN0aW9ucywgYW5kIG1heSAqKm5vdCoqIG11dGF0ZSBhbnkgdmFyaWFibGVzIG9yIHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsXG4gKiBjaGlsZCBXb3JrZmxvd3MsIGV0Yy5cbiAqXG4gKiAjIyMjIEltcGxlbWVudGF0aW9uXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRTaWduYWwgPSB3Zi5kZWZpbmVTaWduYWw8W251bWJlcl0+KCdpbmNyZW1lbnQnKTtcbiAqIGV4cG9ydCBjb25zdCBnZXRWYWx1ZVF1ZXJ5ID0gd2YuZGVmaW5lUXVlcnk8bnVtYmVyPignZ2V0VmFsdWUnKTtcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRBbmRHZXRWYWx1ZVVwZGF0ZSA9IHdmLmRlZmluZVVwZGF0ZTxudW1iZXIsIFtudW1iZXJdPignaW5jcmVtZW50QW5kR2V0VmFsdWUnKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRlcldvcmtmbG93KGluaXRpYWxWYWx1ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGxldCBjb3VudCA9IGluaXRpYWxWYWx1ZTtcbiAqICAgd2Yuc2V0SGFuZGxlcihpbmNyZW1lbnRTaWduYWwsIChhcmc6IG51bWJlcikgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgfSk7XG4gKiAgIHdmLnNldEhhbmRsZXIoZ2V0VmFsdWVRdWVyeSwgKCkgPT4gY291bnQpO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlLCAoYXJnOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgICByZXR1cm4gY291bnQ7XG4gKiAgIH0pO1xuICogICBhd2FpdCB3Zi5jb25kaXRpb24oKCkgPT4gZmFsc2UpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIE1vcmVcbiAqXG4gKiAtIFtEZXRlcm1pbmlzdGljIGJ1aWx0LWluc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20jc291cmNlcy1vZi1ub24tZGV0ZXJtaW5pc20pXG4gKiAtIFtDYW5jZWxsYXRpb24gYW5kIHNjb3Blc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvY2FuY2VsbGF0aW9uLXNjb3BlcylcbiAqICAgLSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9XG4gKiAgIC0ge0BsaW5rIFRyaWdnZXJ9XG4gKiAtIFtTaW5rc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2FwcGxpY2F0aW9uLWRldmVsb3BtZW50L29ic2VydmFiaWxpdHkvP2xhbmc9dHMjbG9nZ2luZylcbiAqICAgLSB7QGxpbmsgU2lua3N9XG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7XG4gIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgQ2FuY2VsbGVkRmFpbHVyZSxcbiAgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBSZXRyeVBvbGljeSxcbiAgcm9vdENhdXNlLFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSxcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2Vycm9ycyc7XG5leHBvcnQge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eUludGVyZmFjZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBQYXlsb2FkLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVudHlwZWRBY3Rpdml0aWVzLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dRdWVyeVR5cGUsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1NpZ25hbFR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LW9wdGlvbnMnO1xuZXhwb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UsIENhbmNlbGxhdGlvblNjb3BlLCBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5leHBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENvbnRpbnVlQXNOZXcsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFBhcmVudENsb3NlUG9saWN5LFxuICBQYXJlbnRXb3JrZmxvd0luZm8sXG4gIFJvb3RXb3JrZmxvd0luZm8sXG4gIFN0YWNrVHJhY2VTREtJbmZvLFxuICBTdGFja1RyYWNlLFxuICBVbnNhZmVXb3JrZmxvd0luZm8sXG4gIFdvcmtmbG93SW5mbyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7IHByb3h5U2lua3MsIFNpbmssIFNpbmtDYWxsLCBTaW5rRnVuY3Rpb24sIFNpbmtzIH0gZnJvbSAnLi9zaW5rcyc7XG5leHBvcnQgdHlwZSB7IFdvcmtmbG93UmFuZG9tU3RyZWFtIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtcyc7XG5leHBvcnQgeyBnZXRSYW5kb21TdHJlYW0sIHdvcmtmbG93UmFuZG9tIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtcyc7XG5leHBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZ3MnO1xuZXhwb3J0IHsgVHJpZ2dlciB9IGZyb20gJy4vdHJpZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3dvcmtmbG93JztcbmV4cG9ydCB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgeyBtZXRyaWNNZXRlciB9IGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQge1xuICBjcmVhdGVOZXh1c1NlcnZpY2VDbGllbnQsXG4gIE5leHVzU2VydmljZUNsaWVudE9wdGlvbnMsXG4gIE5leHVzU2VydmljZUNsaWVudCxcbiAgTmV4dXNPcGVyYXRpb25IYW5kbGUsXG4gIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbn0gZnJvbSAnLi9uZXh1cyc7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRGVwcmVjYXRlZCBBUElzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cblxuICBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgYXMgTG9nZ2VyU2lua3MsXG59IGZyb20gJy4vbG9ncyc7XG4iLCJpbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aCwgdHlwZSBOZXh0IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQ29tcG9zZSB3b3JrZmxvdyBpbnRlcmNlcHRvcnMgd2hpbGUgbWFraW5nIGV2ZXJ5IGBuZXh0KC4uLilgIGNvbnRpbnVhdGlvbiByZS1lbnRlclxuICogdGhlIHdvcmtmbG93LXJhbmRvbSBzY29wZSB0aGF0IHdhcyBjdXJyZW50IHdoZW4gdGhhdCBjb250aW51YXRpb24gd2FzIGNyZWF0ZWQuXG4gKlxuICogVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgdGhpbiB3cmFwcGVyIG92ZXIgdGhlIHNoYXJlZCBpbnRlcmNlcHRvciBjb21wb3NpdGlvbiBoZWxwZXJcbiAqIGluIGBwYWNrYWdlcy9jb21tb25gLiBUaGUgc2hhcmVkIGhlbHBlciBvd25zIHRoZSBhY3R1YWwgY2hhaW4tY29uc3RydWN0aW9uIGFsZ29yaXRobSxcbiAqIG9yZGVyaW5nLCBhbmQgYG5leHQoLi4uKWAgd2lyaW5nIHNvIHdvcmtmbG93IGNvZGUgY2Fubm90IHNpbGVudGx5IGRyaWZ0IGF3YXkgZnJvbSB0aGVcbiAqIHNlbWFudGljcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBTREsuXG4gKlxuICogVGhlIHdvcmtmbG93LXNwZWNpZmljIGJlaGF2aW9yIGxpdmVzIGVudGlyZWx5IGluIHRoZSBgd3JhcE5leHRgIGhvb2sgd2UgcGFzcyBpbnRvIHRoYXRcbiAqIHNoYXJlZCBoZWxwZXIuIEVhY2ggYG5leHQoLi4uKWAgY29udGludWF0aW9uIGhhbmRlZCB0byBhIHdvcmtmbG93IGludGVyY2VwdG9yIGlzIHdyYXBwZWRcbiAqIHdpdGggYEFjdGl2YXRvci5iaW5kQ3VycmVudFJhbmRvbSguLi4pYCwgd2hpY2ggY2FwdHVyZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgd29ya2Zsb3dcbiAqIHJhbmRvbSBzY29wZSwgaW5jbHVkaW5nIHRoZSBhYnNlbmNlIG9mIGFueSBzY29wZWQgb3ZlcnJpZGUuIFdoZW4gdGhlIGludGVyY2VwdG9yIGxhdGVyXG4gKiBjYWxscyBgbmV4dCguLi4pYCwgdGhlIHdyYXBwZXIgcmVzdG9yZXMgdGhhdCBjYXB0dXJlZCBzY29wZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlc3Qgb2ZcbiAqIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBvciB0aGUgYmFzZSB3b3JrZmxvdy9ydW50aW1lIGhhbmRsZXIuXG4gKlxuICogVGhhdCBpcyB0aGUgYmVoYXZpb3Igd2UgbmVlZCBmb3IgYFdvcmtmbG93UmFuZG9tU3RyZWFtLndpdGgoLi4uKWA6IGEgdGVtcG9yYXJ5XG4gKiBwbHVnaW4vaW50ZXJjZXB0b3Igc2NvcGUgc2hvdWxkIGFwcGx5IHRvIHRoZSBwbHVnaW4ncyBvd24gY29kZSwgYnV0IGl0IG11c3Qgbm90XG4gKiBsZWFrIHRocm91Z2ggYG5leHQoLi4uKWAgaW50byBkb3duc3RyZWFtIHdvcmtmbG93IGNvZGUgdW5sZXNzIHRoYXQgZG93bnN0cmVhbSBjb2RlXG4gKiBleHBsaWNpdGx5IGVzdGFibGlzaGVzIGl0cyBvd24gc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9yc1dpdGgoaW50ZXJjZXB0b3JzLCBtZXRob2QsIG5leHQsICgod3JhcHBlZE5leHQpID0+XG4gICAgYWN0aXZhdG9yLmJpbmRDdXJyZW50UmFuZG9tKHdyYXBwZWROZXh0IGFzIGFueSkpIGFzIDxGIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICAgIG5leHQ6IEZcbiAgKSA9PiBGKSBhcyB1bmtub3duIGFzIE5leHQ8SSwgTT47XG59XG4iLCIvKipcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIFdvcmtmbG93IGludGVyY2VwdG9ycy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eU9wdGlvbnMsXG4gIER1cmF0aW9uLFxuICBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgTWV0cmljVGFncyxcbiAgVGltZXN0YW1wLFxuICBXb3JrZmxvd0V4ZWN1dGlvbixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IEhlYWRlcnMsIE5leHQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cywgQ29udGludWVBc05ld09wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgfSBmcm9tICcuL25leHVzJztcblxuZXhwb3J0IHsgTmV4dCwgSGVhZGVycyB9O1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpbnN0YW50aWF0ZXMge0BsaW5rIFdvcmtmbG93SW50ZXJjZXB0b3JzfS5cbiAqXG4gKiBXb3JrZmxvdyBpbnRlcmNlcHRvciBtb2R1bGVzIHNob3VsZCBleHBvcnQgYW4gYGludGVyY2VwdG9yc2AgZnVuY3Rpb24gb2YgdGhpcyB0eXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBmdW5jdGlvbiBpbnRlcmNlcHRvcnMoKTogV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICogICByZXR1cm4ge1xuICogICAgIGluYm91bmQ6IFtdLCAgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbmJvdW5kIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICAgIG91dGJvdW5kOiBbXSwgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBvdXRib3VuZCBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgICBpbnRlcm5hbHM6IFtdLCAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW50ZXJuYWxzIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9ICgpID0+IFdvcmtmbG93SW50ZXJjZXB0b3JzO1xuXG4vKipcbiAqIEEgbWFwcGluZyBmcm9tIGludGVyY2VwdG9yIHR5cGUgdG8gYW4gb3B0aW9uYWwgbGlzdCBvZiBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVyY2VwdG9ycyB7XG4gIGluYm91bmQ/OiBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIG91dGJvdW5kPzogV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3JbXTtcbiAgaW50ZXJuYWxzPzogV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvcltdO1xufVxuXG4vLyBXb3JrZmxvdyBJbmJvdW5kIENhbGxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGluYm91bmQgY2FsbHMgbGlrZSBleGVjdXRpb24sIGFuZCBzaWduYWwgYW5kIHF1ZXJ5IGhhbmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgZXhlY3V0ZSBtZXRob2QgaXMgY2FsbGVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBXb3JrZmxvdyBleGVjdXRpb25cbiAgICovXG4gIGV4ZWN1dGU/OiAoaW5wdXQ6IFdvcmtmbG93RXhlY3V0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdleGVjdXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFVwZGF0ZSBoYW5kbGVyIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgVXBkYXRlXG4gICAqL1xuICBoYW5kbGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVVcGRhdGUnPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdXBkYXRlIHZhbGlkYXRvciBjYWxsZWRcbiAgICovXG4gIHZhbGlkYXRlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAndmFsaWRhdGVVcGRhdGUnPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byBhIFdvcmtmbG93IGV4ZWN1dGlvblxuICAgKi9cbiAgaGFuZGxlU2lnbmFsPzogKGlucHV0OiBTaWduYWxJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlU2lnbmFsJz4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgV29ya2Zsb3cgaXMgcXVlcmllZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgcXVlcnlcbiAgICovXG4gIGhhbmRsZVF1ZXJ5PzogKGlucHV0OiBRdWVyeUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVRdWVyeSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5leGVjdXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGVJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlVXBkYXRlfSBhbmQge0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IudmFsaWRhdGVVcGRhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgdXBkYXRlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVNpZ25hbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsSW5wdXQge1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlUXVlcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5SW5wdXQge1xuICByZWFkb25seSBxdWVyeUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8vIFdvcmtmbG93IE91dGJvdW5kIENhbGxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGNvZGUgY2FsbHMgdG8gdGhlIFRlbXBvcmFsIEFQSXMsIGxpa2Ugc2NoZWR1bGluZyBhbiBhY3Rpdml0eVxuICogYW5kIHN0YXJ0aW5nIGEgdGltZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgdGltZXIuXG4gICAqL1xuICBzdGFydFRpbWVyPzogKGlucHV0OiBUaW1lcklucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnRUaW1lcic+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzY2hlZHVsZXMgYW4gQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlQWN0aXZpdHk/OiAoXG4gICAgaW5wdXQ6IEFjdGl2aXR5SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NjaGVkdWxlQWN0aXZpdHknPlxuICApID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhIGxvY2FsIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uXG4gICAqL1xuICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk/OiAoXG4gICAgaW5wdXQ6IExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5Jz5cbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnROZXh1c09wZXJhdGlvbj86IChcbiAgICBpbnB1dDogU3RhcnROZXh1c09wZXJhdGlvbklucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydE5leHVzT3BlcmF0aW9uJz5cbiAgKSA9PiBQcm9taXNlPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBjaGlsZCB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqXG4gICAqIFRoZSBpbnRlcmNlcHRvciBmdW5jdGlvbiByZXR1cm5zIDIgcHJvbWlzZXM6XG4gICAqIC0gVGhlIGZpcnN0IHJlc29sdmVzIHdpdGggdGhlIGBydW5JZGAgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgaGFzIHN0YXJ0ZWQgb3IgcmVqZWN0cyBpZiBmYWlsZWQgdG8gc3RhcnQuXG4gICAqIC0gVGhlIHNlY29uZCByZXNvbHZlcyB3aXRoIHRoZSB3b3JrZmxvdyByZXN1bHQgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgY29tcGxldGVzIG9yIHJlamVjdHMgb24gZmFpbHVyZS5cbiAgICovXG4gIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbj86IChcbiAgICBpbnB1dDogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbic+XG4gICkgPT4gUHJvbWlzZTxbUHJvbWlzZTxzdHJpbmc+LCBQcm9taXNlPHVua25vd24+XT47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNpZ25hbHMgYSBjaGlsZCBvciBleHRlcm5hbCBXb3JrZmxvdy5cbiAgICovXG4gIHNpZ25hbFdvcmtmbG93PzogKFxuICAgIGlucHV0OiBTaWduYWxXb3JrZmxvd0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzaWduYWxXb3JrZmxvdyc+XG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgY2FsbHMgY29udGludWVBc05ldy5cbiAgICovXG4gIGNvbnRpbnVlQXNOZXc/OiAoXG4gICAgaW5wdXQ6IENvbnRpbnVlQXNOZXdJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnY29udGludWVBc05ldyc+XG4gICkgPT4gUHJvbWlzZTxuZXZlcj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGB3b3JrZmxvdy5sb2dgIG1ldGhvZHMuXG4gICAqXG4gICAqIFRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGluIHRoaXMgY2FsbCBhcmUgYXR0YWNoZWQgdG8gZXZlcnkgbG9nIG1lc3NhZ2UuXG4gICAqL1xuICBnZXRMb2dBdHRyaWJ1dGVzPzogKFxuICAgIGlucHV0OiBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2dldExvZ0F0dHJpYnV0ZXMnPlxuICApID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBldmVyeSB0aW1lIGEgbWV0cmljIGlzIGVtaXR0ZWQgZnJvbSBhIFdvcmtmbG93IG1ldHJpYyAoaWUuIGEgbWV0cmljIGNyZWF0ZWRcbiAgICogZnJvbSB7QGxpbmsgd29ya2Zsb3cubWV0cmljTWV0ZXJ9KS5cbiAgICpcbiAgICogVGFncyByZXR1cm5lZCBieSB0aGlzIGhvb2sgYXJlIF9wcmVwZW5kZWRfIHRvIHRhZ3MgZGVmaW5lZCBhdCB0aGUgbWV0cmljIGxldmVsIGFuZCB0YWdzXG4gICAqIGRlZmluZWQgb24gdGhlIGVtaXR0ZXIgZnVuY3Rpb24gaXRzZWxmLlxuICAgKi9cbiAgZ2V0TWV0cmljVGFncz86IChcbiAgICBpbnB1dDogR2V0TWV0cmljVGFnc0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdnZXRNZXRyaWNUYWdzJz5cbiAgKSA9PiBNZXRyaWNUYWdzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRUaW1lcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lcklucHV0IHtcbiAgcmVhZG9ubHkgZHVyYXRpb25NczogbnVtYmVyO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3B0aW9ucz86IFRpbWVyT3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHRpbWVyIChpLmUuIHNsZWVwKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGZpeGVkLCBzaW5nbGUgbGluZSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kJ3MgcHVycG9zZVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2NoZWR1bGVBY3Rpdml0eX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUxvY2FsQWN0aXZpdHl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3JpZ2luYWxTY2hlZHVsZVRpbWU/OiBUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0TmV4dXNPcGVyYXRpb259LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGlucHV0OiB1bmtub3duO1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBOZXh1cyBPcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGVuZCB0byBlbmQgdGltZW91dCBmb3IgdGhlIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIFRlbXBvcmFsIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIG9wZXJhdGlvbiBtYXkgd2FpdCBiZWZvcmUgaXQgYmVnaW5zIGV4ZWN1dGluZy4gSWYgdGhlIG9wZXJhdGlvbiBoYXMgbm90IHN0YXJ0ZWRcbiAgICogd2l0aGluIHRoaXMgd2luZG93LCBhIHRpbWVvdXQgZXJyb3Igd2l0aCB0eXBlIFNDSEVEVUxFX1RPX1NUQVJUIGlzIHJhaXNlZC5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIG5vIHRpbWVvdXQuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGFuIGFzeW5jIG9wZXJhdGlvbiBtYXkgdGFrZSB0byBjb21wbGV0ZSBhZnRlciBpdCBoYXMgc3RhcnRlZC4gSWYgdGhlIG9wZXJhdGlvbiBkb2VzXG4gICAqIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhpcyB3aW5kb3csIGEgdGltZW91dCBlcnJvciB3aXRoIHR5cGUgU1RBUlRfVE9fQ0xPU0UgaXMgcmFpc2VkLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gbm8gdGltZW91dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIE9wZXJhdGlvbidzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIG9wZXJhdGlvbidzIHJlc3VsdCBwcm9taXNlIGZhaWwgd2l0aCBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmVgLFxuICAgKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAgICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAgICogT3BlcmF0aW9uIGNhbGwgd2FzIG1hZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICByZWFkb25seSBjYW5jZWxsYXRpb25UeXBlPzogTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBBIGZpeGVkLCBzaW5nbGUtbGluZSBzdW1tYXJ5IGZvciB0aGlzIE5leHVzIE9wZXJhdGlvbiB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gc2luZ2xlLWxpbmUgVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE91dHB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0TmV4dXNPcGVyYXRpb259LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQge1xuICAvKipcbiAgICogVGhlIHRva2VuIGZvciB0aGUgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBVbmRlZmluZWQgaWYgdGhlIE5leHVzIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseSwgaW4gd2hpY2ggY2FzZSB0aGUge0BsaW5rIHJlc3VsdH1cbiAgICogd2lsbCBiZSBpbW1lZGlhdGVseSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgTmV4dXMgT3BlcmF0aW9uIGNvbXBsZXRlcywgZWl0aGVyIHdpdGggdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogT3BlcmF0aW9uIGlmIGl0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG9yIGEgZmFpbHVyZSBpZiB0aGUgTmV4dXMgT3BlcmF0aW9uIGZhaWxlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQge1xuICByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2lnbmFsV29ya2Zsb3d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdvcmtmbG93SW5wdXQge1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2lnbmFsTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHRhcmdldDpcbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogJ2V4dGVybmFsJztcbiAgICAgICAgcmVhZG9ubHkgd29ya2Zsb3dFeGVjdXRpb246IFdvcmtmbG93RXhlY3V0aW9uO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICByZWFkb25seSB0eXBlOiAnY2hpbGQnO1xuICAgICAgICByZWFkb25seSBjaGlsZFdvcmtmbG93SWQ6IHN0cmluZztcbiAgICAgIH07XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3SW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3fS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGludWVBc05ld0lucHV0T3B0aW9ucyA9IENvbnRpbnVlQXNOZXdPcHRpb25zICYgUmVxdWlyZWQ8UGljazxDb250aW51ZUFzTmV3T3B0aW9ucywgJ3dvcmtmbG93VHlwZSc+PjtcblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldExvZ0F0dHJpYnV0ZXN9LlxuICovXG5leHBvcnQgdHlwZSBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldE1ldHJpY1RhZ3N9LlxuICovXG5leHBvcnQgdHlwZSBHZXRNZXRyaWNUYWdzSW5wdXQgPSBNZXRyaWNUYWdzO1xuXG4vLyBXb3JrZmxvdyBJbnRlcm5hbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbnRlcmNlcHRvciBmb3IgdGhlIGludGVybmFscyBvZiB0aGUgV29ya2Zsb3cgcnVudGltZS5cbiAqXG4gKiBVc2UgdG8gbWFuaXB1bGF0ZSBvciB0cmFjZSBXb3JrZmxvdyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIGlzIGZvciBhZHZhbmNlZCB1c2UgY2FzZXMgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBXb3JrZmxvdyBydW50aW1lIHJ1bnMgYSBXb3JrZmxvd0FjdGl2YXRpb25Kb2IuXG4gICAqL1xuICBhY3RpdmF0ZT8oaW5wdXQ6IEFjdGl2YXRlSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2FjdGl2YXRlJz4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYWxsIGBXb3JrZmxvd0FjdGl2YXRpb25Kb2JgcyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBhbiBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBDYW4gbWFuaXB1bGF0ZSB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGJ5IHRoZSBXb3JrZmxvd1xuICAgKi9cbiAgY29uY2x1ZGVBY3RpdmF0aW9uPyhpbnB1dDogQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2NvbmNsdWRlQWN0aXZhdGlvbic+KTogQ29uY2x1ZGVBY3RpdmF0aW9uT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYmVmb3JlIGRpc3Bvc2luZyB0aGUgV29ya2Zsb3cgaXNvbGF0ZSBjb250ZXh0LlxuICAgKlxuICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cC5cbiAgICovXG4gIGRpc3Bvc2U/KGlucHV0OiBEaXNwb3NlSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2Rpc3Bvc2UnPik6IHZvaWQ7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmFjdGl2YXRlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2YXRlSW5wdXQge1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgYmF0Y2hJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5kaXNwb3NlfVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VJbnB1dCB7fVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb259XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQge1xuICByZWFkb25seSBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW107XG59XG5cbi8qKlxuICogT3V0cHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb259XG4gKi9cbmV4cG9ydCB0eXBlIENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dCA9IENvbmNsdWRlQWN0aXZhdGlvbklucHV0O1xuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgUmV0cnlQb2xpY3ksXG4gIENvbW1vbldvcmtmbG93T3B0aW9ucyxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgRHVyYXRpb24sXG4gIFZlcnNpb25pbmdJbnRlbnQsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlUGFpcixcbiAgUHJpb3JpdHksXG4gIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogV29ya2Zsb3cgRXhlY3V0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBXb3JrZmxvdywgdGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBjbGllbnQgZHVyaW5nIFdvcmtmbG93IGNyZWF0aW9uLlxuICAgKiBBIHNpbmdsZSBXb3JrZmxvdyBtYXkgcnVuIG11bHRpcGxlIHRpbWVzIGUuZy4gd2hlbiBzY2hlZHVsZWQgd2l0aCBjcm9uLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBhIHNpbmdsZSBXb3JrZmxvdyBydW5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdvcmtmbG93IGZ1bmN0aW9uJ3MgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLCBleHBvc2VkIHRocm91Z2ggYW4gaW50ZXJmYWNlLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogTm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaW5mbyAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ2hpbGQgV29ya2Zsb3cpXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBQYXJlbnRXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSByb290IHdvcmtmbG93IGV4ZWN1dGlvbiwgZGVmaW5lZCBhcyBmb2xsb3dzOlxuICAgKiAxLiBBIHdvcmtmbG93IHdpdGhvdXQgYSBwYXJlbnQgd29ya2Zsb3cgaXMgaXRzIG93biByb290IHdvcmtmbG93LlxuICAgKiAyLiBBIHdvcmtmbG93IHdpdGggYSBwYXJlbnQgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXNcbiAgICogaXRzIHBhcmVudC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBubyBwYXJlbnQgd29ya2Zsb3csIGkuZS4sIHRoZSB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3csXG4gICAqIHRoaXMgZmllbGQgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBDb250aW51ZS1hcy1OZXcgKG9yIHJlc2V0KSBwcm9wYWdhdGVzIHRoZSB3b3JrZmxvdyBwYXJlbnRhZ2UgcmVsYXRpb25zaGlwLFxuICAgKiBhbmQgdGhlcmVmb3JlLCB3aGV0aGVyIHRoZSBuZXcgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgKiBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaGFkIGEgcGFyZW50LlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdD86IFJvb3RXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgaWYgdGhpcyBpcyBhIENyb24gV29ya2Zsb3cgb3Igd2FzIENvbnRpbnVlZCBBcyBOZXcpLlxuICAgKlxuICAgKiBBbiBhcnJheSBvZiB2YWx1ZXMsIHNpbmNlIG90aGVyIFNES3MgbWF5IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgZnJvbSBhIFdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFJlc3VsdD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEZhaWx1cmUgZnJvbSB0aGUgcHJldmlvdXMgUnVuIChwcmVzZW50IHdoZW4gdGhpcyBSdW4gaXMgYSByZXRyeSwgb3IgdGhlIGxhc3QgUnVuIG9mIGEgQ3JvbiBXb3JrZmxvdyBmYWlsZWQpXG4gICAqL1xuICByZWFkb25seSBsYXN0RmFpbHVyZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgV29ya2Zsb3cgaGlzdG9yeSB1cCB1bnRpbCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiBXb3JrZmxvdyBoaXN0b3J5IGluIGJ5dGVzIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgemVybyBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKlxuICAgKiBZb3UgbWF5IHNhZmVseSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hlbiB0byB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgV29ya2Zsb3dUYXNrU3RhcnRlZCBldmVudCByZWNvbW1lbmRpbmcgd2hldGhlciB0b1xuICAgKiB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgYGZhbHNlYCBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVBc05ld1N1Z2dlc3RlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cncyBUYXJnZXQgV29ya2VyIERlcGxveW1lbnQgVmVyc2lvbiBoYXMgY2hhbmdlZCBmcm9tIGl0cyBQaW5uZWQgVmVyc2lvbi5cbiAgICogV2hlbiB0cnVlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGNvbnNpZGVyIGNvbnRpbnVpbmctYXMtbmV3IHdpdGhcbiAgICogYGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6ICdBVVRPX1VQR1JBREUnYCB0byBtb3ZlIHRvIHRoZSBuZXcgdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVwZ3JhZGUtb24tQ29udGludWUtYXMtTmV3IGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFdvcmtlckRlcGxveW1lbnRWZXJzaW9uQ2hhbmdlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVhc29uKHMpIHdoeSBjb250aW51ZSBhcyBuZXcgaXMgc3VnZ2VzdGVkLiBDYW4gcG90ZW50aWFsbHkgYmUgbXVsdGlwbGUgcmVhc29ucy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBNYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRDb250aW51ZUFzTmV3UmVhc29ucz86IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW107XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgb25cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tRdWV1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgaW5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW4gSWQgb2YgdGhlIGZpcnN0IFJ1biBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RFeGVjdXRpb25SdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBSdW4gSWQgaW4gdGhpcyBFeGVjdXRpb24gQ2hhaW5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRpbnVlZEZyb21FeGVjdXRpb25SdW5JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGlzIFtXb3JrZmxvdyBFeGVjdXRpb24gQ2hhaW5dKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvd3Mjd29ya2Zsb3ctZXhlY3V0aW9uLWNoYWluKSB3YXMgc3RhcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBjdXJyZW50IFdvcmtmbG93IFJ1biBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBydW5TdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gZXhwaXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uRXhwaXJhdGlvblRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIFdvcmtmbG93IFJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgU2VydmVyLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1blRpbWVvdXRNcz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhIFdvcmtmbG93IFRhc2sgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSB0YXNrVGltZW91dE1zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHJ5IFBvbGljeSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5yZXRyeX0uXG4gICAqL1xuICByZWFkb25seSByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgYXQgMSBhbmQgaW5jcmVtZW50cyBmb3IgZXZlcnkgcmV0cnkgaWYgdGhlcmUgaXMgYSBgcmV0cnlQb2xpY3lgXG4gICAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyb24gU2NoZWR1bGUgZm9yIHRoaXMgRXhlY3V0aW9uLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMuY3JvblNjaGVkdWxlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGJldHdlZW4gQ3JvbiBSdW5zXG4gICAqL1xuICByZWFkb25seSBjcm9uU2NoZWR1bGVUb1NjaGVkdWxlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBCdWlsZCBJRCBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWQgaWYgdGhlXG4gICAqIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgQnVpbGQgSUQuIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmUgZXhlY3V0aW5nIHRoaXNcbiAgICogdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIEJ1aWxkIElEIHNldCwgdGhlbiBpdHMgSUQgd2lsbCBiZSB1c2VkLiBUaGlzIHZhbHVlIG1heSBjaGFuZ2VcbiAgICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIHdvcmtmbG93IHJ1biwgYnV0IGlzIGRldGVybWluaXN0aWMgYW5kIHNhZmUgdG8gdXNlIGZvciBicmFuY2hpbmcuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY3VycmVudERlcGxveW1lbnRWZXJzaW9uYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QnVpbGRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIERlcGxveW1lbnQgVmVyc2lvbiBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWRcbiAgICogaWYgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgRGVwbG95bWVudCBWZXJzaW9uLiBJZiB0aGlzIHdvcmtlciBpcyB0aGUgb25lXG4gICAqIGV4ZWN1dGluZyB0aGlzIHRhc2sgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBoYXMgYSBEZXBsb3ltZW50IFZlcnNpb24gc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlXG4gICAqIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmRcbiAgICogc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnREZXBsb3ltZW50VmVyc2lvbj86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xuXG4gIHJlYWRvbmx5IHVuc2FmZTogVW5zYWZlV29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBQcmlvcml0eSBvZiB0aGlzIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86IFByaW9yaXR5O1xufVxuXG4vKipcbiAqIFVuc2FmZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24uXG4gKlxuICogTmV2ZXIgcmVseSBvbiB0aGlzIGluZm9ybWF0aW9uIGluIFdvcmtmbG93IGxvZ2ljIGFzIGl0IHdpbGwgY2F1c2Ugbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zYWZlV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIFRoZSBzYWZlIHZlcnNpb24gb2YgdGltZSBpcyBgbmV3IERhdGUoKWAgYW5kIGBEYXRlLm5vdygpYCwgd2hpY2ggYXJlIHNldCBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBhIFdvcmtmbG93XG4gICAqIFRhc2sgYW5kIHN0YXkgY29uc3RhbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgVGFzayBhbmQgZHVyaW5nIHJlcGxheS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdyBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmc6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcgaGlzdG9yeSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byB7QGxpbmsgaXNSZXBsYXlpbmd9LCBidXQgcmV0dXJucyBgZmFsc2VgIGR1cmluZyBxdWVyeSBoYW5kbGVycyBhbmQgdXBkYXRlXG4gICAqIHZhbGlkYXRvcnMsIHdoaWNoIGFyZSBsaXZlIHJlYWQtb25seSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHJlcGxheWluZ1xuICAgKiBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHRydWUsIHdvcmtmbG93IGxvZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCBhbmQgc2lua3MgZGVmaW5lZCB3aXRoXG4gICAqIGNhbGxEdXJpbmdSZXBsYXk9ZmFsc2Ugd29uJ3QgZ2V0IHByb2Nlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHdvcmtmbG93IHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmZvIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90IGFuIGFjdHVhbCBlcnJvciwgdXNlZCBieSB0aGUgV29ya2Zsb3cgcnVudGltZSB0byBhYm9ydCBleGVjdXRpb24gd2hlbiB7QGxpbmsgY29udGludWVBc05ld30gaXMgY2FsbGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29udGludWVBc05ldycpXG5leHBvcnQgY2xhc3MgQ29udGludWVBc05ldyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSUNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbikge1xuICAgIHN1cGVyKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb250aW51aW5nIGEgV29ya2Zsb3cgYXMgbmV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld09wdGlvbnMge1xuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXb3JrZmxvdyB0eXBlIG5hbWUsIGUuZy4gdGhlIGZpbGVuYW1lIGluIHRoZSBOb2RlLmpzIFNESyBvciBjbGFzcyBuYW1lIGluIEphdmFcbiAgICovXG4gIHdvcmtmbG93VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gY29udGludWUgdGhlIFdvcmtmbG93IGluXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciB0aGUgZW50aXJlIFdvcmtmbG93IHJ1blxuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGEgc2luZ2xlIFdvcmtmbG93IHRhc2tcbiAgICogQGZvcm1hdCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogTm9uLXNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIFdvcmtmbG93IHNob3VsZFxuICAgKiBDb250aW51ZS1hcy1OZXcgb250byBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50O1xuICAvKipcbiAgICogRGVmaW5lcyB0aGUgdmVyc2lvbmluZyBiZWhhdmlvciB0byBiZSB1c2VkIGJ5IHRoZSBmaXJzdCB0YXNrIG9mIGEgbmV3IHdvcmtmbG93IHJ1biBpbiBhIGNvbnRpbnVlLWFzLW5ldyBjaGFpbi5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICBpbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yPzogSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCBhbmRcbiAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSdzIG9yIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH0nc1xuICogICBwcm9taXNlIGZhaWwgd2l0aCBhIGBDaGlsZFdvcmtmbG93RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGlzIGNvbnRyb2xsZWQgYnkgdGhlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeX0gc2V0dGluZy5cbiAqXG4gKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYENoaWxkV29ya2Zsb3dPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgQ2hpbGQsIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uXG4gICAqIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFBhcmVudC1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGFjdHVhbGx5IGJlIGF0b21pY2FsbHkgYWRkZWQgdG8gdGhlIENoaWxkIHdvcmtmbG93J3MgaGlzdG9yeS5cbiAgICogSW4gcGFydGljdWxhciwgdGhlIENoaWxkIG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIFBhcmVudCB3b3JrZmxvdyB0aGlua3MgaXRzIGNoaWxkXG4gICAqIHdhcyBjYW5jZWxsZWQsIGJ1dCB0aGUgY2hpbGQgYWN0dWFsbHkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogVG8gZ3VhcmFudGVlIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIENoaWxkIFdvcmtmbG93IGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyByZWNvcmRlZCBpbiBpdHMgaGlzdG9yeS5cbiAgICpcbiAgICogVGhpcyBjYW5jZWxsYXRpb24gdHlwZSBndWFyYW50ZWVzIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgKHRoYXQgaXMsIHVubGVzcyB0aGUgQ2hpbGQgdGVybWluYXRlcyBpbmJldHdlZW4gZHVlIHRvIHVuZXhwZWN0ZWQgY2F1c2VzKS5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIENoaWxkIFdvcmtmbG93LlxuICAgKlxuICAgKiBUaGUgQ2hpbGQgbWF5IHJlc3BlY3QgY2FuY2VsbGF0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBQYXJlbnQncyBgZXhlY3V0ZUNoaWxkYCBvclxuICAgKiBgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHRgIHByb21pc2Ugd2lsbCBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWBcbiAgICogc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIENoaWxkIG1heSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LFxuICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Ugd2lsbCBlaXRoZXIgcmVzb2x2ZSB3aXRoIGEgcmVzdWx0IChpZiBDaGlsZCBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5KSBvciByZWplY3Qgd2l0aCBhIGRpZmZlcmVudCBjYXVzZSAoaWYgQ2hpbGQgY29tcGxldGVkIHVuY2Vzc2Z1bGx5KS5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMCxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDEsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDIsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIEhvdyBhIENoaWxkIFdvcmtmbG93IHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcGFyZW50LWNsb3NlLXBvbGljeS8gfCBQYXJlbnQgQ2xvc2UgUG9saWN5fVxuICovXG5leHBvcnQgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqL1xuICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcblxuICAvLy8gQW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGhhcyBiZWVuIGRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSWYgYSBgUGFyZW50Q2xvc2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIHNlcnZlciBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRWl0aGVyIGxlYXZlIHByb3BlcnR5IGB1bmRlZmluZWRgLCBvciBzZXQgYW4gZXhwbGljaXQgcG9saWN5IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBUZXJtaW5hdGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURX0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksIGRlY29kZVBhcmVudENsb3NlUG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEVdOiAxLFxuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkV29ya2Zsb3dPcHRpb25zIGV4dGVuZHMgT21pdDxDb21tb25Xb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3knPiB7XG4gIC8qKlxuICAgKiBXb3JrZmxvdyBpZCB0byB1c2Ugd2hlbiBzdGFydGluZy4gSWYgbm90IHNwZWNpZmllZCBhIFVVSUQgaXMgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgaXQgaXNcbiAgICogZGFuZ2Vyb3VzIGFzIGluIGNhc2Ugb2YgY2xpZW50IHNpZGUgcmV0cmllcyBubyBkZWR1cGxpY2F0aW9uIHdpbGwgaGFwcGVuIGJhc2VkIG9uIHRoZVxuICAgKiBnZW5lcmF0ZWQgaWQuIFNvIHByZWZlciBhc3NpZ25pbmcgYnVzaW5lc3MgbWVhbmluZ2Z1bCBpZHMgaWYgcG9zc2libGUuXG4gICAqL1xuICB3b3JrZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIHRvIHVzZSBmb3IgV29ya2Zsb3cgdGFza3MuIEl0IHNob3VsZCBtYXRjaCBhIHRhc2sgcXVldWUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYVxuICAgKiBgV29ya2VyYCB0aGF0IGhvc3RzIHRoZSBXb3JrZmxvdyBjb2RlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIGNoaWxkIGlzIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBUYXNrIFF1ZXVlIGFzIHRoZSBwYXJlbnQuXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgYW5kXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIHtAbGluayBleGVjdXRlQ2hpbGR9J3Mgb3Ige0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fSdzXG4gICAqICAgcHJvbWlzZSBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICAgKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaXMgY29udHJvbGxlZCBieSB0aGUge0BsaW5rIFBhcmVudENsb3NlUG9saWN5fSBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdGhlIENoaWxkIHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJlbnRDbG9zZVBvbGljeS5QQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURVxuICAgKi9cbiAgcGFyZW50Q2xvc2VQb2xpY3k/OiBQYXJlbnRDbG9zZVBvbGljeTtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBDaGlsZCBXb3JrZmxvdyBzaG91bGQgcnVuIG9uXG4gICAqIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnMgPSBSZXF1aXJlZDxQaWNrPENoaWxkV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZCcgfCAnY2FuY2VsbGF0aW9uVHlwZSc+PiAmIHtcbiAgYXJnczogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMgPSBDaGlsZFdvcmtmbG93T3B0aW9ucyAmIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZVNES0luZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2xpY2Ugb2YgYSBmaWxlIHN0YXJ0aW5nIGF0IGxpbmVPZmZzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlRmlsZVNsaWNlIHtcbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBwb3NzaWJsZSB0byB0cmltIHRoZSBmaWxlIHdpdGhvdXQgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy5cbiAgICovXG4gIGxpbmVfb2Zmc2V0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBzbGljZSBvZiBhIGZpbGUgd2l0aCBgXFxuYCAobmV3bGluZSkgbGluZSB0ZXJtaW5hdG9yLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIGEgZmlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24ge1xuICAvKipcbiAgICogUGF0aCB0byBzb3VyY2UgZmlsZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpLlxuICAgKiBXaGVuIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCwgbWFrZSBzdXJlIGFsbCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgcm9vdC5cbiAgICovXG4gIGZpbGVfcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIElmIHBvc3NpYmxlLCBTREsgc2hvdWxkIHNlbmQgdGhpcywgcmVxdWlyZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGNvZGUgbG9jYXRpb24uXG4gICAqL1xuICBsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLlxuICAgKi9cbiAgY29sdW1uPzogbnVtYmVyO1xuICAvKipcbiAgICogRnVuY3Rpb24gbmFtZSB0aGlzIGxpbmUgYmVsb25ncyB0byAoaWYgYXBwbGljYWJsZSkuXG4gICAqIFVzZWQgZm9yIGZhbGxpbmcgYmFjayB0byBzdGFjayB0cmFjZSB2aWV3LlxuICAgKi9cbiAgZnVuY3Rpb25fbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEZsYWcgdG8gbWFyayB0aGlzIGFzIGludGVybmFsIFNESyBjb2RlIGFuZCBoaWRlIGJ5IGRlZmF1bHQgaW4gdGhlIFVJLlxuICAgKi9cbiAgaW50ZXJuYWxfY29kZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlIHtcbiAgbG9jYXRpb25zOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgcmVzdWx0IGZvciB0aGUgZW5oYW5jZWQgc3RhY2sgdHJhY2UgcXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFN0YWNrVHJhY2Uge1xuICBzZGs6IFN0YWNrVHJhY2VTREtJbmZvO1xuICAvKipcbiAgICogTWFwcGluZyBvZiBmaWxlIHBhdGggdG8gZmlsZSBjb250ZW50cy5cbiAgICogU0RLIG1heSBjaG9vc2UgdG8gc2VuZCBubywgc29tZSBvciBhbGwgc291cmNlcy5cbiAgICogU291cmNlcyBtaWdodCBiZSB0cmltbWVkLCBhbmQgc29tZSB0aW1lIG9ubHkgdGhlIGZpbGUocykgb2YgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSB0cmFjZSB3aWxsIGJlIHNlbnQuXG4gICAqL1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+O1xuICBzdGFja3M6IFN0YWNrVHJhY2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBpbmZvOiBXb3JrZmxvd0luZm87XG4gIHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXTtcbiAgbm93OiBudW1iZXI7XG4gIHNob3dTdGFja1RyYWNlU291cmNlczogYm9vbGVhbjtcbiAgZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIGV4dGVuZHMgV29ya2Zsb3dDcmVhdGVPcHRpb25zIHtcbiAgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG4gIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcbiAgZ2V0VGltZU9mRGF5KCk6IGJpZ2ludDtcbiAgc3RhY2tUcmFjZXNFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24sIFNpZ25hbERlZmluaXRpb24gb3IgUXVlcnlEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyPFxuICBSZXQsXG4gIEFyZ3MgZXh0ZW5kcyBhbnlbXSxcbiAgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPiB8IFNpZ25hbERlZmluaXRpb248QXJncz4gfCBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPixcbj4gPSBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxpbmZlciBSLCBpbmZlciBBPlxuICA/ICguLi5hcmdzOiBBKSA9PiBSIHwgUHJvbWlzZTxSPlxuICA6IFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPGluZmVyIEE+XG4gICAgPyAoLi4uYXJnczogQSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cbiAgICA6IFQgZXh0ZW5kcyBRdWVyeURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBzaWduYWwgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsTmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgdXBkYXRlIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRVcGRhdGVIYW5kbGVyID0gKHVwZGF0ZU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFF1ZXJ5SGFuZGxlciA9IChxdWVyeU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuXG4vKipcbiAqIEEgdmFsaWRhdGlvbiBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZVZhbGlkYXRvcjxBcmdzIGV4dGVuZHMgYW55W10+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQ7XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHF1ZXJ5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5SGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHNpZ25hbCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBTaWduYWxIYW5kbGVyT3B0aW9ucyA9IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSB9O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGFuZCBkZXNjcmlwdGlvbiBvZiBhbiB1cGRhdGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdPiA9IHtcbiAgdmFsaWRhdG9yPzogVXBkYXRlVmFsaWRhdG9yPEFyZ3M+O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeT86IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbiAgdXNlZEludGVybmFsRmxhZ3M6IG51bWJlcltdO1xuICB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgRmFpbHVyZUNvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgUHJvdG9GYWlsdXJlLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zLFxuICBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMsXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQge1xuICBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgYXJyYXlGcm9tUGF5bG9hZHMsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBlbnN1cmVUZW1wb3JhbEZhaWx1cmUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBJbGxlZ2FsU3RhdGVFcnJvcixcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgbWFwRnJvbVBheWxvYWRzLFxuICBmcm9tUGF5bG9hZHNBdEluZGV4LFxuICBSYXdWYWx1ZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7XG4gIFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCxcbiAgU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgdHlwZSB7IFJORyB9IGZyb20gJy4vYWxlYSc7XG5pbXBvcnQgeyBhbGVhIH0gZnJvbSAnLi9hbGVhJztcbmltcG9ydCB7IFJvb3RDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlLCBVcGRhdGVTY29wZSB9IGZyb20gJy4vdXBkYXRlLXNjb3BlJztcbmltcG9ydCB7IGRlcml2ZUFsZWFTZWVkIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtLXNlZWQnO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciwgTG9jYWxBY3Rpdml0eURvQmFja29mZiwgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIFF1ZXJ5SW5wdXQsXG4gIFNpZ25hbElucHV0LFxuICBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LFxuICBVcGRhdGVJbnB1dCxcbiAgV29ya2Zsb3dFeGVjdXRlSW5wdXQsXG4gIFdvcmtmbG93SW50ZXJjZXB0b3JzLFxufSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlZmF1bHRTaWduYWxIYW5kbGVyLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZUZpbGVTbGljZSxcbiAgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbixcbiAgV29ya2Zsb3dJbmZvLFxuICBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCxcbiAgQWN0aXZhdGlvbkNvbXBsZXRpb24sXG4gIERlZmF1bHRVcGRhdGVIYW5kbGVyLFxuICBEZWZhdWx0UXVlcnlIYW5kbGVyLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb250aW51ZUFzTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHR5cGUgU2lua0NhbGwgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCBwa2cgZnJvbSAnLi9wa2cnO1xuaW1wb3J0IHR5cGUgeyBTZGtGbGFnIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZEZsYWcgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZywgbG9nIH0gZnJvbSAnLi9sb2dzJztcblxuY29uc3QgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPSB7XG4gIFdPUktGTE9XX0FMUkVBRFlfRVhJU1RTOiAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnLFxufSBhcyBjb25zdDtcbnR5cGUgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPVxuICAodHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKVtrZXlvZiB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdO1xuXG5jb25zdCBbX2VuY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLCBkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZV0gPVxuICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICAnU1RBUlRfQ0hJTERfV09SS0ZMT1dfRVhFQ1VUSU9OX0ZBSUxFRF9DQVVTRV8nXG4gID4oXG4gICAge1xuICAgICAgW1N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLldPUktGTE9XX0FMUkVBRFlfRVhJU1RTXTogMSxcbiAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIH0gYXMgY29uc3QsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrIHtcbiAgZm9ybWF0dGVkOiBzdHJpbmc7XG4gIHN0cnVjdHVyZWQ6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgc3RvcmUgdG8gdHJhY2sgcHJvbWlzZSBzdGFja3MgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZVN0YWNrU3RvcmUge1xuICBjaGlsZFRvUGFyZW50OiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU2V0PFByb21pc2U8dW5rbm93bj4+PjtcbiAgcHJvbWlzZVRvU3RhY2s6IE1hcDxQcm9taXNlPHVua25vd24+LCBTdGFjaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbjxTdWNjZXNzLCBDb250ZXh0ID0gbmV2ZXI+IHtcbiAgcmVzb2x2ZSh2YWw6IFN1Y2Nlc3MpOiB2b2lkO1xuICByZWplY3QocmVhc29uOiBFcnJvcik6IHZvaWQ7XG4gIGNvbnRleHQ/OiBDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbiB7XG4gIGZuKCk6IGJvb2xlYW47XG5cbiAgcmVzb2x2ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPEsgZXh0ZW5kcyBrZXlvZiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYj4gPSAoXG4gIGFjdGl2YXRpb246IE5vbk51bGxhYmxlPGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iW0tdPlxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIFZlcmlmaWVzIGFsbCBhY3RpdmF0aW9uIGpvYiBoYW5kbGluZyBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZFxuICovXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlciA9IHtcbiAgW1AgaW4ga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2JdOiBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPFA+O1xufTtcblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9uLlxuICovXG5pbnRlcmZhY2UgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBpZD86IHN0cmluZztcbn1cblxudHlwZSBJbmZlck1hcFZhbHVlPFQ+ID0gVCBleHRlbmRzIE1hcDxudW1iZXIsIGluZmVyIFY+ID8gViA6IG5ldmVyO1xuXG5pbnRlcmZhY2UgU2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2Uge1xuICByYW5kb20oKTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEtlZXBzIGFsbCBvZiB0aGUgV29ya2Zsb3cgcnVudGltZSBzdGF0ZSBsaWtlIHBlbmRpbmcgY29tcGxldGlvbnMgZm9yIGFjdGl2aXRpZXMgYW5kIHRpbWVycy5cbiAqXG4gKiBJbXBsZW1lbnRzIGhhbmRsZXJzIGZvciBhbGwgd29ya2Zsb3cgYWN0aXZhdGlvbiBqb2JzLlxuICpcbiAqIE5vdGUgdGhhdCBtb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gdGhlIFZNLlxuICpcbiAqIEhvd2V2ZXIsIGEgZmV3IG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgdGhlIFZNIChlc3NlbnRpYWxseSBmcm9tIGB2bS1zaGFyZWQudHNgKS5cbiAqIFRoZXNlIG1ldGhvZHMgYXJlIHNwZWNpZmljYWxseSBtYXJrZWQgd2l0aCBhIGNvbW1lbnQgYW5kIHJlcXVpcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLCBhcyB0aGVcbiAqIGV4ZWN1dGlvbiBjb250ZXh0IG1heSBub3QgcHJvcGVybHkgcmVmbGVjdCB0aGF0IG9mIHRoZSB0YXJnZXQgd29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuOiB3aXRoIFJldXNhYmxlXG4gKiBWTXMsIHRoZSBgZ2xvYmFsYCBtYXkgbm90IGhhdmUgYmVlbiBzd2FwcGVkIHRvIHRob3NlIG9mIHRoYXQgd29ya2Zsb3cgZXhlY3V0aW9uOyB0aGUgYWN0aXZlIG1pY3JvdGFza1xuICogcXVldWUgbWF5IGJlIHRoYXQgb2YgdGhlIHRocmVhZC9wcm9jZXNzLCByYXRoZXIgdGhhbiB0aGUgcXVldWUgb2YgdGhhdCBWTSBjb250ZXh0OyBldGMpLiBDb25zZXF1ZW50bHksXG4gKiBtZXRob2RzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFZNIG11c3Qgbm90IGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqIC0gQWNjZXNzIGFueSBnbG9iYWwgdmFyaWFibGU7XG4gKiAtIENyZWF0ZSBQcm9taXNlIG9iamVjdHMsIHVzZSBhc3luYy9hd2FpdCwgb3Igb3RoZXJ3aXNlIHNjaGVkdWxlIG1pY3JvdGFza3M7XG4gKiAtIENhbGwgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGFueSBmb3JtIG9mIGludGVyY2VwdG9yLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQWN0aXZhdGlvbkhhbmRsZXIge1xuICAvKipcbiAgICogQ2FjaGUgZm9yIG1vZHVsZXMgLSByZWZlcmVuY2VkIGluIHJldXNhYmxlLXZtLnRzXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdGFzayBzZXF1ZW5jZSB0byBhIENvbXBsZXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBsZXRpb25zID0ge1xuICAgIHRpbWVyOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgICBhY3Rpdml0eTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93biwgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25TdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25Db21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93bj4+KCksXG4gICAgY2hpbGRXb3JrZmxvd1N0YXJ0OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjxzdHJpbmcsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICAgIGNoaWxkV29ya2Zsb3dDb21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93biwgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgc2lnbmFsV29ya2Zsb3c6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHZvaWQsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICAgIGNhbmNlbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkLCBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0Pj4oKSxcbiAgfTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgVXBkYXRlIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFVwZGF0ZXMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlPigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyBidWZmZXJlZCBzaWduYWwgY2FsbHMgdW50aWwgYSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1ZmZlcmVkU2lnbmFscyA9IEFycmF5PGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JU2lnbmFsV29ya2Zsb3c+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgdXBkYXRlIG5hbWUgdG8gaGFuZGxlciBhbmQgdmFsaWRhdG9yXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2Ygc2lnbmFsIG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGluLXByb2dyZXNzIHVwZGF0ZXMgdG8gaGFuZGxlciBleGVjdXRpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpblByb2dyZXNzVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbj4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyBzaWduYWxzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1NpZ25hbHMgPSBuZXcgTWFwPG51bWJlciwgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIEEgc2VxdWVuY2UgbnVtYmVyIHByb3ZpZGluZyB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2lnbmFsSGFuZGxlckV4ZWN1dGlvblNlcSA9IDA7XG5cbiAgLyoqXG4gICAqIEEgc2lnbmFsIGhhbmRsZXIgdGhhdCBjYXRjaGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0U2lnbmFsSGFuZGxlcj86IERlZmF1bHRTaWduYWxIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBBIHVwZGF0ZSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFVwZGF0ZUhhbmRsZXI/OiBEZWZhdWx0VXBkYXRlSGFuZGxlcjtcblxuICAvKipcbiAgICogQSBxdWVyeSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0UXVlcnlIYW5kbGVyPzogRGVmYXVsdFF1ZXJ5SGFuZGxlcjtcblxuICAvKipcbiAgICogU291cmNlIG1hcCBmaWxlIGZvciBsb29raW5nIHVwIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVzcG9uc2UgdG8gX19lbmhhbmNlZF9zdGFja190cmFjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzZW5kIHRoZSBzb3VyY2VzIGluIGVuaGFuY2VkIHN0YWNrIHRyYWNlIHF1ZXJ5IHJlc3BvbnNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTdGFja1RyYWNlU291cmNlcztcblxuICByZWFkb25seSBwcm9taXNlU3RhY2tTdG9yZTogUHJvbWlzZVN0YWNrU3RvcmUgPSB7XG4gICAgcHJvbWlzZVRvU3RhY2s6IG5ldyBNYXAoKSxcbiAgICBjaGlsZFRvUGFyZW50OiBuZXcgTWFwKCksXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrIHRvIGZhaWwuIFNldHMgaWYgYSBub24tYFRlbXBvcmFsRmFpbHVyZWBcbiAgICogZXJyb3IgYnViYmxlcyB1cCBvdXQgb2YgdGhlIFdvcmtmbG93IGZ1bmN0aW9uLCBvciBvdXQgb2YgYSBTaWduYWwgb3IgVXBkYXRlIGhhbmRsZXIuIFdlXG4gICAqIGNhcHR1cmUgZXJyb3JzIHRoaXMgd2F5IGJlY2F1c2UgdGhvc2UgZnVuY3Rpb25zIGFyZSBub3QgdGVjaG5pY2FsbHkgYXdhaXRlZCB3aGVuIHN0YXJ0ZWQsXG4gICAqIGJ1dCBsZWZ0IHRvIHJ1biBhc3luY2hyb25vdXNseS4gVGhlcmUgaXMgdGhlcmVmb3JlIG5vIHJlYWwgXCJwYXJlbnRcIiBmdW5jdGlvbiB0aGF0IGNhblxuICAgKiBkaXJlY3RseSBoYW5kbGUgdGhvc2UgZXJyb3JzLCBhbmQgbm90IGNhcHR1cmluZyBpdCB3b3VsZCByZXN1bHQgaW4gYW4gVW5oYW5kbGVkIFByb21pc2VcbiAgICogUmVqZWN0aW9uLiBTbyBpbnN0ZWFkLCB3ZSBidWZmZXIgdGhlIGVycm9yIGhlcmUsIHRvIHRoZW4gYmUgcHJvY2Vzc2VkIGluIHRoZSBjb250ZXh0XG4gICAqIG9mIG91ciBvd24gc3luY2hyb25vdXMgQWN0aXZhdGlvbiBoYW5kbGluZyBldmVudCBsb29wLlxuICAgKlxuICAgKiBPdXIgY29kZSBkb2VzIGEgYmVzdCBlZmZvcnQgdG8gc3RvcCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGFjdGl2YXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgKiBhZnRlciB0aGlzIGZpZWxkIGlzIHNldDpcbiAgICogIC0gSWYgYW4gZXJyb3IgaXMgdGhyb3duIHdoaWxlIGV4ZWN1dGluZyBjb2RlIHN5bmNocm9ub3VzbHkgKGUuZy4gYW55dGhpbmcgYmVmb3JlIHRoZVxuICAgKiAgICBmaXJzdCBgYXdhaXRgIHN0YXRlbWVudCBpbiBhIFdvcmtmbG93IGZ1bmN0aW9uIG9yIGEgc2lnbmFsL3VwZGF0ZSBoYW5kbGVyKSwgdGhlIGVycm9yXG4gICAqICAgIHdpbGwgYmUgX2ltbWVkaWF0ZWx5XyByZXRocm93biwgd2hpY2ggd2lsbCBwcmV2ZW50IGV4ZWN1dGlvbiBvZiBmdXJ0aGVyIGpvYnMgaW4gdGhlXG4gICAqICAgIGN1cnJlbnQgYWN0aXZhdGlvbi4gV2Uga25vdyB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBjb2RlIHN5bmNocm9ub3VzbHkgdGhhbmtzIHRvIHRoZVxuICAgKiAgICBgcmV0aHJvd1N5bmNocm9ub3VzbHlgIGZsYWcgYmVsb3cuXG4gICAqICAtIEl0IGFuIGVycm9yIGlzIHRocm93biB3aGlsZSBleGVjdXRpbmcgbWljcm90YXNrcywgdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBvblxuICAgKiAgICB0aGUgbmV4dCBjYWxsIHRvIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYC5cbiAgICpcbiAgICogVW5mb3J0dW5hdGVseSwgdGhlcmUncyBubyB3YXkgZm9yIHVzIHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb24gb2YgbWljcm90YXNrcyB0aGF0IGhhdmVcbiAgICogYWxyZWFkeSBiZWVuIHNjaGVkdWxlZCwgbm9yIHRob3NlIHRoYXQgd2lsbCBiZSByZWN1cnNpdmVseSBzY2hlZHVsZWQgZnJvbSB0aG9zZSBtaWNyb3Rhc2tzLlxuICAgKiBTaG91bGQgbW9yZSBlcnJvcnMgZ2V0IHRocm93biB3aGlsZSBzZXR0bGluZyBtaWNyb3Rhc2tzLCB0aG9zZSB3aWxsIGJlIGlnbm9yZWQgKGkuZS4gb25seVxuICAgKiB0aGUgZmlyc3QgY2FwdHVyZWQgZXJyb3IgaXMgcHJlc2VydmVkKS5cbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvd1Rhc2tFcnJvcjogdW5rbm93bjtcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSBfbmFtZXNfIChmcm9tIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9KSB0aGF0XG4gICAqIHNob3VsZCBjYXVzZSBXb3JrZmxvdyBFeGVjdXRpb24gZmFpbHVyZSByYXRoZXIgdGhhbiBXRlQgZmFpbHVyZS5cbiAgICpcbiAgICogU2V0IGF0IHdvcmtmbG93IGNyZWF0aW9uIHRpbWUgZnJvbSB0aGUgd29ya2VyIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogRXJyb3IgX3R5cGVzXyAoZnJvbSB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy5mYWlsdXJlRXhjZXB0aW9uVHlwZXN9KVxuICAgKiB0aGF0IHNob3VsZCBjYXVzZSBXb3JrZmxvdyBFeGVjdXRpb24gZmFpbHVyZSByYXRoZXIgdGhhbiBXRlQgZmFpbHVyZS5cbiAgICpcbiAgICogU2V0IGluIGB3b3JrZXItaW50ZXJmYWNlLnRzYCBhZnRlciB0aGUgd29ya2Zsb3cgZGVmaW5pdGlvbiBvcHRpb25zIGFyZSByZWFkLlxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlczogQXJyYXk8bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gRXJyb3I+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB3aGVuIHJ1bm5pbmcgc3luY2hyb25vdXMgY29kZSAoZS5nLiB3aGlsZSBwcm9jZXNzaW5nIGFjdGl2YXRpb24gam9icyBhbmQgd2hlbiBjYWxsaW5nXG4gICAqIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCkuIFdoaWxlIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGlzIHNhZmUgdG8gbGV0IGVycm9ycyBidWJibGUgdXAuXG4gICAqL1xuICBwdWJsaWMgcmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcm9vdFNjb3BlID0gbmV3IFJvb3RDYW5jZWxsYXRpb25TY29wZSgpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHF1ZXJ5IG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHF1ZXJ5SGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGU+KFtcbiAgICBbXG4gICAgICBTVEFDS19UUkFDRV9RVUVSWV9OQU1FLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTxzdHJpbmc+KFxuICAgICAgICAgICAgdGhpcy5nZXRTdGFja1RyYWNlcygpXG4gICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZm9ybWF0dGVkKVxuICAgICAgICAgICAgICAuam9pbignXFxuXFxuJylcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzZW5zaWJsZSBzdGFjayB0cmFjZS4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgIEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpOiBSYXdWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzb3VyY2VNYXAgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgc2RrOiBTdGFja1RyYWNlU0RLSW5mbyA9IHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2ZXJzaW9uOiBwa2cudmVyc2lvbiB9O1xuICAgICAgICAgIGNvbnN0IHN0YWNrcyA9IHRoaXMuZ2V0U3RhY2tUcmFjZXMoKS5tYXAoKHsgc3RydWN0dXJlZDogbG9jYXRpb25zIH0pID0+ICh7IGxvY2F0aW9ucyB9KSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgU3RhY2tUcmFjZUZpbGVTbGljZVtdPiA9IHt9O1xuICAgICAgICAgIGlmICh0aGlzLnNob3dTdGFja1RyYWNlU291cmNlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IGxvY2F0aW9ucyB9IG9mIHN0YWNrcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZV9wYXRoIH0gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlX3BhdGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzb3VyY2VNYXA/LnNvdXJjZXNDb250ZW50Py5bc291cmNlTWFwPy5zb3VyY2VzLmluZGV4T2YoZmlsZV9wYXRoKV07XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzW2ZpbGVfcGF0aF0gPSBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUmF3VmFsdWU8RW5oYW5jZWRTdGFja1RyYWNlPih7IHNkaywgc3RhY2tzLCBzb3VyY2VzIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzdGFjayB0cmFjZSBhbm5vdGF0ZWQgd2l0aCBzb3VyY2UgaW5mb3JtYXRpb24uJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICAnX190ZW1wb3JhbF93b3JrZmxvd19tZXRhZGF0YScsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpOiBSYXdWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dUeXBlID0gdGhpcy5pbmZvLndvcmtmbG93VHlwZTtcbiAgICAgICAgICBjb25zdCBxdWVyeURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5SGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBzaWduYWxEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy5zaWduYWxIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnVwZGF0ZUhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTx0ZW1wb3JhbC5hcGkuc2RrLnYxLklXb3JrZmxvd01ldGFkYXRhPih7XG4gICAgICAgICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgIHR5cGU6IHdvcmtmbG93VHlwZSxcbiAgICAgICAgICAgICAgcXVlcnlEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgc2lnbmFsRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgIHVwZGF0ZURlZmluaXRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1cnJlbnREZXRhaWxzOiB0aGlzLmN1cnJlbnREZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd29ya2Zsb3cuJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIExvYWRlZCBpbiB7QGxpbmsgaW5pdFJ1bnRpbWV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJjZXB0b3JzOiBSZXF1aXJlZDxXb3JrZmxvd0ludGVyY2VwdG9ycz4gPSB7XG4gICAgaW5ib3VuZDogW10sXG4gICAgb3V0Ym91bmQ6IFtdLFxuICAgIGludGVybmFsczogW10sXG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciB0aGF0IHN0b3JlcyBhbGwgZ2VuZXJhdGVkIGNvbW1hbmRzLCByZXNldCBhZnRlciBlYWNoIGFjdGl2YXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW10gPSBbXTtcblxuICAvKipcbiAgICogU3RvcmVzIGFsbCB7QGxpbmsgY29uZGl0aW9ufXMgdGhhdCBoYXZlbid0IGJlZW4gdW5ibG9ja2VkIHlldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrZWRDb25kaXRpb25zID0gbmV3IE1hcDxudW1iZXIsIENvbmRpdGlvbj4oKTtcblxuICAvKipcbiAgICogSXMgdGhpcyBXb3JrZmxvdyBjb21wbGV0ZWQ/XG4gICAqXG4gICAqIEEgV29ya2Zsb3cgd2lsbCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlZCBpZiBpdCBnZW5lcmF0ZXMgYSBjb21tYW5kIHRoYXQgdGhlXG4gICAqIHN5c3RlbSBjb25zaWRlcnMgYXMgYSBmaW5hbCBXb3JrZmxvdyBjb21tYW5kIChlLmcuXG4gICAqIGNvbXBsZXRlV29ya2Zsb3dFeGVjdXRpb24gb3IgZmFpbFdvcmtmbG93RXhlY3V0aW9uKS5cbiAgICovXG4gIHB1YmxpYyBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2FzIHRoaXMgV29ya2Zsb3cgY2FuY2VsbGVkP1xuICAgKi9cbiAgcHJvdGVjdGVkIGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV4dCAoaW5jcmVtZW50YWwpIHNlcXVlbmNlIHRvIGFzc2lnbiB3aGVuIGdlbmVyYXRpbmcgY29tcGxldGFibGUgY29tbWFuZHNcbiAgICovXG4gIHB1YmxpYyBuZXh0U2VxcyA9IHtcbiAgICB0aW1lcjogMSxcbiAgICBhY3Rpdml0eTogMSxcbiAgICBjaGlsZFdvcmtmbG93OiAxLFxuICAgIHNpZ25hbFdvcmtmbG93OiAxLFxuICAgIGNhbmNlbFdvcmtmbG93OiAxLFxuICAgIGNvbmRpdGlvbjogMSxcbiAgICBuZXh1c09wZXJhdGlvbjogMSxcbiAgICAvLyBVc2VkIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhY3RpdmUgc3RhY2sgdHJhY2VzXG4gICAgc3RhY2s6IDEsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2V0IGV2ZXJ5IHRpbWUgdGhlIHdvcmtmbG93IGV4ZWN1dGVzIGFuIGFjdGl2YXRpb25cbiAgICogTWF5IGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgbm93OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBXb3JrZmxvdywgaW5pdGlhbGl6ZWQgd2hlbiBhIFdvcmtmbG93IGlzIHN0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvdz86IFdvcmtmbG93IHwgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPGFueVtdLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvd1xuICAgKiBNYXkgYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBpbmZvOiBXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIGRldGVybWluaXN0aWMgUk5HIGZvciB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogU2NvcGVkIG92ZXJyaWRlcyB1c2VkIGJ5IGBXb3JrZmxvd1JhbmRvbVN0cmVhbS53aXRoKC4uLilgIGFyZSBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIFJORy5cbiAgICovXG4gIHB1YmxpYyByYW5kb206IFJORztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2VlZCBtYXRlcmlhbCBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24ncyBkZXRlcm1pbmlzdGljIFJOR3MuXG4gICAqL1xuICBwdWJsaWMgcmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGRldGVybWluaXN0aWMgUk5HIHN0cmVhbXMga2V5ZWQgYnkgc3RhYmxlIHN0cmVhbSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWVkUmFuZG9tU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBSTkc+KCk7XG5cbiAgcHJvdGVjdGVkIGN1cnJlbnRSYW5kb21TdG9yYWdlPzogQUxTPFNjb3BlZFdvcmtmbG93UmFuZG9tU291cmNlIHwgdW5kZWZpbmVkPjtcblxuICBwdWJsaWMgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciA9IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyO1xuICBwdWJsaWMgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIGtub3cgdGhlIHN0YXR1cyBvZiBmb3IgdGhpcyB3b3JrZmxvdywgYXMgaW4ge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duUHJlc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBzZW50IHRvIGNvcmUge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93bkZsYWdzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgc2RrVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQnVmZmVyZWQgc2luayBjYWxscyBwZXIgYWN0aXZhdGlvblxuICAgKi9cbiAgc2lua0NhbGxzID0gQXJyYXk8U2lua0NhbGw+KCk7XG5cbiAgLyoqXG4gICAqIEEgbmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWUgZnVuY3Rpb24sIGV4dGVybmFsbHkgaW5qZWN0ZWQuIFRoaXMgaXMgdXNlZCB0b1xuICAgKiBwcmVjaXNlbHkgc29ydCBsb2dzIGVudHJpZXMgZW1pdHRlZCBmcm9tIHRoZSBXb3JrZmxvdyBDb250ZXh0IHZzIHRob3NlIGVtaXR0ZWRcbiAgICogZnJvbSBvdGhlciBzb3VyY2VzIChlLmcuIG1haW4gdGhyZWFkLCBDb3JlLCBldGMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdldFRpbWVPZkRheTogKCkgPT4gYmlnaW50O1xuXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG5cbiAgcHVibGljIGN1cnJlbnREZXRhaWxzOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuICBwdWJsaWMgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcj86ICgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93U2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFja1RyYWNlc0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZm8sXG4gICAgbm93LFxuICAgIHNob3dTdGFja1RyYWNlU291cmNlcyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZ2V0VGltZU9mRGF5LFxuICAgIHJhbmRvbW5lc3NTZWVkLFxuICAgIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLFxuICAgIHN0YWNrVHJhY2VzRW5hYmxlZCxcbiAgICBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzLFxuICB9OiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCkge1xuICAgIHRoaXMuZ2V0VGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gICAgdGhpcy5zaG93U3RhY2tUcmFjZVNvdXJjZXMgPSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG4gICAgdGhpcy5zb3VyY2VNYXAgPSBzb3VyY2VNYXA7XG4gICAgdGhpcy5yYW5kb21uZXNzU2VlZCA9IFsuLi5yYW5kb21uZXNzU2VlZF07XG4gICAgdGhpcy5yYW5kb20gPSBhbGVhKHRoaXMucmFuZG9tbmVzc1NlZWQpO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMgPSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lcztcbiAgICB0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCA9IHN0YWNrVHJhY2VzRW5hYmxlZDtcbiAgICB0aGlzLmZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMgPSBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzID8/IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFJhbmRvbW5lc3NTZWVkKHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmFuZG9tbmVzc1NlZWQgPSBbLi4ucmFuZG9tbmVzc1NlZWRdO1xuICAgIHRoaXMucmFuZG9tID0gYWxlYSh0aGlzLnJhbmRvbW5lc3NTZWVkKTtcbiAgICB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGdldE5hbWVkUmFuZG9tKG5hbWU6IHN0cmluZyk6IFJORyB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYW1lZFJhbmRvbVN0cmVhbXMuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5kb20gPSBhbGVhKGRlcml2ZUFsZWFTZWVkKHRoaXMucmFuZG9tbmVzc1NlZWQsIG5hbWUpKTtcbiAgICB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5zZXQobmFtZSwgcmFuZG9tKTtcbiAgICByZXR1cm4gcmFuZG9tO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdpdGhSYW5kb21Tb3VyY2U8VD4ocmFuZG9tU291cmNlOiBTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB8IHVuZGVmaW5lZCwgZm46ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFJhbmRvbVN0b3JhZ2UgPz89IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB8IHVuZGVmaW5lZD4oKSkucnVuKFxuICAgICAgcmFuZG9tU291cmNlLFxuICAgICAgZm5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHdpdGhDdXJyZW50UmFuZG9tPFQ+KHJhbmRvbVNvdXJjZTogU2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2UsIGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJhbmRvbVNvdXJjZShyYW5kb21Tb3VyY2UsIGZuKTtcbiAgfVxuXG4gIHB1YmxpYyBiaW5kQ3VycmVudFJhbmRvbTxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZuOiBUKTogVCB7XG4gICAgY29uc3QgcmFuZG9tU291cmNlID0gdGhpcy5jdXJyZW50UmFuZG9tU3RvcmFnZT8uZ2V0U3RvcmUoKTtcbiAgICByZXR1cm4gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiB0aGlzLndpdGhSYW5kb21Tb3VyY2UocmFuZG9tU291cmNlLCAoKSA9PiBmbiguLi5hcmdzKSkpIGFzIFQ7XG4gIH1cblxuICBwdWJsaWMgY3VycmVudFJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRSYW5kb21TdG9yYWdlPy5nZXRTdG9yZSgpPy5yYW5kb20oKSA/PyB0aGlzLnJhbmRvbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBtdXRhdGVXb3JrZmxvd0luZm8oZm46IChpbmZvOiBXb3JrZmxvd0luZm8pID0+IFdvcmtmbG93SW5mbyk6IHZvaWQge1xuICAgIHRoaXMuaW5mbyA9IGZuKHRoaXMuaW5mbyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RhY2tUcmFjZXMoKTogU3RhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBzdGFjayB0cmFjZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgd29ya2VyJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY2hpbGRUb1BhcmVudCwgcHJvbWlzZVRvU3RhY2sgfSA9IHRoaXMucHJvbWlzZVN0YWNrU3RvcmU7XG4gICAgY29uc3QgaW50ZXJuYWxOb2RlcyA9IFsuLi5jaGlsZFRvUGFyZW50LnZhbHVlcygpXS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGN1cnIpIHtcbiAgICAgICAgYWNjLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IFNldCgpKTtcbiAgICBjb25zdCBzdGFja3MgPSBuZXcgTWFwPHN0cmluZywgU3RhY2s+KCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFRvUGFyZW50LmtleXMoKSkge1xuICAgICAgaWYgKCFpbnRlcm5hbE5vZGVzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwcm9taXNlVG9TdGFjay5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5mb3JtYXR0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBzdGFja3Muc2V0KHN0YWNrLmZvcm1hdHRlZCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3QgMTAwJSBzdXJlIHdoZXJlIHRoaXMgY29tZXMgZnJvbSwganVzdCBmaWx0ZXIgaXQgb3V0XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pJyk7XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pXFxuJyk7XG4gICAgcmV0dXJuIFsuLi5zdGFja3NdLm1hcCgoW18sIHN0YWNrXSkgPT4gc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBnZXRBbmRSZXNldFNpbmtDYWxscygpOiBTaW5rQ2FsbFtdIHtcbiAgICBjb25zdCB7IHNpbmtDYWxscyB9ID0gdGhpcztcbiAgICB0aGlzLnNpbmtDYWxscyA9IFtdO1xuICAgIHJldHVybiBzaW5rQ2FsbHM7XG4gIH1cblxuICAvKipcbiAgICogQnVmZmVyIGEgV29ya2Zsb3cgY29tbWFuZCB0byBiZSBjb2xsZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBQcmV2ZW50cyBjb21tYW5kcyBmcm9tIGJlaW5nIGFkZGVkIGFmdGVyIFdvcmtmbG93IGNvbXBsZXRpb24uXG4gICAqL1xuICBwdXNoQ29tbWFuZChjbWQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZCwgY29tcGxldGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChjbWQpO1xuICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKSxcbiAgICAgIHVzZWRJbnRlcm5hbEZsYWdzOiBbLi4udGhpcy5rbm93bkZsYWdzXSxcbiAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFdvcmtmbG93TmV4dEhhbmRsZXIoeyBhcmdzIH06IFdvcmtmbG93RXhlY3V0ZUlucHV0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHdvcmtmbG93IH0gPSB0aGlzO1xuICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93KC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyh0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLCAnZXhlY3V0ZScsIHRoaXMuc3RhcnRXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcblxuICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nKCgpID0+XG4gICAgICAgIGV4ZWN1dGUoe1xuICAgICAgICAgIGhlYWRlcnM6IGFjdGl2YXRpb24uaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uYXJndW1lbnRzLCBjb250ZXh0KSxcbiAgICAgICAgfSlcbiAgICAgICkudGhlbih0aGlzLmNvbXBsZXRlV29ya2Zsb3cuYmluZCh0aGlzKSwgdGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGludWVkRmFpbHVyZSwgbGFzdENvbXBsZXRpb25SZXN1bHQsIG1lbW8sIHNlYXJjaEF0dHJpYnV0ZXMgfSA9IGFjdGl2YXRpb247XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gICAgLy8gTW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpbml0aWFsaXphdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgLi4uaW5mbyxcblxuICAgICAgc2VhcmNoQXR0cmlidXRlczogZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzPy5pbmRleGVkRmllbGRzKSxcbiAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlczogZGVjb2RlVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM/LmluZGV4ZWRGaWVsZHMpLFxuXG4gICAgICBtZW1vOiBtYXBGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBtZW1vPy5maWVsZHMsIGNvbnRleHQpLFxuICAgICAgbGFzdFJlc3VsdDogZnJvbVBheWxvYWRzQXRJbmRleCh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIDAsIGxhc3RDb21wbGV0aW9uUmVzdWx0Py5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICBsYXN0RmFpbHVyZTpcbiAgICAgICAgY29udGludWVkRmFpbHVyZSAhPSBudWxsXG4gICAgICAgICAgPyB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoY29udGludWVkRmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgICBjb25zdCB3b3JrZmxvd0RlZmluaXRpb25PcHRzID0gdGhpcy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyPy4oKTtcbiAgICBpZiAod29ya2Zsb3dEZWZpbml0aW9uT3B0cykge1xuICAgICAgdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IgPSB3b3JrZmxvd0RlZmluaXRpb25PcHRzLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICAgIHRoaXMud29ya2Zsb3dEZWZpbml0aW9uRmFpbHVyZUV4Y2VwdGlvblR5cGVzID0gd29ya2Zsb3dEZWZpbml0aW9uT3B0cy5mYWlsdXJlRXhjZXB0aW9uVHlwZXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbFdvcmtmbG93KF9hY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUNhbmNlbFdvcmtmbG93KTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMucm9vdFNjb3BlLmNhbmNlbCgpO1xuICB9XG5cbiAgcHVibGljIGZpcmVUaW1lcihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUZpcmVUaW1lcik6IHZvaWQge1xuICAgIC8vIFRpbWVycyBhcmUgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlaXIgY29tcGxldGlvbiBtaWdodCBub3QgYmUgaW4gV29ya2Zsb3cgc3RhdGUsXG4gICAgLy8gdGhpcyBpcyBkdWUgdG8gaW1tZWRpYXRlIHRpbWVyIGNhbmNlbGxhdGlvbiB0aGF0IGRvZXNuJ3QgZ28gd2FpdCBmb3IgQ29yZS5cbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCd0aW1lcicsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgY29tcGxldGlvbj8ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVBY3Rpdml0eShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVBY3Rpdml0eSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQWN0aXZpdHkgYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignYWN0aXZpdHknLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGNhbmNlbGxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmJhY2tvZmYpIHtcbiAgICAgIHJlamVjdChuZXcgTG9jYWxBY3Rpdml0eURvQmFja29mZihhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQoXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93U3RhcnQnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnN1Y2NlZWRlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydCB3aXRoIG5vIHJ1bklkJyk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGFjdGl2YXRpb24uc3VjY2VlZGVkLnJ1bklkKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uZmFpbGVkKSB7XG4gICAgICBpZiAoZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UoYWN0aXZhdGlvbi5mYWlsZWQuY2F1c2UpICE9PSAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignR290IHVua25vd24gU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGFjdGl2YXRpb24uc2VxICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQgJiYgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgaW4gYWN0aXZhdGlvbiBqb2InKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChcbiAgICAgICAgbmV3IFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcihcbiAgICAgICAgICAnV29ya2Zsb3cgZXhlY3V0aW9uIGFscmVhZHkgc3RhcnRlZCcsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dJZCxcbiAgICAgICAgICBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd1R5cGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoIWFjdGl2YXRpb24uY2FuY2VsbGVkLmZhaWx1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IG5vIGZhaWx1cmUgaW4gY2FuY2VsbGVkIHZhcmlhbnQnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5jYW5jZWxsZWQuZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gc3RhdHVzJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24gYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd0NvbXBsZXRlJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGZhaWxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBjYW5jZWxsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZXEgPSBnZXRTZXEoYWN0aXZhdGlvbik7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuXG4gICAgaWYgKCFhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdW50cmFja1Byb21pc2UoY29tcGxldGVQcm9taXNlKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgcmVzb2x2ZSh7IHRva2VuOiBhY3RpdmF0aW9uLm9wZXJhdGlvblRva2VuISwgcmVzdWx0OiBjb21wbGV0ZVByb21pc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbGVkKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvbihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVOZXh1c09wZXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHNlcSA9IGdldFNlcShhY3RpdmF0aW9uKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCwgY29udGV4dCk7XG5cbiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBSZXNvbHZlTmV4dXNPcGVyYXRpb24gdG8gYmUgcmVjZWl2ZWQgd2l0aG91dCBhIHByaW9yIFJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0LFxuICAgICAgLy8gZS5nLiBiZWNhdXNlIHRoZSBoYW5kbGVyIGNvbXBsZXRlZCB0aGUgT3BlcmF0aW9uIHN5bmNocm9ub3VzbHkuXG4gICAgICBjb25zdCBzdGFydENvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuICAgICAgaWYgKHN0YXJ0Q29tcGxldGlvbikge1xuICAgICAgICBzdGFydENvbXBsZXRpb24ucmVzb2x2ZSh7IHJlc3VsdDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnI6IEVycm9yO1xuICAgICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5mYWlsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY2FuY2VsbGVkKSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LnRpbWVkT3V0KSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQudGltZWRPdXQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wbGV0aW9uID1cbiAgICAgICAgdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKSA/P1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKTtcbiAgICAgIGNvbXBsZXRpb24ucmVqZWN0KGVyciEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgbm9uLWFzeW5jIGZ1bmN0aW9uIHNvIHRoaXMgaGFuZGxlciBkb2Vzbid0IHNob3cgdXAgaW4gdGhlIHN0YWNrIHRyYWNlXG4gIHByb3RlY3RlZCBxdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIoeyBxdWVyeU5hbWUsIGFyZ3MgfTogUXVlcnlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGxldCBmbiA9IHRoaXMucXVlcnlIYW5kbGVycy5nZXQocXVlcnlOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm4gPSB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIHF1ZXJ5TmFtZSk7XG4gICAgfVxuICAgIC8vIE5vIGhhbmRsZXIgb3IgZGVmYXVsdCByZWdpc3RlcmVkLCBmYWlsLlxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrbm93blF1ZXJ5VHlwZXMgPSBbLi4udGhpcy5xdWVyeUhhbmRsZXJzLmtleXMoKV0uam9pbignICcpO1xuICAgICAgLy8gRmFpbCB0aGUgcXVlcnlcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgIGBXb3JrZmxvdyBkaWQgbm90IHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgJHtxdWVyeU5hbWV9LiBSZWdpc3RlcmVkIHF1ZXJpZXM6IFske2tub3duUXVlcnlUeXBlc31dYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBFeGVjdXRlIGhhbmRsZXIuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdRdWVyeSBoYW5kbGVycyBzaG91bGQgbm90IHJldHVybiBhIFByb21pc2UnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVlcnlXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVF1ZXJ5V29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgcXVlcnlJZCwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIShxdWVyeVR5cGUgJiYgcXVlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcXVlcnkgYWN0aXZhdGlvbiBhdHRyaWJ1dGVzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHF1ZXJpZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLlxuICAgIGlmIChcbiAgICAgIHF1ZXJ5VHlwZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiZcbiAgICAgICF0aGlzLnF1ZXJ5SGFuZGxlcnMuaGFzKHF1ZXJ5VHlwZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlIHF1ZXJ5IG5hbWU6ICcke3F1ZXJ5VHlwZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHF1ZXJ5LlxuICAgIGNvbnN0IGlzSW50ZXJuYWxRdWVyeSA9XG4gICAgICBxdWVyeVR5cGUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBxdWVyeVR5cGUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIHF1ZXJ5VHlwZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsUXVlcnkgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlUXVlcnknLCB0aGlzLnF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgZXhlY3V0ZSh7XG4gICAgICBxdWVyeU5hbWU6IHF1ZXJ5VHlwZSxcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMsIGNvbnRleHQpLFxuICAgICAgcXVlcnlJZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSkudGhlbihcbiAgICAgIChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVRdWVyeShxdWVyeUlkLCByZXN1bHQpLFxuICAgICAgKHJlYXNvbikgPT4gdGhpcy5mYWlsUXVlcnkocXVlcnlJZCwgcmVhc29uKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZG9VcGRhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgaWQ6IHVwZGF0ZUlkLCBwcm90b2NvbEluc3RhbmNlSWQsIG5hbWUsIGhlYWRlcnMsIHJ1blZhbGlkYXRvciB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXVwZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIGlkJyk7XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBuYW1lJyk7XG4gICAgfVxuICAgIGlmICghcHJvdG9jb2xJbnN0YW5jZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIHByb3RvY29sSW5zdGFuY2VJZCcpO1xuICAgIH1cblxuICAgIC8vIFJlamVjdCBfX3RlbXBvcmFsXy1wcmVmaXhlZCB1cGRhdGVzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHJvdXRlZCB0byB0aGVcbiAgICAvLyB1c2VyJ3MgZGVmYXVsdCBoYW5kbGVyLiBBIHNwZWNpZmljIHJlZ2lzdGVyZWQgaGFuZGxlciAoZS5nLiBmcm9tIGFcbiAgICAvLyBjb250cmliIHBhY2thZ2UpIGlzIGFsbG93ZWQgdGhyb3VnaCwgYW5kIHVucmVnaXN0ZXJlZCBuYW1lcyB3aXRob3V0IGFcbiAgICAvLyBkZWZhdWx0IGhhbmRsZXIgZmFsbCB0aHJvdWdoIHRvIHRoZSBidWZmZXItdGhlbi1yZWplY3QgcGF0aCBiZWxvdy5cbiAgICBpZiAoXG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSAmJlxuICAgICAgIXRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKG5hbWUpICYmXG4gICAgICB0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgdXBkYXRlIG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbnRlcmNlcHRvcnMgaWYgaXQncyBhbiBpbnRlcm5hbCB1cGRhdGUuXG4gICAgY29uc3QgaXNJbnRlcm5hbFVwZGF0ZSA9XG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSB8fFxuICAgICAgbmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fFxuICAgICAgbmFtZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsVXBkYXRlID8gW10gOiB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kO1xuXG4gICAgY29uc3QgZW50cnkgPVxuICAgICAgdGhpcy51cGRhdGVIYW5kbGVycy5nZXQobmFtZSkgPz9cbiAgICAgICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlci5iaW5kKHVuZGVmaW5lZCwgbmFtZSksXG4gICAgICAgICAgICB2YWxpZGF0b3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gYSB3YXJuaW5nIHBvbGljeS5cbiAgICAgICAgICAgIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET04sXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwpO1xuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmcm9tIGVpdGhlciBzb3VyY2UsIGJ1ZmZlciBhbmQgcmV0dXJuXG4gICAgaWYgKGVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRVcGRhdGVzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFrZUlucHV0ID0gKCk6IFVwZGF0ZUlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZUlkLFxuICAgICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQsIGNvbnRleHQpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciB1cGhvbGRpbmcsIGFuZCBjb25zdHJhaW5lZFxuICAgIC8vIGJ5LCB0aGUgZm9sbG93aW5nIGNvbnRyYWN0OlxuICAgIC8vXG4gICAgLy8gMS4gSWYgbm8gdmFsaWRhdG9yIGlzIHByZXNlbnQgdGhlbiB2YWxpZGF0aW9uIGludGVyY2VwdG9ycyB3aWxsIG5vdCBiZSBydW4uXG4gICAgLy9cbiAgICAvLyAyLiBEdXJpbmcgdmFsaWRhdGlvbiwgYW55IGVycm9yIG11c3QgZmFpbCB0aGUgVXBkYXRlOyBkdXJpbmcgdGhlIFVwZGF0ZVxuICAgIC8vICAgIGl0c2VsZiwgVGVtcG9yYWwgZXJyb3JzIGZhaWwgdGhlIFVwZGF0ZSB3aGVyZWFzIG90aGVyIGVycm9ycyBmYWlsIHRoZVxuICAgIC8vICAgIGFjdGl2YXRpb24uXG4gICAgLy9cbiAgICAvLyAzLiBUaGUgaGFuZGxlciBtdXN0IG5vdCBzZWUgYW55IG11dGF0aW9ucyBvZiB0aGUgYXJndW1lbnRzIG1hZGUgYnkgdGhlXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNC4gQW55IGVycm9yIHdoZW4gZGVjb2RpbmcvZGVzZXJpYWxpemluZyBpbnB1dCBtdXN0IGJlIGNhdWdodCBhbmQgcmVzdWx0XG4gICAgLy8gICAgaW4gcmVqZWN0aW9uIG9mIHRoZSBVcGRhdGUgYmVmb3JlIGl0IGlzIGFjY2VwdGVkLCBldmVuIGlmIHRoZXJlIGlzIG5vXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNS4gVGhlIGluaXRpYWwgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgKGFzeW5jKSBVcGRhdGUgaGFuZGxlciBzaG91bGRcbiAgICAvLyAgICBiZSBleGVjdXRlZCBhZnRlciB0aGUgKHN5bmMpIHZhbGlkYXRvciBjb21wbGV0ZXMgc3VjaCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gICAgbWluaW1hbCBvcHBvcnR1bml0eSBmb3IgYSBkaWZmZXJlbnQgY29uY3VycmVudCB0YXNrIHRvIGJlIHNjaGVkdWxlZFxuICAgIC8vICAgIGJldHdlZW4gdGhlbS5cbiAgICAvL1xuICAgIC8vIDYuIFRoZSBzdGFjayB0cmFjZSB2aWV3IHByb3ZpZGVkIGluIHRoZSBUZW1wb3JhbCBVSSBtdXN0IG5vdCBiZSBwb2xsdXRlZFxuICAgIC8vICAgIGJ5IHByb21pc2VzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIHVzZXIgY29kZS4gVGhpcyBpbXBsaWVzIHRoYXRcbiAgICAvLyAgICBhc3luYy9hd2FpdCBzeW50YXggbWF5IG5vdCBiZSB1c2VkLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGVsaWJlcmF0ZWx5IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBiZWxvdy5cbiAgICAvLyBUaGVzZSBhcmUgY2F1Z2h0IGVsc2V3aGVyZSBhbmQgZmFpbCB0aGUgY29ycmVzcG9uZGluZyBhY3RpdmF0aW9uLlxuICAgIGNvbnN0IGRvVXBkYXRlSW1wbCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpbnB1dDogVXBkYXRlSW5wdXQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocnVuVmFsaWRhdG9yICYmIGVudHJ5LnZhbGlkYXRvcikge1xuICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IG1hcmsgYXMgbm90IHJlcGxheWluZyBoaXN0b3J5IGV2ZW50cyBkdXJpbmcgdmFsaWRhdG9yIGV4ZWN1dGlvblxuICAgICAgICAgIC8vIHNvIHRoYXQgbG9nZ2luZyBpcyBwZXJtaXR0ZWQuIFZhbGlkYXRvcnMgYXJlIGxpdmUgcmVhZC1vbmx5IG9wZXJhdGlvbnMuXG4gICAgICAgICAgY29uc3Qgd2FzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cyA9IHRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzO1xuICAgICAgICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgICAgIHVuc2FmZTogeyAuLi5pbmZvLnVuc2FmZSwgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiBmYWxzZSB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICAgICAgICBpbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVVcGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LnZhbGlkYXRvcilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YWxpZGF0ZShtYWtlSW5wdXQoKSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgICB1bnNhZmU6IHsgLi4uaW5mby51bnNhZmUsIGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogd2FzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cyB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IG1ha2VJbnB1dCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCBlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWNjZXB0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCk7XG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgaW50ZXJjZXB0b3JzLFxuICAgICAgICAnaGFuZGxlVXBkYXRlJyxcbiAgICAgICAgdGhpcy51cGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LmhhbmRsZXIpXG4gICAgICApO1xuICAgICAgY29uc3QgeyB1bmZpbmlzaGVkUG9saWN5IH0gPSBlbnRyeTtcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuc2V0KHVwZGF0ZUlkLCB7IG5hbWUsIHVuZmluaXNoZWRQb2xpY3ksIGlkOiB1cGRhdGVJZCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGV4ZWN1dGUoaW5wdXQpXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCByZXN1bHQpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5pblByb2dyZXNzVXBkYXRlcy5kZWxldGUodXBkYXRlSWQpKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHJlcyk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgdW50cmFja1Byb21pc2UoVXBkYXRlU2NvcGUudXBkYXRlV2l0aEluZm8odXBkYXRlSWQsIG5hbWUsIGRvVXBkYXRlSW1wbCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZU5leHRIYW5kbGVyKGhhbmRsZXI6IFdvcmtmbG93VXBkYXRlVHlwZSwgeyBhcmdzIH06IFVwZGF0ZUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIoLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVVcGRhdGVOZXh0SGFuZGxlcih2YWxpZGF0b3I6IFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSB8IHVuZGVmaW5lZCwgeyBhcmdzIH06IFVwZGF0ZUlucHV0KTogdm9pZCB7XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFsaWRhdG9yKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFVwZGF0ZXMgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcztcbiAgICB3aGlsZSAoYnVmZmVyZWRVcGRhdGVzLmxlbmd0aCkge1xuICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgdXBkYXRlIGhhbmRsZXIsIHNvIGFsbCB1cGRhdGVzIGFyZSBkaXNwYXRjaGFibGUuXG4gICAgICBpZiAodGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlcikge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBidWZmZXJlZFVwZGF0ZXMuc2hpZnQoKTtcbiAgICAgICAgLy8gTG9naWNhbGx5LCB0aGlzIG11c3QgYmUgZGVmaW5lZCBhcyB3ZSdyZSBpbiB0aGUgbG9vcC5cbiAgICAgICAgLy8gQnV0IFR5cGVzY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgc28gd2UgdXNlIGEgbm9uLW51bGwgYXNzZXJ0aW9uICghKS5cbiAgICAgICAgdGhpcy5kb1VwZGF0ZSh1cGRhdGUhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFVwZGF0ZXMuZmluZEluZGV4KCh1cGRhdGUpID0+IHRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKHVwZGF0ZS5uYW1lIGFzIHN0cmluZykpO1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAvLyBObyBidWZmZXJlZCBVcGRhdGVzIGhhdmUgYSBoYW5kbGVyIHlldC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbdXBkYXRlXSA9IGJ1ZmZlcmVkVXBkYXRlcy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuZG9VcGRhdGUodXBkYXRlISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlamVjdEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShcbiAgICAgICAgICB1cGRhdGUucHJvdG9jb2xJbnN0YW5jZUlkISxcbiAgICAgICAgICBBcHBsaWNhdGlvbkZhaWx1cmUubm9uUmV0cnlhYmxlKGBObyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIHVwZGF0ZTogJHt1cGRhdGUubmFtZX1gKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduYWxXb3JrZmxvd05leHRIYW5kbGVyKHsgc2lnbmFsTmFtZSwgYXJncyB9OiBTaWduYWxJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5zaWduYWxIYW5kbGVycy5nZXQoc2lnbmFsTmFtZSk/LmhhbmRsZXI7XG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcihzaWduYWxOYW1lLCAuLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyByZWdpc3RlcmVkIHNpZ25hbCBoYW5kbGVyIGZvciBzaWduYWw6ICR7c2lnbmFsTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2lnbmFsV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklTaWduYWxXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2lnbmFsTmFtZSwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXNpZ25hbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiBzaWduYWxOYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHNpZ25hbHMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLCBhbmQgdW5yZWdpc3RlcmVkIG5hbWVzIHdpdGhvdXQgYVxuICAgIC8vIGRlZmF1bHQgaGFuZGxlciBmYWxsIHRocm91Z2ggdG8gdGhlIGJ1ZmZlci10aGVuLXJlamVjdCBwYXRoIGJlbG93LlxuICAgIGlmIChcbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmXG4gICAgICAhdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsTmFtZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYENhbm5vdCB1c2Ugc2lnbmFsIG5hbWU6ICcke3NpZ25hbE5hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHNpZ25hbC5cbiAgICBjb25zdCBpc0ludGVybmFsU2lnbmFsID1cbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxTaWduYWwgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbE5hbWUpICYmICF0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkU2lnbmFscy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciB0aGVuIHRoZSB1bmZpbmlzaGVkXG4gICAgLy8gcG9saWN5IGlzIFdBUk5fQU5EX0FCQU5ET047IHVzZXJzIGN1cnJlbnRseSBoYXZlIG5vIHdheSB0byBzaWxlbmNlIGFueVxuICAgIC8vIGVuc3Vpbmcgd2FybmluZ3MuXG4gICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9XG4gICAgICB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuXG4gICAgY29uc3Qgc2lnbmFsRXhlY3V0aW9uTnVtID0gdGhpcy5zaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxKys7XG4gICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5zZXQoc2lnbmFsRXhlY3V0aW9uTnVtLCB7IG5hbWU6IHNpZ25hbE5hbWUsIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlU2lnbmFsJywgdGhpcy5zaWduYWxXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5pbnB1dCwgY29udGV4dCksXG4gICAgICBzaWduYWxOYW1lLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KVxuICAgICAgLmNhdGNoKHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlLmJpbmQodGhpcykpXG4gICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLmRlbGV0ZShzaWduYWxFeGVjdXRpb25OdW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkU2lnbmFscygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFNpZ25hbHMgPSB0aGlzLmJ1ZmZlcmVkU2lnbmFscztcbiAgICB3aGlsZSAoYnVmZmVyZWRTaWduYWxzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIsIHNvIGFsbCBzaWduYWxzIGFyZSBkaXNwYXRjaGFibGVcblxuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KGJ1ZmZlcmVkU2lnbmFscy5zaGlmdCgpISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gYnVmZmVyZWRTaWduYWxzLmZpbmRJbmRleCgoc2lnbmFsKSA9PiB0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWwuc2lnbmFsTmFtZSBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBicmVhaztcbiAgICAgICAgY29uc3QgW3NpZ25hbF0gPSBidWZmZXJlZFNpZ25hbHMuc3BsaWNlKGZvdW5kSW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KHNpZ25hbCEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlU2lnbmFsRXh0ZXJuYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGNvbnRleHQgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ3NpZ25hbFdvcmtmbG93JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5mYWlsdXJlKSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjYW5jZWxXb3JrZmxvdycsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24uZmFpbHVyZSkge1xuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0V2FybmFibGUgPSAoaGFuZGxlckV4ZWN1dGlvbnM6IEl0ZXJhYmxlPE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPik6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10gPT4ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oaGFuZGxlckV4ZWN1dGlvbnMpLmZpbHRlcihcbiAgICAgICAgKGV4KSA9PiBleC51bmZpbmlzaGVkUG9saWN5ID09PSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCB3YXJuYWJsZVVwZGF0ZXMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2Uod2FybmFibGVVcGRhdGVzKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmFibGVTaWduYWxzID0gZ2V0V2FybmFibGUodGhpcy5pblByb2dyZXNzU2lnbmFscy52YWx1ZXMoKSk7XG4gICAgaWYgKHdhcm5hYmxlU2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKHdhcm5hYmxlU2lnbmFscykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSYW5kb21TZWVkKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JVXBkYXRlUmFuZG9tU2VlZCk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWN0aXZhdGlvbiB3aXRoIHJhbmRvbW5lc3NTZWVkIGF0dHJpYnV0ZScpO1xuICAgIH1cbiAgICB0aGlzLnNldFJhbmRvbW5lc3NTZWVkKGFjdGl2YXRpb24ucmFuZG9tbmVzc1NlZWQudG9CeXRlcygpKTtcbiAgfVxuXG4gIHB1YmxpYyBub3RpZnlIYXNQYXRjaChhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSU5vdGlmeUhhc1BhdGNoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nKVxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdVbmV4cGVjdGVkIG5vdGlmeUhhc1BhdGNoIGpvYiBvbiBub24tcmVwbGF5IGFjdGl2YXRpb24nKTtcbiAgICBpZiAoIWFjdGl2YXRpb24ucGF0Y2hJZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignbm90aWZ5SGFzUGF0Y2ggbWlzc2luZyBwYXRjaCBpZCcpO1xuICAgIHRoaXMua25vd25QcmVzZW50UGF0Y2hlcy5hZGQoYWN0aXZhdGlvbi5wYXRjaElkKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXRjaEludGVybmFsKHBhdGNoSWQ6IHN0cmluZywgZGVwcmVjYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndvcmtmbG93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignUGF0Y2hlcyBjYW5ub3QgYmUgdXNlZCBiZWZvcmUgV29ya2Zsb3cgc3RhcnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZVBhdGNoID0gIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgfHwgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmhhcyhwYXRjaElkKTtcbiAgICAvLyBBdm9pZCBzZW5kaW5nIGNvbW1hbmRzIGZvciBwYXRjaGVzIGNvcmUgYWxyZWFkeSBrbm93cyBhYm91dC5cbiAgICAvLyBUaGlzIG9wdGltaXphdGlvbiBlbmFibGVzIGRldmVsb3BtZW50IG9mIGF1dG9tYXRpYyBwYXRjaGluZyB0b29scy5cbiAgICBpZiAodXNlUGF0Y2ggJiYgIXRoaXMuc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpKSB7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgICAgc2V0UGF0Y2hNYXJrZXI6IHsgcGF0Y2hJZCwgZGVwcmVjYXRlZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbnRQYXRjaGVzLmFkZChwYXRjaElkKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVBhdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBlYXJseSB3aGlsZSBoYW5kbGluZyBhbiBhY3RpdmF0aW9uIHRvIHJlZ2lzdGVyIGtub3duIGZsYWdzLlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGFkZEtub3duRmxhZ3MoZmxhZ3M6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIGZsYWdzKSB7XG4gICAgICBhc3NlcnRWYWxpZEZsYWcoZmxhZyk7XG4gICAgICB0aGlzLmtub3duRmxhZ3MuYWRkKGZsYWcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBTREsgRmxhZyBtYXkgYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBTREsgZmxhZ3MgcGxheSBhIHJvbGUgc2ltaWxhciB0byB0aGUgYHBhdGNoZWQoKWAgQVBJLCBidXQgYXJlIG1lYW50IGZvciBpbnRlcm5hbCB1c2FnZSBieSB0aGVcbiAgICogU0RLIGl0c2VsZi4gVGhleSBtYWtlIGl0IHBvc3NpYmxlIGZvciB0aGUgU0RLIHRvIGV2b2x2ZSBpdHMgYmVoYXZpb3JzIG92ZXIgdGltZSwgd2hpbGUgc3RpbGxcbiAgICogbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIFdvcmtmbG93IGhpc3RvcmllcyBwcm9kdWNlZCBieSBvbGRlciBTREtzLCB3aXRob3V0IGNhdXNpbmdcbiAgICogZGV0ZXJtaW5pc20gdmlvbGF0aW9ucy5cbiAgICpcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBoYXNGbGFnKGZsYWc6IFNka0ZsYWcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5rbm93bkZsYWdzLmhhcyhmbGFnLmlkKSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBJZiBub3QgcmVwbGF5aW5nLCBlbmFibGUgdGhlIGZsYWcgaWYgaXQgaXMgY29uZmlndXJlZCB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFNldHRpbmcgYVxuICAgIC8vIGZsYWcncyBkZWZhdWx0IHRvIGZhbHNlIGFsbG93cyBwcm9ncmVzc2l2ZSByb2xsb3V0IG9mIG5ldyBmZWF0dXJlIGZsYWdzLCB3aXRoIHRoZSBwb3NzaWJpbGl0eVxuICAgIC8vIG9mIHJldmVydGluZyBiYWNrIHRvIGEgdmVyc2lvbiBvZiB0aGUgU0RLIHdoZXJlIHRoZSBmbGFnIGlzIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAvLyBJdCBpcyBhbHNvIHVzZWZ1bCBmb3IgdGVzdGluZyBwdXJwb3NlLlxuICAgIGlmICghdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiBmbGFnLmRlZmF1bHQpIHtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZy5pZCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHJlcGxheWluZywgYSBmbGFnIGlzIGNvbnNpZGVyZWQgZW5hYmxlZCBpZiBpdCB3YXMgZW5hYmxlZCBkdXJpbmcgdGhlIG9yaWdpbmFsIGV4ZWN1dGlvbiBvZlxuICAgIC8vIHRoYXQgV29ya2Zsb3cgVGFzazsgdGhpcyBpcyBub3JtYWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgZmxhZyBJRCBpbiB0aGUgY29ycmVzcG9uZGluZ1xuICAgIC8vIFdGVCBDb21wbGV0ZWQncyBgc2RrTWV0YWRhdGEubGFuZ1VzZWRGbGFnc2AuXG4gICAgLy9cbiAgICAvLyBTREsgRmxhZyBBbHRlcm5hdGUgQ29uZGl0aW9uIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgZmxhZyBzaG91bGRcbiAgICAvLyBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREsgdGhhdFxuICAgIC8vIGVtaXR0ZWQgYSBXRlQuIFRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHJldHJvYWN0aXZlbHkgdHVybiBvbiBzb21lIGZsYWdzIGZvciBXRlQgZW1pdHRlZFxuICAgIC8vIGJ5IHByZXZpb3VzIFNES3MgdGhhdCBjb250YWluZWQgYSBidWcuIEFsdCBDb25kaXRpb25zIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcuIEFsc28sIGFsdGVybmF0ZSBjb25kaXRpb25zIHdpbGwgbm90XG4gICAgLy8gY2F1c2UgdGhlIGZsYWcgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrc1xuICAgIC8vIG1heSBub3QgcmVmbGVjdCB0aGlzIGZsYWcgaWYgdGhlIGNvbmRpdGlvbiBubyBsb25nZXIgaG9sZHMuIFRoaXMgaXMgc28gdG8gYXZvaWQgaW5jb3JyZWN0XG4gICAgLy8gYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvdyBFeGVjdXRpb24gaGFzIGdvbmUgdGhyb3VnaCBhIG5ld2VyIFNESyB2ZXJzaW9uIHRoZW4gYWdhaW5cbiAgICAvLyB0aHJvdWdoIGFuIG9sZGVyIG9uZS5cbiAgICBpZiAodGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiBmbGFnLmFsdGVybmF0aXZlQ29uZGl0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBjb25kIG9mIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICAgIGlmIChjb25kKHsgaW5mbzogdGhpcy5pbmZvLCBzZGtWZXJzaW9uOiB0aGlzLnNka1ZlcnNpb24gfSkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGcm9tQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdyZW1vdmVGcm9tQ2FjaGUgYWN0aXZhdGlvbiBqb2Igc2hvdWxkIG5vdCByZWFjaCB3b3JrZmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgZmFpbHVyZXMgaW50byBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBVc2VkIHRvIGhhbmRsZSBhbnkgZmFpbHVyZSBlbWl0dGVkIGJ5IHRoZSBXb3JrZmxvdy5cbiAgICovXG4gIGhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCAmJiBpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjYW5jZWxXb3JrZmxvd0V4ZWN1dGlvbjoge30gfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjb250aW51ZUFzTmV3V29ya2Zsb3dFeGVjdXRpb246IGVycm9yLmNvbW1hbmQgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSB8fCB0aGlzLmlzQ29uZmlndXJlZEZhaWx1cmVFeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdy4gV2UgZG8gbm90IHdhbnQgdG8gaXNzdWUgdW5maW5pc2hlZEhhbmRsZXJzIHdhcm5pbmdzLiBUbyBhY2hpZXZlIHRoYXQsIHdlXG4gICAgICAvLyBtYXJrIGFsbCBoYW5kbGVycyBhcyBjb21wbGV0ZWQgbm93LlxuICAgICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5jbGVhcigpO1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5jbGVhcigpO1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY29yZFdvcmtmbG93VGFza0Vycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlcnJvciBtYXRjaGVzIGFueSBvZiB0aGUgY29uZmlndXJlZCBmYWlsdXJlIGV4Y2VwdGlvbiB0eXBlc1xuICAgKiAoZnJvbSB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSBvclxuICAgKiB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy5mYWlsdXJlRXhjZXB0aW9uVHlwZXN9KS5cbiAgICovXG4gIHByaXZhdGUgaXNDb25maWd1cmVkRmFpbHVyZUV4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGNsYXNzIHJlZmVyZW5jZXMgZnJvbSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIChpbnN0YW5jZW9mLWJhc2VkLCBzdXBwb3J0cyBzdWJjbGFzc2VzKVxuICAgIGlmICh0aGlzLndvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlcykge1xuICAgICAgLy8gV2UgZ3VhcmFudGVlIHRoYXQgaW5jbHVkaW5nIEVycm9yIGluIHRoZSBsaXN0IHdpbGwgY2F0Y2ggX2FueV8gZXJyb3IuXG4gICAgICBpZiAodGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMuaW5jbHVkZXMoRXJyb3IpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBlcnJvclR5cGUgb2YgdGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgZXJyb3JUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBjbGFzcyBuYW1lIHN0cmluZ3MgZnJvbSBXb3JrZXJPcHRpb25zIChwcm90b3R5cGUtY2hhaW4tYmFzZWQpXG4gICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZSBndWFyYW50ZWUgdGhhdCBpbmNsdWRpbmcgJ0Vycm9yJyBpbiB0aGUgbGlzdCB3aWxsIGNhdGNoIF9hbnlfIGVycm9yLlxuICAgICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5pbmNsdWRlcygnRXJyb3InKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBjdG9yID0gKGVycm9yIGFzIGFueSkuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjdG9yICE9IG51bGwgJiYgY3RvciAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IChjdG9yIGFzIGFueSkubmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMuaW5jbHVkZXMobmFtZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVjb3JkV29ya2Zsb3dUYXNrRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGtlZXAgdGhlIGZpcnN0IGVycm9yIHRoYXQgYnViYmxlcyB1cDsgc3Vic2VxdWVudCBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkLlxuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yID09PSB1bmRlZmluZWQpIHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPSBlcnJvcjtcblxuICAgIC8vIEltbWVkaWF0ZWx5IHJldGhyb3cgdGhlIGVycm9yIGlmIHdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBzbyAoaS5lLiB3ZSBhcmUgbm90IHJ1bm5pbmcgYXN5bmNcbiAgICAvLyBtaWNyb3Rhc2tzKS4gT3RoZXJ3aXNlLCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biB3aGVuZXZlciB3ZSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gc28sXG4gICAgLy8gZS5nLiB0aGUgbmV4dCB0aW1lIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCBpcyBjYWxsZWQuXG4gICAgaWYgKHRoaXMucmV0aHJvd1N5bmNocm9ub3VzbHkpIHRoaXMubWF5YmVSZXRocm93V29ya2Zsb3dUYXNrRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIFdvcmtmbG93IFRhc2sgZXJyb3Igd2FzIGNhcHR1cmVkLCBhbmQgd2UgYXJlIHJ1bm5pbmcgaW4gc3luY2hyb25vdXMgbW9kZSxcbiAgICogdGhlbiBidWJibGUgaXQgdXAgbm93LiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBldmVuIGlmIHRoZXJlIGlzIG5vIGVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICBtYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgdGhyb3cgdGhpcy53b3JrZmxvd1Rhc2tFcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7IHF1ZXJ5SWQsIHN1Y2NlZWRlZDogeyByZXNwb25zZTogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpIH0gfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbFF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7XG4gICAgICAgIHF1ZXJ5SWQsXG4gICAgICAgIGZhaWxlZDogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFjY2VwdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoeyB1cGRhdGVSZXNwb25zZTogeyBwcm90b2NvbEluc3RhbmNlSWQsIGFjY2VwdGVkOiB7fSB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBjb21wbGV0ZWQ6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0LCBjb250ZXh0KSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZToge1xuICAgICAgICBwcm90b2NvbEluc3RhbmNlSWQsXG4gICAgICAgIHJlamVjdGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUgKi9cbiAgcHJpdmF0ZSBtYXliZUNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZ2V0KHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZGVsZXRlKHRhc2tTZXEpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbiBhcyBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQ29uc3VtZSBhIGNvbXBsZXRpb24gaWYgaXQgZXhpc3RzIGluIFdvcmtmbG93IHN0YXRlLCB0aHJvd3MgaWYgaXQgZG9lc24ndCAqL1xuICBwcml2YXRlIGNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbih0eXBlLCB0YXNrU2VxKTtcbiAgICBpZiAoY29tcGxldGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIGNvbXBsZXRpb24gZm9yIHRhc2tTZXEgJHt0YXNrU2VxfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVXb3JrZmxvdyhyZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgIHJlc3VsdDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duKTogUHJvdG9GYWlsdXJlIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNvbnZlcnRlci5lcnJvclRvRmFpbHVyZShlcnIsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCk7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUpOiBFcnJvciB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpOiBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5pbmZvLm5hbWVzcGFjZSxcbiAgICAgIHdvcmtmbG93SWQ6IHRoaXMuaW5mby53b3JrZmxvd0lkLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VxPFQgZXh0ZW5kcyB7IHNlcT86IG51bWJlciB8IG51bGwgfT4oYWN0aXZhdGlvbjogVCk6IG51bWJlciB7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRpb24uc2VxO1xuICBpZiAoc2VxID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBHb3QgYWN0aXZhdGlvbiB3aXRoIG5vIHNlcSBhdHRyaWJ1dGVgKTtcbiAgfVxuICByZXR1cm4gc2VxO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5maW5pc2hlZFVwZGF0ZUhhbmRsZXJNZXNzYWdlKGhhbmRsZXJFeGVjdXRpb25zOiBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbltdKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBcbltUTVBSTDExMDJdIFdvcmtmbG93IGZpbmlzaGVkIHdoaWxlIGFuIHVwZGF0ZSBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnVwZGF0ZSBoYW5kbGVyIHdhcyBkb2luZywgYW5kIHRoZSBjbGllbnQgdGhhdCBzZW50IHRoZSB1cGRhdGUgd2lsbCByZWNlaXZlIGEgJ3dvcmtmbG93IGV4ZWN1dGlvblxuYWxyZWFkeSBjb21wbGV0ZWQnIFJQQ0Vycm9yIGluc3RlYWQgb2YgdGhlIHVwZGF0ZSByZXN1bHQuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsXG5oYW5kbGVycyB0byBjb21wbGV0ZSBieSB1c2luZyBcXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuXG5BbHRlcm5hdGl2ZWx5LCBpZiBib3RoIHlvdSBhbmQgdGhlIGNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnNcbndoZW4gdGhlIHdvcmtmbG93IGZpbmlzaGVzLCBhbmQgY2F1c2luZyBjbGllbnRzIHRvIHJlY2VpdmUgZXJyb3JzLCB0aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnlcbnBhc3NpbmcgYW4gb3B0aW9uIHdoZW4gc2V0dGluZyB0aGUgaGFuZGxlcjpcblxcYHdvcmtmbG93LnNldEhhbmRsZXIobXlVcGRhdGUsIG15VXBkYXRlSGFuZGxlciwge3VuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LkFCQU5ET059KTtcXGAuYFxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGAke21lc3NhZ2V9IFRoZSBmb2xsb3dpbmcgdXBkYXRlcyB3ZXJlIHVuZmluaXNoZWQgKGFuZCB3YXJuaW5ncyB3ZXJlIG5vdCBkaXNhYmxlZCBmb3IgdGhlaXIgaGFuZGxlcik6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgaGFuZGxlckV4ZWN1dGlvbnMubWFwKChleCkgPT4gKHsgbmFtZTogZXgubmFtZSwgaWQ6IGV4LmlkIH0pKVxuICApfWA7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYSBzaWduYWwgaGFuZGxlciB3YXMgc3RpbGwgcnVubmluZy4gVGhpcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB3b3JrIHRoYXQgdGhlXG5zaWduYWwgaGFuZGxlciB3YXMgZG9pbmcuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nXG5cXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuIEFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGVcbmNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnMgd2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsXG50aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnkgcGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVNpZ25hbCwgbXlTaWduYWxIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG5cbiAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IG5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBleCBvZiBoYW5kbGVyRXhlY3V0aW9ucykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZXMuZ2V0KGV4Lm5hbWUpIHx8IDA7XG4gICAgbmFtZXMuc2V0KGV4Lm5hbWUsIGNvdW50ICsgMSk7XG4gIH1cblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyBzaWduYWxzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBBcnJheS5mcm9tKG5hbWVzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgY291bnRdKSA9PiAoeyBuYW1lLCBjb3VudCB9KSlcbiAgKX1gO1xufVxuIiwiaW1wb3J0IHsgU2RrQ29tcG9uZW50IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IHR5cGUgU2luaywgdHlwZSBTaW5rcywgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb250aW51ZUFzTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjdXJyZW50VXBkYXRlSW5mbywgaW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL3dvcmtmbG93JztcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0xvZ2dlciBleHRlbmRzIFNpbmsge1xuICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICpcbiAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGV4dGVuZHMgU2lua3Mge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAgICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICAgKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gICAqL1xuICBkZWZhdWx0V29ya2VyTG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNpbmtzSW50ZXJuYWwgZXh0ZW5kcyBTaW5rcyB7XG4gIF9fdGVtcG9yYWxfbG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuY29uc3QgbG9nZ2VyU2luayA9IHByb3h5U2lua3M8TG9nZ2VyU2lua3NJbnRlcm5hbD4oKS5fX3RlbXBvcmFsX2xvZ2dlcjtcblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBieSB0aGUgU0RLIGxvZ2dlciB0byBleHRyYWN0IGEgdGltZXN0YW1wIGZyb20gbG9nIGF0dHJpYnV0ZXMuXG4gKiBBbHNvIGRlZmluZWQgaW4gYHdvcmtlci9sb2dnZXIudHNgIC0gaW50ZW50aW9uYWxseSBub3Qgc2hhcmVkLlxuICovXG5jb25zdCBMb2dUaW1lc3RhbXAgPSBTeW1ib2wuZm9yKCdsb2dfdGltZXN0YW1wJyk7XG5cbi8qKlxuICogRGVmYXVsdCB3b3JrZmxvdyBsb2dnZXIuXG4gKlxuICogVGhpcyBsb2dnZXIgaXMgcmVwbGF5LWF3YXJlIGFuZCB3aWxsIG9taXQgbG9nIG1lc3NhZ2VzIG9uIHdvcmtmbG93IHJlcGxheS4gTWVzc2FnZXMgZW1pdHRlZCBieSB0aGlzIGxvZ2dlciBhcmVcbiAqIGZ1bm5lbGxlZCB0aHJvdWdoIGEgc2luayB0aGF0IGZvcndhcmRzIHRoZW0gdG8gdGhlIGxvZ2dlciByZWdpc3RlcmVkIG9uIHtAbGluayBSdW50aW1lLmxvZ2dlcn0uXG4gKlxuICogQXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbiBjb250ZXh0IGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGFzIG1ldGFkYXRhIG9uIGV2ZXJ5IGxvZ1xuICogZW50cmllcy4gQW4gZXh0cmEgYHNka0NvbXBvbmVudGAgbWV0YWRhdGEgYXR0cmlidXRlIGlzIGFsc28gYWRkZWQsIHdpdGggdmFsdWUgYHdvcmtmbG93YDsgdGhpcyBjYW4gYmUgdXNlZCBmb3JcbiAqIGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIGVudHJpZXMgZnVydGhlciBkb3duc3RyZWFtLlxuICpcbiAqIFRvIGN1c3RvbWl6ZSBsb2cgYXR0cmlidXRlcywgcmVnaXN0ZXIgYSB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3J9IHRoYXQgaW50ZXJjZXB0cyB0aGVcbiAqIGBnZXRMb2dBdHRyaWJ1dGVzKClgIG1ldGhvZC5cbiAqXG4gKiBOb3RpY2UgdGhhdCBzaW5jZSBzaW5rcyBhcmUgdXNlZCB0byBwb3dlciB0aGlzIGxvZ2dlciwgYW55IGxvZyBhdHRyaWJ1dGVzIG11c3QgYmUgdHJhbnNmZXJhYmxlIHZpYSB0aGVcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX1cbiAqIEFQSS5cbiAqXG4gKiBOT1RFOiBTcGVjaWZ5aW5nIGEgY3VzdG9tIGxvZ2dlciB0aHJvdWdoIHtAbGluayBkZWZhdWx0U2lua30gb3IgYnkgbWFudWFsbHkgcmVnaXN0ZXJpbmcgYSBzaW5rIG5hbWVkXG4gKiBgZGVmYXVsdFdvcmtlckxvZ2dlcmAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2c6IFdvcmtmbG93TG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAoWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSBhcyBBcnJheTxrZXlvZiBXb3JrZmxvd0xvZ2dlcj4pLm1hcCgobGV2ZWwpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgbGV2ZWwsXG4gICAgICAobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5sb2coLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICAgICAgY29uc3QgZ2V0TG9nQXR0cmlidXRlcyA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2dldExvZ0F0dHJpYnV0ZXMnLCAoYSkgPT4gYSk7XG4gICAgICAgIHJldHVybiBsb2dnZXJTaW5rW2xldmVsXSEobWVzc2FnZSwge1xuICAgICAgICAgIC8vIEluamVjdCB0aGUgY2FsbCB0aW1lIGluIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBhcyBleHBlY3RlZCBieSB0aGUgd29ya2VyIGxvZ2dlci5cbiAgICAgICAgICBbTG9nVGltZXN0YW1wXTogYWN0aXZhdG9yLmdldFRpbWVPZkRheSgpLFxuICAgICAgICAgIHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtmbG93LFxuICAgICAgICAgIC4uLmdldExvZ0F0dHJpYnV0ZXMod29ya2Zsb3dMb2dBdHRyaWJ1dGVzKGFjdGl2YXRvci5pbmZvKSksXG4gICAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICBdO1xuICB9KVxuKSBhcyBhbnk7XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoZm46ICgpID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgbG9nLmRlYnVnKCdXb3JrZmxvdyBzdGFydGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gIGNvbnN0IHAgPSBmbigpLnRoZW4oXG4gICAgKHJlcykgPT4ge1xuICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb21wbGV0ZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIC8vIEF2b2lkIHVzaW5nIGluc3RhbmNlb2YgY2hlY2tzIGluIGNhc2UgdGhlIG1vZHVsZXMgdGhleSdyZSBkZWZpbmVkIGluIGxvYWRlZCBtb3JlIHRoYW4gb25jZSxcbiAgICAgIC8vIGUuZy4gYnkgamVzdCBvciB3aGVuIG11bHRpcGxlIHZlcnNpb25zIGFyZSBpbnN0YWxsZWQuXG4gICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbXBsZXRlZCBhcyBjYW5jZWxsZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbnRpbnVlZCBhcyBuZXcnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nLndhcm4oJ1dvcmtmbG93IGZhaWxlZCcsIHsgZXJyb3IsIHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgKTtcbiAgLy8gQXZvaWQgc2hvd2luZyB0aGlzIGludGVyY2VwdG9yIGluIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gIHVudHJhY2tQcm9taXNlKHApO1xuICByZXR1cm4gcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWFwIG9mIGF0dHJpYnV0ZXMgdG8gYmUgc2V0IF9ieSBkZWZhdWx0XyBvbiBsb2cgbWVzc2FnZXMgZm9yIGEgZ2l2ZW4gV29ya2Zsb3cuXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgV29ya2Zsb3cgY29udGV4dCAoZWcuIGJ5IHRoZSB3b3JrZXIgaXRzZWxmKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93TG9nQXR0cmlidXRlcyhpbmZvOiBXb3JrZmxvd0luZm8pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgbmFtZXNwYWNlOiBpbmZvLm5hbWVzcGFjZSxcbiAgICB0YXNrUXVldWU6IGluZm8udGFza1F1ZXVlLFxuICAgIHdvcmtmbG93SWQ6IGluZm8ud29ya2Zsb3dJZCxcbiAgICBydW5JZDogaW5mby5ydW5JZCxcbiAgICB3b3JrZmxvd1R5cGU6IGluZm8ud29ya2Zsb3dUeXBlLFxuICB9O1xuICBpZiAoaW5Xb3JrZmxvd0NvbnRleHQoKSkge1xuICAgIGNvbnN0IHVwZGF0ZUluZm8gPSBjdXJyZW50VXBkYXRlSW5mbygpO1xuICAgIGlmICh1cGRhdGVJbmZvKSB7XG4gICAgICAvLyBBZGQgdXBkYXRlIGluZm8gaWYgaXQgZXhpc3RzXG4gICAgICBhdHRyaWJ1dGVzWyd1cGRhdGVJZCddID0gdXBkYXRlSW5mby5pZDtcbiAgICAgIGF0dHJpYnV0ZXNbJ3VwZGF0ZU5hbWUnXSA9IHVwZGF0ZUluZm8ubmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF0dHJpYnV0ZXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIE1ldHJpY0NvdW50ZXIsXG4gIE1ldHJpY0dhdWdlLFxuICBNZXRyaWNIaXN0b2dyYW0sXG4gIE1ldHJpY01ldGVyLFxuICBNZXRyaWNUYWdzLFxuICBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB0eXBlIHsgU2luaywgU2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHByb3h5U2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHdvcmtmbG93SW5mbyB9IGZyb20gJy4vd29ya2Zsb3cnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuY2xhc3MgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0NvdW50ZXIobmFtZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgY3JlYXRlSGlzdG9ncmFtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW0obmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVHYXVnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNHYXVnZSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNHYXVnZShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljTWV0ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0NvdW50ZXIgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljQ291bnRlciB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5hZGRNZXRyaWNDb3VudGVyVmFsdWUodGhpcy5uYW1lLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCBleHRyYVRhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljQ291bnRlciB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0NvdW50ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbSBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHJlY29yZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljSGlzdG9ncmFtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLnJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW1gKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0dhdWdlIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHNldCh2YWx1ZTogbnVtYmVyLCB0YWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljR2F1Z2UgdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1Npbmsuc2V0TWV0cmljR2F1Z2VWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCB0YWdzID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljR2F1Z2VgKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIE5vdGU6IGdpdmVuIHRoYXQgZm9yd2FyZGluZyBtZXRyaWNzIG91dHNpZGUgb2YgdGhlIHNhbmJveCBjYW4gYmUgcXVpdGUgY2hhdHR5IGFuZCBhZGQgbm9uXG4vLyBuZWdsaWdlYWJsZSBvdmVyaGVhZCwgd2UgZWFnZXJseSBjaGVjayBmb3IgYGlzUmVwbGF5aW5nYCBhbmQgY29tcGxldGVseSBza2lwIGRvaW5nIHNpbmtcbi8vIGNhbGxzIGlmIHdlIGFyZSByZXBsYXlpbmcuXG5jb25zdCBtZXRyaWNTaW5rID0gcHJveHlTaW5rczxNZXRyaWNTaW5rcz4oKS5fX3RlbXBvcmFsX21ldHJpY3M7XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbWV0cmljcyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXIuXG4gKlxuICogVGhlc2Ugc2luayBmdW5jdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB3b3JrZmxvdyBjb2RlOyBpbnN0ZWFkLFxuICogZGV2ZWxvcGVycyBzaG91bGQgdXNlIHRoZSBgbWV0cmljTWV0ZXJgIG9iamVjdCBleHBvc2VkIHRvIHdvcmtmbG93IGNvZGUgYnkgdGhlIFNESywgd2hpY2hcbiAqIHByb3ZpZGVzIGFuIEFQSSB0aGF0IGlzIGVhc2llciB0byB3b3JrIHdpdGguXG4gKlxuICogVGhpcyBzaW5rIGludGVyZmFjZSBpcyBhbHNvIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB1c2VyLlxuICpcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9tZXRyaWNzOiBXb3JrZmxvd01ldHJpY01ldGVyO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd01ldHJpY01ldGVyIGV4dGVuZHMgU2luayB7XG4gIGFkZE1ldHJpY0NvdW50ZXJWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHNldE1ldHJpY0dhdWdlVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBNZXRyaWNNZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGVtaXQgbWV0cmljcyBmcm9tIHdpdGhpbiBhIFdvcmtmbG93LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ldHJpY01ldGVyOiBNZXRyaWNNZXRlciA9IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncy5jb21wb3NlKFxuICBuZXcgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwoKSxcbiAgKCkgPT4ge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5tZXRyaWNNZXRlciBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICBjb25zdCBnZXRNZXRyaWNUYWdzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TWV0cmljVGFncycsIChhKSA9PiBhKTtcblxuICAgIGNvbnN0IGluZm8gPSBhY3RpdmF0b3IuaW5mbztcbiAgICByZXR1cm4gZ2V0TWV0cmljVGFncyh7XG4gICAgICAvLyBuYW1lc3BhY2UgYW5kIHRhc2tRdWV1ZSB3aWxsIGJlIGFkZGVkIGJ5IHRoZSBXb3JrZXJcbiAgICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gICAgfSk7XG4gIH0sXG4gIHRydWVcbik7XG4iLCJpbXBvcnQgdHlwZSAqIGFzIG5leHVzIGZyb20gJ25leHVzLXJwYyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyB1c2VyTWV0YWRhdGFUb1BheWxvYWQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3VzZXItbWV0YWRhdGEnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgU3RhcnROZXh1c09wZXJhdGlvbklucHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuLyoqXG4gKiBBIE5leHVzIGNsaWVudCBmb3IgaW52b2tpbmcgTmV4dXMgT3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnQ8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBleGVjdXRlT3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj47XG5cbiAgLy8gVE9ETyhuZXh1cy9wb3N0LWluaXRpYWwtcmVsZWFzZSk6IFJldmlzaXQgdGhlIFwiT3BlcmF0aW9uIFByb3BlcnR5IE5hbWVcIiB0ZXJtaW5vbG9neSxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWZsZWN0IGluIHRoZSBOZXh1cyBSUEMgU0RLLlxuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQW4gT3BlcmF0aW9uJ3MgX3Byb3BlcnR5IG5hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGRlZmluZSB0aGF0IE9wZXJhdGlvbiBpblxuICAgKiB0aGUge0BsaW5rIG5leHVzLlNlcnZpY2VEZWZpbml0aW9ufSBvYmplY3Q7IGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgKiBpZiBvbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSB7QGxpbmsgbmV4dXMuT3BlcmF0aW9uRGVmaW5pdGlvbn0gb2JqZWN0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj47XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIHRha2luZyBhIHtAbGluayBuZXh1cy5vcGVyYXRpb259LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIE9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgIG9wOiBPLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxPPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnRPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj4+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzT3BlcmF0aW9uSGFuZGxlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBPcGVyYXRpb24ncyBzZXJ2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW9uIHRva2VuIGFzIHNldCBieSB0aGUgT3BlcmF0aW9uJ3MgaGFuZGxlci4gTWF5IGJlIGVtcHR5IGlmIHRoZSBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2FpdCBmb3IgT3BlcmF0aW9uIGNvbXBsZXRpb24gYW5kIGdldCBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9uczxUPiB7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2U6IFQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+KFxuICBvcHRpb25zOiBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+XG4pOiBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICBjbGFzcyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4gaW1wbGVtZW50cyBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICAgIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nIHwgVFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XSxcbiAgICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dPixcbiAgICAgIG9wZXJhdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICAgICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0aGlzLnN0YXJ0T3BlcmF0aW9uKG9wZXJhdGlvbiwgaW5wdXQsIG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBvcE5hbWUgPVxuICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gLy8gQ2FzdGluZyBhcyBzdHJpbmcgdG8gY292ZXIgdXAgdGhlIGZhY3QgdGhhdCBgb3BOYW1lYCBtaWdodCBiZSB1bmRlZmluZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYGV4ZWN1dGVgIHdpbGwgcHJvZHVjZSBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmUuTk9UX0ZPVU5EYC5cbiAgICAgICAgICAgIChvcHRpb25zLnNlcnZpY2Uub3BlcmF0aW9uc1tvcGVyYXRpb25dPy5uYW1lIGFzIHN0cmluZylcbiAgICAgICAgICA6IG9wZXJhdGlvbi5uYW1lO1xuXG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5uZXh1c09wZXJhdGlvbisrO1xuXG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nLFxuICAgICAgICBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBpbnRlcmNlcHRvciByZXR1cm5zIGEgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Piwgd2l0aCB0aGUgcmVzdWx0IHByb21pc2UgY29udGFpbmVkXG4gICAgICAvLyBpbiB0aGF0IE91dHB1dCBvYmplY3QuIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIHJlc3VsdCBwcm9taXNlL2NvbXBsZXRpb24gZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHVudGlsIHRoZSBTdGFydE5leHVzT3BlcmF0aW9uIGV2ZW50IGlzIHJlY2VpdmVkLiBUaGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBkaWQgaW5cbiAgICAgIC8vIENoaWxkV29ya2Zsb3csIGJ1dCBpcyBtdWNoIGNsZWFuZXIgZnJvbSB0aGUgaW50ZXJjZXB0b3JzIHBvaW50IG9mIHZpZXcuXG4gICAgICBjb25zdCB7IHRva2VuLCByZXN1bHQ6IHJlc3VsdFByb21pc2UgfSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgc2VydmljZTogb3B0aW9ucy5zZXJ2aWNlLm5hbWUsXG4gICAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBvcGVyYXRpb25PcHRpb25zPy5jYW5jZWxsYXRpb25UeXBlID8/ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc2VxLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBhc3luYyByZXN1bHQoKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZSBhcyBuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz47XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTmV4dXNTZXJ2aWNlQ2xpZW50SW1wbDxUPigpO1xufVxuXG5mdW5jdGlvbiBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXIoe1xuICBpbnB1dCxcbiAgZW5kcG9pbnQsXG4gIHNlcnZpY2UsXG4gIG9wdGlvbnMsXG4gIG9wZXJhdGlvbixcbiAgc2VxLFxuICBoZWFkZXJzLFxufTogU3RhcnROZXh1c09wZXJhdGlvbklucHV0KTogUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIHR5cGU6ICd3b3JrZmxvdycgYXMgY29uc3QsXG4gICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgd29ya2Zsb3dJZDogYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dJZCxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGVkID1cbiAgICAgICAgICAgICFhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5oYXMoc2VxKSAmJlxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvbkNvbXBsZXRlLmhhcyhzZXEpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxOZXh1c09wZXJhdGlvbjogeyBzZXEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY2FuY2VsIG90aGVyd2lzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2NoZWR1bGVOZXh1c09wZXJhdGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIG5leHVzSGVhZGVyOiBoZWFkZXJzLFxuICAgICAgICBpbnB1dDogYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKGlucHV0LCBjb250ZXh0KSxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlKG9wdGlvbnM/LmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uU3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lczpcbiAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE5leHVzIE9wZXJhdGlvblxuICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgT3BlcmF0aW9uJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFdvcmtmbG93XG4gKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIG9wZXJhdGlvbidzIHJlc3VsdCBwcm9taXNlIGZhaWwgd2l0aCBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmVgLFxuICogICB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAqIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBPcGVyYXRpb24gY2FsbCB3YXMgbWFkZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIE5leHVzIE9wZXJhdGlvbiwgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydFxuICAgKiBjYW5jZWxsYXRpb24gdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogSW5pdGlhdGUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmb3IgdGhlIE5leHVzIG9wZXJhdGlvbiBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvbiB0b1xuICAgKiB0aGUgY2FsbGVyLiBOb3RlIHRoYXQgaXQgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkIHRvIHRoZSBvcGVyYXRpb24gaWZcbiAgICogY2FsbGluZyB3b3JrZmxvdyBleGl0cyBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGRvbmUuIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGNhbmNlbGxhdGlvbiBpc1xuICAgKiBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBXb3JrZmxvdy1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgT3BlcmF0aW9uIEhhbmRsZXIuIEluIHBhcnRpY3VsYXIsIGVpdGhlciB0aGVcbiAgICogT3BlcmF0aW9uIG9yIHRoZSBXb3JrZmxvdyBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIE9wZXJhdGlvbiBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5LCBidXQgdGhlIFdvcmtmbG93IHRoaW5rcyBpdCB3YXMgY2FuY2VsbGVkLlxuICAgKlxuICAgKiBUbyBndWFyYW50ZWUgdGhhdCB0aGUgT3BlcmF0aW9uIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIE9wZXJhdGlvbiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3YXMgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIE9wZXJhdGlvbi5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlID1cbiAgKHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGVdO1xuXG5jb25zdCBbZW5jb2RlTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAwLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDEsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMixcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuIiwiLy8gLi4vcGFja2FnZS5qc29uIGlzIG91dHNpZGUgb2YgdGhlIFRTIHByb2plY3Qgcm9vdERpciB3aGljaCBjYXVzZXMgVFMgdG8gY29tcGxhaW4gYWJvdXQgdGhpcyBpbXBvcnQuXG4vLyBXZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UgdGhlIHJvb3REaXIgYmVjYXVzZSBpdCBtZXNzZXMgdXAgdGhlIG91dHB1dCBzdHJ1Y3R1cmUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBkZWZhdWx0IHBrZyBhcyB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH07XG4iLCJleHBvcnQgZnVuY3Rpb24gZmlsbFdpdGhSYW5kb20ocmFuZG9tOiAoKSA9PiBudW1iZXIsIGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlc1tpXSA9IE1hdGguZmxvb3IocmFuZG9tKCkgKiAweDEwMCk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXVpZDRGcm9tUmFuZG9tKHJhbmRvbTogKCkgPT4gbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaG8gPSAobjogbnVtYmVyLCBwOiBudW1iZXIpID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KHAsICcwJyk7XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7XG4gIHZpZXcuc2V0VWludDMyKDAsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDQsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDgsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDEyLCAocmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQ4KDYsICh2aWV3LmdldFVpbnQ4KDYpICYgMHhmKSB8IDB4NDApO1xuICB2aWV3LnNldFVpbnQ4KDgsICh2aWV3LmdldFVpbnQ4KDgpICYgMHgzZikgfCAweDgwKTtcbiAgcmV0dXJuIGAke2hvKHZpZXcuZ2V0VWludDMyKDApLCA4KX0tJHtobyh2aWV3LmdldFVpbnQxNig0KSwgNCl9LSR7aG8odmlldy5nZXRVaW50MTYoNiksIDQpfS0ke2hvKFxuICAgIHZpZXcuZ2V0VWludDE2KDgpLFxuICAgIDRcbiAgKX0tJHtobyh2aWV3LmdldFVpbnQzMigxMCksIDgpfSR7aG8odmlldy5nZXRVaW50MTYoMTQpLCA0KX1gO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9lbmNvZGluZyc7XG5cbmNvbnN0IFJBTkRPTV9TVFJFQU1fU0VFRF9QUkVGSVggPSBBcnJheS5mcm9tKGVuY29kZSgndGVtcG9yYWwtd29ya2Zsb3ctcmFuZG9tLXN0cmVhbS12MScpKTtcblxuZnVuY3Rpb24gZW5jb2RlVTMyKHZhbHVlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBbKHZhbHVlID4+PiAyNCkgJiAweGZmLCAodmFsdWUgPj4+IDE2KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gOCkgJiAweGZmLCB2YWx1ZSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlQWxlYVNlZWQoc2VlZDogbnVtYmVyW10sIG5hbWVzcGFjZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBuYW1lc3BhY2VCeXRlcyA9IEFycmF5LmZyb20oZW5jb2RlKG5hbWVzcGFjZSkpO1xuICByZXR1cm4gW1xuICAgIC4uLlJBTkRPTV9TVFJFQU1fU0VFRF9QUkVGSVgsXG4gICAgLi4uZW5jb2RlVTMyKHNlZWQubGVuZ3RoKSxcbiAgICAuLi5zZWVkLFxuICAgIC4uLmVuY29kZVUzMihuYW1lc3BhY2VCeXRlcy5sZW5ndGgpLFxuICAgIC4uLm5hbWVzcGFjZUJ5dGVzLFxuICBdO1xufVxuIiwiaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdG9yIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgZmlsbFdpdGhSYW5kb20sIHV1aWQ0RnJvbVJhbmRvbSB9IGZyb20gJy4vcmFuZG9tLWhlbHBlcnMnO1xuXG4vKipcbiAqIEEgZGV0ZXJtaW5pc3RpYyBQUk5HIHN0cmVhbSBzY29wZWQgdG8gdGhlIGN1cnJlbnQgV29ya2Zsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFdvcmtmbG93IGNvZGUgYWxyZWFkeSBnZXRzIGEgZGV0ZXJtaW5pc3RpYyBkZWZhdWx0IHN0cmVhbSB0aHJvdWdoIGBNYXRoLnJhbmRvbSgpYC5cbiAqIFRoaXMgaW50ZXJmYWNlIGV4cG9zZXMgYWRkaXRpb25hbCBuYW1lZCBzdHJlYW1zIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSB0aGUgd29ya2Zsb3dcbiAqIHNlZWQgd2l0aG91dCBjb25zdW1pbmcgdGhhdCBkZWZhdWx0IHN0cmVhbS4gUmVwZWF0ZWQgY2FsbHMgdG9cbiAqIHtAbGluayBnZXRSYW5kb21TdHJlYW19IHdpdGggdGhlIHNhbWUgbmFtZSByZWZlciB0byB0aGUgc2FtZSBsb2dpY2FsIHN0cmVhbSBzdGF0ZVxuICogZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbiwgYW5kIHRoYXQgc3RhdGUgaXMgcHJlc2VydmVkIGFjcm9zcyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgY2FzZSBpcyB3b3JrZmxvdyBwbHVnaW5zIGFuZCBpbnRlcmNlcHRvcnMgdGhhdCBuZWVkIHByaXZhdGUsXG4gKiByZXBsYXktc3RhYmxlIGVudHJvcHkgd2l0aG91dCBwZXJ0dXJiaW5nIHVzZXIgd29ya2Zsb3cgcmFuZG9tbmVzcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIG1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIC8qKlxuICAgKiBEcmF3IHRoZSBuZXh0IGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBudW1iZXIgZnJvbSB0aGlzIHN0cmVhbS5cbiAgICpcbiAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBNYXRoLnJhbmRvbSgpYCwgYnV0IGlzb2xhdGVkIGZyb20gdGhlIHdvcmtmbG93J3MgbWFpblxuICAgKiByYW5kb20gc3RyZWFtIGFuZCBmcm9tIG90aGVyIG5hbWVkIHN0cmVhbXMuXG4gICAqL1xuICByYW5kb20oKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGRldGVybWluaXN0aWMgVVVJRHY0IGJhY2tlZCBieSB0aGlzIHN0cmVhbS5cbiAgICovXG4gIHV1aWQ0KCk6IHN0cmluZztcblxuICAvKipcbiAgICogRmlsbCBhIGJ5dGUgYXJyYXkgZGV0ZXJtaW5pc3RpY2FsbHkgZnJvbSB0aGlzIHN0cmVhbS5cbiAgICovXG4gIGZpbGwoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBSdW4gYGZuYCB3aXRoIHNjb3BlZCB3b3JrZmxvdy1yYW5kb20gaGVscGVycyBzdWNoIGFzIGBNYXRoLnJhbmRvbSgpYCBhbmQgYHV1aWQ0KClgXG4gICAqIHJvdXRlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzY29wZWQgb3ZlcnJpZGUgQVBJIGZvciB3b3JrZmxvdyByYW5kb20gc3RyZWFtcy4gSXQgaXMgaW50ZW5kZWQgZm9yXG4gICAqIGJvdW5kZWQgcGx1Z2luL2ludGVyY2VwdG9yIGNvZGUgdGhhdCBuZWVkcyBleGlzdGluZyBjYWxscyB0byBgTWF0aC5yYW5kb20oKWAgb3JcbiAgICogYHV1aWQ0KClgIHRvIHVzZSB0aGlzIHN0cmVhbSB3aXRob3V0IHBlcnR1cmJpbmcgdGhlIHdvcmtmbG93J3MgZGVmYXVsdCByYW5kb21cbiAgICogc2VxdWVuY2Ugb3IgYW55IG90aGVyIG5hbWVkIHN0cmVhbS5cbiAgICpcbiAgICogVGhlIG92ZXJyaWRlIGZvbGxvd3MgYXN5bmMgY29udGludWF0aW9ucyBzdGFydGVkIGJ5IGBmbmAuIFdvcmtmbG93IGludGVyY2VwdG9yXG4gICAqIGBuZXh0KC4uLilgIGNvbnRpbnVhdGlvbnMgcmVzdG9yZSB0aGUgZG93bnN0cmVhbSB3b3JrZmxvdyByYW5kb20gc2NvcGUgYmVmb3JlXG4gICAqIGVudGVyaW5nIHRoZSByZXN0IG9mIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBvciB3b3JrZmxvdyBjb2RlLCBzbyBhIHRlbXBvcmFyeVxuICAgKiBwbHVnaW4gc2NvcGUgZG9lcyBub3QgbGVhayBkb3duc3RyZWFtIHVubGVzcyB0aGF0IGRvd25zdHJlYW0gY29kZSBleHBsaWNpdGx5XG4gICAqIGVzdGFibGlzaGVzIGl0cyBvd24gc2NvcGUuXG4gICAqXG4gICAqIFByZWZlciBleHBsaWNpdCBgc3RyZWFtLnJhbmRvbSgpYCAvIGBzdHJlYW0udXVpZDQoKWAgY2FsbHMgd2hlbiB0aGF0IGlzIHByYWN0aWNhbC5cbiAgICogVXNlIGBzdHJlYW0ud2l0aCguLi4pYCB3aGVuIGEgdGVtcG9yYXJ5IHNjb3BlZCBvdmVycmlkZSBpcyB0aGUgYmV0dGVyIGZpdCwgb3JcbiAgICogd2hlbiB5b3Ugd2FudCB0byBrZWVwIHRoZSBzdHJlYW0gaW5zdGFuY2UgaW4gbW9kdWxlIHNjb3BlIGFuZCByZXVzZSBpdCBkaXJlY3RseS5cbiAgICovXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUO1xufVxuXG5jbGFzcyBBY3RpdmF0b3JSYW5kb21TdHJlYW0gaW1wbGVtZW50cyBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmF0b3I6IEFjdGl2YXRvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICkge31cblxuICByYW5kb20oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmF0b3IuZ2V0TmFtZWRSYW5kb20odGhpcy5uYW1lKSgpO1xuICB9XG5cbiAgdXVpZDQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXVpZDRGcm9tUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCkpO1xuICB9XG5cbiAgZmlsbChieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBmaWxsV2l0aFJhbmRvbSgoKSA9PiB0aGlzLnJhbmRvbSgpLCBieXRlcyk7XG4gIH1cblxuICB3aXRoPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdG9yLndpdGhDdXJyZW50UmFuZG9tKHRoaXMsIGZuKTtcbiAgfVxufVxuXG5jbGFzcyBEZWZhdWx0V29ya2Zsb3dSYW5kb21TdHJlYW0gaW1wbGVtZW50cyBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIHJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dSYW5kb20gbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJykucmFuZG9tKCk7XG4gIH1cblxuICB1dWlkNCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkNEZyb21SYW5kb20oKCkgPT4gdGhpcy5yYW5kb20oKSk7XG4gIH1cblxuICBmaWxsKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGZpbGxXaXRoUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCksIGJ5dGVzKTtcbiAgfVxuXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dSYW5kb20gbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJyk7XG4gICAgcmV0dXJuIGFjdGl2YXRvci53aXRoQ3VycmVudFJhbmRvbSh0aGlzLCBmbik7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBkZXRlcm1pbmlzdGljIHJhbmRvbSBzdHJlYW0gZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGlzIGV4cG9zZXMgdGhlIHNhbWUgdW5kZXJseWluZyBzZXF1ZW5jZSB1c2VkIGJ5IHdvcmtmbG93LWxldmVsIGBNYXRoLnJhbmRvbSgpYFxuICogd2hlbiBubyBuYW1lZCBvdmVycmlkZSBpcyBhY3RpdmUuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIHBsdWdpbi9pbnRlcmNlcHRvciBjb2RlXG4gKiB0aGF0IHdhbnRzIGFuIGV4cGxpY2l0IGhhbmRsZSB0byB0aGUgbWFpbiB3b3JrZmxvdyByYW5kb20gc3RyZWFtLCBpbmNsdWRpbmcgZnJvbVxuICogaW5zaWRlIGEgdGVtcG9yYXJ5IG5hbWVkIHNjb3BlIGVzdGFibGlzaGVkIGJ5IGFub3RoZXIgYFdvcmtmbG93UmFuZG9tU3RyZWFtYC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIG1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93UmFuZG9tOiBXb3JrZmxvd1JhbmRvbVN0cmVhbSA9IG5ldyBEZWZhdWx0V29ya2Zsb3dSYW5kb21TdHJlYW0oKTtcblxuLyoqXG4gKiBHZXQgYSBuYW1lZCBkZXRlcm1pbmlzdGljIHJhbmRvbSBzdHJlYW0gZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBOYW1lZCBzdHJlYW1zIGFyZSBkZXJpdmVkIGZyb20gdGhlIHdvcmtmbG93IHNlZWQgYW5kIGEgc3RhYmxlIHN0cmVhbSBuYW1lLFxuICogd2l0aG91dCBjb25zdW1pbmcgdGhlIHdvcmtmbG93J3MgZGVmYXVsdCBgTWF0aC5yYW5kb20oKWAgc3RyZWFtLiBSZXBlYXRlZFxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgd2l0aGluIGEgd29ya2Zsb3cgZXhlY3V0aW9uIHJlZmVyIHRvIHRoZSBzYW1lXG4gKiBsb2dpY2FsIHN0cmVhbSBzdGF0ZSwgaW5jbHVkaW5nIGFjcm9zcyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgZW50cnkgcG9pbnQgZm9yIHdvcmtmbG93IHBsdWdpbnMgYW5kIGludGVyY2VwdG9ycyB0aGF0XG4gKiBuZWVkIHRoZWlyIG93biBkZXRlcm1pbmlzdGljIGVudHJvcHkuIFVzZSBzdGFibGUgcGFja2FnZS0gb3IgbW9kdWxlLXN0eWxlXG4gKiBuYW1lcyBzbyB0aGUgc3RyZWFtIGlkZW50aXR5IHJlbWFpbnMgcmVwbGF5LXNhZmUsIHRoZW4ga2VlcCB0aGUgcmV0dXJuZWRcbiAqIGBXb3JrZmxvd1JhbmRvbVN0cmVhbWAgYXJvdW5kIGFuZCBjYWxsIGl0cyBtZXRob2RzIGRpcmVjdGx5LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgbWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tU3RyZWFtKG5hbWU6IHN0cmluZyk6IFdvcmtmbG93UmFuZG9tU3RyZWFtIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmdldFJhbmRvbVN0cmVhbSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICByZXR1cm4gbmV3IEFjdGl2YXRvclJhbmRvbVN0cmVhbShhY3RpdmF0b3IsIG5hbWUpO1xufVxuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgV29ya2Zsb3cgZW5kIG9mIHRoZSBzaW5rcyBtZWNoYW5pc20uXG4gKlxuICogU2lua3MgYXJlIGEgbWVjaGFuaXNtIGZvciBleHBvcnRpbmcgZGF0YSBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZVxuICogTm9kZS5qcyBlbnZpcm9ubWVudCwgdGhleSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFdvcmtmbG93IGhhcyBubyB3YXkgdG9cbiAqIGNvbW11bmljYXRlIHdpdGggdGhlIG91dHNpZGUgV29ybGQuXG4gKlxuICogU2lua3MgYXJlIHR5cGljYWxseSB1c2VkIGZvciBleHBvcnRpbmcgbG9ncywgbWV0cmljcyBhbmQgdHJhY2VzIG91dCBmcm9tIHRoZVxuICogV29ya2Zsb3cuXG4gKlxuICogU2luayBmdW5jdGlvbnMgbWF5IG5vdCByZXR1cm4gdmFsdWVzIHRvIHRoZSBXb3JrZmxvdyBpbiBvcmRlciB0byBwcmV2ZW50XG4gKiBicmVha2luZyBkZXRlcm1pbmlzbS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBBbnkgZnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBiZSB1c2VkIGZvciBTaW5rIGZ1bmN0aW9ucyBhcyBsb25nIGFzIHRoZSByZXR1cm4gdHlwZSBpcyBgdm9pZGAuXG4gKlxuICogV2hlbiBjYWxsaW5nIGEgU2luayBmdW5jdGlvbiwgYXJndW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCB1c2luZ1xuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbCN3b3JrZXJfdGhyZWFkc19wb3J0X3Bvc3RtZXNzYWdlX3ZhbHVlX3RyYW5zZmVybGlzdCB8IHBvc3RNZXNzYWdlfS5cblxuICogVGhpcyBjb25zdHJhaW5zIHRoZSBhcmd1bWVudCB0eXBlcyB0byBwcmltaXRpdmVzIChleGNsdWRpbmcgU3ltYm9scykuXG4gKi9cbmV4cG9ydCB0eXBlIFNpbmtGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcblxuLyoqIEEgbWFwcGluZyBvZiBuYW1lIHRvIGZ1bmN0aW9uLCBkZWZpbmVzIGEgc2luZ2xlIHNpbmsgKGUuZy4gbG9nZ2VyKSAqL1xuZXhwb3J0IHR5cGUgU2luayA9IFJlY29yZDxzdHJpbmcsIFNpbmtGdW5jdGlvbj47XG4vKipcbiAqIFdvcmtmbG93IFNpbmsgYXJlIGEgbWFwcGluZyBvZiBuYW1lIHRvIHtAbGluayBTaW5rfVxuICovXG5leHBvcnQgdHlwZSBTaW5rcyA9IFJlY29yZDxzdHJpbmcsIFNpbms+O1xuXG4vKipcbiAqIENhbGwgaW5mb3JtYXRpb24gZm9yIGEgU2lua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmtDYWxsIHtcbiAgaWZhY2VOYW1lOiBzdHJpbmc7XG4gIGZuTmFtZTogc3RyaW5nO1xuICBhcmdzOiBhbnlbXTtcbiAgd29ya2Zsb3dJbmZvOiBXb3JrZmxvd0luZm87XG59XG5cbi8qKlxuICogR2V0IGEgcmVmZXJlbmNlIHRvIFNpbmtzIGZvciBleHBvcnRpbmcgZGF0YSBvdXQgb2YgdGhlIFdvcmtmbG93LlxuICpcbiAqIFRoZXNlIFNpbmtzICoqbXVzdCoqIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgV29ya2VyIGluIG9yZGVyIGZvciB0aGlzXG4gKiBtZWNoYW5pc20gdG8gd29yay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5U2lua3MsIFNpbmtzIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGludGVyZmFjZSBNeVNpbmtzIGV4dGVuZHMgU2lua3Mge1xuICogICBsb2dnZXI6IHtcbiAqICAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gKiAgICAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAqICAgfTtcbiAqIH1cbiAqXG4gKiBjb25zdCB7IGxvZ2dlciB9ID0gcHJveHlTaW5rczxNeURlcGVuZGVuY2llcz4oKTtcbiAqIGxvZ2dlci5pbmZvKCdzZXR0aW5nIHVwJyk7XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAqICAgICAgIGxvZ2dlci5pbmZvKFwiaGV5IGhvXCIpO1xuICogICAgICAgbG9nZ2VyLmVycm9yKFwibGV0cyBnb1wiKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5U2lua3M8VCBleHRlbmRzIFNpbmtzPigpOiBUIHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICB7fSxcbiAgICB7XG4gICAgICBnZXQoXywgaWZhY2VOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgICAge30sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZ2V0KF8sIGZuTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgICAgICAgICAgICAgICAnUHJveGllZCBzaW5rcyBmdW5jdGlvbnMgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFjdGl2YXRvci5zaW5rQ2FsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBpZmFjZU5hbWU6IGlmYWNlTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICBmbk5hbWU6IGZuTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAvLyBTaW5rIGZ1bmN0aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBpbW1lZGlhdGVseS4gTWFrZSBhIGNsb25lIG9mIHRoZSBzaW5rJ3MgYXJncywgc28gdGhhdCBmdXJ0aGVyIG11dGF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlc2Ugb2JqZWN0cyBkb24ndCBjb3JydXB0IHRoZSBhcmdzIHRoYXQgdGhlIHNpbmsgZnVuY3Rpb24gd2lsbCByZWNlaXZlLiBPbmx5IGF2YWlsYWJsZSBmcm9tIG5vZGUgMTcuXG4gICAgICAgICAgICAgICAgICBhcmdzOiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZSA/IChnbG9iYWxUaGlzIGFzIGFueSkuc3RydWN0dXJlZENsb25lKGFyZ3MpIDogYXJncyxcbiAgICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRvci5pbmZvIGlzIGludGVybmFsbHkgY29weS1vbi13cml0ZS4gVGhpcyBlbnN1cmUgdGhhdCBhbnkgZnVydGhlciBtdXRhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSB3b3JrZmxvdyBzdGF0ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJlc2VudCBhY3RpdmF0aW9uIHdpbGwgbm90IGNvcnJ1cHQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvd0luZm8gc3RhdGUgdGhhdCBnZXRzIHBhc3NlZCB3aGVuIHRoZSBzaW5rIGZ1bmN0aW9uIGFjdHVhbGx5IGdldHMgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJbmZvOiBhY3RpdmF0b3IuaW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9XG4gICkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgcHJvbWlzZSBmcm9tIGJlaW5nIHRyYWNrZWQgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5IHB1cnBvc2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnRyYWNrUHJvbWlzZShwcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gbWF5YmVHZXRBY3RpdmF0b3IoKT8ucHJvbWlzZVN0YWNrU3RvcmU7XG4gIGlmICghc3RvcmUpIHJldHVybjtcbiAgc3RvcmUuY2hpbGRUb1BhcmVudC5kZWxldGUocHJvbWlzZSk7XG4gIHN0b3JlLnByb21pc2VUb1N0YWNrLmRlbGV0ZShwcm9taXNlKTtcbn1cbiIsImltcG9ydCB7IENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuXG4vKipcbiAqIEEgYFByb21pc2VMaWtlYCBoZWxwZXIgd2hpY2ggZXhwb3NlcyBpdHMgYHJlc29sdmVgIGFuZCBgcmVqZWN0YCBtZXRob2RzLlxuICpcbiAqIFRyaWdnZXIgaXMgQ2FuY2VsbGF0aW9uU2NvcGUtYXdhcmU6IGl0IGlzIGxpbmtlZCB0byB0aGUgY3VycmVudCBzY29wZSBvblxuICogY29uc3RydWN0aW9uIGFuZCB0aHJvd3Mgd2hlbiB0aGF0IHNjb3BlIGlzIGNhbmNlbGxlZC5cbiAqXG4gKiBVc2VmdWwgZm9yIGUuZy4gd2FpdGluZyBmb3IgdW5ibG9ja2luZyBhIFdvcmtmbG93IGZyb20gYSBTaWduYWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBkZWZpbmVTaWduYWwsIHNldEhhbmRsZXIsIHNsZWVwLCBUcmlnZ2VyIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGNvbnN0IGNvbXBsZXRlVXNlckludGVyYWN0aW9uID0gZGVmaW5lU2lnbmFsKCdjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbicpO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0T25Vc2VyKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGNvbnN0IHVzZXJJbnRlcmFjdGlvbiA9IG5ldyBUcmlnZ2VyPGJvb2xlYW4+KCk7XG4gKlxuICogICAvLyBwcm9ncmFtbWF0aWNhbGx5IHJlc29sdmUgVHJpZ2dlclxuICogICBzZXRIYW5kbGVyKGNvbXBsZXRlVXNlckludGVyYWN0aW9uLCAoKSA9PiB1c2VySW50ZXJhY3Rpb24ucmVzb2x2ZSh0cnVlKSk7XG4gKlxuICogICBjb25zdCB1c2VySW50ZXJhY3RlZCA9IGF3YWl0IFByb21pc2UucmFjZShbdXNlckludGVyYWN0aW9uLCBzbGVlcCgnMzAgZGF5cycpXSk7XG4gKiAgIGlmICghdXNlckludGVyYWN0ZWQpIHtcbiAqICAgICBhd2FpdCBzZW5kUmVtaW5kZXJFbWFpbCh1c2VySWQpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXI8VD4gaW1wbGVtZW50cyBQcm9taXNlTGlrZTxUPiB7XG4gIC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgcmVhbGl6ZSB0aGF0IHRoZSBwcm9taXNlIGV4ZWN1dG9yIGlzIHJ1biBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlc29sdmU6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8VD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApOiBQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3luY0xvY2FsU3RvcmFnZSBhcyBBTFMgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIFVwZGF0ZVNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVTY29wZSB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBVcGRhdGVTY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHNjb3BlIGFzIGN1cnJlbnQgYW5kIHJ1biB0aGUgdXBkYXRlIGhhbmRsZXIgYGZuYC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCBmbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgdXBkYXRlIHNjb3BlLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKTogVXBkYXRlU2NvcGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCk7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBVcGRhdGVTY29wZSh7IGlkLCBuYW1lIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB1cGRhdGVXaXRoSW5mbzxUPihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgaWQsIG5hbWUgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlOiBBTFM8VXBkYXRlU2NvcGU+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG4iLCIvKipcbiAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgdGhlIFdvcmtlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBXb3JrZmxvdyBpc29sYXRlXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIElsbGVnYWxTdGF0ZUVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnLi9pbnRlcmNlcHRvci1jb21wb3NpdGlvbic7XG5pbXBvcnQgeyBzZXRBY3RpdmF0b3IsIGdldEFjdGl2YXRvciwgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLy8gRXhwb3J0IHRoZSB0eXBlIGZvciB1c2Ugb24gdGhlIFwid29ya2VyXCIgc2lkZVxuZXhwb3J0IHsgUHJvbWlzZVN0YWNrU3RvcmUgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBpc29sYXRlIHJ1bnRpbWUuXG4gKlxuICogU2V0cyByZXF1aXJlZCBpbnRlcm5hbCBzdGF0ZSBhbmQgaW5zdGFudGlhdGVzIHRoZSB3b3JrZmxvdyBhbmQgaW50ZXJjZXB0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFJ1bnRpbWUob3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbmV3IEFjdGl2YXRvcih7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpbmZvOiBmaXhQcm90b3R5cGVzKHtcbiAgICAgIC4uLm9wdGlvbnMuaW5mbyxcbiAgICAgIHVuc2FmZTogeyAuLi5vcHRpb25zLmluZm8udW5zYWZlLCBub3c6IE9yaWdpbmFsRGF0ZS5ub3cgfSxcbiAgICB9KSxcbiAgfSk7XG4gIC8vIFRoZXJlJ3Mgb25lIGFjdGl2YXRvciBwZXIgd29ya2Zsb3cgaW5zdGFuY2UsIHNldCBpdCBnbG9iYWxseSBvbiB0aGUgY29udGV4dC5cbiAgLy8gV2UgZG8gdGhpcyBiZWZvcmUgaW1wb3J0aW5nIGFueSB1c2VyIGNvZGUgc28gdXNlciBjb2RlIGNhbiBzdGF0aWNhbGx5IHJlZmVyZW5jZSBAdGVtcG9yYWxpby93b3JrZmxvdyBmdW5jdGlvbnNcbiAgLy8gYXMgd2VsbCBhcyBEYXRlIGFuZCBNYXRoLnJhbmRvbS5cbiAgc2V0QWN0aXZhdG9yKGFjdGl2YXRvcik7XG5cbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIHBheWxvYWRDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21QYXlsb2FkQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXInKS5wYXlsb2FkQ29udmVydGVyO1xuICAgIC8vIFRoZSBgcGF5bG9hZENvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIgPSBjdXN0b21QYXlsb2FkQ29udmVydGVyO1xuICAgIH1cbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIGZhaWx1cmVDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21GYWlsdXJlQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fZmFpbHVyZV9jb252ZXJ0ZXInKS5mYWlsdXJlQ29udmVydGVyO1xuICAgIC8vIFRoZSBgZmFpbHVyZUNvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLmZhaWx1cmVDb252ZXJ0ZXIgPSBjdXN0b21GYWlsdXJlQ29udmVydGVyO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW1wb3J0V29ya2Zsb3dzLCBpbXBvcnRJbnRlcmNlcHRvcnMgfSA9IGdsb2JhbFRoaXMuX19URU1QT1JBTF9fO1xuICAgIGlmIChpbXBvcnRXb3JrZmxvd3MgPT09IHVuZGVmaW5lZCB8fCBpbXBvcnRJbnRlcmNlcHRvcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBidW5kbGUgZGlkIG5vdCByZWdpc3RlciBpbXBvcnQgaG9va3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpbXBvcnRJbnRlcmNlcHRvcnMoKTtcbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGZhY3Rvcnk6IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9IG1vZC5pbnRlcmNlcHRvcnM7XG4gICAgICBpZiAoZmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3dzIGludGVyY2VwdG9yczogZXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IGdvdDogJyR7ZmFjdG9yeX0nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gZmFjdG9yeSgpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmluYm91bmQucHVzaCguLi4oaW50ZXJjZXB0b3JzLmluYm91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMub3V0Ym91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMucHVzaCguLi4oaW50ZXJjZXB0b3JzLmludGVybmFscyA/PyBbXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9IGltcG9ydFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHdvcmtmbG93Rm4gPSBtb2RbYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlXTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2Zsb3dGbiA9IG1vZFsnZGVmYXVsdCddO1xuXG4gICAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSB3b3JrZmxvd0ZuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRXb3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSBkZWZhdWx0V29ya2Zsb3dGbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlscyA9XG4gICAgICAgIHdvcmtmbG93Rm4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gJ25vIHN1Y2ggZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnkgdGhlIHdvcmtmbG93IGJ1bmRsZSdcbiAgICAgICAgICA6IGBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHt0eXBlb2Ygd29ya2Zsb3dGbn0nYDtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtmbG93IG9mIHR5cGUgJyR7YWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlfSc6ICR7ZGV0YWlsc31gKTtcbiAgICB9XG4gICAgaWYgKGlzV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zKGFjdGl2YXRvci53b3JrZmxvdykpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFjdGl2YXRvci52ZXJzaW9uaW5nQmVoYXZpb3IgPSBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy52ZXJzaW9uaW5nQmVoYXZpb3I7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMgPVxuICAgICAgICAgIGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zLmZhaWx1cmVFeGNlcHRpb25UeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyID0gYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENvcmUgd29uJ3Qgc2VuZCBhbiBldmljdGlvbiBqb2IgYWZ0ZXIgYW4gZWFybHkgZXJyb3IsIHNvIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZ1xuICAgICAgLy8gZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0LiBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHJlc291cmNlIGxlYWtzLlxuICAgICAgZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKF9pbm5lckVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3IgZGlzcG9zaW5nIG9mIGFjdGl2YXRvciwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIE9iamVjdHMgdHJhbnNmZXJlZCB0byB0aGUgVk0gZnJvbSBvdXRzaWRlIGhhdmUgcHJvdG90eXBlcyBiZWxvbmdpbmcgdG8gdGhlXG4gKiBvdXRlciBjb250ZXh0LCB3aGljaCBtZWFucyB0aGF0IGluc3RhbmNlb2Ygd29uJ3Qgd29yayBpbnNpZGUgdGhlIFZNLiBUaGlzXG4gKiBmdW5jdGlvbiByZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdCwgYW5kIHJlY3JlYXRlIHNvbWVcbiAqIG9mIHRoZXNlIG9iamVjdHMgKG5vdGFibHkgQXJyYXksIERhdGUgYW5kIE9iamVjdHMpLlxuICovXG5mdW5jdGlvbiBmaXhQcm90b3R5cGVzPFg+KG9iajogWCk6IFgge1xuICBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopPy5jb25zdHJ1Y3Rvcj8ubmFtZSkge1xuICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSgob2JqIGFzIEFycmF5PHVua25vd24+KS5tYXAoZml4UHJvdG90eXBlcykpIGFzIFg7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iaiBhcyB1bmtub3duIGFzIERhdGUpIGFzIFg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pOiBbc3RyaW5nLCBhbnldID0+IFtrLCBmaXhQcm90b3R5cGVzKHYpXSkpIGFzIFg7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSB3b3JrZmxvdy4gT3IgdG8gYmUgZXhhY3QsIF9jb21wbGV0ZV8gaW5pdGlhbGl6YXRpb24sIGFzIG1vc3QgcGFydCBoYXMgYmVlbiBkb25lIGluIGNvbnN0cnVjdG9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoaW5pdGlhbGl6ZVdvcmtmbG93Sm9iOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IuaW5pdGlhbGl6ZVdvcmtmbG93KGluaXRpYWxpemVXb3JrZmxvd0pvYik7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gYSBjaHVuayBvZiBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90aWNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgYXN5bmMgYW5kIHJ1bnMgX2luc2lkZV8gdGhlIFZNIGNvbnRleHQuIFRoZXJlZm9yZSwgbm8gbWljcm90YXNrXG4gKiB3aWxsIGdldCBleGVjdXRlZCBfd2hpbGVfIHRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlOyB0aGV5IHdpbGwgaG93ZXZlciBnZXQgZXhlY3V0ZWQgX2FmdGVyXyB0aGlzXG4gKiBmdW5jdGlvbiByZXR1cm5zIChpLmUuIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzIGluIHRoZSBWTSB3aWxsIGdldCBleGVjdXRlZCBiZWZvcmUgZXhlY3V0aW9uXG4gKiByZXN1bWVzIG91dCBvZiB0aGUgVk0sIGluIGB2bS1zaGFyZWQudHM6YWN0aXZhdGUoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb24sIGJhdGNoSW5kZXggPSAwKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGludGVyY2VwdCA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdhY3RpdmF0ZScsICh7IGFjdGl2YXRpb24gfSkgPT4ge1xuICAgICAgLy8gQ2FzdCBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIHdoaWNoIGhhcyB0aGUgYHZhcmlhbnRgIGF0dHJpYnV0ZS5cbiAgICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBhY3RpdmF0aW9uIGlzIGEgcHJvdG8gY2xhc3MuXG4gICAgICBjb25zdCBqb2JzID0gYWN0aXZhdGlvbi5qb2JzIGFzIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbXTtcblxuICAgICAgLy8gSW5pdGlhbGl6YXRpb24gd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LCBidXQgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBzdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dKb2IgPSBqb2JzWzBdPy52YXJpYW50ID09PSAnaW5pdGlhbGl6ZVdvcmtmbG93JyA/IGpvYnMuc2hpZnQoKT8uaW5pdGlhbGl6ZVdvcmtmbG93IDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgIGlmIChqb2IudmFyaWFudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBqb2IudmFyaWFudCB0byBiZSBkZWZpbmVkJyk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGpvYltqb2IudmFyaWFudF07XG4gICAgICAgIGlmICghdmFyaWFudCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgam9iLiR7am9iLnZhcmlhbnR9IHRvIGJlIHNldGApO1xuXG4gICAgICAgIGFjdGl2YXRvcltqb2IudmFyaWFudF0odmFyaWFudCBhcyBhbnkgLyogVFMgY2FuJ3QgaW5mZXIgdGhpcyB0eXBlICovKTtcblxuICAgICAgICBpZiAoam9iLnZhcmlhbnQgIT09ICdxdWVyeVdvcmtmbG93JykgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0V29ya2Zsb3dKb2IpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYlR5cGVzOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iWyd2YXJpYW50J11bXSA9IFtcbiAgICAgICAgICAnaW5pdGlhbGl6ZVdvcmtmbG93JyxcbiAgICAgICAgICAnc2lnbmFsV29ya2Zsb3cnLFxuICAgICAgICAgICdkb1VwZGF0ZScsXG4gICAgICAgICAgJ2NhbmNlbFdvcmtmbG93JyxcbiAgICAgICAgICAndXBkYXRlUmFuZG9tU2VlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChqb2JzLnNvbWUoKGpvYikgPT4gIXNhZmVKb2JUeXBlcy5pbmNsdWRlcyhqb2IudmFyaWFudCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdSZWNlaXZlZCBib3RoIGluaXRpYWxpemVXb3JrZmxvdyBhbmQgbm9uLXNpZ25hbC9ub24tdXBkYXRlIGpvYnMgaW4gdGhlIHNhbWUgYWN0aXZhdGlvbjogJyArXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGpvYnMubWFwKChqb2IpID0+IGpvYi52YXJpYW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aXZhdG9yLnN0YXJ0V29ya2Zsb3coc3RhcnRXb3JrZmxvd0pvYik7XG5cbiAgICAgICAgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcmNlcHQoeyBhY3RpdmF0aW9uLCBiYXRjaEluZGV4IH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29uY2x1ZGUgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYWN0aXZhdGlvbiBqb2JzIGFuZCBxdWV1ZWQgbWljcm90YXNrcy5cbiAqXG4gKiBBY3RpdmF0aW9uIGZhaWx1cmVzIGFyZSBoYW5kbGVkIGluIHRoZSBtYWluIE5vZGUuanMgaXNvbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBjb3Jlc2RrLndvcmtmbG93X2NvbXBsZXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IucmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk7XG4gICAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2NvbmNsdWRlQWN0aXZhdGlvbicsIChpbnB1dCkgPT4gaW5wdXQpO1xuICAgIGNvbnN0IGFjdGl2YXRpb25Db21wbGV0aW9uID0gYWN0aXZhdG9yLmNvbmNsdWRlQWN0aXZhdGlvbigpO1xuICAgIGNvbnN0IHsgY29tbWFuZHMgfSA9IGludGVyY2VwdCh7IGNvbW1hbmRzOiBhY3RpdmF0aW9uQ29tcGxldGlvbi5jb21tYW5kcyB9KTtcbiAgICBpZiAoYWN0aXZhdG9yLmNvbXBsZXRlZCkge1xuICAgICAgYWN0aXZhdG9yLndhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcnVuSWQ6IGFjdGl2YXRvci5pbmZvLnJ1bklkLFxuICAgICAgc3VjY2Vzc2Z1bDoge1xuICAgICAgICAuLi5hY3RpdmF0aW9uQ29tcGxldGlvbixcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yKGFjdGl2YXRpb25Db21wbGV0aW9uLnZlcnNpb25pbmdCZWhhdmlvciksXG4gICAgICB9LFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29wIHRocm91Z2ggYWxsIGJsb2NrZWQgY29uZGl0aW9ucywgZXZhbHVhdGUgYW5kIHVuYmxvY2sgaWYgcG9zc2libGUuXG4gKlxuICogQHJldHVybnMgbnVtYmVyIG9mIHVuYmxvY2tlZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTogbnVtYmVyIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgbGV0IG51bVVuYmxvY2tlZCA9IDA7XG4gICAgZm9yICg7Oykge1xuICAgICAgYWN0aXZhdG9yLm1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk7XG4gICAgICBjb25zdCBwcmV2VW5ibG9ja2VkID0gbnVtVW5ibG9ja2VkO1xuICAgICAgZm9yIChjb25zdCBbc2VxLCBjb25kXSBvZiBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChjb25kLmZuKCkpIHtcbiAgICAgICAgICBjb25kLnJlc29sdmUoKTtcbiAgICAgICAgICBudW1VbmJsb2NrZWQrKztcbiAgICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIGRlbGV0ZSBlbGVtZW50cyBkdXJpbmcgbWFwIGl0ZXJhdGlvblxuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZXZVbmJsb2NrZWQgPT09IG51bVVuYmxvY2tlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bVVuYmxvY2tlZDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBIYW5kbGUgZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkZXN0cm95aW5nXG4vLyB0aGUgc2FuZGJveCB2bSwgd2hpY2ggbWF5IHBvc3NpYmx5IGJlIHJldXNlZCBpZiBgcmV1c2VWOENvbnRleHRgIGlzIHRydWUpLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcG9zZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdkaXNwb3NlJywgYXN5bmMgKCkgPT4ge30pO1xuICAgICAgZGlzcG9zZSh7fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgIH1cblxuICAgIC8vIERlc3RydWN0b3JzIGFyZSBydW4gb3V0c2lkZSBvZiBpbnRlcmNlcHRvcnMsIGJlY2F1c2UgaW50ZXJjZXB0b3JzIHRoZW1zZWx2ZXMgb2Z0ZW4gcmVseVxuICAgIC8vIG9uIG9iamVjdHMgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZCAobm90YWJseSBBc3luY0xvY2FsU3RvcmFnZSBpbnN0YW5jZXMpLCBhbmQgYmVjYXVzZSB3ZVxuICAgIC8vIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVzb3VyY2VzIGdldCBjbGVhbmVkIHVwIGV2ZW4gaWYgYW4gaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLlxuICAgIC8vIE9ubHkgdGhlIGZpcnN0IGVycm9yIChpZiBhbnkpIGlzIHJldGhyb3duLlxuICAgIGZvciAoY29uc3QgZGVzdHJ1Y3RvciBvZiBhY3RpdmF0b3Iud29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnMuc3BsaWNlKDApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGFjdGl2YXRvciBpcyBubyBsb25nZXIgdmFsaWQgcGFzdCB0aGlzIHBvaW50LlxuICAgIHNldEFjdGl2YXRvcih1bmRlZmluZWQpO1xuICB9XG59XG5cbi8vIERlc3Ryb3kgdGhlIHNhbmRib3ggVk0gKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRpc3Bvc2luZyBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQpLlxuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGhhdmUgYmVlbiBkaXNwb3NlZCBmaXJzdCcpO1xuXG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkZXN0cnVjdG9yIG9mIGdsb2JhbFRoaXMuX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM/LnNwbGljZSgwKSA/PyBbXSkge1xuICAgIHRyeSB7XG4gICAgICBkZXN0cnVjdG9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyhvYmo6IGFueSk6IG9iaiBpcyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT4ge1xuICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24ob2JqLCAnd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucycpO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0LFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgV2l0aFdvcmtmbG93QXJncyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXBpbGVSZXRyeVBvbGljeSxcbiAgY29tcGlsZVByaW9yaXR5LFxuICBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgZXh0cmFjdFdvcmtmbG93VHlwZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIG1hcFRvUGF5bG9hZHMsXG4gIGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHRvUGF5bG9hZHNXaXRoQ29udGV4dCxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgdXNlck1ldGFkYXRhVG9QYXlsb2FkIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi91c2VyLW1ldGFkYXRhJztcbmltcG9ydCB7XG4gIGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2NvbnZlcnRlci9wYXlsb2FkLXNlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi92ZXJzaW9uaW5nLWludGVudC1lbnVtJztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9UcywgcmVxdWlyZWRUc1RvTXMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgdGhyb3dJZlJlc2VydmVkTmFtZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvcmVzZXJ2ZWQnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUsIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUlucHV0LFxuICBMb2NhbEFjdGl2aXR5SW5wdXQsXG4gIFNpZ25hbFdvcmtmbG93SW5wdXQsXG4gIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0LFxuICBUaW1lcklucHV0LFxuICBUaW1lck9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmltcG9ydCB0eXBlIHtcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRGVmYXVsdFNpZ25hbEhhbmRsZXIsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbiAgSGFuZGxlcixcbiAgUXVlcnlIYW5kbGVyT3B0aW9ucyxcbiAgU2lnbmFsSGFuZGxlck9wdGlvbnMsXG4gIFVwZGF0ZUhhbmRsZXJPcHRpb25zLFxuICBXb3JrZmxvd0luZm8sXG4gIFVwZGF0ZUluZm8sXG4gIERlZmF1bHRVcGRhdGVIYW5kbGVyLFxuICBEZWZhdWx0UXVlcnlIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENvbnRpbnVlQXNOZXcsXG4gIGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExvY2FsQWN0aXZpdHlEb0JhY2tvZmYgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCwgZ2V0QWN0aXZhdG9yLCBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgdXVpZDRGcm9tUmFuZG9tIH0gZnJvbSAnLi9yYW5kb20taGVscGVycyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuZnVuY3Rpb24gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHdvcmtmbG93SWQ6IGluZm8ud29ya2Zsb3dJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0V29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dChpbmZvOiBXb3JrZmxvd0luZm8sIHdvcmtmbG93SWQ6IHN0cmluZyk6IFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd3b3JrZmxvdycsXG4gICAgbmFtZXNwYWNlOiBpbmZvLm5hbWVzcGFjZSxcbiAgICB3b3JrZmxvd0lkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0KFxuICBpbmZvOiBXb3JrZmxvd0luZm8sXG4gIGFjdGl2aXR5SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaXNMb2NhbDogYm9vbGVhblxuKTogQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2FjdGl2aXR5JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIGFjdGl2aXR5SWQsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICAgIGlzTG9jYWwsXG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBkZWZhdWx0IHZhbHVlcyBvZiBgd29ya2Zsb3dJZGAgYW5kIGBjYW5jZWxsYXRpb25UeXBlYCB0byBnaXZlbiB3b3JrZmxvdyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9uczxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICBvcHRzOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMge1xuICBjb25zdCB7IGFyZ3MsIHdvcmtmbG93SWQsIC4uLnJlc3QgfSA9IG9wdHM7XG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogd29ya2Zsb3dJZCA/PyB1dWlkNCgpLFxuICAgIGFyZ3M6IChhcmdzID8/IFtdKSBhcyB1bmtub3duW10sXG4gICAgY2FuY2VsbGF0aW9uVHlwZTogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVELFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogUHVzaCBhIHN0YXJ0VGltZXIgY29tbWFuZCBpbnRvIHN0YXRlIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHRpbWVyTmV4dEhhbmRsZXIoeyBzZXEsIGR1cmF0aW9uTXMsIG9wdGlvbnMgfTogVGltZXJJbnB1dCkge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgY29uc3QgY29udGV4dCA9IGN1cnJlbnRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLmRlbGV0ZShzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICBjYW5jZWxUaW1lcjoge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBzdGFydFRvRmlyZVRpbWVvdXQ6IG1zVG9UcyhkdXJhdGlvbk1zKSxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucz8uc3VtbWFyeSwgdW5kZWZpbmVkLCBjb250ZXh0KSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzIHNsZWVwLlxuICpcbiAqIFNjaGVkdWxlcyBhIHRpbWVyIG9uIHRoZSBUZW1wb3JhbCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciBvciAwLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgdGltZXIgb3B0aW9ucyBmb3IgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogRHVyYXRpb24sIG9wdGlvbnM/OiBUaW1lck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNsZWVwKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJyk7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuXG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBNYXRoLm1heCgxLCBtc1RvTnVtYmVyKG1zKSk7XG5cbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ3N0YXJ0VGltZXInLCB0aW1lck5leHRIYW5kbGVyKTtcblxuICByZXR1cm4gZXhlY3V0ZSh7XG4gICAgZHVyYXRpb25NcyxcbiAgICBzZXEsXG4gICAgb3B0aW9ucyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0ID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1aXJlZCBlaXRoZXIgc2NoZWR1bGVUb0Nsb3NlVGltZW91dCBvciBzdGFydFRvQ2xvc2VUaW1lb3V0Jyk7XG4gIH1cbn1cblxuLy8gVXNlIHNhbWUgdmFsaWRhdGlvbiB3ZSB1c2UgZm9yIG5vcm1hbCBhY3Rpdml0aWVzXG5jb25zdCB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zID0gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnM7XG5cbi8qKlxuICogUHVzaCBhIHNjaGVkdWxlQWN0aXZpdHkgY29tbWFuZCBpbnRvIGFjdGl2YXRvciBhY2N1bXVsYXRvciBhbmQgcmVnaXN0ZXIgY29tcGxldGlvblxuICovXG5mdW5jdGlvbiBzY2hlZHVsZUFjdGl2aXR5TmV4dEhhbmRsZXIoeyBvcHRpb25zLCBhcmdzLCBoZWFkZXJzLCBzZXEsIGFjdGl2aXR5VHlwZSB9OiBBY3Rpdml0eUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgYWN0aXZpdHlJZCA9IG9wdGlvbnMuYWN0aXZpdHlJZCA/PyBgJHtzZXF9YDtcbiAgY29uc3QgY29udGV4dCA9IGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIGFjdGl2aXR5SWQsIGZhbHNlKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUFjdGl2aXR5OiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgYWN0aXZpdHlJZCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgaGVhcnRiZWF0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIGRvTm90RWFnZXJseUV4ZWN1dGU6ICEob3B0aW9ucy5hbGxvd0VhZ2VyRGlzcGF0Y2ggPz8gdHJ1ZSksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8gY29tcGlsZVByaW9yaXR5KG9wdGlvbnMucHJpb3JpdHkpIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLnN1bW1hcnksIHVuZGVmaW5lZCwgY29udGV4dCksXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBhcmdzLFxuICBoZWFkZXJzLFxuICBzZXEsXG4gIGFjdGl2aXR5VHlwZSxcbiAgYXR0ZW1wdCxcbiAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG59OiBMb2NhbEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGNvbnN0IGFjdGl2aXR5SWQgPSBgJHtzZXF9YDtcbiAgY29uc3QgY29udGV4dCA9IGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIGFjdGl2aXR5SWQsIHRydWUpO1xuICAvLyBFYWdlcmx5IGZhaWwgdGhlIGxvY2FsIGFjdGl2aXR5ICh3aGljaCB3aWxsIGluIHR1cm4gZmFpbCB0aGUgd29ya2Zsb3cgdGFzay5cbiAgLy8gRG8gbm90IGZhaWwgb24gcmVwbGF5IHdoZXJlIHRoZSBsb2NhbCBhY3Rpdml0aWVzIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBvbiB0aGUgcmVwbGF5IHdvcmtlci5cbiAgaWYgKCFhY3RpdmF0b3IuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgIWFjdGl2YXRvci5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcy5oYXMoYWN0aXZpdHlUeXBlKSkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgTG9jYWwgYWN0aXZpdHkgb2YgdHlwZSAnJHthY3Rpdml0eVR5cGV9JyBub3QgcmVnaXN0ZXJlZCBvbiB3b3JrZXJgKTtcbiAgfVxuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5oYXMoc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IHJlc29sdmVkIG9yIG5ldmVyIHNjaGVkdWxlZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgcmVxdWVzdENhbmNlbExvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbiAgICAgICAgYWN0aXZpdHlJZCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBsb2NhbFJldHJ5VGhyZXNob2xkOiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmxvY2FsUmV0cnlUaHJlc2hvbGQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgY29udGV4dCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IGNvbnRleHQgPSB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB3b3JrZmxvd0lkKTtcbiAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZSA9ICFhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLmhhcyhzZXEpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZSkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgY2FuY2VsQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbjogeyBjaGlsZFdvcmtmbG93U2VxOiBzZXEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBOb3RoaW5nIHRvIGNhbmNlbCBvdGhlcndpc2VcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICB3b3JrZmxvd1R5cGUsXG4gICAgICAgIGlucHV0OiB0b1BheWxvYWRzV2l0aENvbnRleHQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIG9wdGlvbnMuYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93UnVuVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXQpLFxuICAgICAgICB3b3JrZmxvd1Rhc2tUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93VGFza1RpbWVvdXQpLFxuICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSwgLy8gTm90IGNvbmZpZ3VyYWJsZVxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6IGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeShvcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeSksXG4gICAgICAgIHBhcmVudENsb3NlUG9saWN5OiBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeShvcHRpb25zLnBhcmVudENsb3NlUG9saWN5KSxcbiAgICAgICAgY3JvblNjaGVkdWxlOiBvcHRpb25zLmNyb25TY2hlZHVsZSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczpcbiAgICAgICAgICBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMgfHwgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICAgID8geyBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMsIG9wdGlvbnMudHlwZWRTZWFyY2hBdHRyaWJ1dGVzKSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbywgY29udGV4dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8gY29tcGlsZVByaW9yaXR5KG9wdGlvbnMucHJpb3JpdHkpIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKFxuICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgb3B0aW9ucz8uc3RhdGljU3VtbWFyeSxcbiAgICAgICAgb3B0aW9ucz8uc3RhdGljRGV0YWlscyxcbiAgICAgICAgY29udGV4dFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd1N0YXJ0LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBXZSBjb25zdHJ1Y3QgYSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2hpbGQgV29ya2Zsb3cgYmVmb3JlIHdlIGtub3dcbiAgLy8gaWYgdGhlIFdvcmtmbG93IGNvZGUgd2lsbCBhd2FpdCBpdCB0byBjYXB0dXJlIHRoZSByZXN1bHQgaW4gY2FzZSBpdCBkb2VzLlxuICBjb25zdCBjb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQ2hhaW4gc3RhcnQgUHJvbWlzZSByZWplY3Rpb24gdG8gdGhlIGNvbXBsZXRlIFByb21pc2UuXG4gICAgdW50cmFja1Byb21pc2Uoc3RhcnRQcm9taXNlLmNhdGNoKHJlamVjdCkpO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93Q29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIGNvbnRleHQsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB0YXJnZXRXb3JrZmxvd0lkID0gdGFyZ2V0LnR5cGUgPT09ICdleHRlcm5hbCcgPyB0YXJnZXQud29ya2Zsb3dFeGVjdXRpb24ud29ya2Zsb3dJZCA6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQ7XG4gIGNvbnN0IGNvbnRleHQgPSB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB0YXJnZXRXb3JrZmxvd0lkISk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHsgY2FuY2VsU2lnbmFsV29ya2Zsb3c6IHsgc2VxIH0gfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2lnbmFsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGFyZ3M6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHNpZ25hbE5hbWUsXG4gICAgICAgIC4uLih0YXJnZXQudHlwZSA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIC4uLnRhcmdldC53b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiB0YXJnZXQuY2hpbGRXb3JrZmxvd0lkLFxuICAgICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LnNldChzZXEsIHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBpbiB0aGUgcmV0dXJuIHR5cGUgb2YgcHJveHkgbWV0aG9kcyB0byBtYXJrIHRoYXQgYW4gYXR0cmlidXRlIG9uIHRoZSBzb3VyY2UgdHlwZSBpcyBub3QgYSBtZXRob2QuXG4gKlxuICogQHNlZSB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKiBAc2VlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9XG4gKiBAc2VlIHtAbGluayBwcm94eUxvY2FsQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IGNvbnN0IE5vdEFuQWN0aXZpdHlNZXRob2QgPSBTeW1ib2wuZm9yKCdfX1RFTVBPUkFMX05PVF9BTl9BQ1RJVklUWV9NRVRIT0QnKTtcblxuLyoqXG4gKiBUeXBlIGhlbHBlciB0aGF0IHRha2VzIGEgdHlwZSBgVGAgYW5kIHRyYW5zZm9ybXMgYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qge0BsaW5rIEFjdGl2aXR5RnVuY3Rpb259IHRvXG4gKiB7QGxpbmsgTm90QW5BY3Rpdml0eU1ldGhvZH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBwcm94eUFjdGl2aXRpZXN9IHRvIGdldCB0aGlzIGNvbXBpbGUtdGltZSBlcnJvcjpcbiAqXG4gKiBgYGB0c1xuICogaW50ZXJmYWNlIE15QWN0aXZpdGllcyB7XG4gKiAgIHZhbGlkKGlucHV0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG4gKiAgIGludmFsaWQoaW5wdXQ6IG51bWJlcik6IG51bWJlcjtcbiAqIH1cbiAqXG4gKiBjb25zdCBhY3QgPSBwcm94eUFjdGl2aXRpZXM8TXlBY3Rpdml0aWVzPih7IHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc1bScgfSk7XG4gKlxuICogYXdhaXQgYWN0LnZhbGlkKHRydWUpO1xuICogYXdhaXQgYWN0LmludmFsaWQoKTtcbiAqIC8vIF4gVFMgY29tcGxhaW5zIHdpdGg6XG4gKiAvLyAocHJvcGVydHkpIGludmFsaWREZWZpbml0aW9uOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZFxuICogLy8gVGhpcyBleHByZXNzaW9uIGlzIG5vdCBjYWxsYWJsZS5cbiAqIC8vIFR5cGUgJ1N5bWJvbCcgaGFzIG5vIGNhbGwgc2lnbmF0dXJlcy4oMjM0OSlcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eUludGVyZmFjZUZvcjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBBY3Rpdml0eUZ1bmN0aW9uID8gQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VCBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24+ID0gVCAmIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGl2aXR5LCBvdmVycmlkaW5nIGl0cyBleGlzdGluZyBvcHRpb25zIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJncyBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIFRoZSBsb2NhbCBhY3Rpdml0eSBjb3VudGVycGFydCB0byB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogUnVuIHRoZSBsb2NhbCBhY3Rpdml0eSwgb3ZlcnJpZGluZyBpdHMgZXhpc3Rpbmcgb3B0aW9ucyB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJncyBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zLCBhcmdzOiBQYXJhbWV0ZXJzPFQ+KTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pjtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBBY3Rpdml0eU9wdGlvbnN9LlxuICpcbiAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gc2V0dXAgQWN0aXZpdGllcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkgfCBQcm94eX0gZm9yXG4gKiAgICAgICAgIHdoaWNoIGVhY2ggYXR0cmlidXRlIGlzIGEgY2FsbGFibGUgQWN0aXZpdHkgZnVuY3Rpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSAnLi4vYWN0aXZpdGllcyc7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIG1vZHVsZSBleHBvcnRzXG4gKiBjb25zdCB7IGh0dHBHZXQsIG90aGVyQWN0aXZpdHkgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMzAgbWludXRlcycsXG4gKiB9KTtcbiAqXG4gKiAvLyBVc2UgYWN0aXZpdGllcyB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICogY29uc3QgcmVzdWx0MSA9IGF3YWl0IGh0dHBHZXQoJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICpcbiAqIC8vIE92ZXJyaWRlIG9wdGlvbnMgZm9yIHNwZWNpZmljIGFjdGl2aXR5IGNhbGxzXG4gKiBjb25zdCByZXN1bHQyID0gYXdhaXQgaHR0cEdldC5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICBzdGF0aWNTdW1tYXJ5OiAnRmV0Y2hlcyBkYXRhIGZyb20gZXh0ZXJuYWwgQVBJJyxcbiAqICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogJzVtJ1xuICogfSwgWydodHRwOi8vYXBpLmV4YW1wbGUuY29tJ10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdDMgPSBhd2FpdCBvdGhlckFjdGl2aXR5LmV4ZWN1dGVXaXRoT3B0aW9ucyh7XG4gKiAgIHN0YXRpY1N1bW1hcnk6ICdQcm9jZXNzZXMgdGhlIGZldGNoZWQgZGF0YScsXG4gKiAgIHRhc2tRdWV1ZTogJ3NwZWNpYWwtdGFzay1xdWV1ZSdcbiAqIH0sIFtkYXRhXSk7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIGFuIGV4cGxpY2l0IGludGVyZmFjZSAoZS5nLiB3aGVuIGRlZmluZWQgYnkgYW5vdGhlciBTREspXG4gKiBpbnRlcmZhY2UgSmF2YUFjdGl2aXRpZXMge1xuICogICBodHRwR2V0RnJvbUphdmEodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogfVxuICpcbiAqIGNvbnN0IHtcbiAqICAgaHR0cEdldEZyb21KYXZhLFxuICogICBzb21lT3RoZXJKYXZhQWN0aXZpdHlcbiAqIH0gPSBwcm94eUFjdGl2aXRpZXM8SmF2YUFjdGl2aXRpZXM+KHtcbiAqICAgdGFza1F1ZXVlOiAnamF2YS13b3JrZXItdGFza1F1ZXVlJyxcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyxcbiAqIH0pO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICogICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh0dHBHZXQoXCJodHRwOi8vZXhhbXBsZS5jb21cIik7XG4gKiAgIC8vIE9yIHdpdGggY3VzdG9tIG9wdGlvbnM6XG4gKiAgIGNvbnN0IHJlc3BvbnNlMiA9IGF3YWl0IGh0dHBHZXRGcm9tSmF2YS5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICAgIHN0YXRpY1N1bW1hcnk6ICdKYXZhIEhUVFAgY2FsbCB3aXRoIHRpbWVvdXQgb3ZlcnJpZGUnLFxuICogICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICcybSdcbiAqICAgfSwgW1wiaHR0cDovL2Zhc3QtYXBpLmV4YW1wbGUuY29tXCJdKTtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5QWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgQWN0aXZpdHlJbnRlcmZhY2VGb3I8QT4sIHtcbiAgICBnZXQoXywgYWN0aXZpdHlUeXBlKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGl2aXR5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIEFjdGl2aXR5IHR5cGVzLCBnb3Q6ICR7U3RyaW5nKGFjdGl2aXR5VHlwZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQWN0aXZpdHkoYWN0aXZpdHlUeXBlIGFzIHN0cmluZywgYXJncywgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5UHJveHlGdW5jdGlvbi5leGVjdXRlV2l0aE9wdGlvbnMgPSBmdW5jdGlvbiAoXG4gICAgICAgIG92ZXJyaWRlT3B0aW9uczogQWN0aXZpdHlPcHRpb25zLFxuICAgICAgICBhcmdzOiBhbnlbXVxuICAgICAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUFjdGl2aXR5KGFjdGl2aXR5VHlwZSwgYXJncywgZGVlcE1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFjdGl2aXR5UHJveHlGdW5jdGlvbjtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgTG9jYWwgQWN0aXZpdHkgZnVuY3Rpb25zIHdpdGggZ2l2ZW4ge0BsaW5rIExvY2FsQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9XG4gKiAgICAgICAgIGZvciB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQHNlZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSBmb3IgZXhhbXBsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5TG9jYWxBY3Rpdml0aWVzPEEgPSBVbnR5cGVkQWN0aXZpdGllcz4oXG4gIG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zXG4pOiBMb2NhbEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBMb2NhbEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+LCB7XG4gICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2NhbEFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlTG9jYWxBY3Rpdml0eShhY3Rpdml0eVR5cGUgYXMgc3RyaW5nLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24uZXhlY3V0ZVdpdGhPcHRpb25zID0gZnVuY3Rpb24gKFxuICAgICAgICBvdmVycmlkZU9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICAgICAgICBhcmdzOiBhbnlbXVxuICAgICAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlLCBhcmdzLCBkZWVwTWVyZ2Uob3B0aW9ucywgb3ZlcnJpZGVPcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb247XG4gICAgfSxcbiAgfSk7XG59XG5cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIHBhdGNoIGFmdGVyIFwiZW5vdWdoXCIgdGltZSBoYXMgcGFzc2VkXG5jb25zdCBFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0ggPSAnX190ZW1wb3JhbF9pbnRlcm5hbF9jb25uZWN0X2V4dGVybmFsX2hhbmRsZV9jYW5jZWxfdG9fc2NvcGUnO1xuLy8gVGhlIG5hbWUgb2YgdGhpcyBwYXRjaCBjb21lcyBmcm9tIGFuIGF0dGVtcHQgdG8gYnVpbGQgYSBnZW5lcmljIGludGVybmFsIHBhdGNoaW5nIG1lY2hhbmlzbS5cbi8vIFRoYXQgZWZmb3J0IGhhcyBiZWVuIGFiYW5kb25lZCBpbiBmYXZvciBvZiBhIG5ld2VyIFdvcmtmbG93VGFza0NvbXBsZXRlZE1ldGFkYXRhIGJhc2VkIG1lY2hhbmlzbS5cbmNvbnN0IENPTkRJVElPTl8wX1BBVENIID0gJ19fc2RrX2ludGVybmFsX3BhdGNoX251bWJlcjoxJztcblxuLyoqXG4gKiBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIGFuZCBjYW5jZWwgYW4gZXhpc3RpbmcgV29ya2Zsb3cgZXhlY3V0aW9uLlxuICogSXQgdGFrZXMgYSBXb3JrZmxvdyBJRCBhbmQgb3B0aW9uYWwgcnVuIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSh3b3JrZmxvd0lkOiBzdHJpbmcsIHJ1bklkPzogc3RyaW5nKTogRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5nZXRFeHRlcm5hbFdvcmtmbG93SGFuZGxlKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZ2V0SGFuZGxlKC4uLikgaW5zdGVhZC4pJ1xuICApO1xuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQsXG4gICAgcnVuSWQsXG4gICAgY2FuY2VsKCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQ29ubmVjdCB0aGlzIGNhbmNlbCBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHNjb3BlLlxuICAgICAgICAvLyBUaGlzIGlzIGJlaGF2aW9yIHdhcyBpbnRyb2R1Y2VkIGFmdGVyIHYwLjIyLjAgYW5kIGlzIGluY29tcGF0aWJsZVxuICAgICAgICAvLyB3aXRoIGhpc3RvcmllcyBnZW5lcmF0ZWQgd2l0aCBwcmV2aW91cyBTREsgdmVyc2lvbnMgYW5kIHRodXMgcmVxdWlyZXNcbiAgICAgICAgLy8gcGF0Y2hpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHRyeSB0byBkZWxheSBwYXRjaGluZyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGF2b2lkIHBvbGx1dGluZ1xuICAgICAgICAvLyBoaXN0b3JpZXMgdW5sZXNzIHN0cmljdGx5IHJlcXVpcmVkLlxuICAgICAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgICAgIGlmIChwYXRjaGVkKEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuY2FuY2VsV29ya2Zsb3crKztcbiAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICByZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHdvcmtmbG93SWQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNhbmNlbFdvcmtmbG93LnNldChzZXEsIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBjb250ZXh0OiB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB3b3JrZmxvd0lkKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnZXh0ZXJuYWwnLFxuICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7IHdvcmtmbG93SWQsIHJ1bklkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIEJ5IGRlZmF1bHQsIGEgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzICgpID0+IFByb21pc2U8YW55Pj4od29ya2Zsb3dUeXBlOiBzdHJpbmcpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQsXG4gIG9wdGlvbnM/OiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zdGFydENoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuc3RhcnQoLi4uKSBpbnN0ZWFkLiknXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgW3N0YXJ0ZWQsIGNvbXBsZXRlZF0gPSBhd2FpdCBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICBjb25zdCBmaXJzdEV4ZWN1dGlvblJ1bklkID0gYXdhaXQgc3RhcnRlZDtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQ6IG9wdGlvbnNXaXRoRGVmYXVsdHMud29ya2Zsb3dJZCxcbiAgICBmaXJzdEV4ZWN1dGlvblJ1bklkLFxuICAgIGFzeW5jIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCBjb21wbGV0ZWQpIGFzIGFueTtcbiAgICB9LFxuICAgIGFzeW5jIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnY2hpbGQnLFxuICAgICAgICAgIGNoaWxkV29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzICgpID0+IFdvcmtmbG93UmV0dXJuVHlwZT4od29ya2Zsb3dGdW5jOiBUKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZXhlY3V0ZUNoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZXhlY3V0ZSguLi4pIGluc3RlYWQuJ1xuICApO1xuICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9ucyhvcHRpb25zID8/ICh7fSBhcyBhbnkpKTtcbiAgY29uc3Qgd29ya2Zsb3dUeXBlID0gZXh0cmFjdFdvcmtmbG93VHlwZSh3b3JrZmxvd1R5cGVPckZ1bmMpO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLFxuICAgICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nLFxuICAgIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbk5leHRIYW5kbGVyXG4gICk7XG4gIGNvbnN0IGV4ZWNQcm9taXNlID0gZXhlY3V0ZSh7XG4gICAgc2VxOiBhY3RpdmF0b3IubmV4dFNlcXMuY2hpbGRXb3JrZmxvdysrLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgaGVhZGVyczoge30sXG4gICAgd29ya2Zsb3dUeXBlLFxuICB9KTtcbiAgdW50cmFja1Byb21pc2UoZXhlY1Byb21pc2UpO1xuICBjb25zdCBjb21wbGV0ZWRQcm9taXNlID0gZXhlY1Byb21pc2UudGhlbigoW19zdGFydGVkLCBjb21wbGV0ZWRdKSA9PiBjb21wbGV0ZWQpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZWRQcm9taXNlKTtcbiAgcmV0dXJuIGNvbXBsZXRlZFByb21pc2UgYXMgUHJvbWlzZTxhbnk+O1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmcm96ZW4gY29weSBvZiBXb3JrZmxvd0luZm8sIGF0IHRoZSBwb2ludCB3aGVyZSB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gKiBDaGFuZ2VzIGhhcHBlbmluZyBhdCBsYXRlciBwb2ludCBpbiB3b3JrZmxvdyBleGVjdXRpb24gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogRm9yIHRoaXMgcmVhc29uLCB3ZSByZWNvbW1lbmQgY2FsbGluZyBgd29ya2Zsb3dJbmZvKClgIG9uIGV2ZXJ5IGFjY2VzcyB0byB7QGxpbmsgV29ya2Zsb3dJbmZvfSdzIGZpZWxkcyxcbiAqIHJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIGBXb3JrZmxvd0luZm9gIG9iamVjdCAob3IgcGFydCBvZiBpdCkgaW4gYSBsb2NhbCB2YXJpYWJsZS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIC8vIEdPT0RcbiAqIGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIGRvU29tZXRoaW5nKHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXMpXG4gKiAgIC4uLlxuICogICBkb1NvbWV0aGluZ0Vsc2Uod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHZzXG4gKlxuICogYGBgdHNcbiAqIC8vIEJBRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgY29uc3QgYXR0cmlidXRlcyA9IHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXNcbiAqICAgZG9Tb21ldGhpbmcoYXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZShhdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0luZm8oKTogV29ya2Zsb3dJbmZvIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LndvcmtmbG93SW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5pbmZvO1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB1cGRhdGUgaWYgYW55LlxuICpcbiAqIEByZXR1cm4gSW5mbyBmb3IgdGhlIGN1cnJlbnQgdXBkYXRlIGhhbmRsZXIgdGhlIGNvZGUgY2FsbGluZyB0aGlzIGlzIGV4ZWN1dGluZ1xuICogd2l0aGluIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRVcGRhdGVJbmZvKCk6IFVwZGF0ZUluZm8gfCB1bmRlZmluZWQge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY3VycmVudFVwZGF0ZUluZm8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBVcGRhdGVTY29wZS5jdXJyZW50KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBjb2RlIGlzIGV4ZWN1dGluZyBpbiB3b3JrZmxvdyBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbldvcmtmbG93Q29udGV4dCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heWJlR2V0QWN0aXZhdG9yKCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gYGZgIHRoYXQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byBDb250aW51ZUFzTmV3IHdoZW4gY2FsbGVkLlxuICpcbiAqIGBmYCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIFdvcmtmbG93IGZ1bmN0aW9uIHN1cHBsaWVkIHRvIHR5cGVwYXJhbSBgRmAuXG4gKlxuICogT25jZSBgZmAgaXMgY2FsbGVkLCBXb3JrZmxvdyBFeGVjdXRpb24gaW1tZWRpYXRlbHkgY29tcGxldGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEYgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdGlvbnM/OiBDb250aW51ZUFzTmV3T3B0aW9uc1xuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pID0+IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LmNvbnRpbnVlQXNOZXcoLi4uKSBhbmQgV29ya2Zsb3cubWFrZUNvbnRpbnVlQXNOZXdGdW5jKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICBjb25zdCB7IHdvcmtmbG93VHlwZSwgdGFza1F1ZXVlLCAuLi5yZXN0IH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCByZXF1aXJlZE9wdGlvbnMgPSB7XG4gICAgd29ya2Zsb3dUeXBlOiB3b3JrZmxvd1R5cGUgPz8gaW5mby53b3JrZmxvd1R5cGUsXG4gICAgdGFza1F1ZXVlOiB0YXNrUXVldWUgPz8gaW5mby50YXNrUXVldWUsXG4gICAgLi4ucmVzdCxcbiAgfTtcblxuICByZXR1cm4gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pOiBQcm9taXNlPG5ldmVyPiA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGN1cnJlbnRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGluZm8pO1xuICAgIGNvbnN0IGZuID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnY29udGludWVBc05ldycsIGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWFkZXJzLCBhcmdzLCBvcHRpb25zIH0gPSBpbnB1dDtcbiAgICAgIHRocm93IG5ldyBDb250aW51ZUFzTmV3KHtcbiAgICAgICAgd29ya2Zsb3dUeXBlOiBvcHRpb25zLndvcmtmbG93VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIGFyZ3MpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlLFxuICAgICAgICBtZW1vOiBvcHRpb25zLm1lbW8gJiYgbWFwVG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5tZW1vLCBjb250ZXh0KSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczpcbiAgICAgICAgICBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMgfHwgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICAgID8geyBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMsIG9wdGlvbnMudHlwZWRTZWFyY2hBdHRyaWJ1dGVzKSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6IGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3Iob3B0aW9ucy5pbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmbih7XG4gICAgICBhcmdzLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICBvcHRpb25zOiByZXF1aXJlZE9wdGlvbnMsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvdy1leGVjdXRpb24vY29udGludWUtYXMtbmV3I2NvbnRpbnVlLWFzLW5ldyB8IENvbnRpbnVlcy1Bcy1OZXd9IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvblxuICogd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogU2hvcnRoYW5kIGZvciBgbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEY+KCkoLi4uYXJncylgLiAoU2VlOiB7QGxpbmsgbWFrZUNvbnRpbnVlQXNOZXdGdW5jfS4pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogICAvLyAuLi4gV29ya2Zsb3cgbG9naWNcbiAqICAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZUFzTmV3PEYgZXh0ZW5kcyBXb3JrZmxvdz4oLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIG1ha2VDb250aW51ZUFzTmV3RnVuYygpKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIFJGQyBjb21wbGlhbnQgVjQgdXVpZC5cbiAqIFVzZXMgdGhlIHdvcmtmbG93J3MgZGV0ZXJtaW5pc3RpYyBQUk5HIG1ha2luZyBpdCBzYWZlIGZvciB1c2Ugd2l0aGluIGEgd29ya2Zsb3cuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGluc2VjdXJlLlxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQgfCBzdGFja292ZXJmbG93IGRpc2N1c3Npb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIHV1aWQ0RnJvbVJhbmRvbShhY3RpdmF0b3IgPyAoKSA9PiBhY3RpdmF0b3IuY3VycmVudFJhbmRvbSgpIDogTWF0aC5yYW5kb20pO1xufVxuXG4vKipcbiAqIFBhdGNoIG9yIHVwZ3JhZGUgd29ya2Zsb3cgY29kZSBieSBjaGVja2luZyBvciBzdGF0aW5nIHRoYXQgdGhpcyB3b3JrZmxvdyBoYXMgYSBjZXJ0YWluIHBhdGNoLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIHJlcGxheWluZyBhbiBleGlzdGluZyBoaXN0b3J5LCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoYXRcbiAqIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyIHdoaWNoIGFsc28gaGFkIGEgYHBhdGNoZWRgIGNhbGwgd2l0aCB0aGUgc2FtZSBgcGF0Y2hJZGAuXG4gKiBJZiB0aGUgaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgKndpdGhvdXQqIHN1Y2ggYSBjYWxsLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyBub3QgY3VycmVudGx5IHJlcGxheWluZywgdGhlbiB0aGlzIGNhbGwgKmFsd2F5cyogcmV0dXJucyB0cnVlLlxuICpcbiAqIFlvdXIgd29ya2Zsb3cgY29kZSBzaG91bGQgcnVuIHRoZSBcIm5ld1wiIGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUsIGlmIGl0IHJldHVybnMgZmFsc2UsIHlvdVxuICogc2hvdWxkIHJ1biB0aGUgXCJvbGRcIiBjb2RlLiBCeSBkb2luZyB0aGlzLCB5b3UgY2FuIG1haW50YWluIGRldGVybWluaXNtLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hlZChwYXRjaElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIHJldHVybiBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCBmYWxzZSk7XG59XG5cbi8qKlxuICogSW5kaWNhdGUgdGhhdCBhIHBhdGNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBXb3JrZmxvd3Mgd2l0aCB0aGlzIGNhbGwgbWF5IGJlIGRlcGxveWVkIGFsb25nc2lkZSB3b3JrZmxvd3Mgd2l0aCBhIHtAbGluayBwYXRjaGVkfSBjYWxsLCBidXRcbiAqIHRoZXkgbXVzdCAqbm90KiBiZSBkZXBsb3llZCB3aGlsZSBhbnkgd29ya2VycyBzdGlsbCBleGlzdCBydW5uaW5nIG9sZCBjb2RlIHdpdGhvdXQgYVxuICoge0BsaW5rIHBhdGNoZWR9IGNhbGwsIG9yIGFueSBydW5zIHdpdGggaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IHN1Y2ggd29ya2VycyBleGlzdC4gSWYgZWl0aGVyIGtpbmRcbiAqIG9mIHdvcmtlciBlbmNvdW50ZXJzIGEgaGlzdG9yeSBwcm9kdWNlZCBieSB0aGUgb3RoZXIsIHRoZWlyIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBPbmNlIGFsbCBsaXZlIHdvcmtmbG93IHJ1bnMgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5IHdvcmtlcnMgd2l0aCB0aGlzIGNhbGwsIHlvdSBjYW4gZGVwbG95IHdvcmtlcnNcbiAqIHdoaWNoIGFyZSBmcmVlIG9mIGVpdGhlciBraW5kIG9mIHBhdGNoIGNhbGwgZm9yIHRoaXMgSUQuIFdvcmtlcnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGNhbGxcbiAqIG1heSBjb2V4aXN0LCBhcyBsb25nIGFzIHRoZXkgYXJlIGJvdGggcnVubmluZyB0aGUgXCJuZXdcIiBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlUGF0Y2gocGF0Y2hJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLCBwcm92aWRpbmdcbiAqIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0aW1lciAoaS5lLiBwcm92aWRlIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRpbWVyT3B0aW9ucyBpcyBhIG5ldyBhZGRpdGlvbiBhbmQgc3ViamVjdCB0byBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24sIG9wdGlvbnM6IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uLCBvcHRzPzogVGltZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0LCBvcHRzKS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIENhbm5vdCByZWdpc3RlciBoYW5kbGVyIGZvciByZXNlcnZlZCBuYW1lc1xuICB0aHJvd0lmUmVzZXJ2ZWROYW1lKGRlZi50eXBlLCBkZWYubmFtZSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgdXBkYXRlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKlxuICogVXBkYXRlcyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdXBkYXRlcyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRVcGRhdGVIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRVcGRhdGVIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0VXBkYXRlSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0VXBkYXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgcXVlcnkgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqXG4gKiBRdWVyaWVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5IGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcmllcyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFF1ZXJ5SGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0UXVlcnlIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0UXVlcnlIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nIHx8IGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0UXVlcnlIYW5kbGVyID0gaGFuZGxlcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlcyBjYW4gYmUgdXBzZXJ0ZWQgdXNpbmcgZWl0aGVyIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpIG9yIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSAocHJlZmVycmVkKVxuICpcbiAqIFVwc2VydGluZyBhIHdvcmtmbG93J3Mgc2VhcmNoIGF0dHJpYnV0ZXMgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBpbnRLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUludEZpZWxkJywgJ0lOVCcpO1xuICogY29uc3QgYm9vbEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tQm9vbEZpZWxkJywgJ0JPT0wnKTtcbiAqIGNvbnN0IGtleXdvcmRMaXN0S2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21LZXl3b3JkRmllbGQnLCAnS0VZV09SRF9MSVNUJyk7XG4gKlxuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgMSksXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGJvb2xLZXksIHRydWUpXG4gKiBdKTtcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoW1xuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShpbnRLZXksIDQyKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoa2V5d29yZExpc3RLZXksIFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J10pXG4gKiBdKTtcbiAqIGBgYFxuICpcbiAqIFdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIFNlYXJjaCBBdHRyaWJ1dGVzOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXSxcbiAqICAgQ3VzdG9tS2V5d29yZEZpZWxkOiBbJ2R1cmFibGUgY29kZScsICdpcyBncmVhdCddXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VhcmNoQXR0cmlidXRlcyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpLCBzZXQgYSB2YWx1ZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqIElmIHVzaW5nIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpLCBzZXQgYSB2YWx1ZSB0byB1bmRlZmluZWQgb3IgYW4gZW1wdHkgbGlzdCB0byByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXMgfCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuXG4gIGlmIChzZWFyY2hBdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlYXJjaEF0dHJpYnV0ZXMgbXVzdCBiZSBhIG5vbi1udWxsIFNlYXJjaEF0dHJpYnV0ZXMnKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgLy8gVHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXNcbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgdXBzZXJ0V29ya2Zsb3dTZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyh1bmRlZmluZWQsIHNlYXJjaEF0dHJpYnV0ZXMpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGFjdGl2YXRvci5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm86IFdvcmtmbG93SW5mbyk6IFdvcmtmbG93SW5mbyA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07XG4gICAgICBmb3IgKGNvbnN0IHBhaXIgb2Ygc2VhcmNoQXR0cmlidXRlcykge1xuICAgICAgICBpZiAocGFpci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG51bGwsIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBtdXRhdGUgdGhlIGV4aXN0aW5nIHN0YXRlIChqdXN0IHRoZSBuZXcgbWFwKSBzbyB0aGlzIGlzIHNhZmUuXG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXSA9IEFycmF5LmlzQXJyYXkocGFpci52YWx1ZSlcbiAgICAgICAgICAgID8gcGFpci52YWx1ZVxuICAgICAgICAgICAgOiAoW3BhaXIudmFsdWVdIGFzIFNlYXJjaEF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogbmV3U2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvcHkgYW5kIGFwcGx5IGV4aXN0aW5nIGFuZCBuZXcgdXBkYXRlcy4gS2VlcCBpbiBtaW5kIHRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgKGV4aXN0aW5nIGZpcnN0LCBuZXcgc2Vjb25kIC0gdG8gcG9zc2libHkgb3ZlcndyaXRlIGV4aXN0aW5nKS5cbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBpbmZvLnR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFsuLi5zZWFyY2hBdHRyaWJ1dGVzXSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgbGV0IHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW10pO1xuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07XG5cbiAgICAgIC8vIFVwc2VydCBsZWdhY3kgc2VhcmNoIGF0dHJpYnV0ZXMgaW50byB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuXG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWFyY2ggYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb3IgdW5kZWZpbmVkLCBnb3QgJHt2fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHVuZGVmaW5lZCBvciBhbiBlbXB0eSBsaXN0LCB0aGlzIHNpZ25pZmllcyBkZWxldGlvbi5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gYm90aCB1bnR5cGVkICYgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXMuXG4gICAgICAgIGlmICh2ID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgLy8gV2UgY2Fubm90IGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZyb20gdGhlc2UgdmFsdWVzLlxuICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGRvIGEgXCJiZXN0IGVmZm9ydFwiIGRlbGV0aW9uIGZyb20gdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXM6XG4gICAgICAgICAgLy8gLSBjaGVjayBpZiBhIG1hdGNoaW5nIGtleSBuYW1lIGV4aXN0cywgaWYgc28sIHJlbW92ZSBpdC5cbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1BhaXIgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkuZmluZCgocGFpcikgPT4gcGFpci5rZXkubmFtZSA9PT0gayk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nUGFpcikge1xuICAgICAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzID0gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW1xuICAgICAgICAgICAgICB7IGtleTogbWF0Y2hpbmdQYWlyLmtleSwgdmFsdWU6IG51bGwgfSBhcyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXR0ZW1wdCB0byBkaXNjZXJuIGEgdmFsaWQga2V5IHR5cGluZyBmb3IgdGhlIHVwZGF0ZS5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0S2V5RnJvbVVudHlwZWQoaywgdik7XG5cbiAgICAgICAgLy8gVW5hYmxlIHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIChubyB2YWxpZCB0eXBlIGZvciBkZWZpbmVkIHZhbHVlKS5cbiAgICAgICAgLy8gU2tpcCBhcHBseWluZyB0aGlzIHVwZGF0ZSAobm8tb3ApLlxuICAgICAgICBpZiAodHlwZWRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVEVYVCB0eXBlIGlzIGluZmVycmVkIGZyb20gYSBzdHJpbmcgdmFsdWUsIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIEtFWVdPUkQuXG4gICAgICAgIC8vIElmIGEgbWF0Y2hpbmcgcGFpciBleGlzdHMgd2l0aCBLRVlXT1JEIHR5cGUsIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgIGlmICh0eXBlZEtleS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1BhaXIgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkuZmluZCgocGFpcikgPT4gcGFpci5rZXkubmFtZSA9PT0gdHlwZWRLZXkubmFtZSk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nUGFpcikge1xuICAgICAgICAgICAgdHlwZWRLZXkudHlwZSA9IG1hdGNoaW5nUGFpci5rZXkudHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3VmFsdWU6IHVua25vd24gPSB2O1xuICAgICAgICAvLyBVbnBhY2sgdmFsdWUgaWYgaXQgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheS5cbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSB2WzBdO1xuICAgICAgICAgIC8vIENvbnZlcnQgdmFsdWUgYmFjayB0byBEYXRlLlxuICAgICAgICAgIGlmICh0eXBlZEtleS50eXBlID09PSAnREFURVRJTUUnKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG5ldyBEYXRlKG5ld1ZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmluZWQgdmFsdWUgd2l0aCB2YWxpZCB0eXBlLiBBcHBseSB0aGUgdXBkYXRlLlxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgeyBrZXk6IHR5cGVkS2V5LCB2YWx1ZTogbmV3VmFsdWUgfSBhcyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICAgICAgICBdKTtcbiAgICAgICAgbmV3U2VhcmNoQXR0cmlidXRlc1trXSA9IHY7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbmZvLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBuZXdTZWFyY2hBdHRyaWJ1dGVzLFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGlzIFdvcmtmbG93J3MgTWVtb3MgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgYG1lbW9gIHdpdGggZXhpc3RpbmdcbiAqIE1lbW9zIChhcyByZXR1cm5lZCBieSBgd29ya2Zsb3dJbmZvKCkubWVtb2ApLlxuICpcbiAqIE5ldyBtZW1vIGlzIG1lcmdlZCBieSByZXBsYWNpbmcgcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIF9hdCB0aGUgZmlyc3RcbiAqIGxldmVsIG9ubHlfLiBTZXR0aW5nIGEgcHJvcGVydHkgdG8gdmFsdWUgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGNsZWFycyB0aGF0XG4gKiBrZXkgZnJvbSB0aGUgTWVtby5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTE6IHZhbHVlIH1cbiAqICAga2V5NDogdmFsdWUsXG4gKiB9KTtcbiAqIHVwc2VydE1lbW8oe1xuICogICBrZXkyOiB2YWx1ZVxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH1cbiAqICAga2V5NDogdW5kZWZpbmVkLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiB3b3VsZCByZXN1bHQgaW4gdGhlIFdvcmtmbG93IGhhdmluZyB0aGVzZSBNZW1vOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkyOiB2YWx1ZSxcbiAqICAga2V5MzogeyBzdWJrZXkyOiB2YWx1ZSB9ICAvLyBOb3RlIHRoaXMgb2JqZWN0IHdhcyBjb21wbGV0ZWx5IHJlcGxhY2VkXG4gKiAgIC8vIE5vdGUgdGhhdCBrZXk0IHdhcyBjb21wbGV0ZWx5IHJlbW92ZWRcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtZW1vIFRoZSBSZWNvcmQgdG8gbWVyZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRNZW1vKG1lbW86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy51cHNlcnRNZW1vKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBjb25zdCBjb250ZXh0ID0gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8pO1xuXG4gIGlmIChtZW1vID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lbW8gbXVzdCBiZSBhIG5vbi1udWxsIFJlY29yZCcpO1xuICB9XG5cbiAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICBtb2RpZnlXb3JrZmxvd1Byb3BlcnRpZXM6IHtcbiAgICAgIHVwc2VydGVkTWVtbzoge1xuICAgICAgICBmaWVsZHM6IG1hcFRvUGF5bG9hZHMoXG4gICAgICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZFxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZW1vKS5tYXAoKFtrLCB2XSkgPT4gW2ssIHYgPz8gdW5kZWZpbmVkXSkpLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIG1lbW86IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgIC4uLmluZm8ubWVtbyxcbiAgICAgICAgICAuLi5tZW1vLFxuICAgICAgICB9KS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPSBudWxsKVxuICAgICAgKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLlxuICpcbiAqIENvbnNpZGVyIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gYmVmb3JlIHdvcmtmbG93IHJldHVybiBvciBjb250aW51ZS1hcy1uZXcsIHRvIHByZXZlbnRcbiAqIGludGVycnVwdGlvbiBvZiBpbi1wcm9ncmVzcyBoYW5kbGVycyBieSB3b3JrZmxvdyBleGl0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluLXByb2dyZXNzIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsSGFuZGxlcnNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2FsbEhhbmRsZXJzRmluaXNoZWQoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1NpZ25hbHMuc2l6ZSA9PT0gMCAmJiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1VwZGF0ZXMuc2l6ZSA9PT0gMDtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBhbHRlciB3b3JrZmxvdyBmdW5jdGlvbnMgd2l0aCBjZXJ0YWluIG9wdGlvbnMgc3BlY2lmaWVkIGF0IGRlZmluaXRpb24gdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGU6XG4gKiBgYGB0c1xuICogc2V0V29ya2Zsb3dPcHRpb25zKHtcbiAqICAgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyxcbiAqICAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBbQ3VzdG9tV29ya2Zsb3dFcnJvcl1cbiAqIH0sIG15V29ya2Zsb3cpO1xuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAqICAgLy8gV29ya2Zsb3cgY29kZSBoZXJlXG4gKiAgIHJldHVybiBcImhpXCI7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogVG8gYW5ub3RhdGUgYSBkZWZhdWx0IG9yIGR5bmFtaWMgd29ya2Zsb3c6XG4gKiBgYGB0c1xuICogZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gKiAgIC8vIFdvcmtmbG93IGNvZGUgaGVyZVxuICogICByZXR1cm4gXCJoaVwiO1xuICogfVxuICogc2V0V29ya2Zsb3dPcHRpb25zKHtcbiAqICAgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyxcbiAqICAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBbQ3VzdG9tV29ya2Zsb3dFcnJvcl1cbiAqIH0sIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IGRlZmludGlvbiwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgb3B0aW9ucy4gSWYgYVxuICogZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgY2FsbGVkIG9uY2UganVzdCBiZWZvcmUgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlXG4gKiBmaXJzdCB0aW1lLiBJdCBpcyBzYWZlIHRvIGNhbGwge0BsaW5rIHdvcmtmbG93SW5mb30gaW5zaWRlIHN1Y2ggYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBUaGUgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXb3JrZmxvd09wdGlvbnM8QSBleHRlbmRzIGFueVtdLCBSVD4oXG4gIG9wdGlvbnM6IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbiAgZm46ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFJUPlxuKTogdm9pZCB7XG4gIE9iamVjdC5hc3NpZ24oZm4sIHtcbiAgICB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zOiBvcHRpb25zLFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0YWNrVHJhY2VRdWVyeSA9IGRlZmluZVF1ZXJ5PHN0cmluZz4oJ19fc3RhY2tfdHJhY2UnKTtcbmV4cG9ydCBjb25zdCBlbmhhbmNlZFN0YWNrVHJhY2VRdWVyeSA9IGRlZmluZVF1ZXJ5PEVuaGFuY2VkU3RhY2tUcmFjZT4oJ19fZW5oYW5jZWRfc3RhY2tfdHJhY2UnKTtcbmV4cG9ydCBjb25zdCB3b3JrZmxvd01ldGFkYXRhUXVlcnkgPSBkZWZpbmVRdWVyeTx0ZW1wb3JhbC5hcGkuc2RrLnYxLklXb3JrZmxvd01ldGFkYXRhPignX190ZW1wb3JhbF93b3JrZmxvd19tZXRhZGF0YScpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudERldGFpbHMoKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmN1cnJlbnREZXRhaWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudERldGFpbHMoZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdnZXRDdXJyZW50RGV0YWlscygpIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgYWN0aXZhdG9yLmN1cnJlbnREZXRhaWxzID0gZGV0YWlscztcbn1cbiIsImltcG9ydCB7IGluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZiB9IGZyb20gXCIuLi9pbnRlcm5hbC9zeW1ib2wtaW5zdGFuY2VvZlwiO1xuaW1wb3J0IHR5cGUgeyBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuXG4vKipcbiAqIEEgTmV4dXMgaGFuZGxlciBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGhhbmRsaW5nIG9mIGFcbiAqIE5leHVzIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGEgaGFuZGxlciBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIm5leHVzLXJwY1wiO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIkJBRF9SRVFVRVNUXCIsIFwiSW52YWxpZCBpbnB1dCBwcm92aWRlZFwiKTtcbiAqXG4gKiAgICAgLy8gVGhyb3cgYSBiYWQgcmVxdWVzdCBlcnJvciwgd2l0aCBhIGNhdXNlXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIkJBRF9SRVFVRVNUXCIsIFwiSW52YWxpZCBpbnB1dCBwcm92aWRlZFwiLCB7IGNhdXNlIH0pO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIHJldHJ5YWJsZSBpbnRlcm5hbCBlcnJvclxuICogICAgIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJJTlRFUk5BTFwiLCBcIkRhdGFiYXNlIHVuYXZhaWxhYmxlXCIsIHsgcmV0cnlhYmxlT3ZlcnJpZGU6IHRydWUgfSk7XG4gKlxuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgSGFuZGxlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogT25lIG9mIHRoZSBwcmVkZWZpbmVkIGVycm9yIHR5cGVzLlxuICAgKlxuICAgKiBJZiB0aGUgY29uc3RydWN0b3IgcmVjZWl2ZWQgYW4gdW5rbm93biBzdHJpbmcsIHRoaXMgd2lsbCBiZSBgXCJVTktOT1dOXCJgLlxuICAgKiBVc2Uge0BsaW5rIHJhd0Vycm9yVHlwZX0gdG8gYWNjZXNzIHRoZSBvcmlnaW5hbCBzdHJpbmcuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIEhhbmRsZXJFcnJvclR5cGV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogSGFuZGxlckVycm9yVHlwZTtcblxuICAvKipcbiAgICogVGhlIHJhdyBlcnJvciB0eXBlIHN0cmluZy5cbiAgICpcbiAgICogRm9yIGtub3duIHR5cGVzLCB0aGlzIGVxdWFscyB7QGxpbmsgdHlwZX0uIEZvciB1bmtub3duIHR5cGVzLCB0aGlzIHByZXNlcnZlc1xuICAgKiB0aGUgb3JpZ2luYWwgd2lyZSBzdHJpbmcgd2hpbGUge0BsaW5rIHR5cGV9IGlzIHNldCB0byBgXCJVTktOT1dOXCJgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJhd0Vycm9yVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqXG4gICAqIElmIHNwZWNpZmllZCwgYHJldHJ5YWJsZU92ZXJyaWRlYCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmV0cnkgYmVoYXZpb3IgZGV0ZXJtaW5lZCBiYXNlZCBvblxuICAgKiB0aGUgZXJyb3IgdHlwZS4gVXNlIHtAbGluayByZXRyeWFibGV9IHRvIGRldGVybWluZSB0aGUgZWZmZWN0aXZlIHJldHJ5IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayByZXRyeWFibGV9LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldHJ5YWJsZU92ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IGlmIHRoaXMgZXJyb3Igd2FzIGNvbnN0cnVjdGVkIGZyb20gYSB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0LlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGZhaWx1cmUgZm9yIHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEhhbmRsZXJFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGVycm9yLiBNdXN0IGJlIGEga25vd24ge0BsaW5rIEhhbmRsZXJFcnJvclR5cGV9LlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFeHRyYSBvcHRpb25zIGZvciB0aGUgZXJyb3IsIGluY2x1ZGluZyB0aGUgY2F1c2UgYW5kIHJldHJ5YWJsZSBvdmVycmlkZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZTogSGFuZGxlckVycm9yVHlwZSwgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IEhhbmRsZXJFcnJvck9wdGlvbnMpIHtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBgSGFuZGxlciBlcnJvcjogJHt0eXBlfWA7XG5cbiAgICBzdXBlcihhY3R1YWxNZXNzYWdlLCB7IGNhdXNlOiBvcHRpb25zPy5jYXVzZSB9KTtcblxuICAgIGlmICghT2JqZWN0Lmhhc093bihIYW5kbGVyRXJyb3JUeXBlLCB0eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBIYW5kbGVyRXJyb3JUeXBlOiAke3R5cGV9YCk7XG4gICAgfVxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5yYXdFcnJvclR5cGUgPSB0eXBlID09PSBcIlVOS05PV05cIiA/IChvcHRpb25zPy5yYXdFcnJvclR5cGUgPz8gdHlwZSkgOiB0eXBlO1xuICAgIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGUgPSBvcHRpb25zPy5yZXRyeWFibGVPdmVycmlkZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUge0BsaW5rIHJldHJ5YWJsZU92ZXJyaWRlfSBwcm9wZXJ0eSBpbiB0aGF0IGByZXRyeWFibGVgIHRha2VzIGludG9cbiAgICogYWNjb3VudCB0aGUgZGVmYXVsdCBiZWhhdmlvciByZXN1bHRpbmcgZnJvbSB0aGUgZXJyb3IgdHlwZSwgaWYgbm8gb3ZlcnJpZGUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZU92ZXJyaWRlfS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmV0cnlhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJCQURfUkVRVUVTVFwiOlxuICAgICAgY2FzZSBcIlVOQVVUSEVOVElDQVRFRFwiOlxuICAgICAgY2FzZSBcIlVOQVVUSE9SSVpFRFwiOlxuICAgICAgY2FzZSBcIk5PVF9GT1VORFwiOlxuICAgICAgY2FzZSBcIk5PVF9JTVBMRU1FTlRFRFwiOlxuICAgICAgY2FzZSBcIkNPTkZMSUNUXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgY2FzZSBcIlVOQVZBSUxBQkxFXCI6XG4gICAgICBjYXNlIFwiVVBTVFJFQU1fVElNRU9VVFwiOlxuICAgICAgY2FzZSBcIlJFU09VUkNFX0VYSEFVU1RFRFwiOlxuICAgICAgY2FzZSBcIklOVEVSTkFMXCI6XG4gICAgICBjYXNlIFwiUkVRVUVTVF9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiVU5LTk9XTlwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBGb3JjZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBtaXNzaW5nIGEgY2FzZVxuICAgICAgICBjb25zdCBfbm9NaXNzaW5nQ2FzZTogbmV2ZXIgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoSGFuZGxlckVycm9yLCBcIkhhbmRsZXJFcnJvclwiKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAaW5saW5lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlckVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogdW5rbm93bjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGVycm9yIHNob3VsZCBiZSBjb25zaWRlcmVkIHJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgbm90IHNldCwgdGhlIHJldHJ5IGJlaGF2aW9yIGlzIGRldGVybWluZWQgZnJvbSB0aGUgZXJyb3IgdHlwZS5cbiAgICogRm9yIGV4YW1wbGUsIGJ5IGRlZmF1bHQsIGBJTlRFUk5BTGAgaXMgcmV0cnlhYmxlLCBidXQgYFVOQVZBSUxBQkxFYCBpcyBub24tcmV0cnlhYmxlLlxuICAgKi9cbiAgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBzdGFjayB0cmFjZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgYHN0YWNrYCBwcm9wZXJ0eSBvbiB0aGUgZXJyb3IuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlbW90ZSBzdGFjayB0cmFjZXMgcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZSxcbiAgICogd2hpY2ggbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IGxhbmd1YWdlIHJ1bnRpbWUuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBvcmlnaW5hbEZhaWx1cmU/OiBGYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgZXJyb3IgdHlwZSBzdHJpbmcsIHByZXNlcnZpbmcgdGhlIHJhdyB3aXJlIHZhbHVlLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAqIFdoZW4gdGhlIGVycm9yJ3MgdHlwZSBpcyBzZXQgdG8gYFwiVU5LTk9XTlwiYCwgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgd2lyZSBzdHJpbmcuXG4gICAqL1xuICByYXdFcnJvclR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgSGFuZGxlckVycm9yfSwgZGVmaW5lZCBhY2NvcmRpbmcgdG8gdGhlIE5leHVzIHNwZWNpZmljYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyRXJyb3JUeXBlID0gKHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlKVtrZXlvZiB0eXBlb2YgSGFuZGxlckVycm9yVHlwZV07XG5leHBvcnQgY29uc3QgSGFuZGxlckVycm9yVHlwZSA9IHtcbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0eXBlIGlzIHVua25vd24uXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBVTktOT1dOOiBcIlVOS05PV05cIixcblxuICAvKipcbiAgICogVGhlIGhhbmRsZXIgY2Fubm90IG9yIHdpbGwgbm90IHByb2Nlc3MgdGhlIHJlcXVlc3QgZHVlIHRvIGFuIGFwcGFyZW50IGNsaWVudCBlcnJvci5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBCQURfUkVRVUVTVDogXCJCQURfUkVRVUVTVFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50IGRpZCBub3Qgc3VwcGx5IHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIRU5USUNBVEVEOiBcIlVOQVVUSEVOVElDQVRFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIFVOQVVUSE9SSVpFRDogXCJVTkFVVEhPUklaRURcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQgYnV0IG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIE5PVF9GT1VORDogXCJOT1RfRk9VTkRcIixcblxuICAvKipcbiAgICogUmV0dXJuZWQgYnkgdGhlIHNlcnZlciB3aGVuIGl0IGhhcyBnaXZlbiB1cCBoYW5kbGluZyBhIHJlcXVlc3QuIFRoaXMgbWF5IG9jY3VyIGJ5IGVuZm9yY2luZ1xuICAgKiBhIGNsaWVudCBwcm92aWRlZCBgUmVxdWVzdC1UaW1lb3V0YCBvciBmb3IgYW55IGFyYml0cmFyeSByZWFzb24gc3VjaCBhcyBlbmZvcmNpbmcgc29tZVxuICAgKiBjb25maWd1cmFibGUgbGltaXQuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVFVRVNUX1RJTUVPVVQ6IFwiUkVRVUVTVF9USU1FT1VUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBtYWRlIGR1ZSB0byBhIGNvbmZsaWN0LiBUaGlzIG1heSBoYXBwZW4gd2hlbiB0cnlpbmcgdG8gY3JlYXRlIGFuXG4gICAqIG9wZXJhdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBDT05GTElDVDogXCJDT05GTElDVFwiLFxuXG4gIC8qKlxuICAgKiBTb21lIHJlc291cmNlIGhhcyBiZWVuIGV4aGF1c3RlZCwgcGVyaGFwcyBhIHBlci11c2VyIHF1b3RhLCBvciBwZXJoYXBzIHRoZSBlbnRpcmUgZmlsZSBzeXN0ZW1cbiAgICogaXMgb3V0IG9mIHNwYWNlLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgUkVTT1VSQ0VfRVhIQVVTVEVEOiBcIlJFU09VUkNFX0VYSEFVU1RFRFwiLFxuXG4gIC8qKlxuICAgKiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIElOVEVSTkFMOiBcIklOVEVSTkFMXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZWl0aGVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcmVxdWVzdCBtZXRob2QsIG9yIGl0IGxhY2tzIHRoZSBhYmlsaXR5IHRvIGZ1bGZpbGwgdGhlXG4gICAqIHJlcXVlc3QuIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgTk9UX0lNUExFTUVOVEVEOiBcIk5PVF9JTVBMRU1FTlRFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBVTkFWQUlMQUJMRTogXCJVTkFWQUlMQUJMRVwiLFxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGdhdGV3YXlzIHRvIHJlcG9ydCB0aGF0IGEgcmVxdWVzdCB0byBhbiB1cHN0cmVhbSBzZXJ2ZXIgaGFzIHRpbWVkIG91dC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVQU1RSRUFNX1RJTUVPVVQ6IFwiVVBTVFJFQU1fVElNRU9VVFwiLFxufSBhcyBjb25zdDtcbiIsImV4cG9ydCB7IHR5cGUgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcbmV4cG9ydCB7IEhhbmRsZXJFcnJvciwgSGFuZGxlckVycm9yVHlwZSwgdHlwZSBIYW5kbGVyRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vaGFuZGxlci1lcnJvclwiO1xuZXhwb3J0IHsgdHlwZSBMaW5rIH0gZnJvbSBcIi4vbGlua1wiO1xuZXhwb3J0IHtcbiAgT3BlcmF0aW9uRXJyb3IsXG4gIHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSxcbiAgdHlwZSBPcGVyYXRpb25FcnJvck9wdGlvbnMsXG59IGZyb20gXCIuL29wZXJhdGlvbi1lcnJvclwiO1xuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBvcGVyYXRpb24gZXJyb3IuXG4gKlxuICogVGhpcyBlcnJvciBjbGFzcyByZXByZXNlbnRzIHRoZSBhYm5vcm1hbCBjb21wbGV0aW9uIG9mIGEgTmV4dXMgb3BlcmF0aW9uLFxuICogdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBhcyBhbiBvcGVyYXRpb24gZXJyb3IuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogICAgIGltcG9ydCB7IE9wZXJhdGlvbkVycm9yIH0gZnJvbSBcIm5leHVzLXJwY1wiO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJmYWlsZWRcIiwgXCJOb3QgZW5vdWdoIGludmVudG9yeVwiKTtcbiAqXG4gKiAgICAgLy8gVGhyb3cgYSBmYWlsZWQgb3BlcmF0aW9uIGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJmYWlsZWRcIiwgXCJOb3QgZW5vdWdoIGludmVudG9yeVwiLCB7IGNhdXNlIH0pO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGNhbmNlbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImNhbmNlbGVkXCIsIFwiVXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uXCIpO1xuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBTdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlOiBPcGVyYXRpb25FcnJvclN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgdGhhdCByZXN1bHRlZCBpbiB0aGlzIG9wZXJhdGlvbiBlcnJvci5cbiAgICovXG4gIGRlY2xhcmUgcHVibGljIHJlYWRvbmx5IGNhdXNlOiBFcnJvcjtcblxuICAvKipcbiAgICogU2V0IGlmIHRoaXMgZXJyb3Igd2FzIGNvbnN0cnVjdGVkIGZyb20gYSB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0LlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGZhaWx1cmUgZm9yIHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE9wZXJhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlIC0gVGhlIHN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgZS5nLiB0aGUgY2F1c2UuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXRlOiBPcGVyYXRpb25FcnJvclN0YXRlLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBzdGF0ZSA9PT0gXCJjYW5jZWxlZFwiID8gYE9wZXJhdGlvbiBjYW5jZWxlZGAgOiBgT3BlcmF0aW9uIGZhaWxlZGA7XG4gICAgY29uc3QgYWN0dWFsTWVzc2FnZSA9IG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2U7XG5cbiAgICBzdXBlcihhY3R1YWxNZXNzYWdlLCB7IGNhdXNlOiBvcHRpb25zPy5jYXVzZSB9KTtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vcmlnaW5hbEZhaWx1cmUgPSBvcHRpb25zPy5vcmlnaW5hbEZhaWx1cmU7XG4gICAgaWYgKG9wdGlvbnM/LnN0YWNrVHJhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IG9wdGlvbnMuc3RhY2tUcmFjZTtcbiAgICB9XG4gIH1cbn1cblxuaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mKE9wZXJhdGlvbkVycm9yLCBcIk9wZXJhdGlvbkVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25FcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVW5kZXJseWluZyBjYXVzZSBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICBjYXVzZT86IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBzdGFjayB0cmFjZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgYHN0YWNrYCBwcm9wZXJ0eSBvbiB0aGUgZXJyb3IuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlbW90ZSBzdGFjayB0cmFjZXMgcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZSxcbiAgICogd2hpY2ggbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IGxhbmd1YWdlIHJ1bnRpbWUuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBvcmlnaW5hbEZhaWx1cmU/OiBGYWlsdXJlO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBzdGF0ZSBvZiBhbiBvcGVyYXRpb24gdGhhdCBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAaW5saW5lXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkVycm9yU3RhdGUgPSBcImZhaWxlZFwiIHwgXCJjYW5jZWxlZFwiO1xuIiwiZXhwb3J0IHtcbiAgdHlwZSBPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIFN0YXJ0T3BlcmF0aW9uQ29udGV4dCxcbiAgdHlwZSBDYW5jZWxPcGVyYXRpb25Db250ZXh0LFxufSBmcm9tIFwiLi9vcGVyYXRpb24tY29udGV4dFwiO1xuXG5leHBvcnQge1xuICBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQsXG4gIHR5cGUgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYyxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYyxcbn0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuXG5leHBvcnQge1xuICAvL1xuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXIsXG4gIHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbmV4cG9ydCB7XG4gIFNlcnZpY2VIYW5kbGVyLFxuICBzZXJ2aWNlSGFuZGxlcixcbiAgdHlwZSBPcGVyYXRpb25IYW5kbGVyRm9yLFxuICB0eXBlIFNlcnZpY2VIYW5kbGVyRm9yLFxufSBmcm9tIFwiLi9zZXJ2aWNlLWhhbmRsZXJcIjtcbiIsImltcG9ydCB7IEhhbmRsZXJFcnJvciB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHRcIjtcbmltcG9ydCB7IENhbmNlbE9wZXJhdGlvbkNvbnRleHQsIFN0YXJ0T3BlcmF0aW9uQ29udGV4dCB9IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBPcGVyYXRpb25EZWZpbml0aW9uLFxuICBPcGVyYXRpb25JbnB1dCxcbiAgT3BlcmF0aW9uS2V5LFxuICBPcGVyYXRpb25NYXAsXG4gIE9wZXJhdGlvbk91dHB1dCxcbn0gZnJvbSBcIi4uL3NlcnZpY2VcIjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIGEgTmV4dXMgb3BlcmF0aW9uLlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IE5leHVzIHNlcnZpY2UgaW1wbGVtZW50b3JzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHtcbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBzdGFydCBhbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIFJldHVybiB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luY30gdG8gcmVzcG9uZCBzdWNjZXNzZnVsbHkgaW5saW5lLCBvclxuICAgKiB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmN9IHRvIGluZGljYXRlIHRoYXQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3YXMgc3RhcnRlZC5cbiAgICogVGhyb3cgYW4ge0BsaW5rIE9wZXJhdGlvbkVycm9yfSB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgYXMgZmFpbGVkIG9yIGNhbmNlbGVkLlxuICAgKi9cbiAgc3RhcnQoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKTogUHJvbWlzZTxIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQ8Tz4+O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVxdWVzdHMgdG8gY2FuY2VsIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uXG4gICAqXG4gICAqIENhbmNlbGF0aW9uIG9mIGEgTmV4dXMgb3BlcmF0aW9uIGlzOlxuICAgKiAxLiBfYXN5bmNocm9ub3VzXyAtIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kIG9ubHkgY29uZmlybXMgdGhhdCBjYW5jZWxhdGlvbiB3YXMgbm90aWZpZWQ7XG4gICAqICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgaG93ZXZlciBjaG9vc2UgdG8gcHJvY2VzcyB0aGUgY2FuY2VsbGF0aW9uIGF0IGEgbGF0ZXIgdGltZSwgb3IgdG9cbiAgICogICAgaWdub3JlIGl0IGVudGlyZWx5LlxuICAgKiAyLiBfaWRlbXBvdGVudF8gLSBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpZ25vcmUgZHVwbGljYXRlIGNhbmNlbGF0aW9ucyBmb3IgdGhlIHNhbWUgb3BlcmF0aW9uLlxuICAgKi9cbiAgY2FuY2VsKGN0eDogQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBzaG9ydGN1dCBmb3IgZGVmaW5pbmcgYW4gb3BlcmF0aW9uIGhhbmRsZXIgdGhhdCBvbmx5IGltcGxlbWVudHMgdGhlIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLnN0YXJ0fVxuICogbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJucyBhIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gKGN0eDogU3RhcnRPcGVyYXRpb25Db250ZXh0LCBpbnB1dDogSSkgPT4gUHJvbWlzZTxPPjtcblxuLyoqXG4gKiBDb21waWxlcyBhbiBvcGVyYXRpb24gaGFuZGxlciBpbnRvIGEge0BsaW5rIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcn0uIEEgY29tcGlsZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGlzIGEgc2luZ2xlIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb3BlcmF0aW9uIGRlZmluaXRpb24gYW5kIGEgZnVsbC1mbGVkZ2VkIG9wZXJhdGlvblxuICogaGFuZGxlciBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlT3BlcmF0aW9uSGFuZGxlcjxJLCBPPihcbiAgZGVmaW5pdGlvbjogT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPixcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgdW5kZWZpbmVkLFxuKTogQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+IHtcbiAgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgTm8gaGFuZGxlciByZWdpc3RlcmVkIGZvciBvcGVyYXRpb24gJyR7ZGVmaW5pdGlvbi5uYW1lfScgKGV4cGVjdGVkIHByb3BlcnR5IG5hbWUgJyR7ZGVmaW5pdGlvbi5uYW1lfScpYCxcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBPcGVyYXRpb24gaGFuZGxlciBpcyBkZWNsYXJlZCB1c2luZyB0aGUgc2hvcnRjdXQgc3ludGF4LiBXcmFwIGl0IGludG8gYSBmdWxsLWZsZWRnZWQgaGFuZGxlci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmaW5pdGlvbixcblxuICAgICAgc3RhcnQ6IGFzeW5jIChjdHgsIGlucHV0KSA9PiB7XG4gICAgICAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luYyhhd2FpdCBoYW5kbGVyKGN0eCwgaW5wdXQpKTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IG5vdEltcGxlbWVudGVkLFxuICAgIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIuc3RhcnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEhhbmRsZXIgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyBoYXMgbm8gc3RhcnQgbWV0aG9kYCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmRlZmluaXRpb24sXG5cbiAgICAvLyBEZWZlbnNpdmVseSBlbnN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYWxsIHRoZSByZXF1aXJlZCBtZXRob2RzLFxuICAgIC8vIGRlZmF1bHRpbmcgdG8gdGhyb3dpbmcgYSBub3QgaW1wbGVtZW50ZWQgZXJyb3IgaWYgc29tZSBtZXRob2RzIGFyZSBtaXNzaW5nLlxuICAgIHN0YXJ0OiBoYW5kbGVyLnN0YXJ0LmJpbmQoaGFuZGxlciksXG4gICAgY2FuY2VsOiBoYW5kbGVyLmNhbmNlbD8uYmluZChoYW5kbGVyKSA/PyBub3RJbXBsZW1lbnRlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGNvbXBpbGVkIG9wZXJhdGlvbiBoYW5kbGVyIGlzIGEgc2luZ2xlIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb3BlcmF0aW9uIGRlZmluaXRpb24gYW5kIGFcbiAqIGZ1bGwtZmxlZGdlZCBvcGVyYXRpb24gaGFuZGxlciBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiA9IE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz4gJiBPcGVyYXRpb25IYW5kbGVyPEksIE8+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPiA9IENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcjxcbiAgT3BlcmF0aW9uSW5wdXQ8T3BzW09wZXJhdGlvbktleTxPcHM+XT4sXG4gIE9wZXJhdGlvbk91dHB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPlxuPjtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbm90SW1wbGVtZW50ZWQoKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiTk9UX0lNUExFTUVOVEVEXCIsIFwiTm90IGltcGxlbWVudGVkXCIpO1xufVxuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uRGVmaW5pdGlvbiwgT3BlcmF0aW9uS2V5LCBPcGVyYXRpb25NYXAsIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3NlcnZpY2VcIjtcbmltcG9ydCB7XG4gIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcixcbiAgY29tcGlsZU9wZXJhdGlvbkhhbmRsZXIsXG4gIE9wZXJhdGlvbkhhbmRsZXIsXG4gIFN5bmNPcGVyYXRpb25IYW5kbGVyLFxufSBmcm9tIFwiLi9vcGVyYXRpb24taGFuZGxlclwiO1xuXG4vKipcbiAqIEEgTmV4dXMgU2VydmljZSBpbXBsZW1lbnRhdGlvbiwgdGhhdCBwcm92aWRlcyBoYW5kbGVycyBmb3IgZWFjaCBvZiBpdHMgb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+IHtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgYFNlcnZpY2VIYW5kbGVyYCBmcm9tIGEgc2VydmljZSBkZWZpbml0aW9uIGFuZCBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9uIGhhbmRsZXJzLlxuICAgKlxuICAgKiBUaGVyZSBtdXN0IGJlIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBldmVyeSBvcGVyYXRpb24gaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnNcbiAgICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgaGFuZGxlclxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQGhpZGRlblxuICAgKi9cbiAgc3RhdGljIGJ1aWxkPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcD4oXG4gICAgc2VydmljZTogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgKTogU2VydmljZUhhbmRsZXI8T3BzPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IG5ldyBNYXA8T3BlcmF0aW9uS2V5PE9wcz4sIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHM+PigpO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGRlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2Uub3BlcmF0aW9ucykpIHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkT3BIYW5kbGVyID0gY29tcGlsZU9wZXJhdGlvbkhhbmRsZXIoZGVmaW5pdGlvbiwgaGFuZGxlcnNbcHJvcE5hbWVdKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBjb21waWxlZE9wSGFuZGxlci5uYW1lIGFzIE9wZXJhdGlvbktleTxPcHM+O1xuXG4gICAgICBpZiAob3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgT3BlcmF0aW9uIHdpdGggbmFtZSAnJHtvcGVyYXRpb25OYW1lfScgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBzZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5zZXQob3BlcmF0aW9uTmFtZSwgY29tcGlsZWRPcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2VydmljZUhhbmRsZXIoc2VydmljZSwgaGFuZGxlcnMsIG9wZXJhdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVmaW5pdGlvbjogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcnM6IFNlcnZpY2VIYW5kbGVyRm9yPE9wcz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25zTWFwOiBNYXA8T3BlcmF0aW9uS2V5PE9wcz4sIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHM+PixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZpbml0aW9uIGFuZCBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRPcGVyYXRpb25IYW5kbGVyPEsgZXh0ZW5kcyBPcGVyYXRpb25LZXk8T3BzPj4oXG4gICAgb3BlcmF0aW9uTmFtZTogSyxcbiAgKTogQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5vcGVyYXRpb25zTWFwLmdldChvcGVyYXRpb25OYW1lKTtcbiAgICBpZiAoZW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcbiAgICAgICAgXCJOT1RfRk9VTkRcIixcbiAgICAgICAgYE9wZXJhdGlvbiBoYW5kbGVyIG5vdCByZWdpc3RlcmVkIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9uTmFtZX0nIGluIHNlcnZpY2UgJyR7dGhpcy5kZWZpbml0aW9uLm5hbWV9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgc2VydmljZSBoYW5kbGVyIGZvciBhIGdpdmVuIHNlcnZpY2UgY29udHJhY3QuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUhhbmRsZXI8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgc2VydmljZTogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgaGFuZGxlcnM6IFNlcnZpY2VIYW5kbGVyRm9yPE9wcz4sXG4pOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgcmV0dXJuIFNlcnZpY2VIYW5kbGVyLmJ1aWxkKHNlcnZpY2UsIGhhbmRsZXJzKTtcbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiBvcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25IYW5kbGVyRm9yPFQ+ID1cbiAgVCBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCBTeW5jT3BlcmF0aW9uSGFuZGxlcjxJLCBPPlxuICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaW50ZXJmYWNlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VIYW5kbGVyRm9yPFQgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogT3BlcmF0aW9uSGFuZGxlckZvcjxUW0tdPjtcbn07XG4iLCIvKiogQGltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9vcGVyYXRpb24taGFuZGxlclwiICovXG5cbi8qKlxuICogQW4gaW50ZXJuYWwgc3ltYm9sLCB1c2VkIHRvIHByZXZlbnQgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZXMuXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sID0gU3ltYm9sKFwiX19uZXh1c19pc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFwiKTtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQ8VCA9IHVua25vd24+ID1cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+XG4gIHwgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmM7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIGZyb20gdGhlIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLnN0YXJ0fSBtZXRob2QuXG4gKlxuICogVXNlIGVpdGhlciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IG9yIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmN9XG4gKiB0byBjcmVhdGUgYSByZXN1bHQgb2JqZWN0LiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNvbnN0IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAgICovXG4gIGFzeW5jKHRva2VuOiBzdHJpbmcpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXN5bmM6IHRydWUsXG4gICAgICB0b2tlbixcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzeW5jPFQ+KHZhbHVlOiBUKTogSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYzxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXN5bmM6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgICBbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdOiB0cnVlLFxuICAgIH07XG4gIH0sXG5cbiAgW1N5bWJvbC5oYXNJbnN0YW5jZV06IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgKHZhbHVlIGFzIGFueSlbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdID09PSB0cnVlXG4gICAgKTtcbiAgfSxcbn07XG5cbi8qKlxuICogQSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSB0byBjcmVhdGUgYSBzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luYyg0Mik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYzxUID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgdmFsdWU6IFQ7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG5cbi8qKlxuICogQSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gaGFzIGJlZW4gYWNjZXB0ZWQgYW5kIHdpbGwgY29tcGxldGUgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogVXNlIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmN9IHRvIGNyZWF0ZSBhbiBhc3luYyByZXN1bHQgb2JqZWN0LlxuICogRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogICByZXR1cm4gSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jKFwidW5pcXVlIHRva2VuXCIpO1xuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgLyoqXG4gICAqIEluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseSAoZmFsc2UpIG9yIHdpbGwgY29tcGxldGVcbiAgICogYXN5bmNocm9ub3VzbHkgKHRydWUpLlxuICAgKi9cbiAgaXNBc3luYzogdHJ1ZTtcblxuICAvKipcbiAgICogQSB0b2tlbiB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGluIGZvbGxvd3VwIGhhbmRsZXIgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLmdldFJlc3VsdH1cbiAgICogYW5kIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLmNhbmNlbH0uXG4gICAqL1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdOiB0cnVlO1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9oYW5kbGVyXCI7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IG1hcHBpbmcgYWxsIHN0cmluZyBwcm9wZXJ0aWVzIChrZXlzIGFuZCB2YWx1ZXMpIG9mIGFuIGV4aXN0aW5nIG9iamVjdFxuICogdGhyb3VnaCBhIG1hcHBlciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHNvdXJjZSBvYmplY3QsIHdob3NlIHByb3BlcnRpZXMgd2lsbCBiZSBtYXBwZWQuXG4gKiBAcGFyYW0gZm4gLSBUaGUgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG1hcHBlZCB0byB0aGUgbmV3IHR5cGUuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBLZXlWYWx1ZXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFU+KFxuICBvYmo6IFQsXG4gIGZuOiAoa2V5OiBrZXlvZiBUICYgc3RyaW5nLCB2YWx1ZTogVFtrZXlvZiBUICYgc3RyaW5nXSkgPT4gVSxcbik6IFJlY29yZDxrZXlvZiBULCBVPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgZm4oa2V5LCB2YWx1ZSldKSxcbiAgKSBhcyBSZWNvcmQ8a2V5b2YgVCwgVT47XG59XG4iLCIvKipcbiAqIEluamVjdCBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBvbiB0aGUgZ2l2ZW4gY2xhc3MsIHRoYXQgd29ya3MgY29ycmVjdGx5IGFjcm9zcyBleGVjdXRpb24gY29udGV4dHMuXG4gKlxuICogIyMjIERldGFpbHMgIyMjXG4gKlxuICogQWNjb3JkaW5nIHRvIHRoZSBFY21hU2NyaXB0J3Mgc3BlYywgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSmF2YVNjcmlwdCdzIGB4IGluc3RhbmNlb2YgWWAgb3BlcmF0b3IgaXMgdG8gd2FsayB1cCB0aGVcbiAqIHByb3RvdHlwZSBjaGFpbiBvZiBvYmplY3QgJ3gnLCBjaGVja2luZyBpZiBhbnkgY29uc3RydWN0b3IgaW4gdGhhdCBoaWVyYXJjaHkgaXMgX2V4YWN0bHkgdGhlIHNhbWUgb2JqZWN0XyBhcyB0aGVcbiAqIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICdZJy5cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCBpdCBoYXBwZW5zIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGF0IGRpZmZlcmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBvYmplY3RzIGdldCBjcmVhdGVkIGZvciB3aGF0XG4gKiBhcHBlYXJzIHRvIGJlIHRoZSB2ZXJ5IHNhbWUgY2xhc3MuIFRoaXMgbGVhZHMgdG8gc3VycHJpc2luZyBiZWhhdmlvciB3aGVyZSBgaW5zdGFuY2VvZmAgcmV0dXJucyBmYWxzZSB0aG91Z2ggaXQgaXNcbiAqIGtub3duIHRoYXQgdGhlIG9iamVjdCBpcyBpbmRlZWQgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4gT25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgd2hlbiBjb25zdHJ1Y3RvclxuICogJ1knIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGUgY29uc3R1Y3RvciB3aXRoIHdoaWNoICd4JyB3YXMgaW5zdGFudGlhdGVkLiBBbm90aGVyIGNhc2UgaXMgd2hlbiB0d28gY29waWVzXG4gKiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGdldHMgbG9hZGVkIGluIHRoZSBzYW1lIHJlYWxtLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIHRlbmRzIHRvIGNhdXNlIGlzc3VlcyB3aGVuIGNyb3NzaW5nIHRoZSB3b3JrZmxvdy1zYW5kYm94aW5nIGJvdW5kYXJ5IChzaW5jZSBOb2RlJ3Mgdm0gbW9kdWxlXG4gKiByZWFsbHkgY3JlYXRlcyBuZXcgZXhlY3V0aW9uIHJlYWxtcyksIGFzIHdlbGwgYXMgd2hlbiBydW5uaW5nIHRlc3RzIHVzaW5nIEplc3QgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdGpzL2plc3QvaXNzdWVzLzI1NDlcbiAqIGZvciBzb21lIGRldGFpbHMgb24gdGhhdCBvbmUpLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW5qZWN0cyBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBpbnRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6Jywgd2hpY2ggaXMgYm90aCBjcm9zcy1yZWFsbSBzYWZlIGFuZFxuICogY3Jvc3MtY29waWVzLW9mLXRoZS1zYW1lLWxpYiBzYWZlLiBJdCB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIHN5bWJvbCBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIGFuZCB0aGVuXG4gKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoYXQgc3ltYm9sLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mPEU+KGNsYXp6OiBDbGFzczxFPiwgbWFya2VyTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIEl0IG1heSBzZWVtIHJlZHVuZGFudCB0byBoYXZlIGFuIGV4cGxpY2l0IG1hcmtlck5hbWUgYXJndW1lbnQgaGVyZS4gQ2FuJ3Qgd2Ugc2ltcGx5IHVzZSB0aGUgY2xhc3NcbiAgLy8gZnVuY3Rpb24gbmFtZSBmb3IgdGhhdD8gVW5mb3J0dW5hdGVseSwgbm8sIGFzIHRoZSBjbGFzcyBuYW1lIG1heSBnZXQgbWFuZ2xlZCBpZiB0aGUgZmlsZSBnZXRzIG1pbmlmaWVkLlxuICBjb25zdCBtYXJrZXIgPSBTeW1ib2wuZm9yKGBfX25leHVzX2lzJHttYXJrZXJOYW1lfWApO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIFwibmFtZVwiLCB7IHZhbHVlOiBtYXJrZXJOYW1lLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCBtYXJrZXIsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCB2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICBpZiAodGhpcyA9PT0gY2xhenopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KVttYXJrZXJdID09PSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gJ3RoaXMnIG11c3QgYmUgYSBfc3ViY2xhc3NfIG9mIGNsYXp6IHRoYXQgZG9lc24ndCByZWRlZmluZWQgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIHNvIHRoYXQgaXQgaW5oZXJpdGVkXG4gICAgICAgIC8vIGZyb20gY2xhenoncyBbU3ltYm9sLmhhc0luc3RhbmNlXS4gSWYgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgcGFydGljdWxhciBzaXR1YXRpb24sIHRoZW5cbiAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZGVhbGx5LCBpdCdkIGJlIHByZWZlcmFibGUgdG8gYXZvaWQgdGhpcyBjYXNlIGVudGlyZWx5LCBieSBtYWtpbmcgc3VyZSB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mICdjbGF6eidcbiAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgIC8vIGJlaGF2aW9yICh3aGljaCBpcyBOT1QgY3Jvc3MtcmVhbG0gc2FmZSkuXG4gICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHZhbHVlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgY2xhc3MuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3M8RT4ge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogRTtcbiAgcHJvdG90eXBlOiBFO1xufVxuIiwiaW1wb3J0IHsgbWFwS2V5VmFsdWVzIH0gZnJvbSBcIi4uL2ludGVybmFsL29iamVjdC11dGlsc1wiO1xuaW1wb3J0IHsgU2ltcGxpZnkgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdHlwZXNcIjtcbmltcG9ydCB7IGlucHV0QnJhbmQsIG91dHB1dEJyYW5kLCB2YWxpZGF0ZVNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIHNlcnZpY2UgZGVmaW5pdGlvbiBmb3IgYSBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZTxPcHMgZXh0ZW5kcyBQYXJ0aWFsT3BlcmF0aW9uTWFwPihcbiAgbmFtZTogc3RyaW5nLFxuICBvcGVyYXRpb25zOiBPcHMsXG4pOiBTZXJ2aWNlRGVmaW5pdGlvbjxTaW1wbGlmeTxPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxPcHM+Pj4ge1xuICBjb25zdCBzZXJ2aWNlID0ge1xuICAgIG5hbWUsXG4gICAgb3BlcmF0aW9uczogbWFwS2V5VmFsdWVzKG9wZXJhdGlvbnMsIChrZXksIG9wOiBQYXJ0aWFsT3BlcmF0aW9uPGFueSwgYW55PikgPT4gKHtcbiAgICAgIC4uLm9wLFxuICAgICAgbmFtZTogb3AubmFtZSB8fCBrZXksXG4gICAgfSkpLFxuICB9IGFzIFNlcnZpY2VEZWZpbml0aW9uPE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+O1xuXG4gIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZSk7XG4gIHJldHVybiBzZXJ2aWNlO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhcyBwYXJ0IG9mIGEgc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb248SSwgTz4ob3A/OiBPcGVyYXRpb25PcHRpb25zPEksIE8+KTogUGFydGlhbE9wZXJhdGlvbjxJLCBPPiB7XG4gIHJldHVybiB7IC4uLm9wIH0gYXMgUGFydGlhbE9wZXJhdGlvbjxJLCBPPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIG9wZXJhdGlvbn0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbk9wdGlvbnM8X0ksIF9PPiB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBuYW1lZCBjb2xsZWN0aW9uIG9mIHBhcnRpYWwgb3BlcmF0aW9uIGhhbmRsZXJzLiBJbnB1dCBmb3IgdGhlIHtAbGluayBzZXJ2aWNlfSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRpYWxPcGVyYXRpb25NYXAgPSBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsT3BlcmF0aW9uPGFueSwgYW55Pj47XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgdHJhbnNmb3JtcyBhIHtAbGluayBQYXJ0aWFsT3BlcmF0aW9uTWFwfSBpbnRvIGFuIHtAbGluayBPcGVyYXRpb25NYXB9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8VCBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb248aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz5cbiAgICA6IG5ldmVyO1xufTtcblxuLyoqXG4gKiBBIHBhcnRpYWwge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgYW4gb3BlcmF0aW9uIGluIGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHtAbGluayBPcGVyYXRpb25EZWZpbml0aW9ufSBpcyB0aGF0IHRoZSBuYW1lIGlzIG9wdGlvbmFsLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgbmFtZT86IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuIiwiZXhwb3J0IHtcbiAgdHlwZSBTZXJ2aWNlRGVmaW5pdGlvbixcbiAgdHlwZSBPcGVyYXRpb25EZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbk1hcCxcbiAgdHlwZSBPcGVyYXRpb25JbnB1dCxcbiAgdHlwZSBPcGVyYXRpb25PdXRwdXQsXG4gIHR5cGUgT3BlcmF0aW9uS2V5LFxufSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcblxuZXhwb3J0IHtcbiAgc2VydmljZSxcbiAgb3BlcmF0aW9uLFxuICB0eXBlIE9wZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCxcbiAgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbCxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uLFxufSBmcm9tIFwiLi9oZWxwZXJzXCI7XG4iLCJleHBvcnQgZGVjbGFyZSBjb25zdCBpbnB1dEJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IGRlY2xhcmUgY29uc3Qgb3V0cHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIE5leHVzIHNlcnZpY2UgY29udHJhY3QsIGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgb3BlcmF0aW9ucy5cbiAqXG4gKiBDYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBieSB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlRGVmaW5pdGlvbjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvcGVyYXRpb25zOiBPcHM7XG59XG5cbi8qKlxuICogQW4gb3BlcmF0aW9uIGNvbnRyYWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBuYW1lLCBhbmQgaW5wdXQgYW5kIG91dHB1dCB0eXBlcyBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIFtpbnB1dEJyYW5kXTogSTtcbiAgW291dHB1dEJyYW5kXTogTztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucywgYXMgZGVmaW5lZCBieSBhIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXAgPSBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgYW55Pj47XG5cbi8qKlxuICogQSBtYXBwZWQgdHlwZSB0aGF0IGV4dHJhY3RzIHRoZSBpbnB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbklucHV0PFQ+ID0gVCBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248aW5mZXIgSSwgYW55PiA/IEkgOiBhbnk7XG5cbi8qKlxuICogQSBtYXBwZWQgdHlwZSB0aGF0IGV4dHJhY3RzIHRoZSBvdXRwdXQgdHlwZSBmcm9tIGFuIG9wZXJhdGlvbiBpbiBhIHNlcnZpY2UuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25PdXRwdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxhbnksIGluZmVyIE8+ID8gTyA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgYWxsIG9wZXJhdGlvbiBuYW1lcyBmcm9tIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbktleTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IFRbS10gZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgYW55PiA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogQ29uZmlybSB0aGF0IGEgc2VydmljZSBkZWZpbml0aW9uIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIHNlcnZpY2UgZGVmaW5pdGlvbiB0byB2YWxpZGF0ZS5cbiAqXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgaW52YWxpZC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNlcnZpY2VEZWZpbml0aW9uKHNlcnZpY2U6IFNlcnZpY2VEZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2Ygc2VydmljZS5uYW1lICE9PSBcInN0cmluZ1wiIHx8ICFzZXJ2aWNlLm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VydmljZSBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbcHJvcE5hbWUsIG9wZXJhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24ubmFtZTtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbk5hbWUgIT09IFwic3RyaW5nXCIgfHwgIW9wZXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9wZXJhdGlvbiBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLCBmb3IgcHJvcGVydHkgJyR7cHJvcE5hbWV9J2ApO1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9uTmFtZXMuaGFzKG9wZXJhdGlvbk5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBEdXBsaWNhdGUgb3BlcmF0aW9uIGRlZmluaXRpb24gZm9yIG5hbWU6ICcke29wZXJhdGlvbk5hbWV9J2ApO1xuICAgIH1cbiAgICBvcGVyYXRpb25OYW1lcy5hZGQob3BlcmF0aW9uTmFtZSk7XG4gIH1cbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8vIEhlbHBlcnMuXG5jb25zdCBzID0gMTAwMDtcbmNvbnN0IG0gPSBzICogNjA7XG5jb25zdCBoID0gbSAqIDYwO1xuY29uc3QgZCA9IGggKiAyNDtcbmNvbnN0IHcgPSBkICogNztcbmNvbnN0IHkgPSBkICogMzY1LjI1O1xuZnVuY3Rpb24gbXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucz8ubG9uZyA/IGZtdExvbmcodmFsdWUpIDogZm10U2hvcnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG51bWJlci4nKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpc0Vycm9yKGVycm9yKVxuICAgICAgICAgICAgPyBgJHtlcnJvci5tZXNzYWdlfS4gdmFsdWU9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgICAgICAgOiAnQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC4nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gICAgY29uc3QgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB1bml0ICR7dHlwZX0gd2FzIG1hdGNoZWQsIGJ1dCBubyBtYXRjaGluZyBjYXNlIGV4aXN0cy5gKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBtcztcbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gZCl9ZGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gaCl9aGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbSl9bWA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gcyl9c2A7XG4gICAgfVxuICAgIHJldHVybiBgJHttc31tc2A7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBgJHttc30gbXNgO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICAgIGNvbnN0IGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG4pfSAke25hbWV9JHtpc1BsdXJhbCA/ICdzJyA6ICcnfWA7XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgZXJyb3JzLlxuICovXG5mdW5jdGlvbiBpc0Vycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ21lc3NhZ2UnIGluIGVycm9yO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMDkgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzXG4gKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgV2lydHogLyBUaGUgbG9uZy5qcyBBdXRob3JzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8vIFdlYkFzc2VtYmx5IG9wdGltaXphdGlvbnMgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXG52YXIgd2FzbSA9IG51bGw7XG50cnkge1xuICB3YXNtID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKFxuICAgIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoXG4gICAgICBuZXcgVWludDhBcnJheShbXG4gICAgICAgIC8vIFxcMGFzbVxuICAgICAgICAwLCA5NywgMTE1LCAxMDksXG4gICAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgICAxLCAwLCAwLCAwLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJ0eXBlXCJcbiAgICAgICAgMSwgMTMsIDIsXG4gICAgICAgIC8vIDAsICgpID0+IGkzMlxuICAgICAgICA5NiwgMCwgMSwgMTI3LFxuICAgICAgICAvLyAxLCAoaTMyLCBpMzIsIGkzMiwgaTMyKSA9PiBpMzJcbiAgICAgICAgOTYsIDQsIDEyNywgMTI3LCAxMjcsIDEyNywgMSwgMTI3LFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJmdW5jdGlvblwiXG4gICAgICAgIDMsIDcsIDYsXG4gICAgICAgIC8vIDAsIHR5cGUgMFxuICAgICAgICAwLFxuICAgICAgICAvLyAxLCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gMiwgdHlwZSAxXG4gICAgICAgIDEsXG4gICAgICAgIC8vIDMsIHR5cGUgMVxuICAgICAgICAxLFxuICAgICAgICAvLyA0LCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gNSwgdHlwZSAxXG4gICAgICAgIDEsXG5cbiAgICAgICAgLy8gc2VjdGlvbiBcImdsb2JhbFwiXG4gICAgICAgIDYsIDYsIDEsXG4gICAgICAgIC8vIDAsIFwiaGlnaFwiLCBtdXRhYmxlIGkzMlxuICAgICAgICAxMjcsIDEsIDY1LCAwLCAxMSxcblxuICAgICAgICAvLyBzZWN0aW9uIFwiZXhwb3J0XCJcbiAgICAgICAgNywgNTAsIDYsXG4gICAgICAgIC8vIDAsIFwibXVsXCJcbiAgICAgICAgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSxcbiAgICAgICAgLy8gMSwgXCJkaXZfc1wiXG4gICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTUsIDAsIDIsXG4gICAgICAgIC8vIDIsIFwiZGl2X3VcIlxuICAgICAgICA1LCAxMDAsIDEwNSwgMTE4LCA5NSwgMTE3LCAwLCAzLFxuICAgICAgICAvLyAzLCBcInJlbV9zXCJcbiAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCxcbiAgICAgICAgLy8gNCwgXCJyZW1fdVwiXG4gICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTcsIDAsIDUsXG4gICAgICAgIC8vIDUsIFwiZ2V0X2hpZ2hcIlxuICAgICAgICA4LCAxMDMsIDEwMSwgMTE2LCA5NSwgMTA0LCAxMDUsIDEwMywgMTA0LCAwLCAwLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJjb2RlXCJcbiAgICAgICAgMTAsIDE5MSwgMSwgNixcbiAgICAgICAgLy8gMCwgXCJnZXRfaGlnaFwiXG4gICAgICAgIDQsIDAsIDM1LCAwLCAxMSxcbiAgICAgICAgLy8gMSwgXCJtdWxcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDIsIFwiZGl2X3NcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjcsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDMsIFwiZGl2X3VcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjgsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDQsIFwicmVtX3NcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDUsIFwicmVtX3VcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMzAsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICBdKSxcbiAgICApLFxuICAgIHt9LFxuICApLmV4cG9ydHM7XG59IGNhdGNoIHtcbiAgLy8gbm8gd2FzbSBzdXBwb3J0IDooXG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIsIGdpdmVuIGl0cyBsb3cgYW5kIGhpZ2ggMzIgYml0IHZhbHVlcyBhcyAqc2lnbmVkKiBpbnRlZ2Vycy5cbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxuICogQGV4cG9ydHMgTG9uZ1xuICogQGNsYXNzIEEgTG9uZyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaCBUaGUgaGlnaCAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gsIHVuc2lnbmVkKSB7XG4gIC8qKlxuICAgKiBUaGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLmxvdyA9IGxvdyB8IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcblxuICAvKipcbiAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XG59XG5cbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXG4vLyBXZSB1c2UgMzItYml0IHBpZWNlcyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyBvbiB3aGljaFxuLy8gSmF2YXNjcmlwdCBwZXJmb3JtcyBiaXQtb3BlcmF0aW9ucy4gIEZvciBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXG4vLyBtdWx0aXBsaWVkIHdpdGhpbiBKYXZhc2NyaXB0J3MgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBvdmVyZmxvd1xuLy8gb3IgY2hhbmdlIGluIHNpZ24uXG4vL1xuLy8gSW4gdGhlIGFsZ29yaXRobXMgYmVsb3csIHdlIGZyZXF1ZW50bHkgcmVkdWNlIHRoZSBuZWdhdGl2ZSBjYXNlIHRvIHRoZVxuLy8gcG9zaXRpdmUgY2FzZSBieSBuZWdhdGluZyB0aGUgaW5wdXQocykgYW5kIHRoZW4gcG9zdC1wcm9jZXNzaW5nIHRoZSByZXN1bHQuXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcbi8vICgtMl42MykgYmVjYXVzZSAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRSAoc2luY2UgMl42MyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXNcbi8vIGEgcG9zaXRpdmUgbnVtYmVyLCBpdCBvdmVyZmxvd3MgYmFjayBpbnRvIGEgbmVnYXRpdmUpLiAgTm90IGhhbmRsaW5nIHRoaXNcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cbi8vXG4vLyBDb21tb24gY29uc3RhbnQgdmFsdWVzIFpFUk8sIE9ORSwgTkVHX09ORSwgZXRjLiBhcmUgZGVmaW5lZCBiZWxvdyB0aGUgZnJvbSpcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXG5cbi8qKlxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAY29uc3RcbiAqIEBwcml2YXRlXG4gKi9cbkxvbmcucHJvdG90eXBlLl9faXNMb25nX187XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb25nLnByb3RvdHlwZSwgXCJfX2lzTG9uZ19fXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcbiAgcmV0dXJuIChvYmogJiYgb2JqW1wiX19pc0xvbmdfX1wiXSkgPT09IHRydWU7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlIG51bWJlclxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBjdHozMih2YWx1ZSkge1xuICB2YXIgYyA9IE1hdGguY2x6MzIodmFsdWUgJiAtdmFsdWUpO1xuICByZXR1cm4gdmFsdWUgPyAzMSAtIGMgOiBjO1xufVxuXG4vKipcbiAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgTG9uZy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXG4gKiBAdHlwZSB7IU9iamVjdH1cbiAqIEBpbm5lclxuICovXG52YXIgSU5UX0NBQ0hFID0ge307XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuXG4gKiBAdHlwZSB7IU9iamVjdH1cbiAqIEBpbm5lclxuICovXG52YXIgVUlOVF9DQUNIRSA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xuICBpZiAodW5zaWduZWQpIHtcbiAgICB2YWx1ZSA+Pj49IDA7XG4gICAgaWYgKChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpKSB7XG4gICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgfVxuICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAwLCB0cnVlKTtcbiAgICBpZiAoY2FjaGUpIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgfD0gMDtcbiAgICBpZiAoKGNhY2hlID0gLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcbiAgICAgIGNhY2hlZE9iaiA9IElOVF9DQUNIRVt2YWx1ZV07XG4gICAgICBpZiAoY2FjaGVkT2JqKSByZXR1cm4gY2FjaGVkT2JqO1xuICAgIH1cbiAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7XG4gICAgaWYgKGNhY2hlKSBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIDMyIGJpdCBpbnRlZ2VyIHZhbHVlLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tSW50ID0gZnJvbUludDtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICBpZiAodW5zaWduZWQpIHtcbiAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gVVpFUk87XG4gICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKSByZXR1cm4gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1BWF9WQUxVRTtcbiAgfVxuICBpZiAodmFsdWUgPCAwKSByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgIHZhbHVlICUgVFdPX1BXUl8zMl9EQkwgfCAwLFxuICAgICh2YWx1ZSAvIFRXT19QV1JfMzJfREJMKSB8IDAsXG4gICAgdW5zaWduZWQsXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZSwgcHJvdmlkZWQgdGhhdCBpdCBpcyBhIGZpbml0ZSBudW1iZXIuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21OdW1iZXIgPSBmcm9tTnVtYmVyO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgNjQgYml0IGludGVnZXIgdGhhdCBjb21lcyBieSBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsb3cgYW5kIGhpZ2ggYml0cy4gRWFjaCBpc1xuICogIGFzc3VtZWQgdG8gdXNlIDMyIGJpdHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzIFRoZSBsb3cgMzIgYml0c1xuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzIFRoZSBoaWdoIDMyIGJpdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQGlubmVyXG4gKi9cbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXhcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSB0aHJvdyBFcnJvcihcImVtcHR5IHN0cmluZ1wiKTtcbiAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XG4gICAgcmFkaXggPSB1bnNpZ25lZDtcbiAgICB1bnNpZ25lZCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgfVxuICBpZiAoXG4gICAgc3RyID09PSBcIk5hTlwiIHx8XG4gICAgc3RyID09PSBcIkluZmluaXR5XCIgfHxcbiAgICBzdHIgPT09IFwiK0luZmluaXR5XCIgfHxcbiAgICBzdHIgPT09IFwiLUluZmluaXR5XCJcbiAgKVxuICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG5cbiAgdmFyIHA7XG4gIGlmICgocCA9IHN0ci5pbmRleE9mKFwiLVwiKSkgPiAwKSB0aHJvdyBFcnJvcihcImludGVyaW9yIGh5cGhlblwiKTtcbiAgZWxzZSBpZiAocCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7XG4gIH1cblxuICAvLyBEbyBzZXZlcmFsICg4KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7XG5cbiAgdmFyIHJlc3VsdCA9IFpFUk87XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgdmFyIHNpemUgPSBNYXRoLm1pbig4LCBzdHIubGVuZ3RoIC0gaSksXG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcoaSwgaSArIHNpemUpLCByYWRpeCk7XG4gICAgaWYgKHNpemUgPCA4KSB7XG4gICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xuICAgIH1cbiAgfVxuICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcbiAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggVGhlIHJhZGl4IGluIHdoaWNoIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tVmFsdWUodmFsLCB1bnNpZ25lZCkge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGZyb21OdW1iZXIodmFsLCB1bnNpZ25lZCk7XG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcbiAgLy8gVGhyb3dzIGZvciBub24tb2JqZWN0cywgY29udmVydHMgbm9uLWluc3RhbmNlb2YgTG9uZzpcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgIHZhbC5sb3csXG4gICAgdmFsLmhpZ2gsXG4gICAgdHlwZW9mIHVuc2lnbmVkID09PSBcImJvb2xlYW5cIiA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkLFxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbCBWYWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nLmZyb21WYWx1ZSA9IGZyb21WYWx1ZTtcblxuLy8gTk9URTogdGhlIGNvbXBpbGVyIHNob3VsZCBpbmxpbmUgdGhlc2UgY29uc3RhbnQgdmFsdWVzIGJlbG93IGFuZCB0aGVuIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMsIHNvIHRoZXJlIHNob3VsZCBiZVxuLy8gbm8gcnVudGltZSBwZW5hbHR5IGZvciB0aGVzZS5cblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMzJfREJMID0gVFdPX1BXUl8xNl9EQkwgKiBUV09fUFdSXzE2X0RCTDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBjb25zdFxuICogQGlubmVyXG4gKi9cbnZhciBUV09fUFdSXzI0ID0gZnJvbUludChUV09fUFdSXzI0X0RCTCk7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBaRVJPID0gZnJvbUludCgwKTtcblxuLyoqXG4gKiBTaWduZWQgemVyby5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5aRVJPID0gWkVSTztcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIFVaRVJPID0gZnJvbUludCgwLCB0cnVlKTtcblxuLyoqXG4gKiBVbnNpZ25lZCB6ZXJvLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlVaRVJPID0gVVpFUk87XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBPTkUgPSBmcm9tSW50KDEpO1xuXG4vKipcbiAqIFNpZ25lZCBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuT05FID0gT05FO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgVU9ORSA9IGZyb21JbnQoMSwgdHJ1ZSk7XG5cbi8qKlxuICogVW5zaWduZWQgb25lLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlVPTkUgPSBVT05FO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgTkVHX09ORSA9IGZyb21JbnQoLTEpO1xuXG4vKipcbiAqIFNpZ25lZCBuZWdhdGl2ZSBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuTkVHX09ORSA9IE5FR19PTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNQVhfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHg3ZmZmZmZmZiB8IDAsIGZhbHNlKTtcblxuLyoqXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHhmZmZmZmZmZiB8IDAsIHRydWUpO1xuXG4vKipcbiAqIE1heGltdW0gdW5zaWduZWQgdmFsdWUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMHg4MDAwMDAwMCB8IDAsIGZhbHNlKTtcblxuLyoqXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XG5cbi8qKlxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXG4gKiBAaW5uZXJcbiAqL1xudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xuICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IHRoaXMubG93ID4+PiAwIDogdGhpcy5sb3c7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xuICBpZiAodGhpcy51bnNpZ25lZClcbiAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG4gIHJldHVybiB0aGlzLmhpZ2ggKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggUmFkaXggKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBvdmVycmlkZVxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYHJhZGl4YCBpcyBvdXQgb2YgcmFuZ2VcbiAqL1xuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XG4gIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgdGhyb3cgUmFuZ2VFcnJvcihcInJhZGl4XCIpO1xuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIFwiMFwiO1xuICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgTG9uZyB2YWx1ZSBiZWZvcmUgaXQgY2FuIGJlIG5lZ2F0ZWQsIHNvIHdlIHJlbW92ZVxuICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxuICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLFxuICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxuICAgICAgICByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTtcbiAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcbiAgICB9IGVsc2UgcmV0dXJuIFwiLVwiICsgdGhpcy5uZWcoKS50b1N0cmluZyhyYWRpeCk7XG4gIH1cblxuICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA2KSwgdGhpcy51bnNpZ25lZCksXG4gICAgcmVtID0gdGhpcztcbiAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHJlbURpdiA9IHJlbS5kaXYocmFkaXhUb1Bvd2VyKSxcbiAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxuICAgICAgZGlnaXRzID0gaW50dmFsLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZW0gPSByZW1EaXY7XG4gICAgaWYgKHJlbS5pc1plcm8oKSkgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNikgZGlnaXRzID0gXCIwXCIgKyBkaWdpdHM7XG4gICAgICByZXN1bHQgPSBcIlwiICsgZGlnaXRzICsgcmVzdWx0O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBoaWdoIGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xuICByZXR1cm4gdGhpcy5oaWdoO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGhpZ2ggYml0c1xuICovXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xuICByZXR1cm4gdGhpcy5oaWdoID4+PiAwO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGxvdyBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XG4gIHJldHVybiB0aGlzLmxvdztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGxvdyBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xuICByZXR1cm4gdGhpcy5sb3cgPj4+IDA7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSlcbiAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcbiAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XG4gIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSkgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKSBicmVhaztcbiAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcgY2FuIGJlIHNhZmVseSByZXByZXNlbnRlZCBhcyBhIEphdmFTY3JpcHQgbnVtYmVyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNTYWZlSW50ZWdlciA9IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIoKSB7XG4gIC8vIDJeNTMtMSBpcyB0aGUgbWF4aW11bSBzYWZlIHZhbHVlXG4gIHZhciB0b3AxMUJpdHMgPSB0aGlzLmhpZ2ggPj4gMjE7XG4gIC8vIFswLCAyXjUzLTFdXG4gIGlmICghdG9wMTFCaXRzKSByZXR1cm4gdHJ1ZTtcbiAgLy8gPiAyXjUzLTFcbiAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gWy0yXjUzLCAtMV0gZXhjZXB0IC0yXjUzXG4gIHJldHVybiB0b3AxMUJpdHMgPT09IC0xICYmICEodGhpcy5sb3cgPT09IDAgJiYgdGhpcy5oaWdoID09PSAtMHgyMDAwMDApO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gMCAmJiB0aGlzLmxvdyA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XG4gIHJldHVybiAhdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPCAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZSBvciB6ZXJvLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7XG4gIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBvZGQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkge1xuICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4oKSB7XG4gIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIGlmIChcbiAgICB0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJlxuICAgIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiZcbiAgICBvdGhlci5oaWdoID4+PiAzMSA9PT0gMVxuICApXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcbiAgcmV0dXJuICF0aGlzLmVxKC8qIHZhbGlkYXRlcyAqLyBvdGhlcik7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW59LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPiAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPj0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3RlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ2UgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIDA7XG4gIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksXG4gICAgb3RoZXJOZWcgPSBvdGhlci5pc05lZ2F0aXZlKCk7XG4gIGlmICh0aGlzTmVnICYmICFvdGhlck5lZykgcmV0dXJuIC0xO1xuICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpIHJldHVybiAxO1xuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXG4gIGlmICghdGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XG4gIC8vIEJvdGggYXJlIHBvc2l0aXZlIGlmIGF0IGxlYXN0IG9uZSBpcyB1bnNpZ25lZFxuICByZXR1cm4gb3RoZXIuaGlnaCA+Pj4gMCA+IHRoaXMuaGlnaCA+Pj4gMCB8fFxuICAgIChvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgb3RoZXIubG93ID4+PiAwID4gdGhpcy5sb3cgPj4+IDApXG4gICAgPyAtMVxuICAgIDogMTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcCA9IExvbmdQcm90b3R5cGUuY29tcGFyZTtcblxuLyoqXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XG4gIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBNSU5fVkFMVUU7XG4gIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xufTtcblxuLyoqXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25lZ2F0ZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUubmVnID0gTG9uZ1Byb3RvdHlwZS5uZWdhdGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gU3VtXG4gKi9cbkxvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xuICBpZiAoIWlzTG9uZyhhZGRlbmQpKSBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTtcblxuICAvLyBEaXZpZGUgZWFjaCBudW1iZXIgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBzdW0gdGhlIGNodW5rcy5cblxuICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuXG4gIHZhciBiNDggPSBhZGRlbmQuaGlnaCA+Pj4gMTY7XG4gIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGIxNiA9IGFkZGVuZC5sb3cgPj4+IDE2O1xuICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDB4ZmZmZjtcblxuICB2YXIgYzQ4ID0gMCxcbiAgICBjMzIgPSAwLFxuICAgIGMxNiA9IDAsXG4gICAgYzAwID0gMDtcbiAgYzAwICs9IGEwMCArIGIwMDtcbiAgYzE2ICs9IGMwMCA+Pj4gMTY7XG4gIGMwMCAmPSAweGZmZmY7XG4gIGMxNiArPSBhMTYgKyBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTMyICsgYjMyO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzQ4ICs9IGE0OCArIGI0ODtcbiAgYzQ4ICY9IDB4ZmZmZjtcbiAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcbiAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XG4gIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxuICovXG5Mb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICovXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXM7XG4gIGlmICghaXNMb25nKG11bHRpcGxpZXIpKSBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xuXG4gIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICBpZiAod2FzbSkge1xuICAgIHZhciBsb3cgPSB3YXNtW1wibXVsXCJdKHRoaXMubG93LCB0aGlzLmhpZ2gsIG11bHRpcGxpZXIubG93LCBtdWx0aXBsaWVyLmhpZ2gpO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuXG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xuICB9IGVsc2UgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XG5cbiAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxuICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSAqIG11bHRpcGxpZXIudG9OdW1iZXIoKSwgdGhpcy51bnNpZ25lZCk7XG5cbiAgLy8gRGl2aWRlIGVhY2ggbG9uZyBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIGFkZCB1cCA0eDQgcHJvZHVjdHMuXG4gIC8vIFdlIGNhbiBza2lwIHByb2R1Y3RzIHRoYXQgd291bGQgb3ZlcmZsb3cuXG5cbiAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4ZmZmZjtcblxuICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcbiAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjtcbiAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhmZmZmO1xuXG4gIHZhciBjNDggPSAwLFxuICAgIGMzMiA9IDAsXG4gICAgYzE2ID0gMCxcbiAgICBjMDAgPSAwO1xuICBjMDAgKz0gYTAwICogYjAwO1xuICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgYzAwICY9IDB4ZmZmZjtcbiAgYzE2ICs9IGExNiAqIGIwMDtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweGZmZmY7XG4gIGMxNiArPSBhMDAgKiBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTMyICogYjAwO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzMyICs9IGExNiAqIGIxNjtcbiAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gIGMzMiAmPSAweGZmZmY7XG4gIGMzMiArPSBhMDAgKiBiMzI7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhmZmZmO1xuICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xuICBjNDggJj0gMHhmZmZmO1xuICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICovXG5Mb25nUHJvdG90eXBlLm11bCA9IExvbmdQcm90b3R5cGUubXVsdGlwbHk7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGUgcmVzdWx0IGlzIHNpZ25lZCBpZiB0aGlzIExvbmcgaXMgc2lnbmVkIG9yXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gKi9cbkxvbmdQcm90b3R5cGUuZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGRpdmlzb3IpIHtcbiAgaWYgKCFpc0xvbmcoZGl2aXNvcikpIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG4gIGlmIChkaXZpc29yLmlzWmVybygpKSB0aHJvdyBFcnJvcihcImRpdmlzaW9uIGJ5IHplcm9cIik7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XG4gICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxuICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgaWYgKFxuICAgICAgIXRoaXMudW5zaWduZWQgJiZcbiAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcbiAgICAgIGRpdmlzb3IubG93ID09PSAtMSAmJlxuICAgICAgZGl2aXNvci5oaWdoID09PSAtMVxuICAgICkge1xuICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJkaXZfdVwiXSA6IHdhc21bXCJkaXZfc1wiXSkoXG4gICAgICB0aGlzLmxvdyxcbiAgICAgIHRoaXMuaGlnaCxcbiAgICAgIGRpdmlzb3IubG93LFxuICAgICAgZGl2aXNvci5oaWdoLFxuICAgICk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICB9XG5cbiAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICB2YXIgYXBwcm94LCByZW0sIHJlcztcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XG4gICAgLy8gVGhpcyBzZWN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHNpZ25lZCBsb25ncyBhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZVxuICAgIC8vIGNsb3N1cmUgbGlicmFyeSBhcyBhIHdob2xlLlxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSlcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcbiAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE9ORTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXG4gICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpO1xuICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpO1xuICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XG4gICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW0gPSB0aGlzLnN1YihkaXZpc29yLm11bChhcHByb3gpKTtcbiAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTtcbiAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XG4gICAgcmVzID0gWkVSTztcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgYWxnb3JpdGhtIGJlbG93IGhhcyBub3QgYmVlbiBtYWRlIGZvciB1bnNpZ25lZCBsb25ncy4gSXQncyB0aGVyZWZvcmVcbiAgICAvLyByZXF1aXJlZCB0byB0YWtlIHNwZWNpYWwgY2FyZSBvZiB0aGUgTVNCIHByaW9yIHRvIHJ1bm5pbmcgaXQuXG4gICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKSBkaXZpc29yID0gZGl2aXNvci50b1Vuc2lnbmVkKCk7XG4gICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpIHJldHVybiBVWkVSTztcbiAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKVxuICAgICAgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcbiAgICAgIHJldHVybiBVT05FO1xuICAgIHJlcyA9IFVaRVJPO1xuICB9XG5cbiAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcbiAgLy8gZmxvYXRpbmctcG9pbnQgdGhhdCBhcHByb3hpbWF0ZXMgcmVtYWluZGVyIC8gb3RoZXIgKmZyb20gYmVsb3cqLCBhZGQgdGhpc1xuICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XG4gIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcbiAgLy8gcmVtYWluZGVyIG5ldmVyIGJlY29tZXMgbmVnYXRpdmUuXG4gIHJlbSA9IHRoaXM7XG4gIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XG4gICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxuICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxuICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcblxuICAgIC8vIFdlIHdpbGwgdHdlYWsgdGhlIGFwcHJveGltYXRlIHJlc3VsdCBieSBjaGFuZ2luZyBpdCBpbiB0aGUgNDgtdGggZGlnaXQgb3JcbiAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXG4gICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSxcbiAgICAgIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcbiAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkge1xuICAgICAgYXBwcm94IC09IGRlbHRhO1xuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB9XG5cbiAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcbiAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cbiAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKSBhcHByb3hSZXMgPSBPTkU7XG5cbiAgICByZXMgPSByZXMuYWRkKGFwcHJveFJlcyk7XG4gICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAqL1xuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5tb2R1bG8gPSBmdW5jdGlvbiBtb2R1bG8oZGl2aXNvcikge1xuICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcblxuICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgaWYgKHdhc20pIHtcbiAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wicmVtX3VcIl0gOiB3YXNtW1wicmVtX3NcIl0pKFxuICAgICAgdGhpcy5sb3csXG4gICAgICB0aGlzLmhpZ2gsXG4gICAgICBkaXZpc29yLmxvdyxcbiAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICApO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gKi9cbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICovXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XG4gIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudExlYWRpbmdaZXJvcygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA/IE1hdGguY2x6MzIodGhpcy5oaWdoKSA6IE1hdGguY2x6MzIodGhpcy5sb3cpICsgMzI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudExlYWRpbmdaZXJvc30uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IW51bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5jbHogPSBMb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zO1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRUcmFpbGluZ1plcm9zKCkge1xuICByZXR1cm4gdGhpcy5sb3cgPyBjdHozMih0aGlzLmxvdykgOiBjdHozMih0aGlzLmhpZ2gpICsgMzI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRUcmFpbGluZ1plcm9zfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ31cbiAqIEByZXR1cm5zIHshbnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLmN0eiA9IExvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgQU5EIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyB8IG90aGVyLmxvdywgdGhpcy5oaWdoIHwgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyBeIG90aGVyLmxvdywgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgIHRoaXMubG93IDw8IG51bUJpdHMsXG4gICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiAoMzIgLSBudW1CaXRzKSksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIGVsc2UgcmV0dXJuIGZyb21CaXRzKDAsIHRoaXMubG93IDw8IChudW1CaXRzIC0gMzIpLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdExlZnR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0KG51bUJpdHMpIHtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksXG4gICAgICB0aGlzLmhpZ2ggPj4gbnVtQml0cyxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgZWxzZVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgIHRoaXMuaGlnaCA+PiAobnVtQml0cyAtIDMyKSxcbiAgICAgIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLFxuICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0fS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHRVbnNpZ25lZChudW1CaXRzKSB7XG4gIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgIHRoaXMuaGlnaCA+Pj4gbnVtQml0cyxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCAwLCB0aGlzLnVuc2lnbmVkKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+Pj4gKG51bUJpdHMgLSAzMiksIDAsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hydSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaHJfdSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChudW1CaXRzKSB7XG4gIHZhciBiO1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIH1cbiAgbnVtQml0cyAtPSAzMjtcbiAgYiA9IDMyIC0gbnVtQml0cztcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+IGIpLFxuICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgIHRoaXMudW5zaWduZWQsXG4gICk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZUxlZnR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RsID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUucm90YXRlUmlnaHQgPSBmdW5jdGlvbiByb3RhdGVSaWdodChudW1CaXRzKSB7XG4gIHZhciBiO1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIH1cbiAgbnVtQml0cyAtPSAzMjtcbiAgYiA9IDMyIC0gbnVtQml0cztcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgIHRoaXMudW5zaWduZWQsXG4gICk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVSaWdodH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnJvdHIgPSBMb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBzaWduZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9IFNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9TaWduZWQgPSBmdW5jdGlvbiB0b1NpZ25lZCgpIHtcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7XG4gIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXG4gKi9cbkxvbmdQcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMobGUpIHtcbiAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKi9cbkxvbmdQcm90b3R5cGUudG9CeXRlc0xFID0gZnVuY3Rpb24gdG9CeXRlc0xFKCkge1xuICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgbG8gPSB0aGlzLmxvdztcbiAgcmV0dXJuIFtcbiAgICBsbyAmIDB4ZmYsXG4gICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgKGxvID4+PiAxNikgJiAweGZmLFxuICAgIGxvID4+PiAyNCxcbiAgICBoaSAmIDB4ZmYsXG4gICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgIGhpID4+PiAyNCxcbiAgXTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7XG4gIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICBsbyA9IHRoaXMubG93O1xuICByZXR1cm4gW1xuICAgIGhpID4+PiAyNCxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgaGkgJiAweGZmLFxuICAgIGxvID4+PiAyNCxcbiAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgbG8gJiAweGZmLFxuICBdO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbUJ5dGVzID0gZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzLCB1bnNpZ25lZCwgbGUpIHtcbiAgcmV0dXJuIGxlXG4gICAgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZClcbiAgICA6IExvbmcuZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tQnl0ZXNMRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkge1xuICByZXR1cm4gbmV3IExvbmcoXG4gICAgYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkgfCAoYnl0ZXNbMl0gPDwgMTYpIHwgKGJ5dGVzWzNdIDw8IDI0KSxcbiAgICBieXRlc1s0XSB8IChieXRlc1s1XSA8PCA4KSB8IChieXRlc1s2XSA8PCAxNikgfCAoYnl0ZXNbN10gPDwgMjQpLFxuICAgIHVuc2lnbmVkLFxuICApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhcbiAgICAoYnl0ZXNbNF0gPDwgMjQpIHwgKGJ5dGVzWzVdIDw8IDE2KSB8IChieXRlc1s2XSA8PCA4KSB8IGJ5dGVzWzddLFxuICAgIChieXRlc1swXSA8PCAyNCkgfCAoYnl0ZXNbMV0gPDwgMTYpIHwgKGJ5dGVzWzJdIDw8IDgpIHwgYnl0ZXNbM10sXG4gICAgdW5zaWduZWQsXG4gICk7XG59O1xuXG4vLyBTdXBwb3J0IGNvbnZlcnNpb24gdG8vZnJvbSBCaWdJbnQgd2hlcmUgYXZhaWxhYmxlXG5pZiAodHlwZW9mIEJpZ0ludCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJpZyBpbnRlZ2VyLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBiaWcgaW50ZWdlciB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgKi9cbiAgTG9uZy5mcm9tQmlnSW50ID0gZnVuY3Rpb24gZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICB2YXIgbG93Qml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSkpO1xuICAgIHZhciBoaWdoQml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSA+PiBCaWdJbnQoMzIpKSk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGVcbiAgTG9uZy5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWVXaXRoQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBMb25nLmZyb21CaWdJbnQodmFsdWUsIHVuc2lnbmVkKTtcbiAgICByZXR1cm4gZnJvbVZhbHVlKHZhbHVlLCB1bnNpZ25lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGl0cyBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAgICogQHRoaXMgeyFMb25nfVxuICAgKiBAcmV0dXJucyB7YmlnaW50fVxuICAgKi9cbiAgTG9uZ1Byb3RvdHlwZS50b0JpZ0ludCA9IGZ1bmN0aW9uIHRvQmlnSW50KCkge1xuICAgIHZhciBsb3dCaWdJbnQgPSBCaWdJbnQodGhpcy5sb3cgPj4+IDApO1xuICAgIHZhciBoaWdoQmlnSW50ID0gQmlnSW50KHRoaXMudW5zaWduZWQgPyB0aGlzLmhpZ2ggPj4+IDAgOiB0aGlzLmhpZ2gpO1xuICAgIHJldHVybiAoaGlnaEJpZ0ludCA8PCBCaWdJbnQoMzIpKSB8IGxvd0JpZ0ludDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9uZztcbiIsImV4cG9ydCBjb25zdCBTVFVDS19KT0JfVEhSRVNIT0xEX1NFQ09ORFMgPSAxODA7XG4iLCJleHBvcnQge3N0dWNrSm9iRGV0ZWN0b3J9IGZyb20gJy4vc3R1Y2stam9iLWRldGVjdG9yLmpzJztcbiIsImltcG9ydCB7bG9nLCBwcm94eUFjdGl2aXRpZXN9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbmltcG9ydCB7U1RVQ0tfSk9CX1RIUkVTSE9MRF9TRUNPTkRTfSBmcm9tICcjY29yZS9tYWludGVuYW5jZS1wb2xpY3kuanMnO1xuXG5pbXBvcnQgdHlwZSB7Y3JlYXRlUnVubmVyc01haW50ZW5hbmNlQWN0aXZpdGllc30gZnJvbSAnLi4vYWN0aXZpdGllcy9pbmRleC5qcyc7XG5cbmNvbnN0IHtcbiAgZGVsZXRlRXhwaXJlZEVwaGVtZXJhbFJlZ2lzdHJhdGlvblRva2Vuc0FjdGl2aXR5LFxuICBkZWxldGVFeHBpcmVkUmVzZXJ2YXRpb25zQWN0aXZpdHksXG4gIGRlbGV0ZUV4cGlyZWRSdW5uZXJTZXNzaW9uc0FjdGl2aXR5LFxuICBkZXRlY3RBbmRFeHBpcmVTdHVja0pvYnNBY3Rpdml0eSxcbiAgcmVhcFN0YWxlUnVubmVySW5zdGFuY2VzQWN0aXZpdHksXG59ID0gcHJveHlBY3Rpdml0aWVzPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJ1bm5lcnNNYWludGVuYW5jZUFjdGl2aXRpZXM+Pih7XG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc2MHMnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdHVja0pvYkRldGVjdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHtkZWxldGVkfSA9IGF3YWl0IGRlbGV0ZUV4cGlyZWRSZXNlcnZhdGlvbnNBY3Rpdml0eSgpO1xuICAgIGlmIChkZWxldGVkID4gMCkge1xuICAgICAgbG9nLmluZm8oJ1N0dWNrLWpvYiBkZXRlY3RvciBkZWxldGVkIGV4cGlyZWQgcnVubmVyIHJlc2VydmF0aW9ucycsIHtkZWxldGVkfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdTdHVjay1qb2IgZGV0ZWN0b3IgZmFpbGVkIHRvIGRlbGV0ZSBleHBpcmVkIHJ1bm5lciByZXNlcnZhdGlvbnMnLCB7XG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7ZGVsZXRlZH0gPSBhd2FpdCBkZWxldGVFeHBpcmVkUnVubmVyU2Vzc2lvbnNBY3Rpdml0eSgpO1xuICAgIGlmIChkZWxldGVkID4gMCkge1xuICAgICAgbG9nLmluZm8oJ1N0dWNrLWpvYiBkZXRlY3RvciBkZWxldGVkIGV4cGlyZWQgcnVubmVyIHNlc3Npb25zJywge2RlbGV0ZWR9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLndhcm4oJ1N0dWNrLWpvYiBkZXRlY3RvciBmYWlsZWQgdG8gZGVsZXRlIGV4cGlyZWQgcnVubmVyIHNlc3Npb25zJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qge2RlbGV0ZWR9ID0gYXdhaXQgZGVsZXRlRXhwaXJlZEVwaGVtZXJhbFJlZ2lzdHJhdGlvblRva2Vuc0FjdGl2aXR5KCk7XG4gICAgaWYgKGRlbGV0ZWQgPiAwKSB7XG4gICAgICBsb2cuaW5mbygnU3R1Y2stam9iIGRldGVjdG9yIGRlbGV0ZWQgZXhwaXJlZCBlcGhlbWVyYWwgcmVnaXN0cmF0aW9uIHRva2VucycsIHtkZWxldGVkfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZy53YXJuKCdTdHVjay1qb2IgZGV0ZWN0b3IgZmFpbGVkIHRvIGRlbGV0ZSBleHBpcmVkIGVwaGVtZXJhbCByZWdpc3RyYXRpb24gdG9rZW5zJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHtleHBpcmVkfSA9IGF3YWl0IGRldGVjdEFuZEV4cGlyZVN0dWNrSm9ic0FjdGl2aXR5KHtcbiAgICB0aHJlc2hvbGRTZWNvbmRzOiBTVFVDS19KT0JfVEhSRVNIT0xEX1NFQ09ORFMsXG4gIH0pO1xuICBpZiAoZXhwaXJlZCA+IDApIHtcbiAgICBsb2cuaW5mbygnU3R1Y2stam9iIGRldGVjdG9yIGV4cGlyZWQgam9iIGxlYXNlcycsIHtcbiAgICAgIGV4cGlyZWQsXG4gICAgICB0aHJlc2hvbGRTZWNvbmRzOiBTVFVDS19KT0JfVEhSRVNIT0xEX1NFQ09ORFMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7cmVhcGVkLCByZXNlcnZhdGlvbnNSZWxlYXNlZH0gPSBhd2FpdCByZWFwU3RhbGVSdW5uZXJJbnN0YW5jZXNBY3Rpdml0eSgpO1xuICBpZiAocmVhcGVkID4gMCkge1xuICAgIGxvZy5pbmZvKCdTdHVjay1qb2IgZGV0ZWN0b3IgcmVhcGVkIHN0YWxlIHByb3Zpc2lvbmVkIHJ1bm5lcnMnLCB7XG4gICAgICByZWFwZWQsXG4gICAgICByZXNlcnZhdGlvbnNSZWxlYXNlZCxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIlxuY29uc3QgYXBpID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL3dvcmtlci1pbnRlcmZhY2UuanMnKTtcbmV4cG9ydHMuYXBpID0gYXBpO1xuXG5jb25zdCB7IG92ZXJyaWRlR2xvYmFscyB9ID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL2dsb2JhbC1vdmVycmlkZXMuanMnKTtcbm92ZXJyaWRlR2xvYmFscygpO1xuXG5leHBvcnRzLnByZWxvYWRNb2R1bGVzID0gZnVuY3Rpb24gcHJlbG9hZE1vZHVsZXMoKSB7XG5cbn1cblxuZXhwb3J0cy5pbXBvcnRXb3JrZmxvd3MgPSBmdW5jdGlvbiBpbXBvcnRXb3JrZmxvd3MoKSB7XG4gIHJldHVybiByZXF1aXJlKC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbGlicy9hcGkvcnVubmVycy9kaXN0L3RlbXBvcmFsL3dvcmtmbG93cy9pbmRleC5qc1wiKTtcbn1cblxuZXhwb3J0cy5pbXBvcnRJbnRlcmNlcHRvcnMgPSBmdW5jdGlvbiBpbXBvcnRJbnRlcmNlcHRvcnMoKSB7XG4gIHJldHVybiBbXG4gICAgXG4gIF07XG59XG4iXSwibmFtZXMiOlsiU1RVQ0tfSk9CX1RIUkVTSE9MRF9TRUNPTkRTIiwic3R1Y2tKb2JEZXRlY3RvciIsImxvZyIsInByb3h5QWN0aXZpdGllcyIsImRlbGV0ZUV4cGlyZWRFcGhlbWVyYWxSZWdpc3RyYXRpb25Ub2tlbnNBY3Rpdml0eSIsImRlbGV0ZUV4cGlyZWRSZXNlcnZhdGlvbnNBY3Rpdml0eSIsImRlbGV0ZUV4cGlyZWRSdW5uZXJTZXNzaW9uc0FjdGl2aXR5IiwiZGV0ZWN0QW5kRXhwaXJlU3R1Y2tKb2JzQWN0aXZpdHkiLCJyZWFwU3RhbGVSdW5uZXJJbnN0YW5jZXNBY3Rpdml0eSIsInN0YXJ0VG9DbG9zZVRpbWVvdXQiLCJkZWxldGVkIiwiaW5mbyIsImVycm9yIiwid2FybiIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImV4cGlyZWQiLCJ0aHJlc2hvbGRTZWNvbmRzIiwicmVhcGVkIiwicmVzZXJ2YXRpb25zUmVsZWFzZWQiXSwic291cmNlUm9vdCI6IiJ9