@mnaoumov/obsidian-lib 3.2.0 → 3.3.1

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 (775) hide show
  1. package/dist/lib/cjs/@types/i18next.d.cts +1 -1
  2. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +3 -3
  3. package/dist/lib/cjs/@types/original-fs.d.cts +2 -1
  4. package/dist/lib/cjs/__merged.cjs +31 -24
  5. package/dist/lib/cjs/__merged.d.cts +3 -3
  6. package/dist/lib/cjs/active-file-provider.cjs +1 -47
  7. package/dist/lib/cjs/active-file-provider.d.cts +1 -1
  8. package/dist/lib/cjs/app.cjs +1 -47
  9. package/dist/lib/cjs/app.d.cts +1 -1
  10. package/dist/lib/cjs/async-with-notice.cjs +2 -21
  11. package/dist/lib/cjs/async-with-notice.d.cts +2 -1
  12. package/dist/lib/cjs/attachment-path.cjs +7 -26
  13. package/dist/lib/cjs/attachment-path.d.cts +1 -1
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -21
  15. package/dist/lib/cjs/attachment-unit-folder.d.cts +1 -1
  16. package/dist/lib/cjs/backlink-index.cjs +2 -21
  17. package/dist/lib/cjs/backlink-index.d.cts +1 -1
  18. package/dist/lib/cjs/backlink.cjs +2 -21
  19. package/dist/lib/cjs/backlink.d.cts +1 -1
  20. package/dist/lib/cjs/bases-view-registrar.cjs +2 -21
  21. package/dist/lib/cjs/bases-view-registrar.d.cts +1 -1
  22. package/dist/lib/cjs/callout.cjs +2 -21
  23. package/dist/lib/cjs/callout.d.cts +2 -1
  24. package/dist/lib/cjs/canvas.cjs +2 -21
  25. package/dist/lib/cjs/canvas.d.cts +1 -1
  26. package/dist/lib/cjs/case-insensitive-file-index.cjs +2 -21
  27. package/dist/lib/cjs/case-insensitive-file-index.d.cts +1 -1
  28. package/dist/lib/cjs/code-block-markdown-information.cjs +1 -47
  29. package/dist/lib/cjs/code-block-markdown-information.d.cts +1 -1
  30. package/dist/lib/cjs/code-block-reg-exp.cjs +1 -47
  31. package/dist/lib/cjs/code-block-reg-exp.d.cts +1 -1
  32. package/dist/lib/cjs/codemirror/index.cjs +2 -48
  33. package/dist/lib/cjs/codemirror/index.d.cts +1 -1
  34. package/dist/lib/cjs/codemirror/state-field-spec.cjs +1 -47
  35. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +2 -21
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +1 -1
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -21
  39. package/dist/lib/cjs/command-handlers/command-handler-component.d.cts +1 -1
  40. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -21
  41. package/dist/lib/cjs/command-handlers/command-handler.d.cts +1 -1
  42. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +2 -21
  43. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +1 -1
  44. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +5 -24
  45. package/dist/lib/cjs/command-handlers/file-command-handler.d.cts +1 -1
  46. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +5 -24
  47. package/dist/lib/cjs/command-handlers/folder-command-handler.d.cts +1 -1
  48. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +3 -22
  49. package/dist/lib/cjs/command-handlers/global-command-handler.d.cts +1 -1
  50. package/dist/lib/cjs/command-handlers/index.cjs +11 -57
  51. package/dist/lib/cjs/command-handlers/index.d.cts +1 -1
  52. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -21
  53. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.d.cts +1 -1
  54. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +1 -47
  55. package/dist/lib/cjs/command-handlers/open-settings-command-handler.d.cts +1 -1
  56. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -47
  57. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.d.cts +1 -1
  58. package/dist/lib/cjs/command-registrar.cjs +1 -47
  59. package/dist/lib/cjs/command-registrar.d.cts +1 -1
  60. package/dist/lib/cjs/community-plugins.cjs +2 -21
  61. package/dist/lib/cjs/community-plugins.d.cts +1 -1
  62. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -21
  63. package/dist/lib/cjs/components/abort-signal-component.d.cts +2 -1
  64. package/dist/lib/cjs/components/all-windows-event-component.cjs +1 -47
  65. package/dist/lib/cjs/components/all-windows-event-component.d.cts +2 -1
  66. package/dist/lib/cjs/components/async-error-handler-component.cjs +2 -21
  67. package/dist/lib/cjs/components/async-error-handler-component.d.cts +1 -1
  68. package/dist/lib/cjs/components/async-events-component.cjs +2 -21
  69. package/dist/lib/cjs/components/async-events-component.d.cts +1 -1
  70. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -47
  71. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
  72. package/dist/lib/cjs/components/component-ex.cjs +3 -16
  73. package/dist/lib/cjs/components/component-ex.d.cts +1 -1
  74. package/dist/lib/cjs/components/console-debug-component.cjs +2 -21
  75. package/dist/lib/cjs/components/console-debug-component.d.cts +1 -1
  76. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -21
  77. package/dist/lib/cjs/components/core-plugin-toggle-component.d.cts +1 -1
  78. package/dist/lib/cjs/components/disposable-component.cjs +3 -16
  79. package/dist/lib/cjs/components/disposable-component.d.cts +1 -1
  80. package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -47
  81. package/dist/lib/cjs/components/embed-extensions-component.d.cts +1 -1
  82. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +1 -47
  83. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.d.cts +1 -1
  84. package/dist/lib/cjs/components/index.cjs +30 -76
  85. package/dist/lib/cjs/components/index.d.cts +1 -1
  86. package/dist/lib/cjs/components/layout-ready-component.cjs +2 -21
  87. package/dist/lib/cjs/components/layout-ready-component.d.cts +1 -1
  88. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +1 -47
  89. package/dist/lib/cjs/components/menu-event-registrar-component.d.cts +1 -1
  90. package/dist/lib/cjs/components/monkey-around-component.cjs +2 -21
  91. package/dist/lib/cjs/components/monkey-around-component.d.cts +1 -1
  92. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +2 -21
  93. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.d.cts +1 -1
  94. package/dist/lib/cjs/components/plugin-context-component.cjs +2 -21
  95. package/dist/lib/cjs/components/plugin-context-component.d.cts +1 -1
  96. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -21
  97. package/dist/lib/cjs/components/plugin-gate-component.d.cts +2 -1
  98. package/dist/lib/cjs/components/plugin-notice-component.cjs +3 -16
  99. package/dist/lib/cjs/components/plugin-notice-component.d.cts +2 -1
  100. package/dist/lib/cjs/components/plugin-settings-component.cjs +2 -21
  101. package/dist/lib/cjs/components/plugin-settings-component.d.cts +1 -1
  102. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -21
  103. package/dist/lib/cjs/components/plugin-settings-tab-component.d.cts +1 -1
  104. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +2 -21
  105. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +2 -1
  106. package/dist/lib/cjs/components/pointer-position-component.cjs +1 -47
  107. package/dist/lib/cjs/components/pointer-position-component.d.cts +1 -1
  108. package/dist/lib/cjs/components/registry-component.cjs +2 -21
  109. package/dist/lib/cjs/components/registry-component.d.cts +1 -1
  110. package/dist/lib/cjs/components/release-notes-component.cjs +2 -21
  111. package/dist/lib/cjs/components/release-notes-component.d.cts +2 -1
  112. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +3 -16
  113. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +1 -1
  114. package/dist/lib/cjs/components/rmdir-guard-component.cjs +1 -47
  115. package/dist/lib/cjs/components/rmdir-guard-component.d.cts +1 -1
  116. package/dist/lib/cjs/components/settings-migration-component.cjs +2 -21
  117. package/dist/lib/cjs/components/settings-migration-component.d.cts +3 -3
  118. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +2 -21
  119. package/dist/lib/cjs/components/syntax-highlighting-component.d.cts +1 -1
  120. package/dist/lib/cjs/components/templates-language-component.cjs +3 -49
  121. package/dist/lib/cjs/components/templates-language-component.d.cts +1 -1
  122. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +3 -16
  123. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.d.cts +1 -1
  124. package/dist/lib/cjs/constructors/index.cjs +2 -48
  125. package/dist/lib/cjs/constructors/index.d.cts +1 -1
  126. package/dist/lib/cjs/css-class.cjs +1 -47
  127. package/dist/lib/cjs/css-class.d.cts +1 -1
  128. package/dist/lib/cjs/data-handler.cjs +1 -47
  129. package/dist/lib/cjs/data-handler.d.cts +1 -1
  130. package/dist/lib/cjs/dataview-link.cjs +2 -21
  131. package/dist/lib/cjs/dataview-link.d.cts +1 -1
  132. package/dist/lib/cjs/dataview.cjs +2 -21
  133. package/dist/lib/cjs/dataview.d.cts +2 -1
  134. package/dist/lib/cjs/debug.cjs +2 -21
  135. package/dist/lib/cjs/debug.d.cts +1 -1
  136. package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -47
  137. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
  138. package/dist/lib/cjs/demo-vault-helper.cjs +2 -21
  139. package/dist/lib/cjs/demo-vault-helper.d.cts +1 -1
  140. package/dist/lib/cjs/demo-vault-naming.cjs +1 -47
  141. package/dist/lib/cjs/demo-vault-naming.d.cts +1 -1
  142. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +3 -16
  143. package/dist/lib/cjs/desktop-demo-vault-opener.d.cts +1 -1
  144. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -21
  145. package/dist/lib/cjs/desktop-trusted-input.d.cts +2 -1
  146. package/dist/lib/cjs/editor-extension-registrar.cjs +2 -21
  147. package/dist/lib/cjs/editor-extension-registrar.d.cts +1 -1
  148. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -21
  149. package/dist/lib/cjs/editor-suggest-registrar.d.cts +1 -1
  150. package/dist/lib/cjs/editor.cjs +2 -21
  151. package/dist/lib/cjs/editor.d.cts +1 -1
  152. package/dist/lib/cjs/events.cjs +2 -21
  153. package/dist/lib/cjs/events.d.cts +1 -1
  154. package/dist/lib/cjs/extensions-registrar.cjs +2 -21
  155. package/dist/lib/cjs/extensions-registrar.d.cts +1 -1
  156. package/dist/lib/cjs/file-change.cjs +2 -21
  157. package/dist/lib/cjs/file-change.d.cts +2 -1
  158. package/dist/lib/cjs/file-explorer.cjs +2 -21
  159. package/dist/lib/cjs/file-explorer.d.cts +1 -1
  160. package/dist/lib/cjs/file-manager.cjs +2 -21
  161. package/dist/lib/cjs/file-manager.d.cts +2 -1
  162. package/dist/lib/cjs/file-system.cjs +2 -21
  163. package/dist/lib/cjs/file-system.d.cts +1 -1
  164. package/dist/lib/cjs/folder-note.cjs +2 -21
  165. package/dist/lib/cjs/folder-note.d.cts +1 -1
  166. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -21
  167. package/dist/lib/cjs/frontmatter-formatting.d.cts +1 -1
  168. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +2 -21
  169. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +1 -1
  170. package/dist/lib/cjs/frontmatter.cjs +2 -21
  171. package/dist/lib/cjs/frontmatter.d.cts +1 -1
  172. package/dist/lib/cjs/generated-during-build.cjs +2 -48
  173. package/dist/lib/cjs/generated-during-build.d.cts +1 -1
  174. package/dist/lib/cjs/hover-link-source-registrar.cjs +2 -21
  175. package/dist/lib/cjs/hover-link-source-registrar.d.cts +1 -1
  176. package/dist/lib/cjs/html-element.cjs +1 -47
  177. package/dist/lib/cjs/html-element.d.cts +2 -1
  178. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -47
  179. package/dist/lib/cjs/i18n/custom-type-options.d.cts +1 -1
  180. package/dist/lib/cjs/i18n/default-translations.cjs +1 -47
  181. package/dist/lib/cjs/i18n/default-translations.d.cts +1 -1
  182. package/dist/lib/cjs/i18n/i18n.cjs +3 -22
  183. package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
  184. package/dist/lib/cjs/i18n/index.cjs +5 -51
  185. package/dist/lib/cjs/i18n/index.d.cts +1 -1
  186. package/dist/lib/cjs/i18n/locales/en.cjs +1 -47
  187. package/dist/lib/cjs/i18n/locales/en.d.cts +1 -1
  188. package/dist/lib/cjs/i18n/locales/index.cjs +3 -49
  189. package/dist/lib/cjs/i18n/locales/index.d.cts +1 -1
  190. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -47
  191. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -1
  192. package/dist/lib/cjs/index.cjs +96 -142
  193. package/dist/lib/cjs/index.d.cts +1 -1
  194. package/dist/lib/cjs/is-in-obsidian.cjs +1 -47
  195. package/dist/lib/cjs/is-in-obsidian.d.cts +1 -1
  196. package/dist/lib/cjs/library-references.d.cts +2 -0
  197. package/dist/lib/cjs/library-styles.cjs +2 -21
  198. package/dist/lib/cjs/library-styles.d.cts +2 -1
  199. package/dist/lib/cjs/library.cjs +1 -47
  200. package/dist/lib/cjs/link-name.cjs +1 -47
  201. package/dist/lib/cjs/link-name.d.cts +1 -1
  202. package/dist/lib/cjs/link-update-progress.cjs +1 -47
  203. package/dist/lib/cjs/link-update-progress.d.cts +1 -1
  204. package/dist/lib/cjs/link.cjs +3 -16
  205. package/dist/lib/cjs/link.d.cts +2 -1
  206. package/dist/lib/cjs/logger.cjs +2 -21
  207. package/dist/lib/cjs/logger.d.cts +2 -1
  208. package/dist/lib/cjs/loop.cjs +3 -16
  209. package/dist/lib/cjs/loop.d.cts +2 -1
  210. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +2 -21
  211. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +2 -1
  212. package/dist/lib/cjs/markdown-code-block-processor.cjs +2 -21
  213. package/dist/lib/cjs/markdown-code-block-processor.d.cts +2 -1
  214. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -21
  215. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +2 -1
  216. package/dist/lib/cjs/markdown-view.cjs +1 -47
  217. package/dist/lib/cjs/markdown-view.d.cts +1 -1
  218. package/dist/lib/cjs/markdown.cjs +3 -16
  219. package/dist/lib/cjs/markdown.d.cts +2 -1
  220. package/dist/lib/cjs/menu-event-registrar.cjs +1 -47
  221. package/dist/lib/cjs/menu-event-registrar.d.cts +1 -1
  222. package/dist/lib/cjs/metadata-cache.cjs +6 -19
  223. package/dist/lib/cjs/metadata-cache.d.cts +1 -1
  224. package/dist/lib/cjs/mobile-trusted-input.cjs +1 -47
  225. package/dist/lib/cjs/mobile-trusted-input.d.cts +1 -1
  226. package/dist/lib/cjs/modals/alert.cjs +2 -21
  227. package/dist/lib/cjs/modals/alert.d.cts +2 -1
  228. package/dist/lib/cjs/modals/confirm.cjs +2 -21
  229. package/dist/lib/cjs/modals/confirm.d.cts +2 -1
  230. package/dist/lib/cjs/modals/index.cjs +10 -56
  231. package/dist/lib/cjs/modals/index.d.cts +1 -1
  232. package/dist/lib/cjs/modals/minimizable-modal.cjs +2 -21
  233. package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
  234. package/dist/lib/cjs/modals/modal-command-builder.cjs +2 -21
  235. package/dist/lib/cjs/modals/modal-command-builder.d.cts +2 -1
  236. package/dist/lib/cjs/modals/modal.cjs +2 -21
  237. package/dist/lib/cjs/modals/modal.d.cts +1 -1
  238. package/dist/lib/cjs/modals/prompt.cjs +2 -21
  239. package/dist/lib/cjs/modals/prompt.d.cts +2 -1
  240. package/dist/lib/cjs/modals/select-item.cjs +2 -21
  241. package/dist/lib/cjs/modals/select-item.d.cts +1 -1
  242. package/dist/lib/cjs/modals/select-option.cjs +2 -21
  243. package/dist/lib/cjs/modals/select-option.d.cts +2 -1
  244. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -47
  245. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +1 -1
  246. package/dist/lib/cjs/note-priority.cjs +2 -21
  247. package/dist/lib/cjs/note-priority.d.cts +1 -1
  248. package/dist/lib/cjs/notebook-navigator.cjs +1 -47
  249. package/dist/lib/cjs/notebook-navigator.d.cts +1 -1
  250. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +2 -21
  251. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +1 -1
  252. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +2 -21
  253. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +1 -1
  254. package/dist/lib/cjs/obsidian-settings.cjs +2 -21
  255. package/dist/lib/cjs/obsidian-settings.d.cts +1 -1
  256. package/dist/lib/cjs/parse-link.cjs +3 -22
  257. package/dist/lib/cjs/parse-link.d.cts +1 -1
  258. package/dist/lib/cjs/path-settings.cjs +2 -21
  259. package/dist/lib/cjs/path-settings.d.cts +1 -1
  260. package/dist/lib/cjs/pdf.cjs +2 -21
  261. package/dist/lib/cjs/pdf.d.cts +2 -1
  262. package/dist/lib/cjs/plugin/index.cjs +10 -56
  263. package/dist/lib/cjs/plugin/index.d.cts +1 -1
  264. package/dist/lib/cjs/plugin/plugin-api-schema.cjs +5 -50
  265. package/dist/lib/cjs/plugin/plugin-api-schema.d.cts +19 -41
  266. package/dist/lib/cjs/plugin/plugin-api.cjs +2 -21
  267. package/dist/lib/cjs/plugin/plugin-api.d.cts +35 -50
  268. package/dist/lib/cjs/plugin/plugin-context.cjs +2 -21
  269. package/dist/lib/cjs/plugin/plugin-context.d.cts +2 -1
  270. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -47
  271. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +1 -1
  272. package/dist/lib/cjs/plugin/plugin-install-state.cjs +1 -47
  273. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +1 -1
  274. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -47
  275. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +1 -1
  276. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +2 -21
  277. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +2 -1
  278. package/dist/lib/cjs/plugin/plugin.cjs +2 -21
  279. package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
  280. package/dist/lib/cjs/plugin/settings-migration-api.cjs +5 -24
  281. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +3 -3
  282. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -21
  283. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +1 -1
  284. package/dist/lib/cjs/popovers/field-popover.cjs +2 -21
  285. package/dist/lib/cjs/popovers/field-popover.d.cts +1 -1
  286. package/dist/lib/cjs/popovers/index.cjs +4 -50
  287. package/dist/lib/cjs/popovers/index.d.cts +1 -1
  288. package/dist/lib/cjs/popovers/popover-anchor.cjs +2 -21
  289. package/dist/lib/cjs/popovers/popover-anchor.d.cts +2 -1
  290. package/dist/lib/cjs/popovers/popover.cjs +2 -21
  291. package/dist/lib/cjs/popovers/popover.d.cts +2 -1
  292. package/dist/lib/cjs/property-entry.cjs +1 -47
  293. package/dist/lib/cjs/property-entry.d.cts +1 -1
  294. package/dist/lib/cjs/queue.cjs +2 -21
  295. package/dist/lib/cjs/queue.d.cts +2 -1
  296. package/dist/lib/cjs/react/app-context.cjs +2 -21
  297. package/dist/lib/cjs/react/app-context.d.cts +1 -1
  298. package/dist/lib/cjs/react/index.cjs +2 -48
  299. package/dist/lib/cjs/react/index.d.cts +1 -1
  300. package/dist/lib/cjs/reference.cjs +2 -21
  301. package/dist/lib/cjs/reference.d.cts +1 -1
  302. package/dist/lib/cjs/resource-lock.cjs +2 -21
  303. package/dist/lib/cjs/resource-lock.d.cts +2 -1
  304. package/dist/lib/cjs/resource-url.cjs +2 -21
  305. package/dist/lib/cjs/resource-url.d.cts +1 -1
  306. package/dist/lib/cjs/ribbon-icon-registrar.cjs +2 -21
  307. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +2 -1
  308. package/dist/lib/cjs/setting-components/checkbox-component.cjs +2 -21
  309. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +2 -1
  310. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +2 -21
  311. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +2 -1
  312. package/dist/lib/cjs/setting-components/date-component.cjs +2 -21
  313. package/dist/lib/cjs/setting-components/date-component.d.cts +2 -1
  314. package/dist/lib/cjs/setting-components/date-time-component.cjs +2 -21
  315. package/dist/lib/cjs/setting-components/date-time-component.d.cts +2 -1
  316. package/dist/lib/cjs/setting-components/email-component.cjs +1 -47
  317. package/dist/lib/cjs/setting-components/email-component.d.cts +2 -1
  318. package/dist/lib/cjs/setting-components/file-component.cjs +1 -47
  319. package/dist/lib/cjs/setting-components/file-component.d.cts +2 -1
  320. package/dist/lib/cjs/setting-components/index.cjs +27 -73
  321. package/dist/lib/cjs/setting-components/index.d.cts +1 -1
  322. package/dist/lib/cjs/setting-components/month-component.cjs +2 -21
  323. package/dist/lib/cjs/setting-components/month-component.d.cts +2 -1
  324. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +2 -21
  325. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +3 -1
  326. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -47
  327. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +2 -1
  328. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +2 -21
  329. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +2 -1
  330. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +2 -21
  331. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +2 -1
  332. package/dist/lib/cjs/setting-components/number-component.cjs +1 -47
  333. package/dist/lib/cjs/setting-components/number-component.d.cts +2 -1
  334. package/dist/lib/cjs/setting-components/password-component.cjs +1 -47
  335. package/dist/lib/cjs/setting-components/password-component.d.cts +2 -1
  336. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +2 -21
  337. package/dist/lib/cjs/setting-components/setting-component-wrapper.d.cts +2 -1
  338. package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -47
  339. package/dist/lib/cjs/setting-components/telephone-component.d.cts +2 -1
  340. package/dist/lib/cjs/setting-components/text-based-component.cjs +2 -21
  341. package/dist/lib/cjs/setting-components/text-based-component.d.cts +1 -1
  342. package/dist/lib/cjs/setting-components/time-component.cjs +2 -21
  343. package/dist/lib/cjs/setting-components/time-component.d.cts +2 -1
  344. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +2 -21
  345. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +2 -1
  346. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +2 -21
  347. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +3 -1
  348. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +2 -21
  349. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +3 -1
  350. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -47
  351. package/dist/lib/cjs/setting-components/typed-range-text-component.d.cts +1 -1
  352. package/dist/lib/cjs/setting-components/typed-text-component.cjs +2 -21
  353. package/dist/lib/cjs/setting-components/typed-text-component.d.cts +2 -1
  354. package/dist/lib/cjs/setting-components/url-component.cjs +1 -47
  355. package/dist/lib/cjs/setting-components/url-component.d.cts +2 -1
  356. package/dist/lib/cjs/setting-components/validator-component.cjs +2 -21
  357. package/dist/lib/cjs/setting-components/validator-component.d.cts +1 -1
  358. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +1 -47
  359. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.d.cts +1 -1
  360. package/dist/lib/cjs/setting-components/week-component.cjs +2 -21
  361. package/dist/lib/cjs/setting-components/week-component.d.cts +2 -1
  362. package/dist/lib/cjs/setting-ex.cjs +2 -21
  363. package/dist/lib/cjs/setting-ex.d.cts +2 -1
  364. package/dist/lib/cjs/setting-group-ex.cjs +2 -21
  365. package/dist/lib/cjs/setting-group-ex.d.cts +2 -1
  366. package/dist/lib/cjs/status-bar-item-registrar.cjs +2 -21
  367. package/dist/lib/cjs/status-bar-item-registrar.d.cts +2 -1
  368. package/dist/lib/cjs/templater.cjs +1 -47
  369. package/dist/lib/cjs/templater.d.cts +1 -1
  370. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -21
  371. package/dist/lib/cjs/transformers/duration-transformer.d.cts +1 -1
  372. package/dist/lib/cjs/transformers/index.cjs +2 -48
  373. package/dist/lib/cjs/transformers/index.d.cts +1 -1
  374. package/dist/lib/cjs/trusted-input.cjs +2 -21
  375. package/dist/lib/cjs/trusted-input.d.cts +1 -1
  376. package/dist/lib/cjs/validation.cjs +2 -21
  377. package/dist/lib/cjs/validation.d.cts +1 -1
  378. package/dist/lib/cjs/vault-delete.cjs +2 -21
  379. package/dist/lib/cjs/vault-delete.d.cts +1 -1
  380. package/dist/lib/cjs/vault-transaction.cjs +3 -16
  381. package/dist/lib/cjs/vault-transaction.d.cts +1 -1
  382. package/dist/lib/cjs/vault.cjs +3 -16
  383. package/dist/lib/cjs/vault.d.cts +1 -1
  384. package/dist/lib/cjs/view-registrar.cjs +2 -21
  385. package/dist/lib/cjs/view-registrar.d.cts +1 -1
  386. package/dist/lib/cjs/workspace.cjs +2 -21
  387. package/dist/lib/cjs/workspace.d.cts +2 -1
  388. package/dist/lib/esm/@types/i18next.d.mts +1 -1
  389. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +3 -3
  390. package/dist/lib/esm/@types/original-fs.d.mts +2 -1
  391. package/dist/lib/esm/__merged.d.mts +3 -3
  392. package/dist/lib/esm/__merged.mjs +33 -16
  393. package/dist/lib/esm/active-file-provider.d.mts +1 -1
  394. package/dist/lib/esm/active-file-provider.mjs +1 -37
  395. package/dist/lib/esm/app.d.mts +1 -1
  396. package/dist/lib/esm/app.mjs +1 -37
  397. package/dist/lib/esm/async-with-notice.d.mts +2 -1
  398. package/dist/lib/esm/async-with-notice.mjs +2 -11
  399. package/dist/lib/esm/attachment-path.d.mts +1 -1
  400. package/dist/lib/esm/attachment-path.mjs +6 -15
  401. package/dist/lib/esm/attachment-unit-folder.d.mts +1 -1
  402. package/dist/lib/esm/attachment-unit-folder.mjs +2 -11
  403. package/dist/lib/esm/backlink-index.d.mts +1 -1
  404. package/dist/lib/esm/backlink-index.mjs +2 -11
  405. package/dist/lib/esm/backlink.d.mts +1 -1
  406. package/dist/lib/esm/backlink.mjs +2 -11
  407. package/dist/lib/esm/bases-view-registrar.d.mts +1 -1
  408. package/dist/lib/esm/bases-view-registrar.mjs +2 -11
  409. package/dist/lib/esm/callout.d.mts +2 -1
  410. package/dist/lib/esm/callout.mjs +2 -11
  411. package/dist/lib/esm/canvas.d.mts +1 -1
  412. package/dist/lib/esm/canvas.mjs +2 -11
  413. package/dist/lib/esm/case-insensitive-file-index.d.mts +1 -1
  414. package/dist/lib/esm/case-insensitive-file-index.mjs +2 -11
  415. package/dist/lib/esm/code-block-markdown-information.d.mts +1 -1
  416. package/dist/lib/esm/code-block-markdown-information.mjs +0 -36
  417. package/dist/lib/esm/code-block-reg-exp.d.mts +1 -1
  418. package/dist/lib/esm/code-block-reg-exp.mjs +1 -37
  419. package/dist/lib/esm/codemirror/index.d.mts +1 -1
  420. package/dist/lib/esm/codemirror/index.mjs +1 -37
  421. package/dist/lib/esm/codemirror/state-field-spec.d.mts +1 -1
  422. package/dist/lib/esm/codemirror/state-field-spec.mjs +0 -36
  423. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +1 -1
  424. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +2 -11
  425. package/dist/lib/esm/command-handlers/command-handler-component.d.mts +1 -1
  426. package/dist/lib/esm/command-handlers/command-handler-component.mjs +2 -11
  427. package/dist/lib/esm/command-handlers/command-handler.d.mts +1 -1
  428. package/dist/lib/esm/command-handlers/command-handler.mjs +2 -11
  429. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +1 -1
  430. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +2 -11
  431. package/dist/lib/esm/command-handlers/file-command-handler.d.mts +1 -1
  432. package/dist/lib/esm/command-handlers/file-command-handler.mjs +5 -14
  433. package/dist/lib/esm/command-handlers/folder-command-handler.d.mts +1 -1
  434. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +5 -14
  435. package/dist/lib/esm/command-handlers/global-command-handler.d.mts +1 -1
  436. package/dist/lib/esm/command-handlers/global-command-handler.mjs +3 -12
  437. package/dist/lib/esm/command-handlers/index.d.mts +1 -1
  438. package/dist/lib/esm/command-handlers/index.mjs +1 -37
  439. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.d.mts +1 -1
  440. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +2 -11
  441. package/dist/lib/esm/command-handlers/open-settings-command-handler.d.mts +1 -1
  442. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +1 -37
  443. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.d.mts +1 -1
  444. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +1 -37
  445. package/dist/lib/esm/command-registrar.d.mts +1 -1
  446. package/dist/lib/esm/command-registrar.mjs +1 -37
  447. package/dist/lib/esm/community-plugins.d.mts +1 -1
  448. package/dist/lib/esm/community-plugins.mjs +2 -11
  449. package/dist/lib/esm/components/abort-signal-component.d.mts +2 -1
  450. package/dist/lib/esm/components/abort-signal-component.mjs +2 -11
  451. package/dist/lib/esm/components/all-windows-event-component.d.mts +2 -1
  452. package/dist/lib/esm/components/all-windows-event-component.mjs +1 -37
  453. package/dist/lib/esm/components/async-error-handler-component.d.mts +1 -1
  454. package/dist/lib/esm/components/async-error-handler-component.mjs +2 -11
  455. package/dist/lib/esm/components/async-events-component.d.mts +1 -1
  456. package/dist/lib/esm/components/async-events-component.mjs +2 -11
  457. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
  458. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -37
  459. package/dist/lib/esm/components/component-ex.d.mts +1 -1
  460. package/dist/lib/esm/components/component-ex.mjs +3 -6
  461. package/dist/lib/esm/components/console-debug-component.d.mts +1 -1
  462. package/dist/lib/esm/components/console-debug-component.mjs +2 -11
  463. package/dist/lib/esm/components/core-plugin-toggle-component.d.mts +1 -1
  464. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +2 -11
  465. package/dist/lib/esm/components/disposable-component.d.mts +1 -1
  466. package/dist/lib/esm/components/disposable-component.mjs +3 -6
  467. package/dist/lib/esm/components/embed-extensions-component.d.mts +1 -1
  468. package/dist/lib/esm/components/embed-extensions-component.mjs +1 -37
  469. package/dist/lib/esm/components/generate-markdown-link-default-params-component.d.mts +1 -1
  470. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +1 -37
  471. package/dist/lib/esm/components/index.d.mts +1 -1
  472. package/dist/lib/esm/components/index.mjs +1 -37
  473. package/dist/lib/esm/components/layout-ready-component.d.mts +1 -1
  474. package/dist/lib/esm/components/layout-ready-component.mjs +2 -11
  475. package/dist/lib/esm/components/menu-event-registrar-component.d.mts +1 -1
  476. package/dist/lib/esm/components/menu-event-registrar-component.mjs +1 -37
  477. package/dist/lib/esm/components/monkey-around-component.d.mts +1 -1
  478. package/dist/lib/esm/components/monkey-around-component.mjs +2 -11
  479. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.d.mts +1 -1
  480. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +2 -11
  481. package/dist/lib/esm/components/plugin-context-component.d.mts +1 -1
  482. package/dist/lib/esm/components/plugin-context-component.mjs +2 -11
  483. package/dist/lib/esm/components/plugin-gate-component.d.mts +2 -1
  484. package/dist/lib/esm/components/plugin-gate-component.mjs +2 -11
  485. package/dist/lib/esm/components/plugin-notice-component.d.mts +2 -1
  486. package/dist/lib/esm/components/plugin-notice-component.mjs +3 -6
  487. package/dist/lib/esm/components/plugin-settings-component.d.mts +1 -1
  488. package/dist/lib/esm/components/plugin-settings-component.mjs +2 -11
  489. package/dist/lib/esm/components/plugin-settings-tab-component.d.mts +1 -1
  490. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +2 -11
  491. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +2 -1
  492. package/dist/lib/esm/components/plugin-suggestion-component.mjs +2 -11
  493. package/dist/lib/esm/components/pointer-position-component.d.mts +1 -1
  494. package/dist/lib/esm/components/pointer-position-component.mjs +1 -37
  495. package/dist/lib/esm/components/registry-component.d.mts +1 -1
  496. package/dist/lib/esm/components/registry-component.mjs +2 -11
  497. package/dist/lib/esm/components/release-notes-component.d.mts +2 -1
  498. package/dist/lib/esm/components/release-notes-component.mjs +2 -11
  499. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +1 -1
  500. package/dist/lib/esm/components/rename-delete-handler-component.mjs +3 -6
  501. package/dist/lib/esm/components/rmdir-guard-component.d.mts +1 -1
  502. package/dist/lib/esm/components/rmdir-guard-component.mjs +1 -37
  503. package/dist/lib/esm/components/settings-migration-component.d.mts +3 -3
  504. package/dist/lib/esm/components/settings-migration-component.mjs +2 -11
  505. package/dist/lib/esm/components/syntax-highlighting-component.d.mts +1 -1
  506. package/dist/lib/esm/components/syntax-highlighting-component.mjs +2 -11
  507. package/dist/lib/esm/components/templates-language-component.d.mts +1 -1
  508. package/dist/lib/esm/components/templates-language-component.mjs +3 -39
  509. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.d.mts +1 -1
  510. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +3 -6
  511. package/dist/lib/esm/constructors/index.d.mts +1 -1
  512. package/dist/lib/esm/constructors/index.mjs +1 -37
  513. package/dist/lib/esm/css-class.d.mts +1 -1
  514. package/dist/lib/esm/css-class.mjs +1 -37
  515. package/dist/lib/esm/data-handler.d.mts +1 -1
  516. package/dist/lib/esm/data-handler.mjs +1 -37
  517. package/dist/lib/esm/dataview-link.d.mts +1 -1
  518. package/dist/lib/esm/dataview-link.mjs +2 -11
  519. package/dist/lib/esm/dataview.d.mts +2 -1
  520. package/dist/lib/esm/dataview.mjs +2 -11
  521. package/dist/lib/esm/debug.d.mts +1 -1
  522. package/dist/lib/esm/debug.mjs +2 -11
  523. package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
  524. package/dist/lib/esm/demo-vault-helper-settings.mjs +0 -36
  525. package/dist/lib/esm/demo-vault-helper.d.mts +1 -1
  526. package/dist/lib/esm/demo-vault-helper.mjs +2 -11
  527. package/dist/lib/esm/demo-vault-naming.d.mts +1 -1
  528. package/dist/lib/esm/demo-vault-naming.mjs +1 -37
  529. package/dist/lib/esm/desktop-demo-vault-opener.d.mts +1 -1
  530. package/dist/lib/esm/desktop-demo-vault-opener.mjs +3 -6
  531. package/dist/lib/esm/desktop-trusted-input.d.mts +2 -1
  532. package/dist/lib/esm/desktop-trusted-input.mjs +2 -11
  533. package/dist/lib/esm/editor-extension-registrar.d.mts +1 -1
  534. package/dist/lib/esm/editor-extension-registrar.mjs +2 -11
  535. package/dist/lib/esm/editor-suggest-registrar.d.mts +1 -1
  536. package/dist/lib/esm/editor-suggest-registrar.mjs +2 -11
  537. package/dist/lib/esm/editor.d.mts +1 -1
  538. package/dist/lib/esm/editor.mjs +2 -11
  539. package/dist/lib/esm/events.d.mts +1 -1
  540. package/dist/lib/esm/events.mjs +2 -11
  541. package/dist/lib/esm/extensions-registrar.d.mts +1 -1
  542. package/dist/lib/esm/extensions-registrar.mjs +2 -11
  543. package/dist/lib/esm/file-change.d.mts +2 -1
  544. package/dist/lib/esm/file-change.mjs +2 -11
  545. package/dist/lib/esm/file-explorer.d.mts +1 -1
  546. package/dist/lib/esm/file-explorer.mjs +2 -11
  547. package/dist/lib/esm/file-manager.d.mts +2 -1
  548. package/dist/lib/esm/file-manager.mjs +2 -11
  549. package/dist/lib/esm/file-system.d.mts +1 -1
  550. package/dist/lib/esm/file-system.mjs +2 -11
  551. package/dist/lib/esm/folder-note.d.mts +1 -1
  552. package/dist/lib/esm/folder-note.mjs +2 -11
  553. package/dist/lib/esm/frontmatter-formatting.d.mts +1 -1
  554. package/dist/lib/esm/frontmatter-formatting.mjs +2 -11
  555. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +1 -1
  556. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +2 -11
  557. package/dist/lib/esm/frontmatter.d.mts +1 -1
  558. package/dist/lib/esm/frontmatter.mjs +2 -11
  559. package/dist/lib/esm/generated-during-build.d.mts +1 -1
  560. package/dist/lib/esm/generated-during-build.mjs +2 -38
  561. package/dist/lib/esm/hover-link-source-registrar.d.mts +1 -1
  562. package/dist/lib/esm/hover-link-source-registrar.mjs +2 -11
  563. package/dist/lib/esm/html-element.d.mts +2 -1
  564. package/dist/lib/esm/html-element.mjs +1 -37
  565. package/dist/lib/esm/i18n/custom-type-options.d.mts +1 -1
  566. package/dist/lib/esm/i18n/custom-type-options.mjs +1 -37
  567. package/dist/lib/esm/i18n/default-translations.d.mts +1 -1
  568. package/dist/lib/esm/i18n/default-translations.mjs +1 -37
  569. package/dist/lib/esm/i18n/i18n.d.mts +1 -1
  570. package/dist/lib/esm/i18n/i18n.mjs +2 -11
  571. package/dist/lib/esm/i18n/index.d.mts +1 -1
  572. package/dist/lib/esm/i18n/index.mjs +1 -37
  573. package/dist/lib/esm/i18n/locales/en.d.mts +1 -1
  574. package/dist/lib/esm/i18n/locales/en.mjs +1 -37
  575. package/dist/lib/esm/i18n/locales/index.d.mts +1 -1
  576. package/dist/lib/esm/i18n/locales/index.mjs +1 -37
  577. package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -1
  578. package/dist/lib/esm/i18n/locales/translations-map.mjs +1 -37
  579. package/dist/lib/esm/index.d.mts +1 -1
  580. package/dist/lib/esm/index.mjs +1 -37
  581. package/dist/lib/esm/is-in-obsidian.d.mts +1 -1
  582. package/dist/lib/esm/is-in-obsidian.mjs +1 -37
  583. package/dist/lib/esm/library-references.d.mts +2 -0
  584. package/dist/lib/esm/library-styles.d.mts +2 -1
  585. package/dist/lib/esm/library-styles.mjs +2 -11
  586. package/dist/lib/esm/library.mjs +1 -37
  587. package/dist/lib/esm/link-name.d.mts +1 -1
  588. package/dist/lib/esm/link-name.mjs +1 -37
  589. package/dist/lib/esm/link-update-progress.d.mts +1 -1
  590. package/dist/lib/esm/link-update-progress.mjs +0 -36
  591. package/dist/lib/esm/link.d.mts +2 -1
  592. package/dist/lib/esm/link.mjs +3 -6
  593. package/dist/lib/esm/logger.d.mts +2 -1
  594. package/dist/lib/esm/logger.mjs +2 -11
  595. package/dist/lib/esm/loop.d.mts +2 -1
  596. package/dist/lib/esm/loop.mjs +3 -6
  597. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +2 -1
  598. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +2 -11
  599. package/dist/lib/esm/markdown-code-block-processor.d.mts +2 -1
  600. package/dist/lib/esm/markdown-code-block-processor.mjs +2 -11
  601. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +2 -1
  602. package/dist/lib/esm/markdown-post-processor-registrar.mjs +2 -11
  603. package/dist/lib/esm/markdown-view.d.mts +1 -1
  604. package/dist/lib/esm/markdown-view.mjs +1 -37
  605. package/dist/lib/esm/markdown.d.mts +2 -1
  606. package/dist/lib/esm/markdown.mjs +3 -6
  607. package/dist/lib/esm/menu-event-registrar.d.mts +1 -1
  608. package/dist/lib/esm/menu-event-registrar.mjs +0 -36
  609. package/dist/lib/esm/metadata-cache.d.mts +1 -1
  610. package/dist/lib/esm/metadata-cache.mjs +7 -10
  611. package/dist/lib/esm/mobile-trusted-input.d.mts +1 -1
  612. package/dist/lib/esm/mobile-trusted-input.mjs +1 -37
  613. package/dist/lib/esm/modals/alert.d.mts +2 -1
  614. package/dist/lib/esm/modals/alert.mjs +2 -11
  615. package/dist/lib/esm/modals/confirm.d.mts +2 -1
  616. package/dist/lib/esm/modals/confirm.mjs +2 -11
  617. package/dist/lib/esm/modals/index.d.mts +1 -1
  618. package/dist/lib/esm/modals/index.mjs +1 -37
  619. package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
  620. package/dist/lib/esm/modals/minimizable-modal.mjs +2 -11
  621. package/dist/lib/esm/modals/modal-command-builder.d.mts +2 -1
  622. package/dist/lib/esm/modals/modal-command-builder.mjs +2 -11
  623. package/dist/lib/esm/modals/modal.d.mts +1 -1
  624. package/dist/lib/esm/modals/modal.mjs +2 -11
  625. package/dist/lib/esm/modals/prompt.d.mts +2 -1
  626. package/dist/lib/esm/modals/prompt.mjs +2 -11
  627. package/dist/lib/esm/modals/select-item.d.mts +1 -1
  628. package/dist/lib/esm/modals/select-item.mjs +2 -11
  629. package/dist/lib/esm/modals/select-option.d.mts +2 -1
  630. package/dist/lib/esm/modals/select-option.mjs +2 -11
  631. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +1 -1
  632. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -37
  633. package/dist/lib/esm/note-priority.d.mts +1 -1
  634. package/dist/lib/esm/note-priority.mjs +2 -11
  635. package/dist/lib/esm/notebook-navigator.d.mts +1 -1
  636. package/dist/lib/esm/notebook-navigator.mjs +1 -37
  637. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +1 -1
  638. package/dist/lib/esm/obsidian-dev-utils-state.mjs +2 -11
  639. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +1 -1
  640. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +2 -11
  641. package/dist/lib/esm/obsidian-settings.d.mts +1 -1
  642. package/dist/lib/esm/obsidian-settings.mjs +2 -11
  643. package/dist/lib/esm/parse-link.d.mts +1 -1
  644. package/dist/lib/esm/parse-link.mjs +2 -11
  645. package/dist/lib/esm/path-settings.d.mts +1 -1
  646. package/dist/lib/esm/path-settings.mjs +2 -11
  647. package/dist/lib/esm/pdf.d.mts +2 -1
  648. package/dist/lib/esm/pdf.mjs +2 -11
  649. package/dist/lib/esm/plugin/index.d.mts +1 -1
  650. package/dist/lib/esm/plugin/index.mjs +1 -37
  651. package/dist/lib/esm/plugin/plugin-api-schema.d.mts +19 -41
  652. package/dist/lib/esm/plugin/plugin-api-schema.mjs +6 -38
  653. package/dist/lib/esm/plugin/plugin-api.d.mts +35 -50
  654. package/dist/lib/esm/plugin/plugin-api.mjs +2 -11
  655. package/dist/lib/esm/plugin/plugin-context.d.mts +2 -1
  656. package/dist/lib/esm/plugin/plugin-context.mjs +2 -11
  657. package/dist/lib/esm/plugin/plugin-event-source.d.mts +1 -1
  658. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -37
  659. package/dist/lib/esm/plugin/plugin-install-state.d.mts +1 -1
  660. package/dist/lib/esm/plugin/plugin-install-state.mjs +1 -37
  661. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +1 -1
  662. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -37
  663. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +2 -1
  664. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +2 -11
  665. package/dist/lib/esm/plugin/plugin.d.mts +1 -1
  666. package/dist/lib/esm/plugin/plugin.mjs +2 -11
  667. package/dist/lib/esm/plugin/settings-migration-api.d.mts +3 -3
  668. package/dist/lib/esm/plugin/settings-migration-api.mjs +3 -12
  669. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +1 -1
  670. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +2 -11
  671. package/dist/lib/esm/popovers/field-popover.d.mts +1 -1
  672. package/dist/lib/esm/popovers/field-popover.mjs +2 -11
  673. package/dist/lib/esm/popovers/index.d.mts +1 -1
  674. package/dist/lib/esm/popovers/index.mjs +1 -37
  675. package/dist/lib/esm/popovers/popover-anchor.d.mts +2 -1
  676. package/dist/lib/esm/popovers/popover-anchor.mjs +2 -11
  677. package/dist/lib/esm/popovers/popover.d.mts +2 -1
  678. package/dist/lib/esm/popovers/popover.mjs +2 -11
  679. package/dist/lib/esm/property-entry.d.mts +1 -1
  680. package/dist/lib/esm/property-entry.mjs +1 -37
  681. package/dist/lib/esm/queue.d.mts +2 -1
  682. package/dist/lib/esm/queue.mjs +2 -11
  683. package/dist/lib/esm/react/app-context.d.mts +1 -1
  684. package/dist/lib/esm/react/app-context.mjs +2 -11
  685. package/dist/lib/esm/react/index.d.mts +1 -1
  686. package/dist/lib/esm/react/index.mjs +1 -37
  687. package/dist/lib/esm/reference.d.mts +1 -1
  688. package/dist/lib/esm/reference.mjs +2 -11
  689. package/dist/lib/esm/resource-lock.d.mts +2 -1
  690. package/dist/lib/esm/resource-lock.mjs +2 -11
  691. package/dist/lib/esm/resource-url.d.mts +1 -1
  692. package/dist/lib/esm/resource-url.mjs +2 -11
  693. package/dist/lib/esm/ribbon-icon-registrar.d.mts +2 -1
  694. package/dist/lib/esm/ribbon-icon-registrar.mjs +2 -11
  695. package/dist/lib/esm/setting-components/checkbox-component.d.mts +2 -1
  696. package/dist/lib/esm/setting-components/checkbox-component.mjs +2 -11
  697. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +2 -1
  698. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +2 -11
  699. package/dist/lib/esm/setting-components/date-component.d.mts +2 -1
  700. package/dist/lib/esm/setting-components/date-component.mjs +2 -11
  701. package/dist/lib/esm/setting-components/date-time-component.d.mts +2 -1
  702. package/dist/lib/esm/setting-components/date-time-component.mjs +2 -11
  703. package/dist/lib/esm/setting-components/email-component.d.mts +2 -1
  704. package/dist/lib/esm/setting-components/email-component.mjs +1 -37
  705. package/dist/lib/esm/setting-components/file-component.d.mts +2 -1
  706. package/dist/lib/esm/setting-components/file-component.mjs +1 -37
  707. package/dist/lib/esm/setting-components/index.d.mts +1 -1
  708. package/dist/lib/esm/setting-components/index.mjs +1 -37
  709. package/dist/lib/esm/setting-components/month-component.d.mts +2 -1
  710. package/dist/lib/esm/setting-components/month-component.mjs +2 -11
  711. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +3 -1
  712. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +2 -11
  713. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +2 -1
  714. package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -37
  715. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +2 -1
  716. package/dist/lib/esm/setting-components/multiple-file-component.mjs +2 -11
  717. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +2 -1
  718. package/dist/lib/esm/setting-components/multiple-text-component.mjs +2 -11
  719. package/dist/lib/esm/setting-components/number-component.d.mts +2 -1
  720. package/dist/lib/esm/setting-components/number-component.mjs +1 -37
  721. package/dist/lib/esm/setting-components/password-component.d.mts +2 -1
  722. package/dist/lib/esm/setting-components/password-component.mjs +1 -37
  723. package/dist/lib/esm/setting-components/setting-component-wrapper.d.mts +2 -1
  724. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +2 -11
  725. package/dist/lib/esm/setting-components/telephone-component.d.mts +2 -1
  726. package/dist/lib/esm/setting-components/telephone-component.mjs +1 -37
  727. package/dist/lib/esm/setting-components/text-based-component.d.mts +1 -1
  728. package/dist/lib/esm/setting-components/text-based-component.mjs +2 -11
  729. package/dist/lib/esm/setting-components/time-component.d.mts +2 -1
  730. package/dist/lib/esm/setting-components/time-component.mjs +2 -11
  731. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +2 -1
  732. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +2 -11
  733. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +3 -1
  734. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +2 -11
  735. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +3 -1
  736. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +2 -11
  737. package/dist/lib/esm/setting-components/typed-range-text-component.d.mts +1 -1
  738. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +1 -37
  739. package/dist/lib/esm/setting-components/typed-text-component.d.mts +2 -1
  740. package/dist/lib/esm/setting-components/typed-text-component.mjs +2 -11
  741. package/dist/lib/esm/setting-components/url-component.d.mts +2 -1
  742. package/dist/lib/esm/setting-components/url-component.mjs +1 -37
  743. package/dist/lib/esm/setting-components/validator-component.d.mts +1 -1
  744. package/dist/lib/esm/setting-components/validator-component.mjs +2 -11
  745. package/dist/lib/esm/setting-components/value-component-with-change-tracking.d.mts +1 -1
  746. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +0 -36
  747. package/dist/lib/esm/setting-components/week-component.d.mts +2 -1
  748. package/dist/lib/esm/setting-components/week-component.mjs +2 -11
  749. package/dist/lib/esm/setting-ex.d.mts +2 -1
  750. package/dist/lib/esm/setting-ex.mjs +2 -11
  751. package/dist/lib/esm/setting-group-ex.d.mts +2 -1
  752. package/dist/lib/esm/setting-group-ex.mjs +2 -11
  753. package/dist/lib/esm/status-bar-item-registrar.d.mts +2 -1
  754. package/dist/lib/esm/status-bar-item-registrar.mjs +2 -11
  755. package/dist/lib/esm/templater.d.mts +1 -1
  756. package/dist/lib/esm/templater.mjs +1 -37
  757. package/dist/lib/esm/transformers/duration-transformer.d.mts +1 -1
  758. package/dist/lib/esm/transformers/duration-transformer.mjs +2 -11
  759. package/dist/lib/esm/transformers/index.d.mts +1 -1
  760. package/dist/lib/esm/transformers/index.mjs +1 -37
  761. package/dist/lib/esm/trusted-input.d.mts +1 -1
  762. package/dist/lib/esm/trusted-input.mjs +2 -11
  763. package/dist/lib/esm/validation.d.mts +1 -1
  764. package/dist/lib/esm/validation.mjs +2 -11
  765. package/dist/lib/esm/vault-delete.d.mts +1 -1
  766. package/dist/lib/esm/vault-delete.mjs +2 -11
  767. package/dist/lib/esm/vault-transaction.d.mts +1 -1
  768. package/dist/lib/esm/vault-transaction.mjs +3 -6
  769. package/dist/lib/esm/vault.d.mts +1 -1
  770. package/dist/lib/esm/vault.mjs +3 -6
  771. package/dist/lib/esm/view-registrar.d.mts +1 -1
  772. package/dist/lib/esm/view-registrar.mjs +2 -11
  773. package/dist/lib/esm/workspace.d.mts +2 -1
  774. package/dist/lib/esm/workspace.mjs +2 -11
  775. package/package.json +16 -5
@@ -2,7 +2,6 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
6
  function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
7
  symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
@@ -33,10 +32,8 @@ function ensureBrowserProcess() {
33
32
  existingProcessRecord["browser"] = true;
34
33
  }
35
34
 
36
- (function initEsm() {
37
- ensureDisposeSymbols();
38
- ensureBrowserProcess();
39
- })();
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
40
37
  })();
41
38
 
42
39
  var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
@@ -1227,4 +1224,4 @@ export {
1227
1224
  EmptyFolderBehavior2 as EmptyFolderBehavior,
1228
1225
  RenameDeleteHandlerComponent
1229
1226
  };
1230
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyB9IGZyb20gJy4uL2ZpbGUtbWFuYWdlci50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzRm9sZGVyLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4uL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGJ1aWxkQmFja2xpbmtzU25hcHNob3QsXG4gIGVkaXRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgaGFzQmFja2xpbmtDYWNoZVBsdWdpbixcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgXHUyMDE0IG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIFx1MjAxNCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIFx1MjAxNCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgbmV3UGF0aDogc3RyaW5nO1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0TGlua3MoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoIH0pO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUgfHwgdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmIChcbiAgICAgICFhdHRhY2htZW50Rm9sZGVyIHx8ICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgXHUyMDE0IHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyBcdTIwMTQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQgXHUyMDE0IGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IFx1MjAxNCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSA/IHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSkgOiBmYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShcbiAgICAgIGBQcm90ZWN0aW5nICR7c3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aC50b1N0cmluZygpfSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnQocykgZnJvbSB0aGUgZGVsZXRpb24gb2YgJHtmb2xkZXIucGF0aH06ICR7dG9Kc29uKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyl9YFxuICAgICk7XG5cbiAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuYWRkKGZvbGRlci5wYXRoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZGVsZXRlQWJzdHJhY3RGaWxlLFxuICAgICAgICBkZWxldGVkTm90ZVBhdGhzOiBbLi4uZGVsZXRlZE5vdGVQYXRoc10sXG4gICAgICAgIHBhdGhPckZpbGU6IGZvbGRlcixcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSB1c2VyIG5hbWVkIFRISVMgZm9sZGVyLCBzbyBpdCBnb2VzIGV2ZW4gdW5kZXIgYEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcGAgXHUyMDE0IHRoYXQgc2V0dGluZ1xuICAgICAgICAgKiBnb3Zlcm5zIGZvbGRlcnMgZW1wdGllZCBpbmNpZGVudGFsbHksIG5vdCB0aGUgb25lIGV4cGxpY2l0bHkgZGVsZXRlZC4gYGRlbGV0ZUlmTm90VXNlZGAgc3RpbGxcbiAgICAgICAgICogcmVmdXNlcyB0byByZW1vdmUgYW55IGZvbGRlciB3aG9zZSBjaGlsZCBoYWQgdG8gYmUga2VwdCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gd2FudGVkIGhlcmUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHRydWUsXG4gICAgICAgIC8qXG4gICAgICAgICAqIEEgbm90ZSB0aGF0IG90aGVycyBsaW5rIHRvIGlzIGRlbGV0ZWQgYXMgbm9ybWFsOyBPYnNpZGlhbiBsZWF2ZXMgdGhlIGRhbmdsaW5nIGxpbmsuIFByb3RlY3RpbmdcbiAgICAgICAgICogbm90ZXMgdG9vIHdvdWxkIG1ha2UgZGVsZXRpbmcgYSBmb2xkZXIgb2YgbGlua2VkLXRvIG5vdGVzIGltcG9zc2libGUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGRQcm90ZWN0SWZTdGlsbFVzZWQ6IChjYW5kaWRhdGVGaWxlKSA9PiAhKHNldHRpbmdzLmlzTm90ZT8uKGNhbmRpZGF0ZUZpbGUucGF0aCkgPz8gZmFsc2UpXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmRlbGV0ZShmb2xkZXIucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZGVsZXRpb24gaXMgYSBmb2xkZXIgZGVsZXRpb24gdGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nLlxuICAgKlxuICAgKiBFdmVyeSBjaGVjayBoZXJlIGlzIHN5bmNocm9ub3VzIGFuZCBjaGVhcCwgc28gYSBmaWxlIGRlbGV0aW9uIFx1MjAxNCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IFx1MjAxNCBjb3N0cyBvbmVcbiAgICoge0BsaW5rIGlzRm9sZGVyfSBjYWxsIGFuZCByZWFjaGVzIHRoZSBvcmlnaW5hbCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgYmVpbmcgZGVsZXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRlbGV0aW9uIHNob3VsZCBiZSBzY2FubmVkIGJlZm9yZSBpdCBydW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRDb25zaWRlckZvbGRlcihmaWxlOiBUQWJzdHJhY3RGaWxlKTogZmlsZSBpcyBURm9sZGVyIHtcbiAgICBpZiAoIWlzRm9sZGVyKGZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8IChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4oZmlsZS5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlYC1iYWNrZWQsIHNvIHRoZSBhcmJpdHJhdGlvbiBzcGFucyBpbmRlcGVuZGVudGx5IGJ1bmRsZWQgY29waWVzIG9mIHRoaXNcbiAgICAgICAqIGxpYnJhcnk6IHRoZSBmaXJzdCBwYXRjaGVyIHN0YXlzIGxpdmUsIGEgY29weSB0aGF0IHBhdGNoZXMgYWZ0ZXJ3YXJkcyBzZWVzIHRoZSB0b2tlbiBvbiBpdHMgb3duXG4gICAgICAgKiBgb3JpZ2luYWxNZXRob2RgIGFuZCBkZWZlcnMgdmlhIHRoZSBndWFyZCBhYm92ZSwgYW5kIGl0IHRha2VzIG92ZXIgb24gaXRzIG5leHQgY2FsbCBvbmNlIHRoZVxuICAgICAgICogbGVhZGVyIHVubG9hZHMgYW5kIHRoZSB0b2tlbiBpcyBkcm9wcGVkLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgYXJiaXRyYXRlcyB0aGUgUEFUQ0ggb25seS4gVGhlIGNvbXBvbmVudCdzIGB2YXVsdC5vbigncmVuYW1lJyB8ICdkZWxldGUnKWAgYW5kXG4gICAgICAgKiBgbWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcpYCBsaXN0ZW5lcnMgaGF2ZSBubyBlcXVpdmFsZW50IGd1YXJkIFx1MjAxNCB0aGUgcGx1Z2luLXJlZ2lzdHJ5IGVsZWN0aW9uXG4gICAgICAgKiB0aGF0IHVzZWQgdG8gcHJvdmlkZSBvbmUgd2VudCB3aXRoIHRoZSBtdWx0aS1wbHVnaW4gbWFjaGluZXJ5IFx1MjAxNCBzbyB0d28gbGl2ZSBjb3BpZXMgd291bGQgYm90aFxuICAgICAgICogaGFuZGxlIGFuIGV2ZW50LiBXaXRoIG9uZSBvd25lciB0aGF0IGNhbm5vdCBhcmlzZTsgYSBjb25zdW1lciB0aGF0IG11c3QgZ3VhcmFudGVlIGl0IHJlZnVzZXMgdG9cbiAgICAgICAqIGxvYWQgYmVzaWRlIGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBUaGF0IHJlZnVzYWwgdXNlZCB0byBiZSBkZXNjcmliZWQgaGVyZSBhcyBcImEgcGx1Z2luJ3Mgam9iIHJhdGhlciB0aGFuIGEgbGlicmFyeSdzXCIsIHdoaWNoIGlzIG5vXG4gICAgICAgKiBsb25nZXIgdHJ1ZSBcdTIwMTQgYFBsdWdpbkJhc2UuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzYCBpcyB3aGVyZSBhIGNvbnN1bWVyIGRlY2xhcmVzIGl0LCBhbmQgdGhlXG4gICAgICAgKiBgYXBpVmVyc2lvblJhbmdlYCBpdCBuYW1lcyBpcyBleGFjdGx5IHRoZSBjb25mbGljdGluZy12ZXJzaW9uIGd1YXJkLiBUaGUgbGlicmFyeSBvd25zIHRoZVxuICAgICAgICogbWVjaGFuaXNtOyB0aGUgcGx1Z2luIHN0aWxsIG93bnMgdGhlIGRlY2lzaW9uIHRvIHVzZSBpdC5cbiAgICAgICAqL1xuICAgICAgcGF0Y2hUb2tlbjogUEFUQ0hfVE9LRU5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGxldCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgLypcbiAgICAgICAqIEEgcmVuYW1lIHBlcmZvcm1lZCBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gYEFkdmFuY2VkIE5vdGUgQ29tcG9zZXJgJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiByZXNvbHZlZCBmaWxlICR7bGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykgIT09IG51bGwgJiYgIWhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4odGhpcy5hcHApXG4gICAgICAgICAgJiYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTiB8fCBsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBIYW5kbGVkUmVuYW1lcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZWRSZW5hbWVLZXk+KCk7XG5cbiAgcHVibGljIGFkZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldCh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpLCB7IG5ld1BhdGgsIG9sZFBhdGggfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXModGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEhhbmRsZWRSZW5hbWVLZXk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvU3RyaW5nKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG4gIH1cbn1cblxuY2xhc3MgTWV0YWRhdGFEZWxldGVkSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMucHJldmlvdXNDYWNoZSA9IHBhcmFtcy5wcmV2aW91c0NhY2hlO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZpb3VzQ2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZpb3VzQ2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvKlxuICAgICAqIFRoZSByZW5hbWUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBoYW5kbGVyIGlzIHZlcnkgbGlrZWx5IHN0aWxsIGluc2lkZSBPYnNpZGlhbidzIG93blxuICAgICAqIGBGaWxlTWFuYWdlci5ydW5Bc3luY0xpbmtVcGRhdGVgIGN5Y2xlLCB3aGljaCBpcyBhYm91dCB0byBkZWNpZGUgXHUyMDE0IHN5bmNocm9ub3VzbHkgXHUyMDE0IHdoaWNoIGxpbmtzIHRvXG4gICAgICogcmV3cml0ZSwgYnkgcmUtcmVzb2x2aW5nIGVhY2ggb25lLiBFdmVyeXRoaW5nIGJlbG93IHRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIHBoYW50b20gZmlsZSBhdCB0aGVcbiAgICAgKiBvbGQgcGF0aCAoYHJlZ2lzdGVyRmlsZXNgLCBkaXJlY3RseSBoZXJlIGFuZCBpbnNpZGUgYFJlbmFtZU1hcGApIGFuZCBob2xkcyBpdCBhY3Jvc3MgYW4gYGF3YWl0YDtcbiAgICAgKiBzZWVuIG1pZC1kZWNpc2lvbiwgdGhhdCBwaGFudG9tIG1ha2VzIHRoZSBvbGQgcGF0aCBzdGlsbCByZXNvbHZlLCBzbyBPYnNpZGlhbiBjb25jbHVkZXMgbm90aGluZ1xuICAgICAqIGNoYW5nZWQgYW5kIHJld3JpdGVzIG5vdGhpbmcuIFN0YW5kaW5nIGludmFyaWFudDogbmV2ZXIgdG91Y2ggdGhlIHZhdWx0IGluZGV4IHdoaWxlIE9ic2lkaWFuIGlzXG4gICAgICogbWlkLWRlY2lzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy80Ny5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHRoaXMuYXBwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLy8gVGhlIHJlZnJlc2hlZCBiYWNrbGlua3MgZmVlZCBgb2xkUGF0aEJhY2tsaW5rc01hcGAsIHdoaWNoIG9ubHkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdyByZWFkLCBhbmQgdGhvc2UgYXJlIGdhdGVkIG9uIHRoZSBzYW1lIGZsYWcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCkuc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICAgICAgLy8gQmFja2xpbmtzIGFyZSBvbmx5IGNvbnN1bWVkIGJ5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3csIHdoaWNoIGFyZSBnYXRlZCBvblxuICAgICAgLy8gYHNob3VsZEhhbmRsZVJlbmFtZXNgLiBTa2lwIGdhdGhlcmluZyB0aGVtIChhIGJhY2tsaW5rIGZldGNoIHBlciBhdHRhY2htZW50KSBvbiBhIG1vdmUtb25seSByZW5hbWUuXG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudE9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRPbGRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MuZGF0YTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IG1vdmUgYWJvdmUgcnVucyByZWdhcmRsZXNzIG9mIGBzaG91bGRIYW5kbGVSZW5hbWVzYCAodGhhdCBpcyB0aGUgcG9pbnQgb2YgZGVjb3VwbGluZ1xuICAgICAgICogXCJNb3ZlIGF0dGFjaG1lbnRzIHdpdGggbm90ZVwiIGZyb20gXCJVcGRhdGUgbGlua3NcIikuIFRoZSByZW1haW5pbmcgc3RlcHMgb25seSByZXdyaXRlIGxpbmtzLCBzbyBza2lwXG4gICAgICAgKiB0aGVtIHdoZW4gbGluayB1cGRhdGVzIGFyZSBkaXNhYmxlZDsgdGhlIGBmaW5hbGx5YCBibG9jayBiZWxvdyBzdGlsbCBydW5zLlxuICAgICAgICovXG4gICAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogQSByZXN1bWVkIHJlbmFtZSBicmluZ3MgaXRzIG93biBzbmFwc2hvdCBhbG9uZy4gTWVyZ2UgaXQgSU5UTyB0aGUgY3VycmVudCBvbmUgcmF0aGVyIHRoYW5cbiAgICAgICAqIGNvbmNhdGVuYXRpbmcgdGhlIHR3bzogYSBmaWxlIG5hbWVkIGJ5IGJvdGggd291bGQgb3RoZXJ3aXNlIGJlIG9wZW5lZCBhbmQgcmV3cml0dGVuIHR3aWNlLCB3aGljaCBpc1xuICAgICAgICogdGhlIHZlcnkgdGhpbmcgYSBjb21iaW5lZCBzbmFwc2hvdCBleGlzdHMgdG8gYXZvaWQuIFRoZSBjdXJyZW50IHJlbmFtZSdzIGVudHJ5IHdpbnMgYSBrZXkgY29sbGlzaW9uLFxuICAgICAgICogYmVjYXVzZSBpdCBkZXNjcmliZXMgd2hlcmUgdGhlIHRhcmdldCBpcyBub3cuXG4gICAgICAgKi9cbiAgICAgIGZvciAoY29uc3QgW2ludGVycnVwdGVkQmFja2xpbmtQYXRoLCBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXBdIG9mIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCkge1xuICAgICAgICBjb25zdCBsaW5rS2V5VG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KGludGVycnVwdGVkQmFja2xpbmtQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rS2V5VG9QYXRoTWFwKSB7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KGludGVycnVwdGVkQmFja2xpbmtQYXRoLCBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbbGlua0tleSwgb2xkVGFyZ2V0UGF0aF0gb2YgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwKSB7XG4gICAgICAgICAgaWYgKCFsaW5rS2V5VG9QYXRoTWFwLmhhcyhsaW5rS2V5KSkge1xuICAgICAgICAgICAgbGlua0tleVRvUGF0aE1hcC5zZXQobGlua0tleSwgb2xkVGFyZ2V0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmtJbmRleGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGF3YWl0IGVkaXRCYWNrbGlua3NTbmFwc2hvdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPHN0cmluZz4+KHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXI6ICh7IGxpbmssIHBheWxvYWQ6IG9sZEF0dGFjaG1lbnRQYXRoLCBzb3VyY2VQYXRoOiBuZXdCYWNrbGlua1BhdGggfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxpbmtJbmRleCA9IChsaW5rSW5kZXhlcy5nZXQobmV3QmFja2xpbmtQYXRoKSA/PyAwKSArIDE7XG4gICAgICAgICAgbGlua0luZGV4ZXMuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0luZGV4KTtcblxuICAgICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBBIGxpbmsgdGhhdCBpcyBub3QgaW4gdGhlIHNuYXBzaG90IHdhcyBlaXRoZXIgbmV2ZXIgb3VycyB0byByZXdyaXRlLCBvciB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICogcmV3cml0dGVuIGJ5IHNvbWVvbmUgZWxzZSAobGVhdmluZyBpdCBjb3JyZWN0KS4gRWl0aGVyIHdheSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIC1cbiAgICAgICAgICAgICAqIGJ1dCBsb2cgaXQsIGJlY2F1c2UgYSBzaWxlbnQgc2tpcCBoZXJlIGlzIGV4YWN0bHkgaG93XG4gICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwIHN0YXllZFxuICAgICAgICAgICAgICogaW52aXNpYmxlOiBldmVyeSBza2lwcGVkIGxpbmsgbGVmdCBhIGJyb2tlbiBlbWJlZCBhbmQgcmVwb3J0ZWQgbm90aGluZy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjp1cGRhdGVCYWNrbGlua3MnKShcbiAgICAgICAgICAgICAgYE5vIHNuYXBzaG90IGVudHJ5IGZvciBsaW5rICR7dG9Kc29uKGxpbmspfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBvbGRUYXJnZXRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgLy8gVGhlIGNvbnZlcnRlciBsb2dzIGV2ZXJ5IGxpbmsgaXQgZGVjbGluZXMsIHNvIGl0IGhhcyB0byBiZSBzaG93biB0aGUgb25lcyB0aGUgc25hcHNob3QgZG9lcyBub3QgbmFtZS5cbiAgICAgICAgc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rczogdHJ1ZSxcbiAgICAgICAgc25hcHNob3Q6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChpc05vdGUodGhpcy5uZXdQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVQYXJhbXM+KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoIH0pKSB7XG4gICAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5zZXQodGhpcy5uZXdQYXRoLCBpbnRlcnJ1cHRlZFJlbmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IG9ycGhhbktleXMgPSBbLi4udGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCldO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLnVwZGF0ZWRMaW5rcywgeyBmaWxlc0NvdW50OiByZW5hbWVkRmlsZVBhdGhzLnNpemUsIGxpbmtzQ291bnQ6IHJlbmFtZWRMaW5rcy5zaXplIH0pKTtcbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmNsZWFyKCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogaW50ZXJydXB0ZWRSZW5hbWUub2xkUGF0aCxcbiAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KS5oYW5kbGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgbmV3UGF0aDogdGVtcG9yYXJ5UGF0aCxcbiAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wb3JhcnlQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBjb25zdCBmYWtlT2xkRmlsZUJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gZmFrZU9sZEZpbGVCYWNrbGlua3MuZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkKSB7XG4gICAgICBsZXQgb2xkTGlua3MgPSB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuZ2V0KGJhY2tsaW5rUGF0aCk7XG4gICAgICBpZiAoIW9sZExpbmtzKSB7XG4gICAgICAgIG9sZExpbmtzID0gW107XG4gICAgICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5zZXQoYmFja2xpbmtQYXRoLCBvbGRMaW5rcyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluayBvZiByZWZyZXNoZWRMaW5rcykge1xuICAgICAgICBpZiAob2xkTGlua3MuaW5jbHVkZXMobGluaykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvbGRMaW5rcy5wdXNoKGxpbmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVuYW1lSGFuZGxlZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgICByZXR1cm4gbmV3UGF0aDtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5hZGQob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgbmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldExpbmtzKHsgY2FjaGU6IHRoaXMub2xkQ2FjaGUgfSkgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5lbnRyaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmlsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMub2xkUGF0aCwgdGhpcy5uZXdQYXRoKTtcblxuICAgIGlmICghaXNOb3RlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPYnNpZGlhbiBkb2VzIG5vdCBpbmRleCBhIGNhbnZhcyBmaWxlIGludG8gdGhlIG1ldGFkYXRhIGNhY2hlLlxuICAgIC8vIFRoZSBjYWNoZS1kZXJpdmVkIGBvbGRQYXRoTGlua3NgIGlzIGVtcHR5IGZvciBhIGNhbnZhcywgaGlkaW5nIGl0cyBlbWJlZGRlZCBhdHRhY2htZW50cy5cbiAgICAvLyBSZWFkaW5nIHRoZSBjYW52YXMgcmVmZXJlbmNlcyBkaXJlY3RseSBtb3ZlcyB0aGVtIHdpdGggdGhlIGNhbnZhcyAobWlycm9yaW5nIG5vdGUgYmVoYXZpb3IpLlxuICAgIC8vIFRoZSBmaWxlIGFscmVhZHkgbGl2ZXMgYXQgdGhlIG5ldyBwYXRoIGFmdGVyIHRoZSByZW5hbWUsIHNvIHJlYWQgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGVyZS5cbiAgICBpZiAoaXNDYW52YXNGaWxlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhc1JlZmVyZW5jZXMgPSBhd2FpdCBnZXRDYW52YXNSZWZlcmVuY2VzKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpO1xuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaCguLi5jYW52YXNSZWZlcmVuY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgdGhpcy5nZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlKTtcblxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoXG4gICAgICB9KVxuICAgICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICAgIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlciB8fCAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUgfHwgKCFpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgJiYgIW9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dGVuc2lvbik7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJlY3RvcnksIGJhc2VOYW1lKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHN0cmluZz4oe1xuICAgICAgYmFja2xpbmtzOiBzaW5nbGVCYWNrbGlua3NNYXAsXG4gICAgICBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogZ2V0TGlua0lkZW50aXR5S2V5LFxuICAgICAgcGF0aFJlbWFwcGVyOiAoYmFja2xpbmtQYXRoKSA9PiB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGgsXG4gICAgICBwYXlsb2FkUHJvdmlkZXI6ICgpID0+IHBhdGgsXG4gICAgICB0YXJnZXQ6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oW1t0aGlzLm5ld1BhdGgsIFtvbGRQYXRoTGlua11dXSk7XG4gICAgICB0aGlzLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGF0aDogb2xkQXR0YWNobWVudEZpbGUucGF0aCxcbiAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBiYWNrbGlua3NNYXBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmtleXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGU6IFRGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW29sZEZpbGVdKTtcbiAgICB1c2luZyBfY2FjaGVSZWdpc3RyYXRpb24gPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZFxuICAgICAgPyByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSh7IGFwcDogdGhpcy5hcHAsIGNhY2hlOiB0aGlzLm9sZENhY2hlLCBwYXRoT3JGaWxlOiBvbGRGaWxlIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNldHRpbmdzIHRoZSBoYW5kbGVyIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGVyZSBpcyBleGFjdGx5IG9uZSBjb250cmlidXRvcjogdGhlIGNvbXBvbmVudCdzIG93biBgc2V0dGluZ3NCdWlsZGVyYC4gRWFybGllciB2ZXJzaW9ucyBhZ2dyZWdhdGVkIGFcbiAqIHJlZ2lzdHJ5IG9mIGNvbnRyaWJ1dG9ycyBhbmQgT1ItbWVyZ2VkIHRoZWlyIGFuc3dlcnMsIGJlY2F1c2Ugc2V2ZXJhbCBwbHVnaW5zIGNvdWxkIGVhY2ggcmVnaXN0ZXIgYVxuICogaGFuZGxlciBhZ2FpbnN0IHRoZSBvbmUgc2hhcmVkIHZhdWx0LiBUaGV5IG5vIGxvbmdlciBkbywgc28gdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBxdWVzdGlvbiBvZiB3aG9zZVxuICogc2V0dGluZyB3aW5zLlxuICpcbiAqIFdoYXQgcmVtYWlucyBpcyBkZWZhdWx0aW5nOiB0aGUgYnVpbGRlciByZXR1cm5zIGEgYFBhcnRpYWxgLCBzbyB0aGUgdHdvIHByZWRpY2F0ZXMgYW5kIHRoZSBlbXB0eS1mb2xkZXJcbiAqIGJlaGF2aW9yIG5lZWQgYSB2YWx1ZSB3aGVuIGl0IGRvZXMgbm90IHN1cHBseSBvbmUuXG4gKi9cbmNsYXNzIFNldHRpbmdzTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBzZXR0aW5nc0J1aWxkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBidWlsdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc0J1aWxkZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYnVpbHRTZXR0aW5ncyxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IGJ1aWx0U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBpc05vdGU6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gaXNOb3RlKHBhdGgpLFxuICAgICAgaXNQYXRoSWdub3JlZDogKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gYnVpbHRTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGlzTm90ZUV4KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiBzZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IGhhbmRsZXMgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICogSXQgbGlzdGVucyB0byByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgYW5kIHVwZGF0ZXMgbGlua3MgYWNjb3JkaW5nbHkuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGNhc2Utb25seSByZW5hbWVzIGFuZCBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCBjb21wb25lbnQgd2hvc2Ugc2lnbmFsIGNhbmNlbHMgaW4tZmxpZ2h0IHJlbmFtZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSB3aG9zZSBsaW5rcyBhcmUgdXBkYXRlZCBkdXJpbmcgYSByZW5hbWUvbW92ZSxcbiAgICogd2l0aCB0aGUgcnVubmluZyBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBgbnVsbGAsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzQnVpbGRlciA9IHBhcmFtcy5zZXR0aW5nc0J1aWxkZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBuZXcgU2V0dGluZ3NNYW5hZ2VyKHRoaXMuc2V0dGluZ3NCdWlsZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50KHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZmlsZU1hbmFnZXI6IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBEZWxldGVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlRGVsZXRlLCB7IGZpbGVQYXRoOiBmaWxlLnBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHtcbiAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgZmlsZSxcbiAgICAgIHByZXZpb3VzQ2FjaGUsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWlzRmlsZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWApO1xuICAgIGlmICh0aGlzLmhhbmRsZWRSZW5hbWVzLmhhcyhvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBBIHJlbmFtZSBvY2N1cnJpbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBgQWR2YW5jZWQgTm90ZSBDb21wb3NlcmAncyBmb2xkZXIgbWVyZ2UpIGlzIG9yY2hlc3RyYXRlZCBieSB0aGF0XG4gICAgICogdHJhbnNhY3Rpb24ncyBvd25lciwgd2hpY2ggdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gUmVhY3RpbmcgdG8gaXRcbiAgICAgKiBoZXJlIHdvdWxkIChhKSBwZXJ0dXJiIE9ic2lkaWFuJ3MgbmF0aXZlIHBvc3QtcmVuYW1lIGxpbmsgdXBkYXRlIGFuZCBsZWF2ZSBsaW5rcyBkYW5nbGluZywgYW5kXG4gICAgICogKGIpIGNvbGxpZGUgd2l0aCB0aGUgZm9yZWlnbiB0cmFuc2FjdGlvbiBcdTIwMTQgYW4gYXN5bmMgYWJvcnQgZnJvbSB0aGlzIGhhbmRsZXIgYWJvcnRzIGFuXG4gICAgICogYWxyZWFkeS1jb21taXR0ZWQgdHJhbnNhY3Rpb24sIHRocm93aW5nIFwiQ2Fubm90IHJvbGwgYmFjayBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvblwiLiBUaGlzXG4gICAgICogaGFuZGxlcidzIG93biBhdHRhY2htZW50IG1vdmVzIGFyZSBhbHJlYWR5IGV4Y2x1ZGVkIGFib3ZlIHZpYSBgaGFuZGxlZFJlbmFtZXNgLCBzbyBhIGxvY2sgc3RpbGxcbiAgICAgKiBoZWxkIGhlcmUgYWx3YXlzIGJlbG9uZ3MgdG8gYSBmb3JlaWduIG9wZXJhdGlvbjsgc3RheSBvdXQgb2YgaXRzIHdheS4gU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKFxuICAgICAgICBgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9IGFzIGl0IG9jY3VycyBpbnNpZGUgYSBmb3JlaWduIGxvY2tlZCB0cmFuc2FjdGlvbi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTm9PcFJlbmFtZShzZXR0aW5ncywgb2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgaXMgbm90IGEgbm90ZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBkbyB3aXRoIGxpbmsgdXBkYXRlcyBkaXNhYmxlZC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ob2xkUGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBuZXcgcGF0aCAke25ld1BhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gICAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgodGhpcy5hcHAsIG9sZFBhdGgpLmRhdGE7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudC5hYm9ydFNpZ25hbCxcbiAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbGluayByZXdyaXRpbmcgb2ZmLCB0aGUgaGFuZGxlcidzIG9ubHkgcmVtYWluaW5nIGpvYnMgYXJlIG1vdmluZyBhIE5PVEUncyBhdHRhY2htZW50cyBhbmQgcHJ1bmluZ1xuICAgKiB0aGUgZm9sZGVyIGEgbW92ZWQgZmlsZSB2YWNhdGVkLiBBIG5vbi1ub3RlIHJlbmFtZSBuZWVkcyBuZWl0aGVyIHdoZW4gZW1wdHkgZm9sZGVycyBhcmUga2VwdCwgc28gdGhlcmVcbiAgICogaXMgbm90aGluZyB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIGZyb20uXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgdG8uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBoYW5kbGVyIHdvdWxkIGRvIG5vIHdvcmsgZm9yIHRoaXMgcmVuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc05vT3BSZW5hbWUoc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXNcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4ob2xkUGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG5ld1BhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgKHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyBcdTIwMTQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IFx1MjAxNCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYE5vIHJlc2N1ZSBwYXRoIGZvciAke2F0dGFjaG1lbnRQYXRofTsga2VlcGluZyBpdCB3aGVyZSBpdCBpcy5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIC8qXG4gICAgICogYHJlbmFtZVNhZmVgIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgcmVzb2x2ZXMgYSBjb2xsaXNpb24gdmlhIGBnZXRTYWZlUmVuYW1lUGF0aGAsIGFuZCBtb3Zlc1xuICAgICAqIHRocm91Z2ggYGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlYCwgc28gdGhlIHN1cnZpdmluZyBub3RlcycgbGlua3MgZm9sbG93IHRoZSBhdHRhY2htZW50LlxuICAgICAqL1xuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBuZXdQYXRoOiByZXNjdWVQYXRoLFxuICAgICAgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGVcbiAgICB9KTtcblxuICAgIGlmIChuZXdBdHRhY2htZW50UGF0aCA9PT0gYXR0YWNobWVudFBhdGgpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBpcyBhbHJlYWR5IHdoZXJlIGl0IGJlbG9uZ3MuIFRoaXMgaXMgdGhlIG5vcm1hbCBzZWNvbmQgbG9vayBhdCBhIGZpbGUgdGhlIGZvbGRlclxuICAgICAgICogZGVsZXRlIGp1c3QgcmVzY3VlZDogdGhlIG93bmluZyBub3RlJ3Mgb3duIGRlbGV0aW9uIGlzIHJlcG9ydGVkIGFmdGVyd2FyZHMgYW5kIHdhbGtzIGl0cyBsaW5rc1xuICAgICAgICogYWdhaW4uIE5vdGhpbmcgbW92ZWQsIHNvIG5vdGhpbmcgaXMgY2xhaW1lZCBcdTIwMTQgdGhlIGNhbGxlciBrZWVwcyBpdCBpbiBwbGFjZSwgd2hpY2ggaXMgdGhlIHRydXRoLlxuICAgICAgICovXG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgJHthdHRhY2htZW50UGF0aH0gYWxyZWFkeSBzaXRzIGF0IGl0cyByZXNjdWUgcGF0aDsgbm90aGluZyB0byBtb3ZlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG1vdmUgZmlyZXMgYHZhdWx0Lm9uKCdyZW5hbWUnKWAsIHNvIHRoaXMgaGFuZGxlcidzIG93biBgUmVuYW1lSGFuZGxlcmAgcGlja3MgaXQgdXAgbGlrZSBhbnkgb3RoZXJcbiAgICAgKiBhdHRhY2htZW50IG1vdmUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcmVnaXN0ZXJlZCBpbiBgaGFuZGxlZFJlbmFtZXNgOlxuICAgICAqIGBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50YCBhbHJlYWR5IGRpc2NhcmRzIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIHdoaWxlXG4gICAgICogYHNob3VsZEhhbmRsZVJlbmFtZXNgIGlzIG9uLCBzbyBzdXBwcmVzc2luZyB0aGUgaGFuZGxlciBhcyB3ZWxsIHdvdWxkIGxlYXZlIGRhbmdsaW5nIGV4YWN0bHkgdGhlIGxpbmtzXG4gICAgICogdGhpcyByZXNjdWUgZXhpc3RzIHRvIHByZXNlcnZlLiBMZXQgdGhlIHJld3JpdGUgc2V0dGxlIGJlZm9yZSB0aGUgZGVsZXRlIHdhbGsgY2FycmllcyBvbi5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHBhcmFtcy5hcHApO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmF0dGFjaG1lbnRSZXNjdWVkLCB7IGF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCB9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLypcbiAgICAgKiBBIHJlc2N1ZSB0aGF0IGhhbGYgaGFwcGVuZWQgbXVzdCBub3QgcmVhZCBhcyBzdWNjZXNzIFx1MjAxNCByZXBvcnRpbmcgYGZhbHNlYCBmYWxscyBiYWNrIHRvIGtlZXBpbmcgdGhlXG4gICAgICogYXR0YWNobWVudCBpbiBwbGFjZSB3aXRoIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UsIHdoaWNoIGlzIHN0aWxsIHNhZmUuXG4gICAgICovXG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNjdWUgJHthdHRhY2htZW50UGF0aH0gdG8gJHtyZXNjdWVQYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSB1bmRlciB3aGljaCBhIGxpbmsgaXMgcmVtZW1iZXJlZCB3aGlsZSBhIHJlbmFtZSBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhlIHJld3JpdGUgaGFzIHRvIG1hdGNoIGxpbmtzIGNhcHR1cmVkIEJFRk9SRSB0aGUgYXR0YWNobWVudHMgbW92ZWQgYWdhaW5zdCB0aGUgbGlua3MgdGhlIG1ldGFkYXRhIGNhY2hlXG4gKiByZXBvcnRzIEFGVEVSIHRoZXkgbW92ZWQsIGFuZCB0aGUgb25seSB0aGluZyB0aGF0IHJlbGlhYmx5IHN1cnZpdmVzIHRoYXQgZ2FwIGlzIHRoZSBsaW5rJ3MgVEVYVC5cbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyBgcG9zaXRpb25gOiBrZXlpbmcgb24gdGhlIHdob2xlIHtAbGluayBSZWZlcmVuY2V9IG1lYW50IHRoYXQgYXMgc29vbiBhcyBhbnl0aGluZ1xuICogZWRpdGVkIHRoZSBmaWxlIGluIGJldHdlZW4gXHUyMDE0IGEgY28taW5zdGFsbGVkIHBsdWdpbiByZXdyaXRpbmcgaXRzIG93biBsaW5rcywgbW9zdCBvZnRlbiBcdTIwMTQgZXZlcnkgbGluayBiZWxvd1xuICogdGhlIGVkaXQgc2hpZnRlZCBpdHMgb2Zmc2V0cywgbWlzc2VkIGl0cyBrZXksIGFuZCB3YXMgc2tpcHBlZCBpbiBzaWxlbmNlLCBsZWF2aW5nIHRoZSBub3RlIHdpdGggc29tZSBlbWJlZHNcbiAqIHJld3JpdHRlbiBhbmQgdGhlIHJlc3QgYnJva2VuLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAuXG4gKlxuICogVHdvIGxpbmtzIHdpdGggaWRlbnRpY2FsIHRleHQgaW4gb25lIGZpbGUgbmVjZXNzYXJpbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSB0YXJnZXQsIHNvIGNvbGxhcHNpbmcgdGhlbSBvbnRvXG4gKiBvbmUga2V5IGxvc2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBidWlsZCB0aGUga2V5IGZvci5cbiAqIEByZXR1cm5zIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGxpbmsgYnkgaXRzIHRleHQgYWxvbmUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFNBQVM7QUFDbEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFhUDtBQUFBLEVB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TXhDLDZCQUF1QixrREFBa0QsRUFBRSxHQUFHLGNBQWMsb0RBQW9EO0FBQ2hKLGFBQU87QUFBQSxJQUNUO0FBU0EsVUFBTSwwQkFBMEIsT0FBTyxHQUFHO0FBRTFDLDJCQUF1QixrREFBa0QsRUFBRSxXQUFXLGNBQWMsT0FBTyxpQkFBaUIsR0FBRztBQUMvSCxXQUFPLHNCQUFzQixXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsbUJBQW1CLEVBQUUsZ0JBQWdCLGtCQUFrQixDQUFDLENBQUM7QUFDckksV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBS2QsZUFBVyxJQUFJLE1BQU0sb0JBQW9CLGNBQWMsT0FBTyxVQUFVLElBQUksRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQzdGLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFtQkEsU0FBUyxtQkFBbUIsTUFBeUI7QUFDbkQsU0FBTyxPQUFPO0FBQUEsSUFDWixNQUFNLEtBQUs7QUFBQSxJQUNYLFVBQVUsS0FBSztBQUFBLEVBQ2pCLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiRW1wdHlGb2xkZXJCZWhhdmlvciJdCn0K
1227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyB9IGZyb20gJy4uL2ZpbGUtbWFuYWdlci50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzRm9sZGVyLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4uL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGJ1aWxkQmFja2xpbmtzU25hcHNob3QsXG4gIGVkaXRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgaGFzQmFja2xpbmtDYWNoZVBsdWdpbixcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQg4oCUIG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIOKAlCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIOKAlCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgbmV3UGF0aDogc3RyaW5nO1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0TGlua3MoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoIH0pO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUgfHwgdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmIChcbiAgICAgICFhdHRhY2htZW50Rm9sZGVyIHx8ICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUg4oCUIHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyDigJQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQg4oCUIGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IOKAlCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSA/IHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSkgOiBmYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShcbiAgICAgIGBQcm90ZWN0aW5nICR7c3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aC50b1N0cmluZygpfSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnQocykgZnJvbSB0aGUgZGVsZXRpb24gb2YgJHtmb2xkZXIucGF0aH06ICR7dG9Kc29uKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyl9YFxuICAgICk7XG5cbiAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuYWRkKGZvbGRlci5wYXRoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZGVsZXRlQWJzdHJhY3RGaWxlLFxuICAgICAgICBkZWxldGVkTm90ZVBhdGhzOiBbLi4uZGVsZXRlZE5vdGVQYXRoc10sXG4gICAgICAgIHBhdGhPckZpbGU6IGZvbGRlcixcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSB1c2VyIG5hbWVkIFRISVMgZm9sZGVyLCBzbyBpdCBnb2VzIGV2ZW4gdW5kZXIgYEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcGAg4oCUIHRoYXQgc2V0dGluZ1xuICAgICAgICAgKiBnb3Zlcm5zIGZvbGRlcnMgZW1wdGllZCBpbmNpZGVudGFsbHksIG5vdCB0aGUgb25lIGV4cGxpY2l0bHkgZGVsZXRlZC4gYGRlbGV0ZUlmTm90VXNlZGAgc3RpbGxcbiAgICAgICAgICogcmVmdXNlcyB0byByZW1vdmUgYW55IGZvbGRlciB3aG9zZSBjaGlsZCBoYWQgdG8gYmUga2VwdCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gd2FudGVkIGhlcmUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHRydWUsXG4gICAgICAgIC8qXG4gICAgICAgICAqIEEgbm90ZSB0aGF0IG90aGVycyBsaW5rIHRvIGlzIGRlbGV0ZWQgYXMgbm9ybWFsOyBPYnNpZGlhbiBsZWF2ZXMgdGhlIGRhbmdsaW5nIGxpbmsuIFByb3RlY3RpbmdcbiAgICAgICAgICogbm90ZXMgdG9vIHdvdWxkIG1ha2UgZGVsZXRpbmcgYSBmb2xkZXIgb2YgbGlua2VkLXRvIG5vdGVzIGltcG9zc2libGUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGRQcm90ZWN0SWZTdGlsbFVzZWQ6IChjYW5kaWRhdGVGaWxlKSA9PiAhKHNldHRpbmdzLmlzTm90ZT8uKGNhbmRpZGF0ZUZpbGUucGF0aCkgPz8gZmFsc2UpXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmRlbGV0ZShmb2xkZXIucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZGVsZXRpb24gaXMgYSBmb2xkZXIgZGVsZXRpb24gdGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nLlxuICAgKlxuICAgKiBFdmVyeSBjaGVjayBoZXJlIGlzIHN5bmNocm9ub3VzIGFuZCBjaGVhcCwgc28gYSBmaWxlIGRlbGV0aW9uIOKAlCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IOKAlCBjb3N0cyBvbmVcbiAgICoge0BsaW5rIGlzRm9sZGVyfSBjYWxsIGFuZCByZWFjaGVzIHRoZSBvcmlnaW5hbCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgYmVpbmcgZGVsZXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRlbGV0aW9uIHNob3VsZCBiZSBzY2FubmVkIGJlZm9yZSBpdCBydW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRDb25zaWRlckZvbGRlcihmaWxlOiBUQWJzdHJhY3RGaWxlKTogZmlsZSBpcyBURm9sZGVyIHtcbiAgICBpZiAoIWlzRm9sZGVyKGZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8IChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4oZmlsZS5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlYC1iYWNrZWQsIHNvIHRoZSBhcmJpdHJhdGlvbiBzcGFucyBpbmRlcGVuZGVudGx5IGJ1bmRsZWQgY29waWVzIG9mIHRoaXNcbiAgICAgICAqIGxpYnJhcnk6IHRoZSBmaXJzdCBwYXRjaGVyIHN0YXlzIGxpdmUsIGEgY29weSB0aGF0IHBhdGNoZXMgYWZ0ZXJ3YXJkcyBzZWVzIHRoZSB0b2tlbiBvbiBpdHMgb3duXG4gICAgICAgKiBgb3JpZ2luYWxNZXRob2RgIGFuZCBkZWZlcnMgdmlhIHRoZSBndWFyZCBhYm92ZSwgYW5kIGl0IHRha2VzIG92ZXIgb24gaXRzIG5leHQgY2FsbCBvbmNlIHRoZVxuICAgICAgICogbGVhZGVyIHVubG9hZHMgYW5kIHRoZSB0b2tlbiBpcyBkcm9wcGVkLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgYXJiaXRyYXRlcyB0aGUgUEFUQ0ggb25seS4gVGhlIGNvbXBvbmVudCdzIGB2YXVsdC5vbigncmVuYW1lJyB8ICdkZWxldGUnKWAgYW5kXG4gICAgICAgKiBgbWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcpYCBsaXN0ZW5lcnMgaGF2ZSBubyBlcXVpdmFsZW50IGd1YXJkIOKAlCB0aGUgcGx1Z2luLXJlZ2lzdHJ5IGVsZWN0aW9uXG4gICAgICAgKiB0aGF0IHVzZWQgdG8gcHJvdmlkZSBvbmUgd2VudCB3aXRoIHRoZSBtdWx0aS1wbHVnaW4gbWFjaGluZXJ5IOKAlCBzbyB0d28gbGl2ZSBjb3BpZXMgd291bGQgYm90aFxuICAgICAgICogaGFuZGxlIGFuIGV2ZW50LiBXaXRoIG9uZSBvd25lciB0aGF0IGNhbm5vdCBhcmlzZTsgYSBjb25zdW1lciB0aGF0IG11c3QgZ3VhcmFudGVlIGl0IHJlZnVzZXMgdG9cbiAgICAgICAqIGxvYWQgYmVzaWRlIGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBUaGF0IHJlZnVzYWwgdXNlZCB0byBiZSBkZXNjcmliZWQgaGVyZSBhcyBcImEgcGx1Z2luJ3Mgam9iIHJhdGhlciB0aGFuIGEgbGlicmFyeSdzXCIsIHdoaWNoIGlzIG5vXG4gICAgICAgKiBsb25nZXIgdHJ1ZSDigJQgYFBsdWdpbkJhc2UuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzYCBpcyB3aGVyZSBhIGNvbnN1bWVyIGRlY2xhcmVzIGl0LCBhbmQgdGhlXG4gICAgICAgKiBgYXBpVmVyc2lvblJhbmdlYCBpdCBuYW1lcyBpcyBleGFjdGx5IHRoZSBjb25mbGljdGluZy12ZXJzaW9uIGd1YXJkLiBUaGUgbGlicmFyeSBvd25zIHRoZVxuICAgICAgICogbWVjaGFuaXNtOyB0aGUgcGx1Z2luIHN0aWxsIG93bnMgdGhlIGRlY2lzaW9uIHRvIHVzZSBpdC5cbiAgICAgICAqL1xuICAgICAgcGF0Y2hUb2tlbjogUEFUQ0hfVE9LRU5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGxldCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgLypcbiAgICAgICAqIEEgcmVuYW1lIHBlcmZvcm1lZCBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gYEFkdmFuY2VkIE5vdGUgQ29tcG9zZXJgJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiByZXNvbHZlZCBmaWxlICR7bGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykgIT09IG51bGwgJiYgIWhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4odGhpcy5hcHApXG4gICAgICAgICAgJiYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTiB8fCBsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBIYW5kbGVkUmVuYW1lcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZWRSZW5hbWVLZXk+KCk7XG5cbiAgcHVibGljIGFkZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldCh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpLCB7IG5ld1BhdGgsIG9sZFBhdGggfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXModGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEhhbmRsZWRSZW5hbWVLZXk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvU3RyaW5nKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG4gIH1cbn1cblxuY2xhc3MgTWV0YWRhdGFEZWxldGVkSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMucHJldmlvdXNDYWNoZSA9IHBhcmFtcy5wcmV2aW91c0NhY2hlO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZpb3VzQ2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZpb3VzQ2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvKlxuICAgICAqIFRoZSByZW5hbWUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBoYW5kbGVyIGlzIHZlcnkgbGlrZWx5IHN0aWxsIGluc2lkZSBPYnNpZGlhbidzIG93blxuICAgICAqIGBGaWxlTWFuYWdlci5ydW5Bc3luY0xpbmtVcGRhdGVgIGN5Y2xlLCB3aGljaCBpcyBhYm91dCB0byBkZWNpZGUg4oCUIHN5bmNocm9ub3VzbHkg4oCUIHdoaWNoIGxpbmtzIHRvXG4gICAgICogcmV3cml0ZSwgYnkgcmUtcmVzb2x2aW5nIGVhY2ggb25lLiBFdmVyeXRoaW5nIGJlbG93IHRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIHBoYW50b20gZmlsZSBhdCB0aGVcbiAgICAgKiBvbGQgcGF0aCAoYHJlZ2lzdGVyRmlsZXNgLCBkaXJlY3RseSBoZXJlIGFuZCBpbnNpZGUgYFJlbmFtZU1hcGApIGFuZCBob2xkcyBpdCBhY3Jvc3MgYW4gYGF3YWl0YDtcbiAgICAgKiBzZWVuIG1pZC1kZWNpc2lvbiwgdGhhdCBwaGFudG9tIG1ha2VzIHRoZSBvbGQgcGF0aCBzdGlsbCByZXNvbHZlLCBzbyBPYnNpZGlhbiBjb25jbHVkZXMgbm90aGluZ1xuICAgICAqIGNoYW5nZWQgYW5kIHJld3JpdGVzIG5vdGhpbmcuIFN0YW5kaW5nIGludmFyaWFudDogbmV2ZXIgdG91Y2ggdGhlIHZhdWx0IGluZGV4IHdoaWxlIE9ic2lkaWFuIGlzXG4gICAgICogbWlkLWRlY2lzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy80Ny5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHRoaXMuYXBwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLy8gVGhlIHJlZnJlc2hlZCBiYWNrbGlua3MgZmVlZCBgb2xkUGF0aEJhY2tsaW5rc01hcGAsIHdoaWNoIG9ubHkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdyByZWFkLCBhbmQgdGhvc2UgYXJlIGdhdGVkIG9uIHRoZSBzYW1lIGZsYWcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCkuc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICAgICAgLy8gQmFja2xpbmtzIGFyZSBvbmx5IGNvbnN1bWVkIGJ5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3csIHdoaWNoIGFyZSBnYXRlZCBvblxuICAgICAgLy8gYHNob3VsZEhhbmRsZVJlbmFtZXNgLiBTa2lwIGdhdGhlcmluZyB0aGVtIChhIGJhY2tsaW5rIGZldGNoIHBlciBhdHRhY2htZW50KSBvbiBhIG1vdmUtb25seSByZW5hbWUuXG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudE9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRPbGRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MuZGF0YTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IG1vdmUgYWJvdmUgcnVucyByZWdhcmRsZXNzIG9mIGBzaG91bGRIYW5kbGVSZW5hbWVzYCAodGhhdCBpcyB0aGUgcG9pbnQgb2YgZGVjb3VwbGluZ1xuICAgICAgICogXCJNb3ZlIGF0dGFjaG1lbnRzIHdpdGggbm90ZVwiIGZyb20gXCJVcGRhdGUgbGlua3NcIikuIFRoZSByZW1haW5pbmcgc3RlcHMgb25seSByZXdyaXRlIGxpbmtzLCBzbyBza2lwXG4gICAgICAgKiB0aGVtIHdoZW4gbGluayB1cGRhdGVzIGFyZSBkaXNhYmxlZDsgdGhlIGBmaW5hbGx5YCBibG9jayBiZWxvdyBzdGlsbCBydW5zLlxuICAgICAgICovXG4gICAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogQSByZXN1bWVkIHJlbmFtZSBicmluZ3MgaXRzIG93biBzbmFwc2hvdCBhbG9uZy4gTWVyZ2UgaXQgSU5UTyB0aGUgY3VycmVudCBvbmUgcmF0aGVyIHRoYW5cbiAgICAgICAqIGNvbmNhdGVuYXRpbmcgdGhlIHR3bzogYSBmaWxlIG5hbWVkIGJ5IGJvdGggd291bGQgb3RoZXJ3aXNlIGJlIG9wZW5lZCBhbmQgcmV3cml0dGVuIHR3aWNlLCB3aGljaCBpc1xuICAgICAgICogdGhlIHZlcnkgdGhpbmcgYSBjb21iaW5lZCBzbmFwc2hvdCBleGlzdHMgdG8gYXZvaWQuIFRoZSBjdXJyZW50IHJlbmFtZSdzIGVudHJ5IHdpbnMgYSBrZXkgY29sbGlzaW9uLFxuICAgICAgICogYmVjYXVzZSBpdCBkZXNjcmliZXMgd2hlcmUgdGhlIHRhcmdldCBpcyBub3cuXG4gICAgICAgKi9cbiAgICAgIGZvciAoY29uc3QgW2ludGVycnVwdGVkQmFja2xpbmtQYXRoLCBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXBdIG9mIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCkge1xuICAgICAgICBjb25zdCBsaW5rS2V5VG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KGludGVycnVwdGVkQmFja2xpbmtQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rS2V5VG9QYXRoTWFwKSB7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KGludGVycnVwdGVkQmFja2xpbmtQYXRoLCBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbbGlua0tleSwgb2xkVGFyZ2V0UGF0aF0gb2YgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwKSB7XG4gICAgICAgICAgaWYgKCFsaW5rS2V5VG9QYXRoTWFwLmhhcyhsaW5rS2V5KSkge1xuICAgICAgICAgICAgbGlua0tleVRvUGF0aE1hcC5zZXQobGlua0tleSwgb2xkVGFyZ2V0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmtJbmRleGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGF3YWl0IGVkaXRCYWNrbGlua3NTbmFwc2hvdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPHN0cmluZz4+KHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXI6ICh7IGxpbmssIHBheWxvYWQ6IG9sZEF0dGFjaG1lbnRQYXRoLCBzb3VyY2VQYXRoOiBuZXdCYWNrbGlua1BhdGggfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxpbmtJbmRleCA9IChsaW5rSW5kZXhlcy5nZXQobmV3QmFja2xpbmtQYXRoKSA/PyAwKSArIDE7XG4gICAgICAgICAgbGlua0luZGV4ZXMuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0luZGV4KTtcblxuICAgICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBBIGxpbmsgdGhhdCBpcyBub3QgaW4gdGhlIHNuYXBzaG90IHdhcyBlaXRoZXIgbmV2ZXIgb3VycyB0byByZXdyaXRlLCBvciB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICogcmV3cml0dGVuIGJ5IHNvbWVvbmUgZWxzZSAobGVhdmluZyBpdCBjb3JyZWN0KS4gRWl0aGVyIHdheSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIC1cbiAgICAgICAgICAgICAqIGJ1dCBsb2cgaXQsIGJlY2F1c2UgYSBzaWxlbnQgc2tpcCBoZXJlIGlzIGV4YWN0bHkgaG93XG4gICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwIHN0YXllZFxuICAgICAgICAgICAgICogaW52aXNpYmxlOiBldmVyeSBza2lwcGVkIGxpbmsgbGVmdCBhIGJyb2tlbiBlbWJlZCBhbmQgcmVwb3J0ZWQgbm90aGluZy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjp1cGRhdGVCYWNrbGlua3MnKShcbiAgICAgICAgICAgICAgYE5vIHNuYXBzaG90IGVudHJ5IGZvciBsaW5rICR7dG9Kc29uKGxpbmspfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBvbGRUYXJnZXRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgLy8gVGhlIGNvbnZlcnRlciBsb2dzIGV2ZXJ5IGxpbmsgaXQgZGVjbGluZXMsIHNvIGl0IGhhcyB0byBiZSBzaG93biB0aGUgb25lcyB0aGUgc25hcHNob3QgZG9lcyBub3QgbmFtZS5cbiAgICAgICAgc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rczogdHJ1ZSxcbiAgICAgICAgc25hcHNob3Q6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChpc05vdGUodGhpcy5uZXdQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVQYXJhbXM+KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoIH0pKSB7XG4gICAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5zZXQodGhpcy5uZXdQYXRoLCBpbnRlcnJ1cHRlZFJlbmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IG9ycGhhbktleXMgPSBbLi4udGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCldO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLnVwZGF0ZWRMaW5rcywgeyBmaWxlc0NvdW50OiByZW5hbWVkRmlsZVBhdGhzLnNpemUsIGxpbmtzQ291bnQ6IHJlbmFtZWRMaW5rcy5zaXplIH0pKTtcbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmNsZWFyKCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogaW50ZXJydXB0ZWRSZW5hbWUub2xkUGF0aCxcbiAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KS5oYW5kbGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgbmV3UGF0aDogdGVtcG9yYXJ5UGF0aCxcbiAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wb3JhcnlQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBjb25zdCBmYWtlT2xkRmlsZUJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gZmFrZU9sZEZpbGVCYWNrbGlua3MuZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkKSB7XG4gICAgICBsZXQgb2xkTGlua3MgPSB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuZ2V0KGJhY2tsaW5rUGF0aCk7XG4gICAgICBpZiAoIW9sZExpbmtzKSB7XG4gICAgICAgIG9sZExpbmtzID0gW107XG4gICAgICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5zZXQoYmFja2xpbmtQYXRoLCBvbGRMaW5rcyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluayBvZiByZWZyZXNoZWRMaW5rcykge1xuICAgICAgICBpZiAob2xkTGlua3MuaW5jbHVkZXMobGluaykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvbGRMaW5rcy5wdXNoKGxpbmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVuYW1lSGFuZGxlZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgICByZXR1cm4gbmV3UGF0aDtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5hZGQob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgbmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldExpbmtzKHsgY2FjaGU6IHRoaXMub2xkQ2FjaGUgfSkgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5lbnRyaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmlsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMub2xkUGF0aCwgdGhpcy5uZXdQYXRoKTtcblxuICAgIGlmICghaXNOb3RlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPYnNpZGlhbiBkb2VzIG5vdCBpbmRleCBhIGNhbnZhcyBmaWxlIGludG8gdGhlIG1ldGFkYXRhIGNhY2hlLlxuICAgIC8vIFRoZSBjYWNoZS1kZXJpdmVkIGBvbGRQYXRoTGlua3NgIGlzIGVtcHR5IGZvciBhIGNhbnZhcywgaGlkaW5nIGl0cyBlbWJlZGRlZCBhdHRhY2htZW50cy5cbiAgICAvLyBSZWFkaW5nIHRoZSBjYW52YXMgcmVmZXJlbmNlcyBkaXJlY3RseSBtb3ZlcyB0aGVtIHdpdGggdGhlIGNhbnZhcyAobWlycm9yaW5nIG5vdGUgYmVoYXZpb3IpLlxuICAgIC8vIFRoZSBmaWxlIGFscmVhZHkgbGl2ZXMgYXQgdGhlIG5ldyBwYXRoIGFmdGVyIHRoZSByZW5hbWUsIHNvIHJlYWQgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGVyZS5cbiAgICBpZiAoaXNDYW52YXNGaWxlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhc1JlZmVyZW5jZXMgPSBhd2FpdCBnZXRDYW52YXNSZWZlcmVuY2VzKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpO1xuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaCguLi5jYW52YXNSZWZlcmVuY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgdGhpcy5nZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlKTtcblxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoXG4gICAgICB9KVxuICAgICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICAgIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlciB8fCAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUgfHwgKCFpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgJiYgIW9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dGVuc2lvbik7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJlY3RvcnksIGJhc2VOYW1lKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHN0cmluZz4oe1xuICAgICAgYmFja2xpbmtzOiBzaW5nbGVCYWNrbGlua3NNYXAsXG4gICAgICBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogZ2V0TGlua0lkZW50aXR5S2V5LFxuICAgICAgcGF0aFJlbWFwcGVyOiAoYmFja2xpbmtQYXRoKSA9PiB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGgsXG4gICAgICBwYXlsb2FkUHJvdmlkZXI6ICgpID0+IHBhdGgsXG4gICAgICB0YXJnZXQ6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oW1t0aGlzLm5ld1BhdGgsIFtvbGRQYXRoTGlua11dXSk7XG4gICAgICB0aGlzLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGF0aDogb2xkQXR0YWNobWVudEZpbGUucGF0aCxcbiAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBiYWNrbGlua3NNYXBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmtleXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGU6IFRGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW29sZEZpbGVdKTtcbiAgICB1c2luZyBfY2FjaGVSZWdpc3RyYXRpb24gPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZFxuICAgICAgPyByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSh7IGFwcDogdGhpcy5hcHAsIGNhY2hlOiB0aGlzLm9sZENhY2hlLCBwYXRoT3JGaWxlOiBvbGRGaWxlIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNldHRpbmdzIHRoZSBoYW5kbGVyIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGVyZSBpcyBleGFjdGx5IG9uZSBjb250cmlidXRvcjogdGhlIGNvbXBvbmVudCdzIG93biBgc2V0dGluZ3NCdWlsZGVyYC4gRWFybGllciB2ZXJzaW9ucyBhZ2dyZWdhdGVkIGFcbiAqIHJlZ2lzdHJ5IG9mIGNvbnRyaWJ1dG9ycyBhbmQgT1ItbWVyZ2VkIHRoZWlyIGFuc3dlcnMsIGJlY2F1c2Ugc2V2ZXJhbCBwbHVnaW5zIGNvdWxkIGVhY2ggcmVnaXN0ZXIgYVxuICogaGFuZGxlciBhZ2FpbnN0IHRoZSBvbmUgc2hhcmVkIHZhdWx0LiBUaGV5IG5vIGxvbmdlciBkbywgc28gdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBxdWVzdGlvbiBvZiB3aG9zZVxuICogc2V0dGluZyB3aW5zLlxuICpcbiAqIFdoYXQgcmVtYWlucyBpcyBkZWZhdWx0aW5nOiB0aGUgYnVpbGRlciByZXR1cm5zIGEgYFBhcnRpYWxgLCBzbyB0aGUgdHdvIHByZWRpY2F0ZXMgYW5kIHRoZSBlbXB0eS1mb2xkZXJcbiAqIGJlaGF2aW9yIG5lZWQgYSB2YWx1ZSB3aGVuIGl0IGRvZXMgbm90IHN1cHBseSBvbmUuXG4gKi9cbmNsYXNzIFNldHRpbmdzTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBzZXR0aW5nc0J1aWxkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBidWlsdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc0J1aWxkZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYnVpbHRTZXR0aW5ncyxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IGJ1aWx0U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBpc05vdGU6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gaXNOb3RlKHBhdGgpLFxuICAgICAgaXNQYXRoSWdub3JlZDogKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gYnVpbHRTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGlzTm90ZUV4KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiBzZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IGhhbmRsZXMgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICogSXQgbGlzdGVucyB0byByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgYW5kIHVwZGF0ZXMgbGlua3MgYWNjb3JkaW5nbHkuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGNhc2Utb25seSByZW5hbWVzIGFuZCBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCBjb21wb25lbnQgd2hvc2Ugc2lnbmFsIGNhbmNlbHMgaW4tZmxpZ2h0IHJlbmFtZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSB3aG9zZSBsaW5rcyBhcmUgdXBkYXRlZCBkdXJpbmcgYSByZW5hbWUvbW92ZSxcbiAgICogd2l0aCB0aGUgcnVubmluZyBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBgbnVsbGAsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzQnVpbGRlciA9IHBhcmFtcy5zZXR0aW5nc0J1aWxkZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBuZXcgU2V0dGluZ3NNYW5hZ2VyKHRoaXMuc2V0dGluZ3NCdWlsZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50KHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZmlsZU1hbmFnZXI6IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBEZWxldGVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlRGVsZXRlLCB7IGZpbGVQYXRoOiBmaWxlLnBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHtcbiAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgZmlsZSxcbiAgICAgIHByZXZpb3VzQ2FjaGUsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWlzRmlsZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWApO1xuICAgIGlmICh0aGlzLmhhbmRsZWRSZW5hbWVzLmhhcyhvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBBIHJlbmFtZSBvY2N1cnJpbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBgQWR2YW5jZWQgTm90ZSBDb21wb3NlcmAncyBmb2xkZXIgbWVyZ2UpIGlzIG9yY2hlc3RyYXRlZCBieSB0aGF0XG4gICAgICogdHJhbnNhY3Rpb24ncyBvd25lciwgd2hpY2ggdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gUmVhY3RpbmcgdG8gaXRcbiAgICAgKiBoZXJlIHdvdWxkIChhKSBwZXJ0dXJiIE9ic2lkaWFuJ3MgbmF0aXZlIHBvc3QtcmVuYW1lIGxpbmsgdXBkYXRlIGFuZCBsZWF2ZSBsaW5rcyBkYW5nbGluZywgYW5kXG4gICAgICogKGIpIGNvbGxpZGUgd2l0aCB0aGUgZm9yZWlnbiB0cmFuc2FjdGlvbiDigJQgYW4gYXN5bmMgYWJvcnQgZnJvbSB0aGlzIGhhbmRsZXIgYWJvcnRzIGFuXG4gICAgICogYWxyZWFkeS1jb21taXR0ZWQgdHJhbnNhY3Rpb24sIHRocm93aW5nIFwiQ2Fubm90IHJvbGwgYmFjayBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvblwiLiBUaGlzXG4gICAgICogaGFuZGxlcidzIG93biBhdHRhY2htZW50IG1vdmVzIGFyZSBhbHJlYWR5IGV4Y2x1ZGVkIGFib3ZlIHZpYSBgaGFuZGxlZFJlbmFtZXNgLCBzbyBhIGxvY2sgc3RpbGxcbiAgICAgKiBoZWxkIGhlcmUgYWx3YXlzIGJlbG9uZ3MgdG8gYSBmb3JlaWduIG9wZXJhdGlvbjsgc3RheSBvdXQgb2YgaXRzIHdheS4gU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKFxuICAgICAgICBgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9IGFzIGl0IG9jY3VycyBpbnNpZGUgYSBmb3JlaWduIGxvY2tlZCB0cmFuc2FjdGlvbi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTm9PcFJlbmFtZShzZXR0aW5ncywgb2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgaXMgbm90IGEgbm90ZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBkbyB3aXRoIGxpbmsgdXBkYXRlcyBkaXNhYmxlZC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ob2xkUGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBuZXcgcGF0aCAke25ld1BhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gICAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgodGhpcy5hcHAsIG9sZFBhdGgpLmRhdGE7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudC5hYm9ydFNpZ25hbCxcbiAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbGluayByZXdyaXRpbmcgb2ZmLCB0aGUgaGFuZGxlcidzIG9ubHkgcmVtYWluaW5nIGpvYnMgYXJlIG1vdmluZyBhIE5PVEUncyBhdHRhY2htZW50cyBhbmQgcHJ1bmluZ1xuICAgKiB0aGUgZm9sZGVyIGEgbW92ZWQgZmlsZSB2YWNhdGVkLiBBIG5vbi1ub3RlIHJlbmFtZSBuZWVkcyBuZWl0aGVyIHdoZW4gZW1wdHkgZm9sZGVycyBhcmUga2VwdCwgc28gdGhlcmVcbiAgICogaXMgbm90aGluZyB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIGZyb20uXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgdG8uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBoYW5kbGVyIHdvdWxkIGRvIG5vIHdvcmsgZm9yIHRoaXMgcmVuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc05vT3BSZW5hbWUoc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXNcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4ob2xkUGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG5ld1BhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgKHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyDigJQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IOKAlCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYE5vIHJlc2N1ZSBwYXRoIGZvciAke2F0dGFjaG1lbnRQYXRofTsga2VlcGluZyBpdCB3aGVyZSBpdCBpcy5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIC8qXG4gICAgICogYHJlbmFtZVNhZmVgIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgcmVzb2x2ZXMgYSBjb2xsaXNpb24gdmlhIGBnZXRTYWZlUmVuYW1lUGF0aGAsIGFuZCBtb3Zlc1xuICAgICAqIHRocm91Z2ggYGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlYCwgc28gdGhlIHN1cnZpdmluZyBub3RlcycgbGlua3MgZm9sbG93IHRoZSBhdHRhY2htZW50LlxuICAgICAqL1xuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBuZXdQYXRoOiByZXNjdWVQYXRoLFxuICAgICAgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGVcbiAgICB9KTtcblxuICAgIGlmIChuZXdBdHRhY2htZW50UGF0aCA9PT0gYXR0YWNobWVudFBhdGgpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBpcyBhbHJlYWR5IHdoZXJlIGl0IGJlbG9uZ3MuIFRoaXMgaXMgdGhlIG5vcm1hbCBzZWNvbmQgbG9vayBhdCBhIGZpbGUgdGhlIGZvbGRlclxuICAgICAgICogZGVsZXRlIGp1c3QgcmVzY3VlZDogdGhlIG93bmluZyBub3RlJ3Mgb3duIGRlbGV0aW9uIGlzIHJlcG9ydGVkIGFmdGVyd2FyZHMgYW5kIHdhbGtzIGl0cyBsaW5rc1xuICAgICAgICogYWdhaW4uIE5vdGhpbmcgbW92ZWQsIHNvIG5vdGhpbmcgaXMgY2xhaW1lZCDigJQgdGhlIGNhbGxlciBrZWVwcyBpdCBpbiBwbGFjZSwgd2hpY2ggaXMgdGhlIHRydXRoLlxuICAgICAgICovXG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgJHthdHRhY2htZW50UGF0aH0gYWxyZWFkeSBzaXRzIGF0IGl0cyByZXNjdWUgcGF0aDsgbm90aGluZyB0byBtb3ZlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG1vdmUgZmlyZXMgYHZhdWx0Lm9uKCdyZW5hbWUnKWAsIHNvIHRoaXMgaGFuZGxlcidzIG93biBgUmVuYW1lSGFuZGxlcmAgcGlja3MgaXQgdXAgbGlrZSBhbnkgb3RoZXJcbiAgICAgKiBhdHRhY2htZW50IG1vdmUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcmVnaXN0ZXJlZCBpbiBgaGFuZGxlZFJlbmFtZXNgOlxuICAgICAqIGBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50YCBhbHJlYWR5IGRpc2NhcmRzIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIHdoaWxlXG4gICAgICogYHNob3VsZEhhbmRsZVJlbmFtZXNgIGlzIG9uLCBzbyBzdXBwcmVzc2luZyB0aGUgaGFuZGxlciBhcyB3ZWxsIHdvdWxkIGxlYXZlIGRhbmdsaW5nIGV4YWN0bHkgdGhlIGxpbmtzXG4gICAgICogdGhpcyByZXNjdWUgZXhpc3RzIHRvIHByZXNlcnZlLiBMZXQgdGhlIHJld3JpdGUgc2V0dGxlIGJlZm9yZSB0aGUgZGVsZXRlIHdhbGsgY2FycmllcyBvbi5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHBhcmFtcy5hcHApO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmF0dGFjaG1lbnRSZXNjdWVkLCB7IGF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCB9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLypcbiAgICAgKiBBIHJlc2N1ZSB0aGF0IGhhbGYgaGFwcGVuZWQgbXVzdCBub3QgcmVhZCBhcyBzdWNjZXNzIOKAlCByZXBvcnRpbmcgYGZhbHNlYCBmYWxscyBiYWNrIHRvIGtlZXBpbmcgdGhlXG4gICAgICogYXR0YWNobWVudCBpbiBwbGFjZSB3aXRoIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UsIHdoaWNoIGlzIHN0aWxsIHNhZmUuXG4gICAgICovXG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNjdWUgJHthdHRhY2htZW50UGF0aH0gdG8gJHtyZXNjdWVQYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSB1bmRlciB3aGljaCBhIGxpbmsgaXMgcmVtZW1iZXJlZCB3aGlsZSBhIHJlbmFtZSBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhlIHJld3JpdGUgaGFzIHRvIG1hdGNoIGxpbmtzIGNhcHR1cmVkIEJFRk9SRSB0aGUgYXR0YWNobWVudHMgbW92ZWQgYWdhaW5zdCB0aGUgbGlua3MgdGhlIG1ldGFkYXRhIGNhY2hlXG4gKiByZXBvcnRzIEFGVEVSIHRoZXkgbW92ZWQsIGFuZCB0aGUgb25seSB0aGluZyB0aGF0IHJlbGlhYmx5IHN1cnZpdmVzIHRoYXQgZ2FwIGlzIHRoZSBsaW5rJ3MgVEVYVC5cbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyBgcG9zaXRpb25gOiBrZXlpbmcgb24gdGhlIHdob2xlIHtAbGluayBSZWZlcmVuY2V9IG1lYW50IHRoYXQgYXMgc29vbiBhcyBhbnl0aGluZ1xuICogZWRpdGVkIHRoZSBmaWxlIGluIGJldHdlZW4g4oCUIGEgY28taW5zdGFsbGVkIHBsdWdpbiByZXdyaXRpbmcgaXRzIG93biBsaW5rcywgbW9zdCBvZnRlbiDigJQgZXZlcnkgbGluayBiZWxvd1xuICogdGhlIGVkaXQgc2hpZnRlZCBpdHMgb2Zmc2V0cywgbWlzc2VkIGl0cyBrZXksIGFuZCB3YXMgc2tpcHBlZCBpbiBzaWxlbmNlLCBsZWF2aW5nIHRoZSBub3RlIHdpdGggc29tZSBlbWJlZHNcbiAqIHJld3JpdHRlbiBhbmQgdGhlIHJlc3QgYnJva2VuLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAuXG4gKlxuICogVHdvIGxpbmtzIHdpdGggaWRlbnRpY2FsIHRleHQgaW4gb25lIGZpbGUgbmVjZXNzYXJpbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSB0YXJnZXQsIHNvIGNvbGxhcHNpbmcgdGhlbSBvbnRvXG4gKiBvbmUga2V5IGxvc2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBidWlsZCB0aGUga2V5IGZvci5cbiAqIEByZXR1cm5zIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGxpbmsgYnkgaXRzIHRleHQgYWxvbmUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWFQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDhCQUE4QjtBQUN2QyxT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
@@ -1,4 +1,4 @@
1
- /// <reference path="../library.d.mts" />
1
+ /// <reference path="../library-references.d.mts" />
2
2
  /**
3
3
  * @file
4
4
  *