@aerokit/sdk 12.80.0 → 12.82.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 (376) hide show
  1. package/dist/cjs/bpm/deployer.js +1 -1
  2. package/dist/cjs/bpm/index.js +1 -1
  3. package/dist/cjs/bpm/process.js +1 -1
  4. package/dist/cjs/bpm/tasks.js +1 -1
  5. package/dist/cjs/bpm/tracer.js +1 -1
  6. package/dist/cjs/bpm/values.js +1 -1
  7. package/dist/cjs/cache/cache.js +1 -1
  8. package/dist/cjs/cache/index.js +1 -1
  9. package/dist/cjs/cms/cmis.js +1 -1
  10. package/dist/cjs/cms/index.js +1 -1
  11. package/dist/cjs/component/decorators.js +1 -1
  12. package/dist/cjs/component/index.js +1 -1
  13. package/dist/cjs/core/configurations.js +1 -1
  14. package/dist/cjs/core/context.js +1 -1
  15. package/dist/cjs/core/env.js +1 -1
  16. package/dist/cjs/core/globals.js +1 -1
  17. package/dist/cjs/core/index.js +1 -1
  18. package/dist/cjs/db/dao.js +1 -1
  19. package/dist/cjs/db/database.js +1 -1
  20. package/dist/cjs/db/decorators.js +1 -1
  21. package/dist/cjs/db/index.js +1 -1
  22. package/dist/cjs/db/insert.js +1 -1
  23. package/dist/cjs/db/orm.js +1 -1
  24. package/dist/cjs/db/ormstatements.js +1 -1
  25. package/dist/cjs/db/procedure.js +1 -1
  26. package/dist/cjs/db/query.js +1 -1
  27. package/dist/cjs/db/repository.js +1 -1
  28. package/dist/cjs/db/sequence.js +1 -1
  29. package/dist/cjs/db/sql.js +1 -1
  30. package/dist/cjs/db/store.js +1 -1
  31. package/dist/cjs/db/translator.js +1 -1
  32. package/dist/cjs/db/update.js +1 -1
  33. package/dist/cjs/etcd/client.js +1 -1
  34. package/dist/cjs/etcd/index.js +1 -1
  35. package/dist/cjs/extensions/decorators.js +1 -1
  36. package/dist/cjs/extensions/extensions.js +1 -1
  37. package/dist/cjs/extensions/index.js +1 -1
  38. package/dist/cjs/git/client.js +1 -1
  39. package/dist/cjs/git/index.js +1 -1
  40. package/dist/cjs/http/client-async.js +1 -1
  41. package/dist/cjs/http/client.js +1 -1
  42. package/dist/cjs/http/decorators.js +1 -1
  43. package/dist/cjs/http/errors/ForbiddenError.js +1 -1
  44. package/dist/cjs/http/errors/ValidationError.js +1 -1
  45. package/dist/cjs/http/errors.js +1 -1
  46. package/dist/cjs/http/index.js +1 -1
  47. package/dist/cjs/http/request.js +1 -1
  48. package/dist/cjs/http/response.js +1 -1
  49. package/dist/cjs/http/rs/resource-http-controller.js +1 -1
  50. package/dist/cjs/http/rs/resource-mappings.js +1 -1
  51. package/dist/cjs/http/rs/resource-method.js +1 -1
  52. package/dist/cjs/http/rs/resource.js +1 -1
  53. package/dist/cjs/http/rs.js +1 -1
  54. package/dist/cjs/http/session.js +1 -1
  55. package/dist/cjs/http/upload.js +1 -1
  56. package/dist/cjs/http/utils.js +1 -1
  57. package/dist/cjs/indexing/index.js +1 -1
  58. package/dist/cjs/indexing/searcher.js +1 -1
  59. package/dist/cjs/indexing/writer.js +1 -1
  60. package/dist/cjs/integrations/index.js +1 -1
  61. package/dist/cjs/integrations/integrations.js +1 -1
  62. package/dist/cjs/io/bytes.js +1 -1
  63. package/dist/cjs/io/files.js +1 -1
  64. package/dist/cjs/io/image.js +1 -1
  65. package/dist/cjs/io/index.js +1 -1
  66. package/dist/cjs/io/streams.js +1 -1
  67. package/dist/cjs/io/zip.js +1 -1
  68. package/dist/cjs/job/decorators.js +1 -1
  69. package/dist/cjs/job/index.js +1 -1
  70. package/dist/cjs/job/scheduler.js +1 -1
  71. package/dist/cjs/junit/index.js +1 -1
  72. package/dist/cjs/junit/junit.js +1 -1
  73. package/dist/cjs/kafka/consumer.js +1 -1
  74. package/dist/cjs/kafka/index.js +1 -1
  75. package/dist/cjs/kafka/producer.js +1 -1
  76. package/dist/cjs/log/index.js +1 -1
  77. package/dist/cjs/log/logging.js +1 -1
  78. package/dist/cjs/mail/client.js +1 -1
  79. package/dist/cjs/mail/index.js +1 -1
  80. package/dist/cjs/messaging/consumer.js +1 -1
  81. package/dist/cjs/messaging/decorators.js +1 -1
  82. package/dist/cjs/messaging/index.js +1 -1
  83. package/dist/cjs/messaging/producer.js +1 -1
  84. package/dist/cjs/mongodb/client.js +1 -1
  85. package/dist/cjs/mongodb/dao.js +1 -1
  86. package/dist/cjs/mongodb/index.js +1 -1
  87. package/dist/cjs/net/decorators.js +1 -1
  88. package/dist/cjs/net/index.js +1 -1
  89. package/dist/cjs/net/soap.js +1 -1
  90. package/dist/cjs/net/websockets.js +1 -1
  91. package/dist/cjs/pdf/index.js +1 -1
  92. package/dist/cjs/pdf/pdf.js +3 -3
  93. package/dist/cjs/platform/command.js +1 -1
  94. package/dist/cjs/platform/engines.js +1 -1
  95. package/dist/cjs/platform/index.js +1 -1
  96. package/dist/cjs/platform/lifecycle.js +1 -1
  97. package/dist/cjs/platform/os.js +1 -1
  98. package/dist/cjs/platform/problems.js +1 -1
  99. package/dist/cjs/platform/registry.js +1 -1
  100. package/dist/cjs/platform/repository.js +1 -1
  101. package/dist/cjs/platform/workspace.js +1 -1
  102. package/dist/cjs/qldb/index.js +1 -1
  103. package/dist/cjs/qldb/qldb.js +1 -1
  104. package/dist/cjs/rabbitmq/consumer.js +1 -1
  105. package/dist/cjs/rabbitmq/index.js +1 -1
  106. package/dist/cjs/rabbitmq/producer.js +1 -1
  107. package/dist/cjs/redis/client.js +1 -1
  108. package/dist/cjs/redis/index.js +1 -1
  109. package/dist/cjs/security/decorators.js +1 -1
  110. package/dist/cjs/security/index.js +1 -1
  111. package/dist/cjs/security/oauth.js +1 -1
  112. package/dist/cjs/security/user.js +1 -1
  113. package/dist/cjs/template/engines.js +1 -1
  114. package/dist/cjs/template/index.js +1 -1
  115. package/dist/cjs/utils/alphanumeric.js +2 -2
  116. package/dist/cjs/utils/base64.js +1 -1
  117. package/dist/cjs/utils/converter.js +1 -1
  118. package/dist/cjs/utils/digest.js +1 -1
  119. package/dist/cjs/utils/escape.js +1 -1
  120. package/dist/cjs/utils/hex.js +1 -1
  121. package/dist/cjs/utils/index.js +1 -1
  122. package/dist/cjs/utils/jsonpath.js +1 -1
  123. package/dist/cjs/utils/qrcode.js +1 -1
  124. package/dist/cjs/utils/url.js +1 -1
  125. package/dist/cjs/utils/utf8.js +1 -1
  126. package/dist/cjs/utils/uuid.js +1 -1
  127. package/dist/cjs/utils/xml.js +1 -1
  128. package/dist/dts/bpm/deployer.d.ts +35 -3
  129. package/dist/dts/bpm/index.d.ts +14 -0
  130. package/dist/dts/bpm/process.d.ts +28 -3
  131. package/dist/dts/bpm/tasks.d.ts +32 -1
  132. package/dist/dts/bpm/tracer.d.ts +35 -0
  133. package/dist/dts/bpm/values.d.ts +17 -3
  134. package/dist/dts/cache/cache.d.ts +38 -0
  135. package/dist/dts/cache/index.d.ts +10 -0
  136. package/dist/dts/cms/cmis.d.ts +28 -3
  137. package/dist/dts/cms/index.d.ts +10 -0
  138. package/dist/dts/component/decorators.d.ts +35 -5
  139. package/dist/dts/component/index.d.ts +10 -0
  140. package/dist/dts/core/configurations.d.ts +43 -4
  141. package/dist/dts/core/context.d.ts +35 -2
  142. package/dist/dts/core/env.d.ts +29 -2
  143. package/dist/dts/core/globals.d.ts +34 -2
  144. package/dist/dts/core/index.d.ts +13 -0
  145. package/dist/dts/db/database.d.ts +34 -0
  146. package/dist/dts/db/decorators.d.ts +55 -2
  147. package/dist/dts/db/index.d.ts +19 -0
  148. package/dist/dts/db/orm.d.ts +43 -0
  149. package/dist/dts/db/procedure.d.ts +37 -0
  150. package/dist/dts/db/query.d.ts +25 -1
  151. package/dist/dts/db/repository.d.ts +52 -0
  152. package/dist/dts/db/sequence.d.ts +31 -2
  153. package/dist/dts/db/sql.d.ts +33 -0
  154. package/dist/dts/db/store.d.ts +27 -0
  155. package/dist/dts/db/translator.d.ts +34 -1
  156. package/dist/dts/db/update.d.ts +38 -0
  157. package/dist/dts/etcd/client.d.ts +36 -0
  158. package/dist/dts/etcd/index.d.ts +10 -0
  159. package/dist/dts/extensions/decorators.d.ts +28 -0
  160. package/dist/dts/extensions/extensions.d.ts +30 -1
  161. package/dist/dts/extensions/index.d.ts +11 -0
  162. package/dist/dts/git/client.d.ts +28 -0
  163. package/dist/dts/git/index.d.ts +10 -0
  164. package/dist/dts/http/client-async.d.ts +29 -1
  165. package/dist/dts/http/client.d.ts +29 -1
  166. package/dist/dts/http/decorators.d.ts +38 -0
  167. package/dist/dts/http/errors/ForbiddenError.d.ts +6 -2
  168. package/dist/dts/http/errors/ValidationError.d.ts +6 -2
  169. package/dist/dts/http/errors.d.ts +14 -0
  170. package/dist/dts/http/index.d.ts +18 -0
  171. package/dist/dts/http/request.d.ts +30 -3
  172. package/dist/dts/http/response.d.ts +40 -3
  173. package/dist/dts/http/rs/resource-mappings.d.ts +30 -0
  174. package/dist/dts/http/rs.d.ts +38 -0
  175. package/dist/dts/http/session.d.ts +34 -3
  176. package/dist/dts/http/upload.d.ts +27 -2
  177. package/dist/dts/http/utils.d.ts +42 -0
  178. package/dist/dts/indexing/index.d.ts +11 -0
  179. package/dist/dts/indexing/searcher.d.ts +35 -2
  180. package/dist/dts/indexing/writer.d.ts +23 -2
  181. package/dist/dts/integrations/index.d.ts +10 -0
  182. package/dist/dts/integrations/integrations.d.ts +27 -3
  183. package/dist/dts/io/bytes.d.ts +33 -2
  184. package/dist/dts/io/files.d.ts +34 -2
  185. package/dist/dts/io/image.d.ts +27 -2
  186. package/dist/dts/io/index.d.ts +14 -0
  187. package/dist/dts/io/streams.d.ts +40 -0
  188. package/dist/dts/io/zip.d.ts +32 -0
  189. package/dist/dts/job/decorators.d.ts +29 -0
  190. package/dist/dts/job/index.d.ts +11 -0
  191. package/dist/dts/job/scheduler.d.ts +33 -2
  192. package/dist/dts/junit/index.d.ts +10 -0
  193. package/dist/dts/junit/junit.d.ts +31 -0
  194. package/dist/dts/kafka/consumer.d.ts +31 -0
  195. package/dist/dts/kafka/index.d.ts +11 -0
  196. package/dist/dts/kafka/producer.d.ts +31 -0
  197. package/dist/dts/log/index.d.ts +10 -0
  198. package/dist/dts/log/logging.d.ts +32 -0
  199. package/dist/dts/mail/client.d.ts +27 -0
  200. package/dist/dts/mail/index.d.ts +10 -0
  201. package/dist/dts/messaging/consumer.d.ts +29 -2
  202. package/dist/dts/messaging/decorators.d.ts +32 -0
  203. package/dist/dts/messaging/index.d.ts +12 -0
  204. package/dist/dts/messaging/producer.d.ts +27 -2
  205. package/dist/dts/mongodb/client.d.ts +37 -0
  206. package/dist/dts/mongodb/dao.d.ts +53 -0
  207. package/dist/dts/mongodb/index.d.ts +11 -0
  208. package/dist/dts/net/decorators.d.ts +27 -0
  209. package/dist/dts/net/index.d.ts +13 -0
  210. package/dist/dts/net/soap.d.ts +34 -0
  211. package/dist/dts/net/websockets.d.ts +34 -0
  212. package/dist/dts/pdf/index.d.ts +10 -0
  213. package/dist/dts/pdf/pdf.d.ts +41 -2
  214. package/dist/dts/platform/command.d.ts +26 -0
  215. package/dist/dts/platform/engines.d.ts +38 -0
  216. package/dist/dts/platform/index.d.ts +19 -0
  217. package/dist/dts/platform/lifecycle.d.ts +29 -0
  218. package/dist/dts/platform/os.d.ts +30 -0
  219. package/dist/dts/platform/problems.d.ts +36 -0
  220. package/dist/dts/platform/registry.d.ts +39 -0
  221. package/dist/dts/platform/repository.d.ts +40 -0
  222. package/dist/dts/platform/workspace.d.ts +42 -0
  223. package/dist/dts/qldb/index.d.ts +12 -0
  224. package/dist/dts/qldb/qldb.d.ts +14 -0
  225. package/dist/dts/rabbitmq/consumer.d.ts +24 -3
  226. package/dist/dts/rabbitmq/index.d.ts +13 -0
  227. package/dist/dts/rabbitmq/producer.d.ts +20 -3
  228. package/dist/dts/redis/client.d.ts +31 -3
  229. package/dist/dts/redis/index.d.ts +12 -0
  230. package/dist/dts/security/decorators.d.ts +34 -0
  231. package/dist/dts/security/index.d.ts +14 -0
  232. package/dist/dts/security/oauth.d.ts +27 -0
  233. package/dist/dts/security/user.d.ts +39 -0
  234. package/dist/dts/template/engines.d.ts +31 -0
  235. package/dist/dts/template/index.d.ts +12 -0
  236. package/dist/dts/utils/alphanumeric.d.ts +36 -2
  237. package/dist/dts/utils/base64.d.ts +30 -0
  238. package/dist/dts/utils/converter.d.ts +37 -2
  239. package/dist/dts/utils/digest.d.ts +31 -0
  240. package/dist/dts/utils/escape.d.ts +28 -3
  241. package/dist/dts/utils/hex.d.ts +30 -0
  242. package/dist/dts/utils/index.d.ts +23 -0
  243. package/dist/dts/utils/jsonpath.d.ts +43 -0
  244. package/dist/dts/utils/qrcode.d.ts +24 -3
  245. package/dist/dts/utils/url.d.ts +37 -3
  246. package/dist/dts/utils/utf8.d.ts +34 -3
  247. package/dist/dts/utils/uuid.d.ts +28 -2
  248. package/dist/dts/utils/xml.d.ts +31 -2
  249. package/dist/esm/bpm/deployer.mjs +1 -1
  250. package/dist/esm/bpm/index.mjs +1 -1
  251. package/dist/esm/bpm/process.mjs +1 -1
  252. package/dist/esm/bpm/tasks.mjs +1 -1
  253. package/dist/esm/bpm/tracer.mjs +1 -1
  254. package/dist/esm/bpm/values.mjs +1 -1
  255. package/dist/esm/cache/cache.mjs +1 -1
  256. package/dist/esm/cache/index.mjs +1 -1
  257. package/dist/esm/cms/cmis.mjs +1 -1
  258. package/dist/esm/cms/index.mjs +1 -1
  259. package/dist/esm/component/decorators.mjs +1 -1
  260. package/dist/esm/component/index.mjs +1 -1
  261. package/dist/esm/core/configurations.mjs +1 -1
  262. package/dist/esm/core/context.mjs +1 -1
  263. package/dist/esm/core/env.mjs +1 -1
  264. package/dist/esm/core/globals.mjs +1 -1
  265. package/dist/esm/core/index.mjs +1 -1
  266. package/dist/esm/db/dao.mjs +1 -1
  267. package/dist/esm/db/database.mjs +1 -1
  268. package/dist/esm/db/decorators.mjs +1 -1
  269. package/dist/esm/db/index.mjs +1 -1
  270. package/dist/esm/db/insert.mjs +1 -1
  271. package/dist/esm/db/orm.mjs +1 -1
  272. package/dist/esm/db/ormstatements.mjs +1 -1
  273. package/dist/esm/db/procedure.mjs +1 -1
  274. package/dist/esm/db/query.mjs +1 -1
  275. package/dist/esm/db/repository.mjs +1 -1
  276. package/dist/esm/db/sequence.mjs +1 -1
  277. package/dist/esm/db/sql.mjs +1 -1
  278. package/dist/esm/db/store.mjs +1 -1
  279. package/dist/esm/db/translator.mjs +1 -1
  280. package/dist/esm/db/update.mjs +1 -1
  281. package/dist/esm/etcd/client.mjs +1 -1
  282. package/dist/esm/etcd/index.mjs +1 -1
  283. package/dist/esm/extensions/decorators.mjs +1 -1
  284. package/dist/esm/extensions/extensions.mjs +1 -1
  285. package/dist/esm/extensions/index.mjs +1 -1
  286. package/dist/esm/git/client.mjs +1 -1
  287. package/dist/esm/git/index.mjs +1 -1
  288. package/dist/esm/http/client-async.mjs +1 -1
  289. package/dist/esm/http/client.mjs +1 -1
  290. package/dist/esm/http/decorators.mjs +1 -1
  291. package/dist/esm/http/errors/ForbiddenError.mjs +1 -1
  292. package/dist/esm/http/errors/ValidationError.mjs +1 -1
  293. package/dist/esm/http/errors.mjs +1 -1
  294. package/dist/esm/http/index.mjs +1 -1
  295. package/dist/esm/http/request.mjs +1 -1
  296. package/dist/esm/http/response.mjs +1 -1
  297. package/dist/esm/http/rs/resource-http-controller.mjs +1 -1
  298. package/dist/esm/http/rs/resource-mappings.mjs +1 -1
  299. package/dist/esm/http/rs/resource-method.mjs +1 -1
  300. package/dist/esm/http/rs/resource.mjs +1 -1
  301. package/dist/esm/http/rs.mjs +1 -1
  302. package/dist/esm/http/session.mjs +1 -1
  303. package/dist/esm/http/upload.mjs +1 -1
  304. package/dist/esm/http/utils.mjs +1 -1
  305. package/dist/esm/indexing/index.mjs +1 -1
  306. package/dist/esm/indexing/searcher.mjs +1 -1
  307. package/dist/esm/indexing/writer.mjs +1 -1
  308. package/dist/esm/integrations/index.mjs +1 -1
  309. package/dist/esm/integrations/integrations.mjs +1 -1
  310. package/dist/esm/io/bytes.mjs +1 -1
  311. package/dist/esm/io/files.mjs +1 -1
  312. package/dist/esm/io/image.mjs +1 -1
  313. package/dist/esm/io/index.mjs +1 -1
  314. package/dist/esm/io/streams.mjs +1 -1
  315. package/dist/esm/io/zip.mjs +1 -1
  316. package/dist/esm/job/decorators.mjs +1 -1
  317. package/dist/esm/job/index.mjs +1 -1
  318. package/dist/esm/job/scheduler.mjs +1 -1
  319. package/dist/esm/junit/index.mjs +1 -1
  320. package/dist/esm/junit/junit.mjs +1 -1
  321. package/dist/esm/kafka/consumer.mjs +1 -1
  322. package/dist/esm/kafka/index.mjs +1 -1
  323. package/dist/esm/kafka/producer.mjs +1 -1
  324. package/dist/esm/log/index.mjs +1 -1
  325. package/dist/esm/log/logging.mjs +1 -1
  326. package/dist/esm/mail/client.mjs +1 -1
  327. package/dist/esm/mail/index.mjs +1 -1
  328. package/dist/esm/messaging/consumer.mjs +1 -1
  329. package/dist/esm/messaging/decorators.mjs +1 -1
  330. package/dist/esm/messaging/index.mjs +1 -1
  331. package/dist/esm/messaging/producer.mjs +1 -1
  332. package/dist/esm/mongodb/client.mjs +2 -2
  333. package/dist/esm/mongodb/dao.mjs +1 -1
  334. package/dist/esm/mongodb/index.mjs +1 -1
  335. package/dist/esm/net/decorators.mjs +1 -1
  336. package/dist/esm/net/index.mjs +1 -1
  337. package/dist/esm/net/soap.mjs +1 -1
  338. package/dist/esm/net/websockets.mjs +1 -1
  339. package/dist/esm/pdf/index.mjs +1 -1
  340. package/dist/esm/pdf/pdf.mjs +3 -3
  341. package/dist/esm/platform/command.mjs +1 -1
  342. package/dist/esm/platform/engines.mjs +1 -1
  343. package/dist/esm/platform/index.mjs +1 -1
  344. package/dist/esm/platform/lifecycle.mjs +1 -1
  345. package/dist/esm/platform/os.mjs +1 -1
  346. package/dist/esm/platform/problems.mjs +1 -1
  347. package/dist/esm/platform/registry.mjs +1 -1
  348. package/dist/esm/platform/repository.mjs +1 -1
  349. package/dist/esm/platform/workspace.mjs +1 -1
  350. package/dist/esm/qldb/index.mjs +1 -1
  351. package/dist/esm/qldb/qldb.mjs +1 -1
  352. package/dist/esm/rabbitmq/consumer.mjs +1 -1
  353. package/dist/esm/rabbitmq/index.mjs +1 -1
  354. package/dist/esm/rabbitmq/producer.mjs +1 -1
  355. package/dist/esm/redis/client.mjs +1 -1
  356. package/dist/esm/redis/index.mjs +1 -1
  357. package/dist/esm/security/decorators.mjs +1 -1
  358. package/dist/esm/security/index.mjs +1 -1
  359. package/dist/esm/security/oauth.mjs +1 -1
  360. package/dist/esm/security/user.mjs +1 -1
  361. package/dist/esm/template/engines.mjs +1 -1
  362. package/dist/esm/template/index.mjs +1 -1
  363. package/dist/esm/utils/alphanumeric.mjs +2 -2
  364. package/dist/esm/utils/base64.mjs +1 -1
  365. package/dist/esm/utils/converter.mjs +1 -1
  366. package/dist/esm/utils/digest.mjs +1 -1
  367. package/dist/esm/utils/escape.mjs +1 -1
  368. package/dist/esm/utils/hex.mjs +1 -1
  369. package/dist/esm/utils/index.mjs +1 -1
  370. package/dist/esm/utils/jsonpath.mjs +1 -1
  371. package/dist/esm/utils/qrcode.mjs +1 -1
  372. package/dist/esm/utils/url.mjs +1 -1
  373. package/dist/esm/utils/utf8.mjs +1 -1
  374. package/dist/esm/utils/uuid.mjs +1 -1
  375. package/dist/esm/utils/xml.mjs +1 -1
  376. package/package.json +1 -1
@@ -54,4 +54,4 @@ class Deployer {
54
54
  if (typeof module !== "undefined") {
55
55
  module.exports = Deployer;
56
56
  }
57
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9kZXBsb3llci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBBUEkgRGVwbG95ZXJcbiAqICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiBCdXNpbmVzcyBQcm9jZXNzIE1vZGVsIGFuZCBOb3RhdGlvbiAoQlBNTikgZGVmaW5pdGlvbnMsXG4gKiBpbmNsdWRpbmcgZGVwbG95bWVudCwgdW5kZXBsb3ltZW50LCBhbmQgZGVsZXRpb24uXG4gKi9cblxuY29uc3QgQnBtRmFjYWRlID0gSmF2YS50eXBlKFwib3JnLmVjbGlwc2UuZGlyaWdpYmxlLmNvbXBvbmVudHMuYXBpLmJwbS5CcG1GYWNhZGVcIik7XG5cbmV4cG9ydCBjbGFzcyBEZXBsb3llciB7XG5cblx0LyoqXG5cdCAqIERlcGxveXMgYSBuZXcgcHJvY2VzcyBkZWZpbml0aW9uIGZyb20gYSBzcGVjaWZpZWQgbG9jYXRpb24gKGUuZy4sIGEgZmlsZSBwYXRoKS5cblx0ICpcblx0ICogQHBhcmFtIGxvY2F0aW9uIFRoZSBwYXRoIG9yIGxvY2F0aW9uIG9mIHRoZSBCUE1OIFhNTCBmaWxlIHRvIGJlIGRlcGxveWVkLlxuXHQgKiBAcmV0dXJucyBUaGUgZGVwbG95bWVudCBJRCBhc3NpZ25lZCB0byB0aGUgbmV3IHByb2Nlc3MgZGVmaW5pdGlvbi5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZGVwbG95UHJvY2Vzcyhsb2NhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmRlcGxveVByb2Nlc3MobG9jYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVuZGVwbG95cyBhIHByb2Nlc3MgZGVmaW5pdGlvbiBwcmV2aW91c2x5IGRlcGxveWVkIGZyb20gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGxvY2F0aW9uIFRoZSBwYXRoIG9yIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVwbG95ZWQgQlBNTiBmaWxlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB1bmRlcGxveVByb2Nlc3MobG9jYXRpb246IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS51bmRlcGxveVByb2Nlc3MobG9jYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYSBkZXBsb3llZCBwcm9jZXNzIGRlZmluaXRpb24gYnkgaXRzIElELlxuXHQgKlxuXHQgKiA+ICoqTm90ZToqKiBUaGlzIHBlcm1hbmVudGx5IHJlbW92ZXMgdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBhbmQgYWxsIGl0cyBhc3NvY2lhdGVkIGhpc3RvcnkgYW5kIHJ1bnRpbWUgZGF0YS5cblx0ICpcblx0ICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIHRvIGRlbGV0ZS5cblx0ICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBkZWxldGluZyB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIChlLmcuLCBcIk9ic29sZXRlXCIpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBkZWxldGVQcm9jZXNzKGlkOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLmRlbGV0ZVByb2Nlc3MoaWQsIHJlYXNvbik7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBEZXBsb3llcjtcbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxNQUFNLFlBQVksS0FBSyxLQUFLLG9EQUFvRDtBQUV6RSxNQUFNLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFyQixPQUFjLGNBQWMsVUFBMEI7QUFDckQsV0FBTyxVQUFVLGNBQWMsUUFBUTtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxnQkFBZ0IsVUFBd0I7QUFDckQsY0FBVSxnQkFBZ0IsUUFBUTtBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsT0FBYyxjQUFjLElBQVksUUFBc0I7QUFDN0QsY0FBVSxjQUFjLElBQUksTUFBTTtBQUFBLEVBQ25DO0FBQ0Q7QUFHQSxJQUFJLE9BQU8sV0FBVyxhQUFhO0FBRWxDLFNBQU8sVUFBVTtBQUNsQjsiLAogICJuYW1lcyI6IFtdCn0K
57
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9kZXBsb3llci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbW9kdWxlIGJwbS9kZXBsb3llclxuICogQHBhY2thZ2UgQGFlcm9raXQvc2RrL2JwbVxuICogQG5hbWUgRGVwbG95ZXJcbiAqIEBvdmVydmlld1xuICogXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbmFsaXRpZXMgZm9yIG1hbmFnaW5nIEJ1c2luZXNzIFByb2Nlc3MgTW9kZWwgYW5kIE5vdGF0aW9uIChCUE1OKSBkZWZpbml0aW9ucyxcbiAqIGluY2x1ZGluZyBkZXBsb3ltZW50LCB1bmRlcGxveW1lbnQsIGFuZCBkZWxldGlvbiBvZiBwcm9jZXNzIGRlZmluaXRpb25zLlxuICogXG4gKiAjIyMgS2V5IEZlYXR1cmVzXG4gKiAtIERlcGxveSBCUE1OIHByb2Nlc3MgZGVmaW5pdGlvbnMgZnJvbSBzcGVjaWZpZWQgbG9jYXRpb25zIChlLmcuLCBmaWxlIHBhdGhzKS5cbiAqIC0gVW5kZXBsb3kgcHJldmlvdXNseSBkZXBsb3llZCBwcm9jZXNzIGRlZmluaXRpb25zIGJhc2VkIG9uIHRoZWlyIGRlcGxveW1lbnQgbG9jYXRpb24uXG4gKiAtIFBlcm1hbmVudGx5IGRlbGV0ZSBwcm9jZXNzIGRlZmluaXRpb25zIGJ5IHRoZWlyIElELCB3aXRoIGEgcmVhc29uIGZvciBkZWxldGlvbi5cbiAqIFxuICogIyMjIFVzZSBDYXNlc1xuICogLSBNYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIEJQTU4gcHJvY2VzcyBkZWZpbml0aW9ucyBpbiBhIHdvcmtmbG93IGVuZ2luZS5cbiAqIC0gQXV0b21hdGluZyBkZXBsb3ltZW50IGFuZCBjbGVhbnVwIG9mIHByb2Nlc3MgZGVmaW5pdGlvbnMgaW4gZGV2ZWxvcG1lbnQgYW5kIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLlxuICogLSBJbnRlZ3JhdGluZyBCUE1OIG1hbmFnZW1lbnQgaW50byBsYXJnZXIgYXBwbGljYXRpb24gd29ya2Zsb3dzIG9yIGFkbWluaXN0cmF0aXZlIHRvb2xzLlxuICogXG4gKiAjIyMgRXhhbXBsZSBVc2FnZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IERlcGxveWVyIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG1cIjtcbiAqIFxuICogLy8gRGVwbG95IGEgbmV3IHByb2Nlc3MgZGVmaW5pdGlvblxuICogY29uc3QgZGVwbG95bWVudElkID0gRGVwbG95ZXIuZGVwbG95UHJvY2VzcyhcIi9wYXRoL3RvL3Byb2Nlc3MuYnBtblwiKTtcbiAqIGNvbnNvbGUubG9nKGBEZXBsb3llZCBwcm9jZXNzIHdpdGggSUQ6ICR7ZGVwbG95bWVudElkfWApO1xuICogXG4gKiAvLyBVbmRlcGxveSB0aGUgcHJvY2VzcyBkZWZpbml0aW9uXG4gKiBEZXBsb3llci51bmRlcGxveVByb2Nlc3MoXCIvcGF0aC90by9wcm9jZXNzLmJwbW5cIik7XG4gKiBjb25zb2xlLmxvZyhcIlVuZGVwbG95ZWQgcHJvY2VzcyBmcm9tIGxvY2F0aW9uOiAvcGF0aC90by9wcm9jZXNzLmJwbW5cIik7XG4gKiBcbiAqIC8vIERlbGV0ZSBhIGRlcGxveWVkIHByb2Nlc3MgZGVmaW5pdGlvbiBieSBJRFxuICogRGVwbG95ZXIuZGVsZXRlUHJvY2VzcyhkZXBsb3ltZW50SWQsIFwiT2Jzb2xldGVcIik7XG4gKiBjb25zb2xlLmxvZyhgRGVsZXRlZCBwcm9jZXNzIHdpdGggSUQ6ICR7ZGVwbG95bWVudElkfSBmb3IgcmVhc29uOiBPYnNvbGV0ZWApO1xuICogYGBgXG4gKlxuICovXG5cbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgRGVwbG95ZXIge1xuXG5cdC8qKlxuXHQgKiBEZXBsb3lzIGEgbmV3IHByb2Nlc3MgZGVmaW5pdGlvbiBmcm9tIGEgc3BlY2lmaWVkIGxvY2F0aW9uIChlLmcuLCBhIGZpbGUgcGF0aCkuXG5cdCAqXG5cdCAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgcGF0aCBvciBsb2NhdGlvbiBvZiB0aGUgQlBNTiBYTUwgZmlsZSB0byBiZSBkZXBsb3llZC5cblx0ICogQHJldHVybnMgVGhlIGRlcGxveW1lbnQgSUQgYXNzaWduZWQgdG8gdGhlIG5ldyBwcm9jZXNzIGRlZmluaXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGRlcGxveVByb2Nlc3MobG9jYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5kZXBsb3lQcm9jZXNzKGxvY2F0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmRlcGxveXMgYSBwcm9jZXNzIGRlZmluaXRpb24gcHJldmlvdXNseSBkZXBsb3llZCBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgcGF0aCBvciBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGRlcGxveWVkIEJQTU4gZmlsZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgdW5kZXBsb3lQcm9jZXNzKGxvY2F0aW9uOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudW5kZXBsb3lQcm9jZXNzKGxvY2F0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIGEgZGVwbG95ZWQgcHJvY2VzcyBkZWZpbml0aW9uIGJ5IGl0cyBJRC5cblx0ICpcblx0ICogPiAqKk5vdGU6KiogVGhpcyBwZXJtYW5lbnRseSByZW1vdmVzIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gYW5kIGFsbCBpdHMgYXNzb2NpYXRlZCBoaXN0b3J5IGFuZCBydW50aW1lIGRhdGEuXG5cdCAqXG5cdCAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiB0byBkZWxldGUuXG5cdCAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgZGVsZXRpbmcgdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiAoZS5nLiwgXCJPYnNvbGV0ZVwiKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZGVsZXRlUHJvY2VzcyhpZDogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5kZWxldGVQcm9jZXNzKGlkLCByZWFzb24pO1xuXHR9XG59XG5cbi8vIEB0cy1pZ25vcmVcbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuXHQvLyBAdHMtaWdub3JlXG5cdG1vZHVsZS5leHBvcnRzID0gRGVwbG95ZXI7XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0NBLE1BQU0sWUFBWSxLQUFLLEtBQUssb0RBQW9EO0FBRXpFLE1BQU0sU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUXJCLE9BQWMsY0FBYyxVQUEwQjtBQUNyRCxXQUFPLFVBQVUsY0FBYyxRQUFRO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLGdCQUFnQixVQUF3QjtBQUNyRCxjQUFVLGdCQUFnQixRQUFRO0FBQUEsRUFDbkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxPQUFjLGNBQWMsSUFBWSxRQUFzQjtBQUM3RCxjQUFVLGNBQWMsSUFBSSxNQUFNO0FBQUEsRUFDbkM7QUFDRDtBQUdBLElBQUksT0FBTyxXQUFXLGFBQWE7QUFFbEMsU0FBTyxVQUFVO0FBQ2xCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -35,4 +35,4 @@ var import_values = require("./values");
35
35
  __reExport(bpm_exports, require("./values"), module.exports);
36
36
  __reExport(bpm_exports, require("./tracer"), module.exports);
37
37
  var import_tracer = require("./tracer");
38
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHsgRGVwbG95ZXIgYXMgZGVwbG95ZXIgfSBmcm9tIFwiLi9kZXBsb3llclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVwbG95ZXJcIjtcbmV4cG9ydCB7IFByb2Nlc3MgYXMgcHJvY2VzcyB9IGZyb20gXCIuL3Byb2Nlc3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Byb2Nlc3NcIjtcbmV4cG9ydCB7IFRhc2tzIGFzIHRhc2tzIH0gZnJvbSBcIi4vdGFza3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rhc2tzXCI7XG5leHBvcnQgeyBWYWx1ZXMgYXMgdmFsdWVzIH0gZnJvbSBcIi4vdmFsdWVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWx1ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyYWNlclwiO1xuZXhwb3J0IHsgVHJhY2VyIGFzIHRyYWNlciB9IGZyb20gXCIuL3RyYWNlclwiOyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFxQztBQUNyQyx3QkFBYyx1QkFEZDtBQUVBLHFCQUFtQztBQUNuQyx3QkFBYyxzQkFIZDtBQUlBLG1CQUErQjtBQUMvQix3QkFBYyxvQkFMZDtBQU1BLG9CQUFpQztBQUNqQyx3QkFBYyxxQkFQZDtBQVFBLHdCQUFjLHFCQVJkO0FBU0Esb0JBQWlDOyIsCiAgIm5hbWVzIjogW10KfQo=
38
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbW9kdWxlIGJwbS9pbmRleFxuICogQHBhY2thZ2UgQGFlcm9raXQvc2RrL2JwbVxuICogQG92ZXJ2aWV3XG4gKiBcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdGllcyBmb3IgQnVzaW5lc3MgUHJvY2VzcyBNYW5hZ2VtZW50IChCUE0pIHdpdGhpbiB0aGUgQWVyb2tpdCBTREsuIEl0IGluY2x1ZGVzIGNsYXNzZXMgYW5kIG1ldGhvZHMgZm9yIGRlcGxveWluZyBwcm9jZXNzZXMsIG1hbmFnaW5nIHRhc2tzLCBhbmQgdHJhY2luZyBwcm9jZXNzIGV4ZWN1dGlvbi5cbiAqIFxuICogVGhlIG1haW4gY29tcG9uZW50cyBvZiB0aGlzIG1vZHVsZSBhcmU6XG4gKiAtIERlcGxveWVyOiBSZXNwb25zaWJsZSBmb3IgZGVwbG95aW5nIEJQTU4gcHJvY2Vzc2VzLlxuICogLSBQcm9jZXNzOiBSZXByZXNlbnRzIGEgQlBNTiBwcm9jZXNzIGluc3RhbmNlIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIGludGVyYWN0IHdpdGggaXQuXG4gKiAtIFRhc2tzOiBNYW5hZ2VzIHRhc2tzIGFzc29jaWF0ZWQgd2l0aCBCUE1OIHByb2Nlc3NlcywgYWxsb3dpbmcgZm9yIHRhc2sgY29tcGxldGlvbiBhbmQgcmV0cmlldmFsLlxuICogLSBWYWx1ZXM6IEhhbmRsZXMgdGhlIHZhbHVlcyBhbmQgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBCUE1OIHByb2Nlc3Nlcy5cbiAqIC0gVHJhY2VyOiBQcm92aWRlcyB0cmFjaW5nIGNhcGFiaWxpdGllcyB0byBtb25pdG9yIHRoZSBleGVjdXRpb24gb2YgQlBNTiBwcm9jZXNzZXMuXG4gKi9cblxuZXhwb3J0IHsgRGVwbG95ZXIgYXMgZGVwbG95ZXIgfSBmcm9tIFwiLi9kZXBsb3llclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVwbG95ZXJcIjtcbmV4cG9ydCB7IFByb2Nlc3MgYXMgcHJvY2VzcyB9IGZyb20gXCIuL3Byb2Nlc3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Byb2Nlc3NcIjtcbmV4cG9ydCB7IFRhc2tzIGFzIHRhc2tzIH0gZnJvbSBcIi4vdGFza3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rhc2tzXCI7XG5leHBvcnQgeyBWYWx1ZXMgYXMgdmFsdWVzIH0gZnJvbSBcIi4vdmFsdWVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWx1ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyYWNlclwiO1xuZXhwb3J0IHsgVHJhY2VyIGFzIHRyYWNlciB9IGZyb20gXCIuL3RyYWNlclwiOyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLHNCQUFxQztBQUNyQyx3QkFBYyx1QkFoQmQ7QUFpQkEscUJBQW1DO0FBQ25DLHdCQUFjLHNCQWxCZDtBQW1CQSxtQkFBK0I7QUFDL0Isd0JBQWMsb0JBcEJkO0FBcUJBLG9CQUFpQztBQUNqQyx3QkFBYyxxQkF0QmQ7QUF1QkEsd0JBQWMscUJBdkJkO0FBd0JBLG9CQUFpQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1071,4 +1071,4 @@ class TaskContext extends VariableScope {
1071
1071
  if (typeof module !== "undefined") {
1072
1072
  module.exports = Process;
1073
1073
  }
1074
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlMaW5rIH0gZnJvbSBcIi4vdGFza3NcIjtcblxuY29uc3QgSkJwbW5FcnJvciA9IEphdmEudHlwZSgnb3JnLmZsb3dhYmxlLmVuZ2luZS5kZWxlZ2F0ZS5CcG1uRXJyb3InKTtcbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgQnBtbkVycm9yIHtcblx0Y29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG5ldyBKQnBtbkVycm9yKGNvZGUsIG1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcblxuXHQvKipcblx0ICogU3RhcnRzIGEgbmV3IHByb2Nlc3MgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGtleSAoSUQpIG9mIHRoZSBwcm9jZXNzIHRvIHN0YXJ0LlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgQW4gb3B0aW9uYWwgYnVzaW5lc3Mga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzIGluc3RhbmNlLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFuIG9wdGlvbmFsIG1hcCBvZiBwcm9jZXNzIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIHVwb24gc3RhcnRpbmcuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgbmV3bHkgc3RhcnRlZCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBzdGFydChrZXk6IHN0cmluZywgYnVzaW5lc3NLZXk6IHN0cmluZyA9ICcnLCBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiBzdHJpbmcge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuc3RhcnRQcm9jZXNzKGtleSwgYnVzaW5lc3NLZXksIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQsIG5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGJ1c2luZXNzIGtleSBvZiBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIGJ1c2luZXNzS2V5IFRoZSBuZXcgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB1cGRhdGVCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkLCBidXNpbmVzc0tleSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mgc3RhdHVzIG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NTdGF0dXMgVGhlIG5ldyBidXNpbmVzcyBzdGF0dXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzU3RhdHVzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzU3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzU3RhdHVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCBvciBgbnVsbGAgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LiBUaGUgdHlwZSBpcyBgYW55YCBhcyBpdCBkZXBlbmRzIG9uIHRoZSBzdG9yZWQgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGFsbCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlLCB3aGVyZSBrZXlzIGFyZSB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGUgdmFyaWFibGUgdmFsdWVzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5nZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgb3IgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSBpbiBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4gVGhlIHR5cGUgaXMgYGFueWAgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGRhdGEgdHlwZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUucmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVsYXRlcyBhIG1lc3NhZ2UgZXZlbnQgd2l0aCBhIHJ1bm5pbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byBjb3JyZWxhdGUgdGhlIG1lc3NhZ2UgdG8uXG5cdCAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBldmVudCBkZWZpbmVkIGluIHRoZSBCUE1OIHByb2Nlc3MuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2YgdmFyaWFibGVzIChgTWFwPHN0cmluZywgYW55PmApIHRvIHBhc3MgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSBldmVudC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY29ycmVsYXRlTWVzc2FnZUV2ZW50KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIG1lc3NhZ2VOYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5jb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQsIG1lc3NhZ2VOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBvYmplY3QsIHR5cGljYWxseSB1c2VkIHdpdGhpbiBhbiBleGVjdXRpb24gbGlzdGVuZXIgb3Igc2VydmljZSB0YXNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgYEV4ZWN1dGlvbkNvbnRleHRgIGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRFeGVjdXRpb25Db250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgRXhlY3V0aW9uQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB0YXNrIGNvbnRleHQgb2JqZWN0LCB0eXBpY2FsbHkgdXNlZCB3aXRoaW4gYSB0YXNrIGxpc3RlbmVyIG9yIHNlcnZpY2UgdGFzay5cblx0ICpcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBUYXNrQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tDb250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgVGFza0NvbnRleHQoKTtcblx0fVxufVxuXG5jbGFzcyBWYXJpYWJsZVNjb3BlIHtcblxuXHRwcml2YXRlIHZhcmlhYmxlU2NvcGU6IGFueTtcblxuXHRjb25zdHJ1Y3Rvcih2YXJpYWJsZVNjb3BlOiBhbnkpIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlcygpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5wYXJzZVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYWJsZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdmFyaWFibGVzLCBhcyBpbnN0YW5jZXMgb2YgdGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnRlcmZhY2UsIHdoaWNoIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBvbmx5IHRoZSB2YWx1ZSAodHlwZSwgZXhlY3V0aW9uIGlkLCBldGMuKVxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3RzIChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBsb2NhbCB0byB0aGlzIHNjb3BlIG9ubHkuIFNvLCBpbiBjb250cmFyeSB0byB7QGxpbmsgI2dldFZhcmlhYmxlcygpfSwgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgd29uJ3QgYmUgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwgdmFyaWFibGUgdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2VzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB2YWx1ZSBmb3Igb25lIHNwZWNpZmljIHZhcmlhYmxlLiBXaWxsIGxvb2sgaW4gcGFyZW50IHNjb3BlcyB3aGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBhcnRpY3VsYXIgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI2dldFZhcmlhYmxlKFN0cmluZyl9LCBidXQgcmV0dXJucyBhIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnN0YW5jZSwgd2hpY2ggY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIGp1c3QgdGhlIHZhbHVlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjZ2V0VmFyaWFibGVMb2NhbChTdHJpbmcpfSwgYnV0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9LCB3aGljaCBoYXMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSBhbmQgYWxsIHBhcmVudCBzY29wZXMuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGFsbCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTmFtZXMoKTogU2V0PHN0cmluZz4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXNMb2NhbCgpLnRvQXJyYXkoKSkge1xuXHRcdFx0dmFyaWFibGVOYW1lc0xvY2FsLmFkZChuZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlTmFtZXNMb2NhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4gSXQgY2hlY2tzIHBhcmVudCBzY29wZXMgZm9yIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGJlZm9yZSBzZXR0aW5nIG9uIHRoZSBjdXJyZW50IHNjb3BlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI3NldFZhcmlhYmxlKFN0cmluZywgT2JqZWN0KX0sIGJ1dCB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZSkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCBsb2NhbGx5LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgKGBhbnlgKS5cblx0ICogQHJldHVybnMgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjc2V0VmFyaWFibGVzKE1hcCl9LCBidXQgdGhlIHZhcmlhYmxlcyBhcmUgc2V0IG9uIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZXMpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzIEEgbWFwIG9mIGtleXMgKGBzdHJpbmdgKSBhbmQgdmFsdWVzIChgYW55YCkgZm9yIHRoZSBsb2NhbCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB2YXJpYWJsZXMgZXhpc3QgaW4gc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgYSBzcGVjaWZpYyB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFyaWFibGUgaXMgZm91bmQgaW4gdGhlIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaGFzIGEgc3BlY2lmaWMgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhcmlhYmxlIGlzIGZvdW5kIGxvY2FsbHksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZXMgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLiBTZWFyY2hlcyB1cCB0aGUgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lcyBBbiBhcnJheSBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ1tdYCkgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlcyh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgdHJhbnNpZW50IHZhcmlhYmxlIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgbWVjaGFuaXNtICh1cCB0aGUgaGllcmFyY2h5KS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YXJpYWJsZVZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSB0cmFuc2llbnQgdmFyaWFibGUsIHNlYXJjaGluZyB1cCB0aGUgcGFyZW50IHNjb3Blcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy52YXJpYWJsZVNjb3BlLmdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdHJhbnNpZW50IHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB0cmFuc2llbnRWYXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwodHJhbnNpZW50VmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcy5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHNwZWNpZmljIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUucmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgb2YgdGhpcyBzY29wZSBhbmQgaXRzIHBhcmVudCBzY29wZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVzKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0aW9uQ29udGV4dCBvYmplY3RcbiAqICogUHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNvbnRyb2wgb3ZlciB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuICovXG5jbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgVmFyaWFibGVTY29wZSB7XG5cblx0cHJpdmF0ZSBleGVjdXRpb246IGFueTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcihfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKSk7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cbn1cblxuZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG5jbGFzcyBUYXNrQ29udGV4dCBleHRlbmRzIFZhcmlhYmxlU2NvcGUge1xuXG5cdHByaXZhdGUgdGFzazogYW55O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKF9fY29udGV4dC5nZXQoJ3Rhc2snKSk7XG5cdFx0dGhpcy50YXNrID0gX19jb250ZXh0LmdldCgndGFzaycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERCIGlkIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hbWUgb3IgdGl0bGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldE5hbWUobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RGVzY3JpcHRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXMgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LFxuXHQgKiBbNDAuLjU5XSBub3JtYWwsIFs2MC4uNzldIGhpZ2ggWzgwLi4xMDBdIGhpZ2hlc3Rcblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcmlvcml0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdyxcblx0ICogWzQwLi41OV0gbm9ybWFsLCBbNjAuLjc5XSBoaWdoIFs4MC4uMTAwXSBoaWdoZXN0XG5cdCAqIFxuXHQgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2ssIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdywgWzQwLi41OV0gbm9ybWFsLCBcblx0ICovXG5cdHB1YmxpYyBzZXRQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldFByaW9yaXR5KHByaW9yaXR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzSW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgSUQgb2YgdGhlIGV4ZWN1dGlvbiB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV4ZWN1dGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRTdGF0ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDcmVhdGVUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q3JlYXRlVGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBpbiBwcm9ncmVzcyBzdGFydCB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0VGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdGFydGVkIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgc3RhcnRlZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY2xhaW1lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBjbGFpbSB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1UaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q2xhaW1UaW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgY2xhaW1lZCB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IGNsYWltZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1lZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDbGFpbWVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGlkIG9mIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIHRhc2sgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2Vzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB0YXNrIGRlZmluaXRpb24ga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRUYXNrRGVmaW5pdGlvbktleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlZCB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LlxuXHQgKiBcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGlzIHN1c3BlbmRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTdXNwZW5kZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5pc1N1c3BlbmRlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIGFuZCBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGggKGlmIGFueSkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdGVuYW50IElEIG9mIHRoaXMgdGFzaywgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBubyB0ZW5hbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUZW5hbnRJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0VGVuYW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZm9ybSBrZXkgZm9yIHRoZSB1c2VyIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtIGtleSBkZWZpbmVkIG9uIHRoZSB1c2VyIHRhc2sgaW4gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgdGFzayBpcyBub3QgYSB1c2VyIHRhc2sgb3IgaWYgbm8gZm9ybSBrZXkgaXMgZGVmaW5lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBmb3JtIGtleSBmb3IgdGhlIHVzZXIgdGFzaywgb3IgYG51bGxgIGlmIG5vIGZvcm0ga2V5IGlzIGRlZmluZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Rm9ybUtleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Rm9ybUtleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgZm9ybSBrZXkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZm9ybUtleSB0aGUgbmV3IGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrLCBvciBgbnVsbGAgdG8gcmVtb3ZlIHRoZSBmb3JtIGtleVxuXHQgKi9cblx0cHVibGljIHNldEZvcm1LZXkoZm9ybUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEZvcm1LZXkoZm9ybUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IG5hbWUgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzay4gV2lsbCByZXR1cm4gYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lci5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBldmVudCBuYW1lIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2ssIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRFdmVudE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgaGFuZGxlciBpZGVudGlmaWVyIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2suIFdpbGwgcmV0dXJuIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIgb3IgaWYgdGhlIGV2ZW50IGhhbmRsZXIgZG9lcyBub3QgaGF2ZSBhbiBpZGVudGlmaWVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgaWRlbnRpZmllciwgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lciBvciBpZiB0aGUgZXZlbnQgaGFuZGxlciBkb2VzIG5vdCBoYXZlIGFuIGlkZW50aWZpZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV2ZW50SGFuZGxlcklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgZGVsZWdhdGlvbiBzdGF0ZSBvZiB0aGUgdGFzaywgd2hpY2ggaXMgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCBkZWxlZ2F0ZWQsIGBQRU5ESU5HYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIHdhaXRpbmcgZm9yIHJlc29sdXRpb24gYnkgdGhlIGFzc2lnbmVlLCBhbmQgYFJFU09MVkVEYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBhc3NpZ25lZSBidXQgbm90IHlldCBjb21wbGV0ZWQgYnkgdGhlIG93bmVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGRlbGVnYXRpb24gc3RhdGUgb2YgdGhlIHRhc2ssIHdoaWNoIGlzIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgZGVsZWdhdGVkLCBgUEVORElOR2AgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCB3YWl0aW5nIGZvciByZXNvbHV0aW9uIGJ5IHRoZSBhc3NpZ25lZSwgYW5kIGBSRVNPTFZFRGAgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCBoYXMgYmVlbiByZXNvbHZlZCBieSB0aGUgYXNzaWduZWUgYnV0IG5vdCB5ZXQgY29tcGxldGVkIGJ5IHRoZSBvd25lci5cblx0ICovXG5cdHB1YmxpYyBnZXREZWxlZ2F0aW9uU3RhdGUoKTogRGVsZWdhdGlvblN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldERlbGVnYXRpb25TdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBjYW5kaWRhdGUgdXNlciB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzaywgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYSBjYW5kaWRhdGUgdG8gYmVjb21lIGFuIGFzc2lnbmVlLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlIHRoaXMgdGFzayBpbiB0aGVpciB0YXNrIGxpc3QgYW5kIGNsYWltIGl0IHRvIGJlY29tZSB0aGUgYXNzaWduZWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXNlcklkIHRoZSB1c2VyIElEIG9mIHRoZSBjYW5kaWRhdGUgdXNlciB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlVXNlcih1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbXVsdGlwbGUgdXNlcnMgYXMgY2FuZGlkYXRlIHVzZXIgdG8gdGhpcyB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGNhbmRpZGF0ZVVzZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZSB1c2VyIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXJzKGNhbmRpZGF0ZVVzZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVVc2VycyhjYW5kaWRhdGVVc2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNhbmRpZGF0ZSBncm91cCB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cCBhcmUgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBncm91cCBpcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2ssIGJ1dCBpdCBtZWFucyB0aGF0IGFsbCB1c2VycyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoZSBncm91cCBhcmUgY2FuZGlkYXRlcyB0byBiZWNvbWUgYXNzaWduZWVzLiBUaGUgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGlzIHRhc2sgaW4gdGhlaXIgdGFzayBsaXN0IGFuZCBjbGFpbSBpdCB0byBiZWNvbWUgdGhlIGFzc2lnbmVlLlxuXHQgKiBcblx0ICogQHBhcmFtIGdyb3VwSWQgdGhlIGdyb3VwIElEIG9mIHRoZSBjYW5kaWRhdGUgZ3JvdXAgdG8gYWRkIHRvIHRoaXMgdGFzay5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBtdWx0aXBsZSBncm91cHMgYXMgY2FuZGlkYXRlIGdyb3VwIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBjYW5kaWRhdGVHcm91cHMgdGhlIGNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlIGdyb3VwIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay4gVGhpcyBpcyB0aGUgdXNlciB0aGF0IGhhcyB0byB3b3JrIG9uIHRoaXMgdGFzayBhbmQgY29tcGxldGUgaXQuIFdoZW4gYSB0YXNrIGlzIGFzc2lnbmVkIHRvIGEgdXNlciwgdGhhdCB1c2VyIGJlY29tZXMgdGhlIGFzc2lnbmVlIG9mIHRoZSB0YXNrLiBUaGUgYXNzaWduZWUgaXMgdGhlIG9ubHkgb25lIHRoYXQgY2FuIGNvbXBsZXRlIHRoZSB0YXNrICh1bmxlc3MgdGhlIHRhc2sgaXMgZGVsZWdhdGVkXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T3duZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE93bmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLiBUaGlzIGlzIHRoZSB1c2VyIHRoYXQgaGFzIHRvIHdvcmsgb24gdGhpcyB0YXNrIGFuZCBjb21wbGV0ZSBpdC4gV2hlbiBhIHRhc2sgaXMgYXNzaWduZWQgdG8gYSB1c2VyLCB0aGF0IHVzZXIgYmVjb21lcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2suIFRoZSBhc3NpZ25lZSBpcyB0aGUgb25seSBvbmUgdGhhdCBjYW4gY29tcGxldGUgdGhlIHRhc2sgKHVubGVzcyB0aGUgdGFzayBpcyBkZWxlZ2F0ZWRcblx0ICogXG5cdCAqIEBwYXJhbSBvd25lciB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIob3duZXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXRPd25lcihvd25lcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0byB3aGljaCB0aGlzIHRhc2sgaXMgZGVsZWdhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIGFzc2lnbmVlIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRBc3NpZ25lZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICogQHBhcmFtIGFzc2lnbmVlIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG4gICAgcHVibGljIHNldEFzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLnNldEFzc2lnbmVlKGFzc2lnbmVlKTtcbiAgICB9XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGluUHJvZ3Jlc3NTdGFydER1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZShpblByb2dyZXNzU3RhcnREdWVEYXRlOiBEYXRlKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoaW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGR1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0RHVlRGF0ZShkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2F0ZWdvcnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENhdGVnb3J5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBjYXRlZ29yeSBvZiB0aGUgdGFzay4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgYWxsb3dzIHRvICd0YWcnIHRhc2tzIGFzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gY2F0ZWdvcnkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIG5ldyBjYXRlZ29yeSBvZiB0aGUgdGFza1xuXHQgKi9cblx0cHVibGljIHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXHR9XG5cblxuICAgIC8qKlxuICAgICAqIEludm9sdmVzIGEgdXNlciB3aXRoIGEgdGFzay4gVGhlIHR5cGUgb2YgaWRlbnRpdHkgbGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgdXNlciBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgYWRkVXNlcklkZW50aXR5TGluayh1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZFVzZXJJZGVudGl0eUxpbmsodXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG4gICAgLyoqXG4gICAgICogSW52b2x2ZXMgYSBncm91cCB3aXRoIGdyb3VwIHRhc2suIFRoZSB0eXBlIG9mIGlkZW50aXR5TGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmFkZEdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVVc2VySWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nKX0gOyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZUdyb3VwKGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIHVzZXIgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciBpbnZvbHZlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuICAgICAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBkZWxldGVVc2VySWRlbnRpdHlMaW5rKHVzZXJJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suZGVsZXRlVXNlcklkZW50aXR5TGluayh1c2VySWQsIGlkZW50aXR5TGlua1R5cGUpO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgZ3JvdXAgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjYW5kaWRhdGUgdXNlcnMgYW5kIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNldCBvZiB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgb2YgdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9LlxuICAgICAqL1xuXHRwdWJsaWMgZ2V0Q2FuZGlkYXRlcygpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDYW5kaWRhdGVzKCk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxvQkFBdUI7QUFHdkIsTUFBTSxhQUFhLEtBQUssS0FBSyx3Q0FBd0M7QUFDckUsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUs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
1074
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBtb2R1bGUgYnBtL3Byb2Nlc3NcbiAqIEBwYWNrYWdlIEBhZXJva2l0L3Nkay9icG1cbiAqIEBuYW1lIFByb2Nlc3NcbiAqIEBvdmVydmlld1xuICogXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbmFsaXRpZXMgZm9yIG1hbmFnaW5nIGFuZCBpbnRlcmFjdGluZyB3aXRoIEJQTU4gcHJvY2VzcyBpbnN0YW5jZXMsIGluY2x1ZGluZyBzdGFydGluZyBwcm9jZXNzZXMsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgaGFuZGxpbmcgcHJvY2VzcyB2YXJpYWJsZXMuXG4gKiBcbiAqICMjIyBLZXkgRmVhdHVyZXNcbiAqIC0gU3RhcnQgbmV3IHByb2Nlc3MgaW5zdGFuY2VzIHdpdGggb3B0aW9uYWwgYnVzaW5lc3Mga2V5cyBhbmQgcGFyYW1ldGVyc1xuICogLSBVcGRhdGUgcHJvY2VzcyBpbnN0YW5jZSBtZXRhZGF0YSBzdWNoIGFzIG5hbWUsIGJ1c2luZXNzIGtleSwgYW5kIGJ1c2luZXNzIHN0YXR1c1xuICogLSBNYW5hZ2UgcHJvY2VzcyB2YXJpYWJsZXMgd2l0aCBzdXBwb3J0IGZvciBsb2NhbCBhbmQgZ2xvYmFsIHNjb3BlcywgYXMgd2VsbCBhcyB0cmFuc2llbnQgdmFyaWFibGVzXG4gKiBcbiAqICMjIyBVc2UgQ2FzZXNcbiAqIC0gSW5pdGlhdGluZyBuZXcgcHJvY2VzcyBpbnN0YW5jZXMgZnJvbSBhcHBsaWNhdGlvbiBjb2RlXG4gKiAtIER5bmFtaWNhbGx5IHVwZGF0aW5nIHByb2Nlc3MgaW5zdGFuY2UgaW5mb3JtYXRpb24gZHVyaW5nIGV4ZWN1dGlvblxuICogLSBNYW5hZ2luZyBwcm9jZXNzIHZhcmlhYmxlcyBmb3IgZGF0YSBzdG9yYWdlIGFuZCByZXRyaWV2YWwgd2l0aGluIHByb2Nlc3MgZXhlY3V0aW9uc1xuICogXG4gKiAjIyMgRXhhbXBsZSBVc2FnZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IFByb2Nlc3MgfSBmcm9tIFwiQGFlcm9raXQvc2RrL2JwbVwiO1xuICogLy8gU3RhcnQgYSBuZXcgcHJvY2VzcyBpbnN0YW5jZVxuICogY29uc3QgcHJvY2Vzc0luc3RhbmNlSWQgPSBQcm9jZXNzLnN0YXJ0KFwibXlQcm9jZXNzRGVmaW5pdGlvbktleVwiLCBcIm15QnVzaW5lc3NLZXlcIiwgeyBteVZhcmlhYmxlOiBcInZhbHVlXCIgfSk7XG4gKiBjb25zb2xlLmxvZyhgU3RhcnRlZCBwcm9jZXNzIGluc3RhbmNlIHdpdGggSUQ6ICR7cHJvY2Vzc0luc3RhbmNlSWR9YCk7XG4gKiAvLyBVcGRhdGUgcHJvY2VzcyBpbnN0YW5jZSBuYW1lXG4gKiBQcm9jZXNzLnNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQsIFwiTXkgUHJvY2VzcyBJbnN0YW5jZVwiKTtcbiAqIC8vIFNldCBhIHByb2Nlc3MgdmFyaWFibGVcbiAqIFByb2Nlc3Muc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIFwibXlWYXJpYWJsZVwiLCBcIm5ld1ZhbHVlXCIpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgVmFsdWVzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG0vdmFsdWVzXCI7XG5pbXBvcnQgeyBJZGVudGl0eUxpbmsgfSBmcm9tIFwiLi90YXNrc1wiO1xuXG5jb25zdCBKQnBtbkVycm9yID0gSmF2YS50eXBlKCdvcmcuZmxvd2FibGUuZW5naW5lLmRlbGVnYXRlLkJwbW5FcnJvcicpO1xuY29uc3QgQnBtRmFjYWRlID0gSmF2YS50eXBlKFwib3JnLmVjbGlwc2UuZGlyaWdpYmxlLmNvbXBvbmVudHMuYXBpLmJwbS5CcG1GYWNhZGVcIik7XG5cbmV4cG9ydCBjbGFzcyBCcG1uRXJyb3Ige1xuXHRjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gbmV3IEpCcG1uRXJyb3IoY29kZSwgbWVzc2FnZSk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2Nlc3Mge1xuXG5cdC8qKlxuXHQgKiBTdGFydHMgYSBuZXcgcHJvY2VzcyBpbnN0YW5jZSBmb3IgYSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24ga2V5LlxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBwcm9jZXNzIGRlZmluaXRpb24ga2V5IChJRCkgb2YgdGhlIHByb2Nlc3MgdG8gc3RhcnQuXG5cdCAqIEBwYXJhbSBidXNpbmVzc0tleSBBbiBvcHRpb25hbCBidXNpbmVzcyBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb2Nlc3MgaW5zdGFuY2UuIERlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQW4gb3B0aW9uYWwgbWFwIG9mIHByb2Nlc3MgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdXBvbiBzdGFydGluZy4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyBUaGUgdW5pcXVlIElEIG9mIHRoZSBuZXdseSBzdGFydGVkIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHN0YXJ0KGtleTogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nID0gJycsIHBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5zdGFydFByb2Nlc3Moa2V5LCBidXNpbmVzc0tleSwgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lIGZvciB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc2V0UHJvY2Vzc0luc3RhbmNlTmFtZShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuc2V0UHJvY2Vzc0luc3RhbmNlTmFtZShwcm9jZXNzSW5zdGFuY2VJZCwgbmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mga2V5IG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgVGhlIG5ldyBidXNpbmVzcyBrZXkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NLZXkocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBidXNpbmVzcyBzdGF0dXMgb2YgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBidXNpbmVzc1N0YXR1cyBUaGUgbmV3IGJ1c2luZXNzIHN0YXR1cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgdXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgYnVzaW5lc3NTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS51cGRhdGVCdXNpbmVzc1N0YXR1cyhwcm9jZXNzSW5zdGFuY2VJZCwgYnVzaW5lc3NTdGF0dXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyB2YXJpYWJsZSBmcm9tIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUsIG9yIGBudWxsYCBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QuIFRoZSB0eXBlIGlzIGBhbnlgIGFzIGl0IGRlcGVuZHMgb24gdGhlIHN0b3JlZCB2YWx1ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuZ2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFsbCB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHZhcmlhYmxlcyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UsIHdoZXJlIGtleXMgYXJlIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZSB2YXJpYWJsZSB2YWx1ZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlcyhwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlcyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBvciB1cGRhdGVzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIGluIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gc2V0LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZhcmlhYmxlLiBUaGUgdHlwZSBpcyBgYW55YCB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgZGF0YSB0eXBlcy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSB2YXJpYWJsZSBmcm9tIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyByZW1vdmVWYXJpYWJsZShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5yZW1vdmVWYXJpYWJsZShwcm9jZXNzSW5zdGFuY2VJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWxhdGVzIGEgbWVzc2FnZSBldmVudCB3aXRoIGEgcnVubmluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIGNvcnJlbGF0ZSB0aGUgbWVzc2FnZSB0by5cblx0ICogQHBhcmFtIG1lc3NhZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGV2ZW50IGRlZmluZWQgaW4gdGhlIEJQTU4gcHJvY2Vzcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiB2YXJpYWJsZXMgKGBNYXA8c3RyaW5nLCBhbnk+YCkgdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIGV2ZW50LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBjb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbWVzc2FnZU5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLmNvcnJlbGF0ZU1lc3NhZ2VFdmVudChwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgd2l0aGluIGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBvciBzZXJ2aWNlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBgRXhlY3V0aW9uQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHByb2Nlc3MgZXhlY3V0aW9uIHBhdGguXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldEV4ZWN1dGlvbkNvbnRleHQoKSB7XG5cdFx0cmV0dXJuIG5ldyBFeGVjdXRpb25Db250ZXh0KCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHRhc2sgY29udGV4dCBvYmplY3QsIHR5cGljYWxseSB1c2VkIHdpdGhpbiBhIHRhc2sgbGlzdGVuZXIgb3Igc2VydmljZSB0YXNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgYFRhc2tDb250ZXh0YCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VGFza0NvbnRleHQoKSB7XG5cdFx0cmV0dXJuIG5ldyBUYXNrQ29udGV4dCgpO1xuXHR9XG59XG5cbmNsYXNzIFZhcmlhYmxlU2NvcGUge1xuXG5cdHByaXZhdGUgdmFyaWFibGVTY29wZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yKHZhcmlhYmxlU2NvcGU6IGFueSkge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZSA9IHZhcmlhYmxlU2NvcGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdmFyaWFibGVzLiBUaGlzIHdpbGwgaW5jbHVkZSBhbGwgdmFyaWFibGVzIG9mIHBhcmVudCBzY29wZXMgdG9vLlxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhcmlhYmxlIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB2YXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB2YXJpYWJsZXMsIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIG9ubHkgdGhlIHZhbHVlICh0eXBlLCBleGVjdXRpb24gaWQsIGV0Yy4pXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8ge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUluc3RhbmNlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlIGxvY2FsIHRvIHRoaXMgc2NvcGUgb25seS4gU28sIGluIGNvbnRyYXJ5IHRvIHtAbGluayAjZ2V0VmFyaWFibGVzKCl9LCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHBhcmVudCBzY29wZSB3b24ndCBiZSByZXR1cm5lZC5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byBsb2NhbCB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB2YXJpYWJsZXNMb2NhbCA9IHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZXNMb2NhbCgpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlc0xvY2FsKSB7XG5cdFx0XHR2YXJpYWJsZXNMb2NhbC5zZXQoa2V5LCBWYWx1ZXMucGFyc2VWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVzTG9jYWw7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGVzIGxvY2FsIHRvIHRoaXMgc2NvcGUgYXMgaW5zdGFuY2VzIG9mIHRoZSB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gaW50ZXJmYWNlLCB3aGljaCBwcm92aWRlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpYWJsZS5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byBsb2NhbCB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gb2JqZWN0cyAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlIHZhbHVlIGZvciBvbmUgc3BlY2lmaWMgdmFyaWFibGUuIFdpbGwgbG9vayBpbiBwYXJlbnQgc2NvcGVzIHdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgcGFydGljdWxhciBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjZ2V0VmFyaWFibGUoU3RyaW5nKX0sIGJ1dCByZXR1cm5zIGEge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGluc3RhbmNlLCB3aGljaCBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uIHRoYW4ganVzdCB0aGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWMgdmFyaWFibGUgYW5kIG9ubHkgY2hlY2tzIHRoaXMgc2NvcGUgYW5kIG5vdCBhbnkgcGFyZW50IHNjb3BlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSAoYGFueWApLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kIGxvY2FsbHkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNnZXRWYXJpYWJsZUxvY2FsKFN0cmluZyl9LCBidXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0sIHdoaWNoIGhhcyBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSB2YWx1ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSBsb2NhbCB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gb2JqZWN0IChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIGZvciB0aGlzIHNjb3BlIGFuZCBhbGwgcGFyZW50IHNjb3Blcy5cblx0ICogQHJldHVybnMgQSBTZXQgb2YgYWxsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lcygpOiBTZXQ8c3RyaW5nPiB7XG5cdFx0Y29uc3QgdmFyaWFibGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgbmV4dCBvZiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVOYW1lcygpLnRvQXJyYXkoKSkge1xuXHRcdFx0dmFyaWFibGVOYW1lcy5hZGQobmV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYWJsZU5hbWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIGZvciB0aGlzIHNjb3BlIChubyBwYXJlbnQgc2NvcGVzKS5cblx0ICogQHJldHVybnMgQSBTZXQgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZU5hbWVzTG9jYWwoKTogU2V0PHN0cmluZz4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlTmFtZXNMb2NhbCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgbmV4dCBvZiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCkudG9BcnJheSgpKSB7XG5cdFx0XHR2YXJpYWJsZU5hbWVzTG9jYWwuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLiBJdCBjaGVja3MgcGFyZW50IHNjb3BlcyBmb3IgYW4gZXhpc3RpbmcgdmFyaWFibGUgYmVmb3JlIHNldHRpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGUodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjc2V0VmFyaWFibGUoU3RyaW5nLCBPYmplY3QpfSwgYnV0IHRoZSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhpcyBzY29wZSBzcGVjaWZpY2FsbHkgKGxvY2FsIHZhcmlhYmxlKS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IGxvY2FsbHkuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCAoYGFueWApLlxuXHQgKiBAcmV0dXJucyBUaGUgb2xkIHZhbHVlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB0byB0aGUgdmFyaWFibGUgc2NvcGUsIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgYWxnb3JpdGhtLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzIEEgbWFwIG9mIGtleXMgKGBzdHJpbmdgKSBhbmQgdmFsdWVzIChgYW55YCkgZm9yIHRoZSB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXMpIHtcblx0XHRcdHZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNzZXRWYXJpYWJsZXMoTWFwKX0sIGJ1dCB0aGUgdmFyaWFibGVzIGFyZSBzZXQgb24gdGhpcyBzY29wZSBzcGVjaWZpY2FsbHkgKGxvY2FsIHZhcmlhYmxlcykuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlcyB0byBiZSBzZXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIHNjb3BlIG9yIGFueSBwYXJlbnQgc2NvcGUgaGFzIHZhcmlhYmxlcy5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHZhcmlhYmxlcyBleGlzdCBpbiBzY29wZSBoaWVyYXJjaHksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlcygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIHNjb3BlIGhhcyB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBsb2NhbCB2YXJpYWJsZXMgZXhpc3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlc0xvY2FsKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuaGFzVmFyaWFibGVzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyBhIHNwZWNpZmljIHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBjaGVjay5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXJpYWJsZSBpcyBmb3VuZCBpbiB0aGUgc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuaGFzVmFyaWFibGUodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgYSBzcGVjaWZpYyB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFyaWFibGUgaXMgZm91bmQgbG9jYWxseSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuaGFzVmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHZhcmlhYmxlIGZyb20gdGhlIHByb2Nlc3MgaW5zdGFuY2UgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZS4gU2VhcmNoZXMgdXAgdGhlIHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGUgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUucmVtb3ZlVmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHZhcmlhYmxlcyBhbmQgY3JlYXRlcyBhIG5ldyBIaXN0b3JpY1ZhcmlhYmxlVXBkYXRlIGZvciBlYWNoIG9mIHRoZW0uIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWVzIEFuIGFycmF5IG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nW11gKSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVmFyaWFibGVzKHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlcyh2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBsb2NhbCB2YXJpYWJsZXMgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lcyBBbiBhcnJheSBvZiBsb2NhbCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ1tdYCkgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlTmFtZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSB0cmFuc2llbnQgdmFyaWFibGUgdXNpbmcgdGhlIGRlZmF1bHQgc2NvcGluZyBtZWNoYW5pc20gKHVwIHRoZSBoaWVyYXJjaHkpLiBUcmFuc2llbnQgdmFyaWFibGVzIGhhdmUgbm8gaGlzdG9yeSBhbmQgYXJlIGNsZWFyZWQgYXQgd2FpdCBzdGF0ZXMuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBzZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhcmlhYmxlVmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLiBUcmFuc2llbnQgdmFyaWFibGVzIGhhdmUgbm8gaGlzdG9yeSBhbmQgYXJlIGNsZWFyZWQgYXQgd2FpdCBzdGF0ZXMuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBzZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YXJpYWJsZVZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBtdWx0aXBsZSB0cmFuc2llbnQgdmFyaWFibGVzIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgbWVjaGFuaXNtICh1cCB0aGUgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdHJhbnNpZW50IHZhcmlhYmxlcyB0byBiZSBzZXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVzKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVzKHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBwYXJlbnQgc2NvcGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFsbCB0cmFuc2llbnQgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdHJhbnNpZW50IHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zaWVudFZhcmlhYmxlcyA9IHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMucGFyc2VWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJhbnNpZW50VmFyaWFibGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcy5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcyB0byBiZSBzZXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwodHJhbnNpZW50VmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy52YXJpYWJsZVNjb3BlLmdldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCA9IHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXNMb2NhbC5zZXQoa2V5LCBWYWx1ZXMucGFyc2VWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJhbnNpZW50VmFyaWFibGVzTG9jYWw7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHNwZWNpZmljIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdHJhbnNpZW50IHZhcmlhYmxlLCBzZWFyY2hpbmcgdXAgdGhlIHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZSBhbGwgdHJhbnNpZW50IHZhcmlhYmxlcyBvZiB0aGlzIHNjb3BlIGFuZCBpdHMgcGFyZW50IHNjb3Blcy5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBFeGVjdXRpb25Db250ZXh0IG9iamVjdFxuICogKiBQcm92aWRlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY29udHJvbCBvdmVyIHRoZSBjdXJyZW50IHByb2Nlc3MgZXhlY3V0aW9uIHBhdGguXG4gKi9cbmNsYXNzIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBWYXJpYWJsZVNjb3BlIHtcblxuXHRwcml2YXRlIGV4ZWN1dGlvbjogYW55O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKF9fY29udGV4dC5nZXQoJ2V4ZWN1dGlvbicpKTtcblx0XHR0aGlzLmV4ZWN1dGlvbiA9IF9fY29udGV4dC5nZXQoJ2V4ZWN1dGlvbicpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVuaXF1ZSBpZCBvZiB0aGlzIHBhdGggb2YgZXhlY3V0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBoYW5kbGUgdG8gcHJvdmlkZSBleHRlcm5hbCBzaWduYWxzIGJhY2sgaW50byB0aGUgZW5naW5lIGFmdGVyIHdhaXQgc3RhdGVzLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgdW5pcXVlIElEIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGlvbi5cblx0ICovXG5cdHB1YmxpYyBnZXRJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgb3ZlcmFsbCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgJ3Jvb3QnIHByb2Nlc3MgaW5zdGFuY2UuIFdoZW4gdXNpbmcgY2FsbCBhY3Rpdml0eSBmb3IgZXhhbXBsZSwgdGhlIHByb2Nlc3NJbnN0YW5jZSBzZXQgd2lsbCBub3QgYWx3YXlzIGJlIHRoZSByb290LiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSB0b3Btb3N0IHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBJRCBvZiB0aGUgcm9vdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFJvb3RQcm9jZXNzSW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaWxsIGNvbnRhaW4gdGhlIGV2ZW50IG5hbWUgaW4gY2FzZSB0aGlzIGV4ZWN1dGlvbiBpcyBwYXNzZWQgaW4gZm9yIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0uXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGV2ZW50IG5hbWUsIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhbiBldmVudCBsaXN0ZW5lci5cblx0ICovXG5cdHB1YmxpYyBnZXRFdmVudE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0RXZlbnROYW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgY3VycmVudCBldmVudCAodHlwaWNhbGx5IHdoZW4gZXhlY3V0aW9uIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0pLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cblx0ICovXG5cdHB1YmxpYyBzZXRFdmVudE5hbWUoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRFdmVudE5hbWUoZXZlbnROYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYnVzaW5lc3Mga2V5IGZvciB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIGV4ZWN1dGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguXG5cdCAqIEByZXR1cm5zIFRoZSBidXNpbmVzcyBrZXkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYnVzaW5lc3Mgc3RhdHVzIGZvciB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIGV4ZWN1dGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguXG5cdCAqIEByZXR1cm5zIFRoZSBidXNpbmVzcyBzdGF0dXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NTdGF0dXMoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NTdGF0dXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIElELlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UHJvY2Vzc0RlZmluaXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIElmIHRoaXMgZXhlY3V0aW9uIHJ1bnMgaW4gdGhlIGNvbnRleHQgb2YgYSBjYXNlIGFuZCBzdGFnZSwgdGhpcyBtZXRob2QgcmV0dXJucyBpdCdzIGNsb3Nlc3QgcGFyZW50IHN0YWdlIGluc3RhbmNlIGlkICh0aGUgc3RhZ2UgcGxhbiBpdGVtIGluc3RhbmNlIGlkIHRvIGJlXG5cdCAqIHByZWNpc2UpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgc3RhZ2UgaW5zdGFuY2UgaWQgdGhpcyBleGVjdXRpb24gYmVsb25ncyB0byBvciBgbnVsbGAsIGlmIHRoaXMgZXhlY3V0aW9uIGlzIG5vdCBwYXJ0IG9mIGEgY2FzZSBhdCBhbGwgb3IgaXMgbm90IGEgY2hpbGQgZWxlbWVudCBvZiBhIHN0YWdlLlxuXHQgKi9cblx0cHVibGljIGdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UHJvcGFnYXRlZFN0YWdlSW5zdGFuY2VJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24uIElmIG51bGwsIHRoZSBleGVjdXRpb24gcmVwcmVzZW50cyBhIHByb2Nlc3MtaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJlbnQgZXhlY3V0aW9uIElELCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UGFyZW50SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgY2FsbGluZyBleGVjdXRpb24uIElmIG5vdCBudWxsLCB0aGUgZXhlY3V0aW9uIGlzIHBhcnQgb2YgYSBzdWJwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBUaGUgc3VwZXIgZXhlY3V0aW9uIElELCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VwZXJFeGVjdXRpb25JZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRTdXBlckV4ZWN1dGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgYWN0aXZpdHkuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFjdGl2aXR5IElELlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRBY3Rpdml0eUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRBY3Rpdml0eUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdGVuYW50IGlkLCBpZiBhbnkgaXMgc2V0IGJlZm9yZSBvbiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIG9yIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIFRoZSB0ZW5hbnQgSUQsIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VGVuYW50SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0VGVuYW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgQlBNTiBlbGVtZW50IHdoZXJlIHRoZSBleGVjdXRpb24gY3VycmVudGx5IGlzIGF0LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBmbG93IGVsZW1lbnQgb2JqZWN0ICh0eXBlIGlzIEphdmEgb2JqZWN0KS5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50Rmxvd0VsZW1lbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBjdXJyZW50IEJQTU4gZWxlbWVudCB0aGUgZXhlY3V0aW9uIGlzIGF0LlxuXHQgKiBAcGFyYW0gZmxvd0VsZW1lbnQgVGhlIG5ldyBmbG93IGVsZW1lbnQgb2JqZWN0IChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIHNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudDogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q3VycmVudEZsb3dFbGVtZW50KGZsb3dFbGVtZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRmxvd2FibGVMaXN0ZW5lcn0gaW5zdGFuY2UgbWF0Y2hpbmcgYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpZiBjdXJyZW50bHkgYW4gZXhlY3V0aW9uIGxpc3RlbmVyIGlzIGJlaW5nIGV4ZWN1dGlvbi4gUmV0dXJucyBudWxsIG90aGVyd2lzZS5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgRmxvd2FibGUgTGlzdGVuZXIgb2JqZWN0IChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9IGlzIGJlaW5nIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gY3VycmVudExpc3RlbmVyIFRoZSBjdXJyZW50IGxpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXI6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKGN1cnJlbnRMaXN0ZW5lcik7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGEgc25hcHNob3QgcmVhZCBvbmx5IGRlbGVnYXRlIGV4ZWN1dGlvbiBvZiB0aGlzIGRlbGVnYXRlIGV4ZWN1dGlvbi5cblx0ICpcblx0ICogQHJldHVybnMgQSB7QGxpbmsgUmVhZE9ubHlEZWxlZ2F0ZUV4ZWN1dGlvbn0gb2JqZWN0IChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIHNuYXBzaG90UmVhZE9ubHkoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uc25hcHNob3RSZWFkT25seSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIGV4ZWN1dGlvbiwgb3IgbnVsbCBpZiB0aGVyZSBubyBwYXJlbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBwYXJlbnQgZXhlY3V0aW9uIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudCgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRQYXJlbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBsaXN0IG9mIGV4ZWN1dGlvbiBvZiB3aGljaCB0aGlzIGV4ZWN1dGlvbiB0aGUgcGFyZW50IG9mLlxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjaGlsZCBleGVjdXRpb24gb2JqZWN0cyAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBnZXRFeGVjdXRpb25zKCk6IGFueVtdIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0RXhlY3V0aW9ucygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIG1ha2VzIHRoaXMgZXhlY3V0aW9uIGFjdGl2ZSBvciBpbmFjdGl2ZS5cblx0ICogQHBhcmFtIGlzQWN0aXZlIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV4ZWN1dGlvbiBzaG91bGQgYmUgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIHNldEFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEFjdGl2ZShpc0FjdGl2ZSk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGN1cnJlbnRseSBhY3RpdmUuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBhY3RpdmUsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0FjdGl2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBoYXMgZW5kZWQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZW5kZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzRW5kZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmlzRW5kZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBjaGFuZ2VzIHRoZSBjb25jdXJyZW50IGluZGljYXRvciBvbiB0aGlzIGV4ZWN1dGlvbi5cblx0ICogQHBhcmFtIGlzQ29uY3VycmVudCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGNvbmN1cnJlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDb25jdXJyZW50KGlzQ29uY3VycmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGNvbmN1cnJlbnQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgY29uY3VycmVudCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNDb25jdXJyZW50KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0NvbmN1cnJlbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgYSBwcm9jZXNzIGluc3RhbmNlIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGl0J3MgYSBwcm9jZXNzIGluc3RhbmNlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmlzUHJvY2Vzc0luc3RhbmNlVHlwZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluYWN0aXZhdGVzIHRoaXMgZXhlY3V0aW9uLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZXhhbXBsZSBpbiBhIGpvaW46IHRoZSBleGVjdXRpb24gc3RpbGwgZXhpc3RzLCBidXQgaXQgaXMgbm90IGxvbmdlciBhY3RpdmUuXG5cdCAqL1xuXHRwdWJsaWMgaW5hY3RpdmF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5pbmFjdGl2YXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgc2NvcGUuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBhIHNjb3BlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc1Njb3BlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Njb3BlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgc2NvcGUgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNTY29wZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGEgc2NvcGUuXG5cdCAqL1xuXHRwdWJsaWMgc2V0U2NvcGUoaXNTY29wZTogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFNjb3BlKGlzU2NvcGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyB0aGUgcm9vdCBvZiBhIG11bHRpIGluc3RhbmNlIGV4ZWN1dGlvbi5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGl0J3MgYSBtdWx0aSBpbnN0YW5jZSByb290LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc011bHRpSW5zdGFuY2VSb290KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc011bHRpSW5zdGFuY2VSb290KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCBvciBub3QuXG5cdCAqIEBwYXJhbSBpc011bHRpSW5zdGFuY2VSb290IEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV4ZWN1dGlvbiBpcyB0aGUgcm9vdCBvZiBhIG11bHRpLWluc3RhbmNlIGV4ZWN1dGlvbi5cblx0ICovXG5cdHB1YmxpYyBzZXRNdWx0aUluc3RhbmNlUm9vdChpc011bHRpSW5zdGFuY2VSb290OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdCk7XG5cdH1cblxufVxuXG5lbnVtIERlbGVnYXRpb25TdGF0ZSB7XG5cblx0LyoqXG5cdCAqIFRoZSBvd25lciBkZWxlZ2F0ZWQgdGhlIHRhc2sgYW5kIHdhbnRzIHRvIHJldmlldyB0aGUgcmVzdWx0IGFmdGVyIHRoZSBhc3NpZ25lZSBoYXMgcmVzb2x2ZWQgdGhlIHRhc2suIFdoZW4gdGhlIGFzc2lnbmVlIGNvbXBsZXRlcyB0aGUgdGFzaywgdGhlIHRhc2sgaXMgbWFya2VkIGFzIHtAbGluayAjUkVTT0xWRUR9IGFuZCBzZW50IGJhY2tcblx0ICogdG8gdGhlIG93bmVyLiBXaGVuIHRoYXQgaGFwcGVucywgdGhlIG93bmVyIGlzIHNldCBhcyB0aGUgYXNzaWduZWUgc28gdGhhdCB0aGUgb3duZXIgZ2V0cyB0aGlzIHRhc2sgYmFjayBpbiB0aGUgVG9Eby5cblx0ICovXG5cdFBFTkRJTkcsXG5cblx0LyoqXG5cdCAqIFRoZSBhc3NpZ25lZSBoYXMgcmVzb2x2ZWQgdGhlIHRhc2ssIHRoZSBhc3NpZ25lZSB3YXMgc2V0IHRvIHRoZSBvd25lciBhZ2FpbiBhbmQgdGhlIG93bmVyIG5vdyBmaW5kcyB0aGlzIHRhc2sgYmFjayBpbiB0aGUgVG9EbyBsaXN0IGZvciByZXZpZXcuIFRoZSBvd25lciBub3cgaXMgYWJsZSB0byBjb21wbGV0ZSB0aGUgdGFzay5cblx0ICovXG5cdFJFU09MVkVEXG59XG5cbmNsYXNzIFRhc2tDb250ZXh0IGV4dGVuZHMgVmFyaWFibGVTY29wZSB7XG5cblx0cHJpdmF0ZSB0YXNrOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoX19jb250ZXh0LmdldCgndGFzaycpKTtcblx0XHR0aGlzLnRhc2sgPSBfX2NvbnRleHQuZ2V0KCd0YXNrJyk7XG5cdH1cblxuXHQvKipcblx0ICogREIgaWQgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdW5pcXVlIElEIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogTmFtZSBvciB0aXRsZSBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lIHRoZSBuZXcgbmFtZSBmb3IgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0TmFtZShuYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZyZWUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXREZXNjcmlwdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZyZWUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0aW9uIG9mIGhvdyBpbXBvcnRhbnQvdXJnZW50IHRoaXMgdGFzayBpcyB3aXRoIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwIHdoZXJlIGhpZ2hlciB2YWx1ZXMgbWVhbiBhIGhpZ2hlciBwcmlvcml0eSBhbmQgbG93ZXIgdmFsdWVzIG1lYW4gbG93ZXIgcHJpb3JpdHk6IFswLi4xOV0gbG93ZXN0LCBbMjAuLjM5XSBsb3csXG5cdCAqIFs0MC4uNTldIG5vcm1hbCwgWzYwLi43OV0gaGlnaCBbODAuLjEwMF0gaGlnaGVzdFxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHByaW9yaXR5IG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UHJpb3JpdHkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFByaW9yaXR5KCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXMgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LFxuXHQgKiBbNDAuLjU5XSBub3JtYWwsIFs2MC4uNzldIGhpZ2ggWzgwLi4xMDBdIGhpZ2hlc3Rcblx0ICogXG5cdCAqIEBwYXJhbSBwcmlvcml0eSB0aGUgbmV3IHByaW9yaXR5IGZvciB0aGUgdGFzaywgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LCBbNDAuLjU5XSBub3JtYWwsIFxuXHQgKi9cblx0cHVibGljIHNldFByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0UHJpb3JpdHkocHJpb3JpdHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlbmNlIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcm9jZXNzSW5zdGFuY2VJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgcGF0aCBvZiBleGVjdXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgZXhlY3V0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRFeGVjdXRpb25JZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RXhlY3V0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIElEIG9mIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldFN0YXRlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRTdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIGNyZWF0ZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgY3JlYXRpb24gdGltZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldENyZWF0ZVRpbWUoKTogRGF0ZSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDcmVhdGVUaW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgcHV0IGluIHByb2dyZXNzLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGluIHByb2dyZXNzIHN0YXJ0IHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnRUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0SW5Qcm9ncmVzc1N0YXJ0VGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHN0YXJ0ZWQgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdGFydGVkIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldEluUHJvZ3Jlc3NTdGFydGVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydGVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBjbGFpbWVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNsYWltIHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDbGFpbVRpbWUoKTogRGF0ZSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDbGFpbVRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBjbGFpbWVkIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgY2xhaW1lZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDbGFpbWVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENsYWltZWRCeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHN1c3BlbmRlZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHN1c3BlbmRlZC5cblx0ICovXG5cdHB1YmxpYyBnZXRTdXNwZW5kZWRUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3VzcGVuZGVkVGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHN1c3BlbmRlZCB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHN1c3BlbmRlZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRTdXNwZW5kZWRCeSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3VzcGVuZGVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzIGRlZmluaW5nIHRoaXMgdGFzayBvciBudWxsIGlmIHRoaXMgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFRhc2tEZWZpbml0aW9uS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVkIHdoZXRoZXIgdGhpcyB0YXNrIGlzIHN1c3BlbmRlZCBvciBub3QuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgaXMgc3VzcGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc1N1c3BlbmRlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmlzU3VzcGVuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRlbmFudCBpZGVudGlmaWVyIG9mIHRoaXMgdGFzaywgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIHRlbmFudCBpZGVudGlmaWVyIG9mIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gYW5kIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCAoaWYgYW55KS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB0ZW5hbnQgSUQgb2YgdGhpcyB0YXNrLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vIHRlbmFudCBpcyBhc3NvY2lhdGVkLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRUZW5hbnRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBmb3JtIGtleSBmb3IgdGhlIHVzZXIgdGFzaywgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIGZvcm0ga2V5IGRlZmluZWQgb24gdGhlIHVzZXIgdGFzayBpbiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uLiBXaWxsIHJldHVybiBgbnVsbGAgaWYgdGhpcyB0YXNrIGlzIG5vdCBhIHVzZXIgdGFzayBvciBpZiBubyBmb3JtIGtleSBpcyBkZWZpbmVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrLCBvciBgbnVsbGAgaWYgbm8gZm9ybSBrZXkgaXMgZGVmaW5lZC5cblx0ICovXG5cdHB1YmxpYyBnZXRGb3JtS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRGb3JtS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBmb3JtIGtleSBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBmb3JtS2V5IHRoZSBuZXcgZm9ybSBrZXkgZm9yIHRoZSB1c2VyIHRhc2ssIG9yIGBudWxsYCB0byByZW1vdmUgdGhlIGZvcm0ga2V5XG5cdCAqL1xuXHRwdWJsaWMgc2V0Rm9ybUtleShmb3JtS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0Rm9ybUtleShmb3JtS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgbmFtZSB3aGljaCB0cmlnZ2VyZWQgdGhlIHRhc2sgbGlzdGVuZXIgdG8gZmlyZSBmb3IgdGhpcyB0YXNrLiBXaWxsIHJldHVybiBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYSB0YXNrIGxpc3RlbmVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGV2ZW50IG5hbWUgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzaywgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lci5cblx0ICovXG5cdHB1YmxpYyBnZXRFdmVudE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBldmVudCBoYW5kbGVyIGlkZW50aWZpZXIgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzay4gV2lsbCByZXR1cm4gYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lciBvciBpZiB0aGUgZXZlbnQgaGFuZGxlciBkb2VzIG5vdCBoYXZlIGFuIGlkZW50aWZpZXIuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZXZlbnQgaGFuZGxlciBpZGVudGlmaWVyLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYSB0YXNrIGxpc3RlbmVyIG9yIGlmIHRoZSBldmVudCBoYW5kbGVyIGRvZXMgbm90IGhhdmUgYW4gaWRlbnRpZmllci5cblx0ICovXG5cdHB1YmxpYyBnZXRFdmVudEhhbmRsZXJJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RXZlbnRIYW5kbGVySWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBkZWxlZ2F0aW9uIHN0YXRlIG9mIHRoZSB0YXNrLCB3aGljaCBpcyBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IGRlbGVnYXRlZCwgYFBFTkRJTkdgIGlmIHRoZSB0YXNrIGlzIGRlbGVnYXRlZCBhbmQgd2FpdGluZyBmb3IgcmVzb2x1dGlvbiBieSB0aGUgYXNzaWduZWUsIGFuZCBgUkVTT0xWRURgIGlmIHRoZSB0YXNrIGlzIGRlbGVnYXRlZCBhbmQgaGFzIGJlZW4gcmVzb2x2ZWQgYnkgdGhlIGFzc2lnbmVlIGJ1dCBub3QgeWV0IGNvbXBsZXRlZCBieSB0aGUgb3duZXIuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGVsZWdhdGlvbiBzdGF0ZSBvZiB0aGUgdGFzaywgd2hpY2ggaXMgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCBkZWxlZ2F0ZWQsIGBQRU5ESU5HYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIHdhaXRpbmcgZm9yIHJlc29sdXRpb24gYnkgdGhlIGFzc2lnbmVlLCBhbmQgYFJFU09MVkVEYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBhc3NpZ25lZSBidXQgbm90IHlldCBjb21wbGV0ZWQgYnkgdGhlIG93bmVyLlxuXHQgKi9cblx0cHVibGljIGdldERlbGVnYXRpb25TdGF0ZSgpOiBEZWxlZ2F0aW9uU3RhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RGVsZWdhdGlvblN0YXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNhbmRpZGF0ZSB1c2VyIHRvIHRoaXMgdGFzaywgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGNsYWltIGFuZCB3b3JrIG9uIHRoaXMgdGFzay4gVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHVzZXIgaXMgdGhlIGFzc2lnbmVlIG9mIHRoZSB0YXNrLCBidXQgaXQgbWVhbnMgdGhhdCB0aGUgdXNlciBpcyBhIGNhbmRpZGF0ZSB0byBiZWNvbWUgYW4gYXNzaWduZWUuIFRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byBzZWUgdGhpcyB0YXNrIGluIHRoZWlyIHRhc2sgbGlzdCBhbmQgY2xhaW0gaXQgdG8gYmVjb21lIHRoZSBhc3NpZ25lZS5cblx0ICogXG5cdCAqIEBwYXJhbSB1c2VySWQgdGhlIHVzZXIgSUQgb2YgdGhlIGNhbmRpZGF0ZSB1c2VyIHRvIGFkZCB0byB0aGlzIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ2FuZGlkYXRlVXNlcih1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVVc2VyKHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBtdWx0aXBsZSB1c2VycyBhcyBjYW5kaWRhdGUgdXNlciB0byB0aGlzIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2FuZGlkYXRlVXNlcnMgdGhlIGNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlIHVzZXIgSURzIHRvIGFkZCB0byB0aGlzIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ2FuZGlkYXRlVXNlcnMoY2FuZGlkYXRlVXNlcnM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZENhbmRpZGF0ZVVzZXJzKGNhbmRpZGF0ZVVzZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgY2FuZGlkYXRlIGdyb3VwIHRvIHRoaXMgdGFzaywgd2hpY2ggbWVhbnMgdGhhdCBhbGwgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGlzIGdyb3VwIGFyZSBhbGxvd2VkIHRvIGNsYWltIGFuZCB3b3JrIG9uIHRoaXMgdGFzay4gVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGdyb3VwIGlzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzaywgYnV0IGl0IG1lYW5zIHRoYXQgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhlIGdyb3VwIGFyZSBjYW5kaWRhdGVzIHRvIGJlY29tZSBhc3NpZ25lZXMuIFRoZSB1c2VycyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoZSBncm91cCB3aWxsIGJlIGFibGUgdG8gc2VlIHRoaXMgdGFzayBpbiB0aGVpciB0YXNrIGxpc3QgYW5kIGNsYWltIGl0IHRvIGJlY29tZSB0aGUgYXNzaWduZWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCB0aGUgZ3JvdXAgSUQgb2YgdGhlIGNhbmRpZGF0ZSBncm91cCB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVHcm91cChncm91cElkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIG11bHRpcGxlIGdyb3VwcyBhcyBjYW5kaWRhdGUgZ3JvdXAgdG8gdGhpcyB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGNhbmRpZGF0ZUdyb3VwcyB0aGUgY29sbGVjdGlvbiBvZiBjYW5kaWRhdGUgZ3JvdXAgSURzIHRvIGFkZCB0byB0aGlzIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ2FuZGlkYXRlR3JvdXBzKGNhbmRpZGF0ZUdyb3Vwczogc3RyaW5nW10pOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlR3JvdXBzKGNhbmRpZGF0ZUdyb3Vwcyk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLiBUaGlzIGlzIHRoZSB1c2VyIHRoYXQgaGFzIHRvIHdvcmsgb24gdGhpcyB0YXNrIGFuZCBjb21wbGV0ZSBpdC4gV2hlbiBhIHRhc2sgaXMgYXNzaWduZWQgdG8gYSB1c2VyLCB0aGF0IHVzZXIgYmVjb21lcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2suIFRoZSBhc3NpZ25lZSBpcyB0aGUgb25seSBvbmUgdGhhdCBjYW4gY29tcGxldGUgdGhlIHRhc2sgKHVubGVzcyB0aGUgdGFzayBpcyBkZWxlZ2F0ZWRcblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdHB1YmxpYyBnZXRPd25lcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0T3duZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRhc2suIFRoaXMgaXMgdGhlIHVzZXIgdGhhdCBoYXMgdG8gd29yayBvbiB0aGlzIHRhc2sgYW5kIGNvbXBsZXRlIGl0LiBXaGVuIGEgdGFzayBpcyBhc3NpZ25lZCB0byBhIHVzZXIsIHRoYXQgdXNlciBiZWNvbWVzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzay4gVGhlIGFzc2lnbmVlIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGNhbiBjb21wbGV0ZSB0aGUgdGFzayAodW5sZXNzIHRoZSB0YXNrIGlzIGRlbGVnYXRlZFxuXHQgKiBcblx0ICogQHBhcmFtIG93bmVyIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdHB1YmxpYyBzZXRPd25lcihvd25lcjogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldE93bmVyKG93bmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QXNzaWduZWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEFzc2lnbmVlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0byB3aGljaCB0aGlzIHRhc2sgaXMgZGVsZWdhdGVkLlxuXHQgKiBAcGFyYW0gYXNzaWduZWUgdGhlIHVzZXIgSUQgb2YgdGhlIGFzc2lnbmVlIG9mIHRoaXMgdGFza1xuXHQgKi9cbiAgICBwdWJsaWMgc2V0QXNzaWduZWUoYXNzaWduZWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2suc2V0QXNzaWduZWUoYXNzaWduZWUpO1xuICAgIH1cblxuXHQvKipcblx0ICogRHVlIGRhdGUgb2YgdGhlIGluIHByb2dyZXNzIHN0YXJ0IG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGR1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnREdWVEYXRlKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gaW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSB0aGUgbmV3IGR1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXRJblByb2dyZXNzU3RhcnREdWVEYXRlKGluUHJvZ3Jlc3NTdGFydER1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZShpblByb2dyZXNzU3RhcnREdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXREdWVEYXRlKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RHVlRGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZHVlRGF0ZSB0aGUgbmV3IGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIHNldER1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXREdWVEYXRlKGR1ZURhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjYXRlZ29yeSBvZiB0aGUgdGFzay4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgYWxsb3dzIHRvICd0YWcnIHRhc2tzIGFzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gY2F0ZWdvcnkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2tcblx0ICovXG5cdHB1YmxpYyBnZXRDYXRlZ29yeSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q2F0ZWdvcnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIGFuZCBhbGxvd3MgdG8gJ3RhZycgdGFza3MgYXMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBjYXRlZ29yeS5cblx0ICogXG5cdCAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgbmV3IGNhdGVnb3J5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXRDYXRlZ29yeShjYXRlZ29yeSk7XG5cdH1cblxuXG4gICAgLyoqXG4gICAgICogSW52b2x2ZXMgYSB1c2VyIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eSBsaW5rIGlzIGRlZmluZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciBpbnZvbHZlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuICAgICAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBhZGRVc2VySWRlbnRpdHlMaW5rKHVzZXJJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkVXNlcklkZW50aXR5TGluayh1c2VySWQsIGlkZW50aXR5TGlua1R5cGUpO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBJbnZvbHZlcyBhIGdyb3VwIHdpdGggZ3JvdXAgdGFzay4gVGhlIHR5cGUgb2YgaWRlbnRpdHlMaW5rIGlzIGRlZmluZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5TGluay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHksIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRHcm91cElkZW50aXR5TGluayhncm91cElkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2suYWRkR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2RlbGV0ZVVzZXJJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcpfSA7IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciB0byB1c2UgYXMgY2FuZGlkYXRlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cbiAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlVXNlcih1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2suZGVsZXRlQ2FuZGlkYXRlVXNlcih1c2VySWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVHcm91cElkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZyl9OyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuICAgICAqXG4gICAgICogQHBhcmFtIGdyb3VwSWRcbiAgICAgKiAgICAgICAgICAgIGlkIG9mIHRoZSBncm91cCB0byB1c2UgYXMgY2FuZGlkYXRlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cbiAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIGdyb3VwIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBkZWxldGVDYW5kaWRhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suZGVsZXRlQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgdXNlciBhbmQgYSB0YXNrIGZvciB0aGUgZ2l2ZW4gaWRlbnRpdHlMaW5rVHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1c2VySWRcbiAgICAgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5TGluaywgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cbiAgICAgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cbiAgICAgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cblx0cHVibGljIGRlbGV0ZVVzZXJJZGVudGl0eUxpbmsodXNlcklkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5kZWxldGVVc2VySWRlbnRpdHlMaW5rKHVzZXJJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSBncm91cCBhbmQgYSB0YXNrIGZvciB0aGUgZ2l2ZW4gaWRlbnRpdHlMaW5rVHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHksIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cElkZW50aXR5TGluayhncm91cElkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2suZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNhbmRpZGF0ZSB1c2VycyBhbmQgZ3JvdXBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2V0IG9mIHtAbGluayBJZGVudGl0eUxpbmt9cyBvZiB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX0uXG4gICAgICovXG5cdHB1YmxpYyBnZXRDYW5kaWRhdGVzKCk6IElkZW50aXR5TGlua1tdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENhbmRpZGF0ZXMoKTtcblx0fVxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFByb2Nlc3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQStCQSxvQkFBdUI7QUFHdkIsTUFBTSxhQUFhLEtBQUssS0FBSyx3Q0FBd0M7QUFDckUsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUsTUFBTSxVQUFVO0FBQUEsRUFDdEIsWUFBWSxNQUFjLFNBQWtCO0FBQzNDLFdBQU8sSUFBSSxXQUFXLE1BQU0sT0FBTztBQUFBLEVBQ3BDO0FBQ0Q7QUFFTyxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVcEIsT0FBYyxNQUFNLEtBQWEsY0FBc0IsSUFBSSxhQUFxQyxDQUFDLEdBQVc7QUFDM0csV0FBTyxVQUFVLGFBQWEsS0FBSyxhQUFhLEtBQUssVUFBVSxVQUFVLENBQUM7QUFBQSxFQUMzRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsT0FBYyx1QkFBdUIsbUJBQTJCLE1BQW9CO0FBQ25GLGNBQVUsdUJBQXVCLG1CQUFtQixJQUFJO0FBQUEsRUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQWMsa0JBQWtCLG1CQUEyQixhQUEyQjtBQUNyRixjQUFVLGtCQUFrQixtQkFBbUIsV0FBVztBQUFBLEVBQzNEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFjLHFCQUFxQixtQkFBMkIsZ0JBQThCO0FBQzNGLGNBQVUscUJBQXFCLG1CQUFtQixjQUFjO0FBQUEsRUFDakU7QUFBQTtBQUFBO0FBQUE7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