obsidian-dev-utils 80.1.0 → 82.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/lib/cjs/abort-controller.cjs +12 -9
  3. package/dist/lib/cjs/abort-controller.d.cts +2 -2
  4. package/dist/lib/cjs/async-events.cjs +9 -1
  5. package/dist/lib/cjs/async-events.d.cts +9 -1
  6. package/dist/lib/cjs/async.cjs +93 -34
  7. package/dist/lib/cjs/async.d.cts +87 -17
  8. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +1 -1
  9. package/dist/lib/cjs/css-class.cjs +6 -1
  10. package/dist/lib/cjs/css-class.d.cts +20 -0
  11. package/dist/lib/cjs/debug.cjs +26 -9
  12. package/dist/lib/cjs/debug.d.cts +24 -6
  13. package/dist/lib/cjs/disposable.cjs +234 -0
  14. package/dist/lib/cjs/disposable.d.cts +124 -0
  15. package/dist/lib/cjs/error.cjs +29 -18
  16. package/dist/lib/cjs/error.d.cts +23 -7
  17. package/dist/lib/cjs/function.d.cts +1 -1
  18. package/dist/lib/cjs/html-element.cjs +9 -6
  19. package/dist/lib/cjs/html-element.d.cts +5 -3
  20. package/dist/lib/cjs/index.cjs +4 -1
  21. package/dist/lib/cjs/index.d.cts +1 -0
  22. package/dist/lib/cjs/library.cjs +2 -2
  23. package/dist/lib/cjs/object-utils.cjs +233 -128
  24. package/dist/lib/cjs/object-utils.d.cts +38 -13
  25. package/dist/lib/cjs/obsidian/@types/dataview/api/plugin-api.d.cts +1 -1
  26. package/dist/lib/cjs/obsidian/@types/dataview/data-index/index.d.cts +1 -1
  27. package/dist/lib/cjs/obsidian/@types/dataview/data-model/markdown.d.cts +2 -2
  28. package/dist/lib/cjs/obsidian/@types/dataview/data-model/serialized/markdown.d.cts +2 -2
  29. package/dist/lib/cjs/obsidian/@types/dataview/index.d.cts +1 -1
  30. package/dist/lib/cjs/obsidian/@types/dataview/query/engine.d.cts +1 -1
  31. package/dist/lib/cjs/obsidian/@types/dataview/typings/obsidian-ex.d.cts +1 -1
  32. package/dist/lib/cjs/obsidian/@types/dataview/ui/lp-render.d.cts +1 -1
  33. package/dist/lib/cjs/obsidian/@types/dataview/ui/markdown.d.cts +1 -1
  34. package/dist/lib/cjs/obsidian/@types/dataview/ui/views/calendar-view.d.cts +1 -1
  35. package/dist/lib/cjs/obsidian/@types/dataview/ui/views/inline-view.d.cts +1 -1
  36. package/dist/lib/cjs/obsidian/@types/dataview/ui/views/list-view.d.cts +2 -2
  37. package/dist/lib/cjs/obsidian/@types/dataview/ui/views/table-view.d.cts +2 -2
  38. package/dist/lib/cjs/obsidian/@types/dataview/ui/views/task-view.d.cts +1 -1
  39. package/dist/lib/cjs/obsidian/active-file-provider.d.cts +1 -1
  40. package/dist/lib/cjs/obsidian/app.d.cts +1 -1
  41. package/dist/lib/cjs/obsidian/async-with-notice.cjs +9 -6
  42. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +16 -3
  43. package/dist/lib/cjs/obsidian/attachment-path.cjs +45 -13
  44. package/dist/lib/cjs/obsidian/attachment-path.d.cts +47 -9
  45. package/dist/lib/cjs/obsidian/backlink.cjs +6 -6
  46. package/dist/lib/cjs/obsidian/backlink.d.cts +6 -2
  47. package/dist/lib/cjs/obsidian/bases-view-registrar.d.cts +1 -1
  48. package/dist/lib/cjs/obsidian/callout.cjs +1 -1
  49. package/dist/lib/cjs/obsidian/callout.d.cts +8 -0
  50. package/dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts +1 -1
  51. package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +1 -1
  52. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +53 -16
  53. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +84 -10
  54. package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +1 -1
  55. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +25 -5
  56. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +38 -2
  57. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +33 -19
  58. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.d.cts +45 -19
  59. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +33 -19
  60. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.d.cts +45 -19
  61. package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.d.cts +2 -2
  62. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.d.cts +1 -1
  63. package/dist/lib/cjs/obsidian/command-registrar.d.cts +1 -1
  64. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +17 -9
  65. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +49 -9
  66. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +5 -2
  67. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts +1 -1
  68. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +5 -10
  69. package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +0 -7
  70. package/dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts +2 -2
  71. package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +2 -2
  72. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +1 -1
  73. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +1 -1
  74. package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +1 -1
  75. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +1 -1
  76. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -2
  77. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +24 -8
  78. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +26 -5
  79. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +1 -1
  80. package/dist/lib/cjs/obsidian/components/registry-component.d.cts +1 -1
  81. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +195 -72
  82. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +4 -1
  83. package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.d.cts +2 -2
  84. package/dist/lib/cjs/obsidian/data-handler.d.cts +1 -1
  85. package/dist/lib/cjs/obsidian/dataview-link.cjs +7 -2
  86. package/dist/lib/cjs/obsidian/dataview-link.d.cts +22 -5
  87. package/dist/lib/cjs/obsidian/dataview.cjs +27 -10
  88. package/dist/lib/cjs/obsidian/dataview.d.cts +32 -7
  89. package/dist/lib/cjs/obsidian/editor-extension-registrar.d.cts +1 -1
  90. package/dist/lib/cjs/obsidian/editor-lock.cjs +245 -0
  91. package/dist/lib/cjs/obsidian/editor-lock.d.cts +57 -0
  92. package/dist/lib/cjs/obsidian/editor.cjs +7 -1
  93. package/dist/lib/cjs/obsidian/editor.d.cts +3 -2
  94. package/dist/lib/cjs/obsidian/file-change.cjs +103 -27
  95. package/dist/lib/cjs/obsidian/file-change.d.cts +55 -14
  96. package/dist/lib/cjs/obsidian/file-manager.cjs +61 -32
  97. package/dist/lib/cjs/obsidian/file-manager.d.cts +65 -15
  98. package/dist/lib/cjs/obsidian/file-system.cjs +122 -23
  99. package/dist/lib/cjs/obsidian/file-system.d.cts +189 -40
  100. package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.d.cts +1 -1
  101. package/dist/lib/cjs/obsidian/frontmatter.cjs +7 -2
  102. package/dist/lib/cjs/obsidian/hover-link-source-registrar.d.cts +1 -1
  103. package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +1 -1
  104. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +4 -1
  105. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
  106. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
  107. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  108. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  109. package/dist/lib/cjs/obsidian/link.cjs +326 -129
  110. package/dist/lib/cjs/obsidian/link.d.cts +133 -36
  111. package/dist/lib/cjs/obsidian/logger.cjs +48 -22
  112. package/dist/lib/cjs/obsidian/logger.d.cts +27 -6
  113. package/dist/lib/cjs/obsidian/loop.cjs +14 -4
  114. package/dist/lib/cjs/obsidian/loop.d.cts +27 -8
  115. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +2 -2
  116. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +155 -107
  117. package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +16 -6
  118. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +1 -1
  119. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +5 -3
  120. package/dist/lib/cjs/obsidian/markdown-view.d.cts +1 -1
  121. package/dist/lib/cjs/obsidian/markdown.cjs +40 -11
  122. package/dist/lib/cjs/obsidian/markdown.d.cts +85 -17
  123. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
  124. package/dist/lib/cjs/obsidian/metadata-cache.cjs +88 -32
  125. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +42 -32
  126. package/dist/lib/cjs/obsidian/modals/alert.cjs +1 -1
  127. package/dist/lib/cjs/obsidian/modals/alert.d.cts +2 -0
  128. package/dist/lib/cjs/obsidian/modals/confirm.cjs +1 -1
  129. package/dist/lib/cjs/obsidian/modals/confirm.d.cts +2 -0
  130. package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
  131. package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
  132. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +234 -0
  133. package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +74 -0
  134. package/dist/lib/cjs/obsidian/modals/modal.d.cts +1 -1
  135. package/dist/lib/cjs/obsidian/modals/prompt.cjs +1 -1
  136. package/dist/lib/cjs/obsidian/modals/prompt.d.cts +7 -1
  137. package/dist/lib/cjs/obsidian/modals/select-item.cjs +1 -1
  138. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +2 -0
  139. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.d.cts +2 -2
  140. package/dist/lib/cjs/obsidian/obsidian-settings.d.cts +1 -1
  141. package/dist/lib/cjs/obsidian/path-settings.cjs +5 -2
  142. package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +1 -1
  143. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +5 -1
  144. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +5 -1
  145. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +15 -7
  146. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +51 -14
  147. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +22 -16
  148. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +6 -6
  149. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.d.cts +2 -2
  150. package/dist/lib/cjs/obsidian/queue.cjs +9 -7
  151. package/dist/lib/cjs/obsidian/queue.d.cts +15 -3
  152. package/dist/lib/cjs/obsidian/react/app-context.d.cts +1 -1
  153. package/dist/lib/cjs/obsidian/reference.d.cts +1 -1
  154. package/dist/lib/cjs/obsidian/resource-url.cjs +7 -2
  155. package/dist/lib/cjs/obsidian/resource-url.d.cts +20 -5
  156. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +1 -1
  157. package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.d.cts +1 -1
  158. package/dist/lib/cjs/obsidian/setting-ex.d.cts +1 -1
  159. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +4 -2
  160. package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +6 -2
  161. package/dist/lib/cjs/obsidian/vault-delete.cjs +19 -15
  162. package/dist/lib/cjs/obsidian/vault-delete.d.cts +12 -7
  163. package/dist/lib/cjs/obsidian/vault.cjs +116 -59
  164. package/dist/lib/cjs/obsidian/vault.d.cts +188 -45
  165. package/dist/lib/cjs/obsidian/view-registrar.d.cts +1 -1
  166. package/dist/lib/cjs/obsidian/workspace.d.cts +1 -1
  167. package/dist/lib/cjs/path.cjs +12 -5
  168. package/dist/lib/cjs/path.d.cts +15 -3
  169. package/dist/lib/cjs/reg-exp.cjs +101 -78
  170. package/dist/lib/cjs/script-utils/build.cjs +9 -5
  171. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +34 -14
  172. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.d.cts +1 -1
  173. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +20 -5
  174. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +24 -6
  175. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +1 -1
  176. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +11 -4
  177. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +6 -2
  178. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.d.cts +1 -1
  179. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +31 -12
  180. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +20 -5
  181. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -7
  182. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +1 -1
  183. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +12 -3
  184. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
  185. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.d.cts +1 -1
  186. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +1 -1
  187. package/dist/lib/cjs/script-utils/check-project-types.cjs +5 -1
  188. package/dist/lib/cjs/script-utils/check-project-types.d.cts +10 -2
  189. package/dist/lib/cjs/script-utils/cli-utils.cjs +6 -2
  190. package/dist/lib/cjs/script-utils/cli-utils.d.cts +1 -1
  191. package/dist/lib/cjs/script-utils/commitlint-config.d.cts +1 -1
  192. package/dist/lib/cjs/script-utils/exec.cjs +47 -12
  193. package/dist/lib/cjs/script-utils/exec.d.cts +12 -0
  194. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -3
  195. package/dist/lib/cjs/script-utils/formatters/dprint.d.cts +2 -0
  196. package/dist/lib/cjs/script-utils/fs.d.cts +1 -1
  197. package/dist/lib/cjs/script-utils/json.cjs +9 -5
  198. package/dist/lib/cjs/script-utils/json.d.cts +41 -9
  199. package/dist/lib/cjs/script-utils/linters/eslint-config.d.cts +1 -1
  200. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +1 -1
  201. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +8 -3
  202. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +1 -1
  203. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +1 -1
  204. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +1 -1
  205. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +1 -1
  206. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +1 -1
  207. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +1 -1
  208. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +27 -7
  209. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +1 -1
  210. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +7 -3
  211. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +1 -1
  212. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +8 -3
  213. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +1 -1
  214. package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.d.cts +2 -2
  215. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -3
  216. package/dist/lib/cjs/script-utils/linters/eslint.d.cts +2 -0
  217. package/dist/lib/cjs/script-utils/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1 -1
  218. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +3 -3
  219. package/dist/lib/cjs/script-utils/linters/markdownlint.d.cts +2 -0
  220. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +72 -30
  221. package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +9 -1
  222. package/dist/lib/cjs/script-utils/npm-publish.cjs +2 -2
  223. package/dist/lib/cjs/script-utils/npm.cjs +18 -9
  224. package/dist/lib/cjs/script-utils/npm.d.cts +3 -1
  225. package/dist/lib/cjs/script-utils/root.cjs +20 -5
  226. package/dist/lib/cjs/script-utils/root.d.cts +45 -9
  227. package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +1 -1
  228. package/dist/lib/cjs/script-utils/test-runners/vitest.d.cts +2 -0
  229. package/dist/lib/cjs/script-utils/validate-declarations.cjs +8 -44
  230. package/dist/lib/cjs/script-utils/validate-declarations.d.cts +22 -9
  231. package/dist/lib/cjs/script-utils/version.cjs +36 -19
  232. package/dist/lib/cjs/script-utils/version.d.cts +20 -7
  233. package/dist/lib/cjs/strict-proxy.cjs +10 -1
  234. package/dist/lib/cjs/string.cjs +63 -22
  235. package/dist/lib/cjs/string.d.cts +194 -40
  236. package/dist/lib/cjs/value-provider.d.cts +1 -1
  237. package/dist/lib/esm/abort-controller.d.mts +2 -2
  238. package/dist/lib/esm/abort-controller.mjs +12 -9
  239. package/dist/lib/esm/async-events.d.mts +8 -0
  240. package/dist/lib/esm/async-events.mjs +9 -1
  241. package/dist/lib/esm/async.d.mts +86 -16
  242. package/dist/lib/esm/async.mjs +93 -34
  243. package/dist/lib/esm/css-class.d.mts +20 -0
  244. package/dist/lib/esm/css-class.mjs +6 -1
  245. package/dist/lib/esm/debug.d.mts +23 -5
  246. package/dist/lib/esm/debug.mjs +26 -9
  247. package/dist/lib/esm/disposable.d.mts +124 -0
  248. package/dist/lib/esm/disposable.mjs +122 -0
  249. package/dist/lib/esm/error.d.mts +23 -7
  250. package/dist/lib/esm/error.mjs +29 -18
  251. package/dist/lib/esm/html-element.d.mts +4 -2
  252. package/dist/lib/esm/html-element.mjs +9 -6
  253. package/dist/lib/esm/index.d.mts +1 -0
  254. package/dist/lib/esm/index.mjs +3 -1
  255. package/dist/lib/esm/library.mjs +2 -2
  256. package/dist/lib/esm/object-utils.d.mts +37 -12
  257. package/dist/lib/esm/object-utils.mjs +233 -128
  258. package/dist/lib/esm/obsidian/async-with-notice.d.mts +15 -2
  259. package/dist/lib/esm/obsidian/async-with-notice.mjs +9 -6
  260. package/dist/lib/esm/obsidian/attachment-path.d.mts +46 -8
  261. package/dist/lib/esm/obsidian/attachment-path.mjs +45 -13
  262. package/dist/lib/esm/obsidian/backlink.d.mts +6 -2
  263. package/dist/lib/esm/obsidian/backlink.mjs +6 -6
  264. package/dist/lib/esm/obsidian/callout.d.mts +8 -0
  265. package/dist/lib/esm/obsidian/callout.mjs +1 -1
  266. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +83 -9
  267. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +53 -16
  268. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +37 -1
  269. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +25 -5
  270. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.d.mts +43 -17
  271. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +33 -19
  272. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.d.mts +43 -17
  273. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +33 -19
  274. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +48 -8
  275. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +17 -9
  276. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +5 -2
  277. package/dist/lib/esm/obsidian/components/disposable-component.d.mts +0 -7
  278. package/dist/lib/esm/obsidian/components/disposable-component.mjs +3 -7
  279. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -2
  280. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +1 -1
  281. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +25 -4
  282. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +24 -8
  283. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -0
  284. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +197 -79
  285. package/dist/lib/esm/obsidian/dataview-link.d.mts +22 -5
  286. package/dist/lib/esm/obsidian/dataview-link.mjs +7 -2
  287. package/dist/lib/esm/obsidian/dataview.d.mts +31 -6
  288. package/dist/lib/esm/obsidian/dataview.mjs +27 -10
  289. package/dist/lib/esm/obsidian/editor-lock.d.mts +57 -0
  290. package/dist/lib/esm/obsidian/editor-lock.mjs +141 -0
  291. package/dist/lib/esm/obsidian/editor.d.mts +2 -1
  292. package/dist/lib/esm/obsidian/editor.mjs +7 -1
  293. package/dist/lib/esm/obsidian/file-change.d.mts +54 -13
  294. package/dist/lib/esm/obsidian/file-change.mjs +104 -27
  295. package/dist/lib/esm/obsidian/file-manager.d.mts +63 -13
  296. package/dist/lib/esm/obsidian/file-manager.mjs +65 -33
  297. package/dist/lib/esm/obsidian/file-system.d.mts +188 -39
  298. package/dist/lib/esm/obsidian/file-system.mjs +122 -23
  299. package/dist/lib/esm/obsidian/frontmatter.mjs +7 -2
  300. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
  301. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +4 -1
  302. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
  303. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  304. package/dist/lib/esm/obsidian/index.mjs +3 -1
  305. package/dist/lib/esm/obsidian/link.d.mts +131 -34
  306. package/dist/lib/esm/obsidian/link.mjs +327 -130
  307. package/dist/lib/esm/obsidian/logger.d.mts +26 -5
  308. package/dist/lib/esm/obsidian/logger.mjs +48 -22
  309. package/dist/lib/esm/obsidian/loop.d.mts +26 -7
  310. package/dist/lib/esm/obsidian/loop.mjs +14 -4
  311. package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +15 -5
  312. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +155 -107
  313. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -1
  314. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +1 -1
  315. package/dist/lib/esm/obsidian/markdown.d.mts +84 -16
  316. package/dist/lib/esm/obsidian/markdown.mjs +40 -11
  317. package/dist/lib/esm/obsidian/metadata-cache.d.mts +40 -30
  318. package/dist/lib/esm/obsidian/metadata-cache.mjs +88 -30
  319. package/dist/lib/esm/obsidian/modals/alert.d.mts +2 -0
  320. package/dist/lib/esm/obsidian/modals/alert.mjs +1 -1
  321. package/dist/lib/esm/obsidian/modals/confirm.d.mts +2 -0
  322. package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
  323. package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
  324. package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
  325. package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +74 -0
  326. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +126 -0
  327. package/dist/lib/esm/obsidian/modals/prompt.d.mts +6 -0
  328. package/dist/lib/esm/obsidian/modals/prompt.mjs +1 -1
  329. package/dist/lib/esm/obsidian/modals/select-item.d.mts +2 -0
  330. package/dist/lib/esm/obsidian/modals/select-item.mjs +1 -1
  331. package/dist/lib/esm/obsidian/path-settings.mjs +5 -2
  332. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +4 -0
  333. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +5 -1
  334. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +48 -11
  335. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +15 -7
  336. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +4 -4
  337. package/dist/lib/esm/obsidian/plugin/plugin.mjs +24 -21
  338. package/dist/lib/esm/obsidian/queue.d.mts +14 -2
  339. package/dist/lib/esm/obsidian/queue.mjs +9 -7
  340. package/dist/lib/esm/obsidian/resource-url.d.mts +19 -4
  341. package/dist/lib/esm/obsidian/resource-url.mjs +7 -2
  342. package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +6 -2
  343. package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +4 -2
  344. package/dist/lib/esm/obsidian/vault-delete.d.mts +11 -6
  345. package/dist/lib/esm/obsidian/vault-delete.mjs +19 -15
  346. package/dist/lib/esm/obsidian/vault.d.mts +187 -44
  347. package/dist/lib/esm/obsidian/vault.mjs +116 -59
  348. package/dist/lib/esm/path.d.mts +15 -3
  349. package/dist/lib/esm/path.mjs +12 -5
  350. package/dist/lib/esm/reg-exp.mjs +101 -78
  351. package/dist/lib/esm/script-utils/build.mjs +9 -5
  352. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +34 -14
  353. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +23 -5
  354. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +20 -5
  355. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +11 -4
  356. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +6 -2
  357. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +19 -4
  358. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +31 -12
  359. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +7 -7
  360. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +12 -3
  361. package/dist/lib/esm/script-utils/check-project-types.d.mts +9 -1
  362. package/dist/lib/esm/script-utils/check-project-types.mjs +5 -1
  363. package/dist/lib/esm/script-utils/cli-utils.mjs +6 -2
  364. package/dist/lib/esm/script-utils/exec.d.mts +12 -0
  365. package/dist/lib/esm/script-utils/exec.mjs +47 -12
  366. package/dist/lib/esm/script-utils/formatters/dprint.d.mts +2 -0
  367. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -3
  368. package/dist/lib/esm/script-utils/json.d.mts +40 -8
  369. package/dist/lib/esm/script-utils/json.mjs +9 -5
  370. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +8 -3
  371. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +27 -7
  372. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +7 -3
  373. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +8 -3
  374. package/dist/lib/esm/script-utils/linters/eslint.d.mts +2 -0
  375. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -3
  376. package/dist/lib/esm/script-utils/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1 -1
  377. package/dist/lib/esm/script-utils/linters/markdownlint.d.mts +2 -0
  378. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +3 -3
  379. package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +8 -0
  380. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +72 -30
  381. package/dist/lib/esm/script-utils/npm-publish.mjs +2 -2
  382. package/dist/lib/esm/script-utils/npm.d.mts +2 -0
  383. package/dist/lib/esm/script-utils/npm.mjs +18 -9
  384. package/dist/lib/esm/script-utils/root.d.mts +45 -9
  385. package/dist/lib/esm/script-utils/root.mjs +20 -5
  386. package/dist/lib/esm/script-utils/test-runners/vitest.d.mts +2 -0
  387. package/dist/lib/esm/script-utils/test-runners/vitest.mjs +1 -1
  388. package/dist/lib/esm/script-utils/validate-declarations.d.mts +22 -9
  389. package/dist/lib/esm/script-utils/validate-declarations.mjs +8 -51
  390. package/dist/lib/esm/script-utils/version.d.mts +20 -7
  391. package/dist/lib/esm/script-utils/version.mjs +36 -19
  392. package/dist/lib/esm/strict-proxy.mjs +10 -1
  393. package/dist/lib/esm/string.d.mts +194 -40
  394. package/dist/lib/esm/string.mjs +63 -22
  395. package/dist/styles.css +5 -1
  396. package/obsidian/Modals/minimizable-modal/package.json +6 -0
  397. package/obsidian/editor-lock/package.json +6 -0
  398. package/package.json +9 -9
@@ -87,7 +87,12 @@ function analyzeOverExposure(params) {
87
87
  }
88
88
  const { writeFile } = params;
89
89
  assertNonNullable(writeFile, "writeFile is required when shouldFix is true.");
90
- return applyOverExposureFixes(result, params.languageService.getProgram(), writeFile, params.shouldForce ?? false);
90
+ return applyOverExposureFixes({
91
+ program: params.languageService.getProgram(),
92
+ result,
93
+ shouldForce: params.shouldForce ?? false,
94
+ writeFile
95
+ });
91
96
  }
92
97
  function createLanguageServiceHost(params) {
93
98
  const { compilerOptions, fileNames, fileSystem } = params;
@@ -156,7 +161,13 @@ function analyzeExport(node, context) {
156
161
  const otherFileReferences = references.filter((reference) => toCanonical(reference.fileName) !== declFilePath);
157
162
  if (otherFileReferences.length === 0) {
158
163
  candidates.push({
159
- finding: buildFinding(declaration, nameNode, "export", "file-local", { hasNoReferences: references.length === 0, isForcedByTestOnly: false }),
164
+ finding: buildFinding({
165
+ currentExposure: "export",
166
+ flags: { hasNoReferences: references.length === 0, isForcedByTestOnly: false },
167
+ nameNode,
168
+ node: declaration,
169
+ suggestedExposure: "file-local"
170
+ }),
160
171
  isPlainFileLocal: true
161
172
  });
162
173
  continue;
@@ -164,7 +175,13 @@ function analyzeExport(node, context) {
164
175
  const nonTestReferences = otherFileReferences.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
165
176
  if (nonTestReferences.length === 0) {
166
177
  candidates.push({
167
- finding: buildFinding(declaration, nameNode, "export", "file-local", { hasNoReferences: false, isForcedByTestOnly: true }),
178
+ finding: buildFinding({
179
+ currentExposure: "export",
180
+ flags: { hasNoReferences: false, isForcedByTestOnly: true },
181
+ nameNode,
182
+ node: declaration,
183
+ suggestedExposure: "file-local"
184
+ }),
168
185
  isPlainFileLocal: false
169
186
  });
170
187
  }
@@ -175,7 +192,11 @@ function analyzeExport(node, context) {
175
192
  const canDropExport = candidates.length === nameNodes.length && candidates.every((candidate) => candidate.isPlainFileLocal || context.shouldForce);
176
193
  const exportEdit = canDropExport ? computeExportRemovalEdit(declaration) : null;
177
194
  for (const candidate of candidates) {
178
- record(context, candidate.finding, exportEdit);
195
+ record({
196
+ context,
197
+ edit: exportEdit,
198
+ finding: candidate.finding
199
+ });
179
200
  }
180
201
  }
181
202
  function analyzeMember(node, context) {
@@ -201,21 +222,31 @@ function analyzeMember(node, context) {
201
222
  }
202
223
  const sourceFile = member.getSourceFile();
203
224
  const directReferences = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
204
- const references = [...directReferences, ...collectStringLiteralReferences(nameNode, declaringClass, context)];
225
+ const references = [...directReferences, ...collectStringLiteralReferences({ context, declaringClass, nameNode })];
205
226
  const nonTestReferences = references.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
206
- const neededForSrc = computeNeededExposure(nonTestReferences, declaringClass, context);
207
- const neededWithTests = computeNeededExposure(references, declaringClass, context);
227
+ const neededForSrc = computeNeededExposure({ context, declaringClass, references: nonTestReferences });
228
+ const neededWithTests = computeNeededExposure({ context, declaringClass, references });
208
229
  if (neededForSrc === "public") {
209
230
  return;
210
231
  }
211
232
  if (rankExposure(neededForSrc) >= rankExposure(currentExposure)) {
212
233
  return;
213
234
  }
214
- const finding = buildFinding(member, nameNode, currentExposure, neededForSrc, {
215
- hasNoReferences: references.length === 0,
216
- isForcedByTestOnly: rankExposure(neededWithTests) > rankExposure(neededForSrc)
235
+ const finding = buildFinding({
236
+ currentExposure,
237
+ flags: {
238
+ hasNoReferences: references.length === 0,
239
+ isForcedByTestOnly: rankExposure(neededWithTests) > rankExposure(neededForSrc)
240
+ },
241
+ nameNode,
242
+ node: member,
243
+ suggestedExposure: neededForSrc
244
+ });
245
+ record({
246
+ context,
247
+ edit: computeMemberExposureEdit(member, neededForSrc),
248
+ finding
217
249
  });
218
- record(context, finding, computeMemberExposureEdit(member, neededForSrc));
219
250
  }
220
251
  function applyEdits(text, edits) {
221
252
  const seen = /* @__PURE__ */ new Set();
@@ -233,11 +264,12 @@ function applyEdits(text, edits) {
233
264
  }
234
265
  return result;
235
266
  }
236
- function applyOverExposureFixes(result, program, writeFile, shouldForce) {
267
+ function applyOverExposureFixes(params) {
268
+ const { program, result, shouldForce, writeFile } = params;
237
269
  const editsByFile = /* @__PURE__ */ new Map();
238
270
  const findings = result.findings.map((finding, index) => {
239
271
  const edit = result.edits[index] ?? null;
240
- const skipReason = determineSkipReason(finding, edit, shouldForce);
272
+ const skipReason = determineSkipReason({ edit, finding, shouldForce });
241
273
  if (skipReason !== null) {
242
274
  return { ...finding, skipReason, wasFixed: false };
243
275
  }
@@ -273,7 +305,8 @@ function asExportableDeclaration(node) {
273
305
  }
274
306
  return void 0;
275
307
  }
276
- function buildFinding(node, nameNode, currentExposure, suggestedExposure, flags) {
308
+ function buildFinding(params) {
309
+ const { currentExposure, flags, nameNode, node, suggestedExposure } = params;
277
310
  const sourceFile = node.getSourceFile();
278
311
  const { character, line } = sourceFile.getLineAndCharacterOfPosition(nameNode.getStart());
279
312
  return {
@@ -317,7 +350,8 @@ function collectReferences(referencedSymbols) {
317
350
  }
318
351
  return references;
319
352
  }
320
- function collectStringLiteralReferences(nameNode, declaringClass, context) {
353
+ function collectStringLiteralReferences(params) {
354
+ const { context, declaringClass, nameNode } = params;
321
355
  const occurrences = context.stringLiteralOccurrencesByText.get(nameNode.getText());
322
356
  if (!occurrences || occurrences.length === 0) {
323
357
  return [];
@@ -325,7 +359,7 @@ function collectStringLiteralReferences(nameNode, declaringClass, context) {
325
359
  const keySet = getClassKeySet(declaringClass, context.checker);
326
360
  const references = [];
327
361
  for (const occurrence of occurrences) {
328
- if (isKeyReferenceToClass(occurrence.node, keySet, context.checker)) {
362
+ if (isKeyReferenceToClass({ checker: context.checker, keySet, node: occurrence.node })) {
329
363
  references.push({ fileName: occurrence.sourceFile.fileName, start: occurrence.node.getStart() });
330
364
  }
331
365
  }
@@ -374,17 +408,18 @@ function computeMemberExposureEdit(member, suggestedExposure) {
374
408
  start: insertStart
375
409
  };
376
410
  }
377
- function computeNeededExposure(references, declaringClass, context) {
411
+ function computeNeededExposure(params) {
412
+ const { context, declaringClass, references } = params;
378
413
  if (references.length === 0) {
379
414
  return "private";
380
415
  }
381
416
  let needed = "private";
382
417
  for (const reference of references) {
383
- const referenceClass = getClassAtPosition(context.program, reference.fileName, reference.start);
418
+ const referenceClass = getClassAtPosition({ fileName: reference.fileName, position: reference.start, program: context.program });
384
419
  if (referenceClass === declaringClass) {
385
420
  continue;
386
421
  }
387
- if (referenceClass && isDerivedFrom(referenceClass, declaringClass, context.checker)) {
422
+ if (referenceClass && isDerivedFrom({ base: declaringClass, checker: context.checker, derived: referenceClass })) {
388
423
  needed = "protected";
389
424
  continue;
390
425
  }
@@ -411,7 +446,8 @@ function describeReason(finding) {
411
446
  }
412
447
  return base;
413
448
  }
414
- function determineSkipReason(finding, edit, shouldForce) {
449
+ function determineSkipReason(params) {
450
+ const { edit, finding, shouldForce } = params;
415
451
  if (finding.isForcedByTestOnly && !shouldForce) {
416
452
  return "test-only";
417
453
  }
@@ -444,7 +480,7 @@ function formatFindingBlocks(findings, baseFolder) {
444
480
  for (const [filePath, list] of byFile) {
445
481
  const sorted = [...list].sort((a, b) => a.line - b.line);
446
482
  const locationWidth = Math.max(...sorted.map((finding) => `${String(finding.line)}:${String(finding.column)}`.length));
447
- lines.push(toDisplayPath(filePath, baseFolder));
483
+ lines.push(toDisplayPath({ baseFolder, filePath }));
448
484
  for (const finding of sorted) {
449
485
  const location = `${String(finding.line)}:${String(finding.column)}`.padEnd(locationWidth);
450
486
  const change = `${finding.currentExposure} ${finding.name} -> ${finding.suggestedExposure}`;
@@ -463,7 +499,8 @@ function formatSummary(findings) {
463
499
  }
464
500
  return `${summary} ${String(fixedCount)} fixed, ${String(skippedCount)} skipped.`;
465
501
  }
466
- function getClassAtPosition(program, fileName, position) {
502
+ function getClassAtPosition(params) {
503
+ const { fileName, position, program } = params;
467
504
  const sourceFile = program.getSourceFile(fileName);
468
505
  assertNonNullable(sourceFile, `Source file not found in program: ${fileName}`);
469
506
  const node = findNodeAtPosition(sourceFile, position);
@@ -536,7 +573,8 @@ function hasTsDocComment(node) {
536
573
  function isDeclarationItself(reference, nameNode) {
537
574
  return toCanonical(reference.fileName) === toCanonical(nameNode.getSourceFile().fileName) && reference.start === nameNode.getStart();
538
575
  }
539
- function isDerivedFrom(derived, base, checker) {
576
+ function isDerivedFrom(params) {
577
+ const { base, checker, derived } = params;
540
578
  const baseSymbol = base.name ? checker.getSymbolAtLocation(base.name) : void 0;
541
579
  if (!baseSymbol) {
542
580
  return false;
@@ -551,7 +589,7 @@ function isDerivedFrom(derived, base, checker) {
551
589
  return true;
552
590
  }
553
591
  for (const declaration of symbol?.declarations ?? []) {
554
- if (isClassLike(declaration) && isDerivedFrom(declaration, base, checker)) {
592
+ if (isClassLike(declaration) && isDerivedFrom({ base, checker, derived: declaration })) {
555
593
  return true;
556
594
  }
557
595
  }
@@ -559,7 +597,8 @@ function isDerivedFrom(derived, base, checker) {
559
597
  }
560
598
  return false;
561
599
  }
562
- function isKeyReferenceToClass(node, keySet, checker) {
600
+ function isKeyReferenceToClass(params) {
601
+ const { checker, keySet, node } = params;
563
602
  const contextualType = checker.getContextualType(node);
564
603
  if (!contextualType) {
565
604
  return false;
@@ -570,7 +609,8 @@ function isKeyReferenceToClass(node, keySet, checker) {
570
609
  }
571
610
  return literals.every((literal) => keySet.has(literal));
572
611
  }
573
- function isOwnSourceFile(filePath, srcFolder) {
612
+ function isOwnSourceFile(params) {
613
+ const { filePath, srcFolder } = params;
574
614
  return filePath.startsWith(`${srcFolder}/`) && filePath.endsWith(".ts") && !filePath.endsWith(".d.ts");
575
615
  }
576
616
  function isTestFile(filePath) {
@@ -579,7 +619,8 @@ function isTestFile(filePath) {
579
619
  function rankExposure(exposure) {
580
620
  return MEMBER_EXPOSURE_ORDER.indexOf(exposure);
581
621
  }
582
- function record(context, finding, edit) {
622
+ function record(params) {
623
+ const { context, edit, finding } = params;
583
624
  context.findings.push(finding);
584
625
  context.edits.push(edit);
585
626
  }
@@ -600,7 +641,7 @@ function runOverExposureAnalysis(params) {
600
641
  };
601
642
  const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
602
643
  const filePath = toCanonical(sourceFile.fileName);
603
- return isOwnSourceFile(filePath, srcFolder) && !isTestFile(filePath);
644
+ return isOwnSourceFile({ filePath, srcFolder }) && !isTestFile(filePath);
604
645
  });
605
646
  for (const [analyzedFileCount, sourceFile] of sourceFilesToAnalyze.entries()) {
606
647
  onProgress?.({
@@ -617,7 +658,8 @@ function runOverExposureAnalysis(params) {
617
658
  node.forEachChild(visit);
618
659
  }
619
660
  }
620
- function toDisplayPath(filePath, baseFolder) {
661
+ function toDisplayPath(params) {
662
+ const { baseFolder, filePath } = params;
621
663
  if (baseFolder !== void 0 && filePath.startsWith(`${baseFolder}/`)) {
622
664
  return filePath.slice(baseFolder.length + 1);
623
665
  }
@@ -631,4 +673,4 @@ export {
631
673
  findOverExposure,
632
674
  formatOverExposureFindings
633
675
  };
634
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZSB7XG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xuICByZWFkb25seSBzb3VyY2VGaWxlOiBTb3VyY2VGaWxlO1xufVxuXG4vLyBBIEpTRG9jL1RTRG9jIGNvbW1lbnQgb3BlbnMgd2l0aCBgLyoqYDogdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMiBpcyB0aGUgc2Vjb25kIGAqYCwgYW5kIHRvIGV4Y2x1ZGUgdGhlIGVtcHR5IGAvKiovYCBjb21tZW50IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDMgbXVzdCBub3QgYmUgdGhlIGNsb3NpbmcgYC9gLlxuY29uc3QgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCA9IDI7XG5jb25zdCBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCA9IDM7XG5jb25zdCBNRU1CRVJfRVhQT1NVUkVfT1JERVI6IHJlYWRvbmx5IE1lbWJlckV4cG9zdXJlW10gPSBbJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYyddO1xuY29uc3QgU0NPUEVfREVTQ1JJUFRJT046IFJlY29yZDxTdWdnZXN0ZWRFeHBvc3VyZSwgc3RyaW5nPiA9IHtcbiAgJ2ZpbGUtbG9jYWwnOiAnd2l0aGluIGl0cyBvd24gZmlsZScsXG4gICdwcml2YXRlJzogJ2luc2lkZSBpdHMgb3duIGNsYXNzJyxcbiAgJ3Byb3RlY3RlZCc6ICdpbnNpZGUgaXRzIGNsYXNzICsgc3ViY2xhc3Nlcydcbn07XG5jb25zdCBTS0lQX1JFQVNPTl9ERVNDUklQVElPTjogUmVjb3JkPE92ZXJFeHBvc3VyZVNraXBSZWFzb24sIHN0cmluZz4gPSB7XG4gICdkZWNvcmF0ZWQnOiAnZGVjb3JhdGVkIG1lbWJlcicsXG4gICdzaGFyZWQtZXhwb3J0JzogJ2V4cG9ydCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcnLFxuICAndGVzdC1vbmx5JzogJ2V4cG9zZWQgb25seSBmb3IgdGVzdHMnXG59O1xuY29uc3QgVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUzogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4gPSBuZXcgU2V0PFN5bnRheEtpbmQ+KFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkLCBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZF0pO1xuY29uc3QgV0hJVEVTUEFDRV9QQVRURVJOID0gL1xccy87XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBwcm9qZWN0IChhbHJlYWR5IGxvYWRlZCBpbnRvIGEgbGFuZ3VhZ2Ugc2VydmljZSkgZm9yIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGFuZCBcdTIwMTRcbiAqIHdoZW4ge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQgXHUyMDE0IHRpZ2h0ZW5zIGV2ZXJ5IGZpeGFibGUgZmluZGluZyBpbiBwbGFjZVxuICogdmlhIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLndyaXRlRmlsZX0uIEZpbmRpbmdzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgKGV4cG9zZWRcbiAqIG9ubHkgZm9yIHRlc3RzLCBkZWNvcmF0ZWQsIG9yIHNoYXJpbmcgYW4gYGV4cG9ydGAga2V5d29yZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZykgY2FycnkgYVxuICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0gYW5kIGFyZSBsZWZ0IHVudG91Y2hlZCBcdTIwMTQgdW5sZXNzXG4gKiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGb3JjZX0gaXMgc2V0LCB3aGljaCBhZGRpdGlvbmFsbHkgdGlnaHRlbnMgdGhlIHRlc3Qtb25seVxuICogZmluZGluZ3MgKGRlY29yYXRlZCBhbmQgc2hhcmVkLWV4cG9ydCBvbmVzIHN0aWxsIHN0YXkgc2tpcHBlZCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMocmVzdWx0LCBwYXJhbXMubGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKSwgd3JpdGVGaWxlLCBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbEZpbGVQYXRoKTtcblxuICAgIGlmIChvdGhlckZpbGVSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gb3RoZXJGaWxlUmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuICAgIGlmIChub25UZXN0UmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyhkZWNsYXJhdGlvbiwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuRHJvcEV4cG9ydCA9IGNhbmRpZGF0ZXMubGVuZ3RoID09PSBuYW1lTm9kZXMubGVuZ3RoICYmIGNhbmRpZGF0ZXMuZXZlcnkoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlzUGxhaW5GaWxlTG9jYWwgfHwgY29udGV4dC5zaG91bGRGb3JjZSk7XG4gIGNvbnN0IGV4cG9ydEVkaXQgPSBjYW5Ecm9wRXhwb3J0ID8gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uKSA6IG51bGw7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICByZWNvcmQoY29udGV4dCwgY2FuZGlkYXRlLmZpbmRpbmcsIGV4cG9ydEVkaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG1lbWJlciA9IGFzQ2xhc3NNZW1iZXIobm9kZSk7XG4gIGlmICghbWVtYmVyIHx8ICFpc0NsYXNzTGlrZShub2RlLnBhcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSBtZW1iZXIubmFtZTtcbiAgY29uc3QgZGVjbGFyaW5nQ2xhc3MgPSBub2RlLnBhcmVudDtcblxuICBpZiAoaXNQcml2YXRlSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhtZW1iZXIpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQobWVtYmVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGRpcmVjdFJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMobmFtZU5vZGUsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KV07XG4gIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuXG4gIGNvbnN0IG5lZWRlZEZvclNyYyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZShub25UZXN0UmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuICBjb25zdCBuZWVkZWRXaXRoVGVzdHMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUocmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmluZGluZyA9IGJ1aWxkRmluZGluZyhtZW1iZXIsIG5hbWVOb2RlLCBjdXJyZW50RXhwb3N1cmUsIG5lZWRlZEZvclNyYywge1xuICAgIGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiByYW5rRXhwb3N1cmUobmVlZGVkV2l0aFRlc3RzKSA+IHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpXG4gIH0pO1xuICByZWNvcmQoY29udGV4dCwgZmluZGluZywgY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXIsIG5lZWRlZEZvclNyYykpO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhcbiAgcmVzdWx0OiBBbmFseXNpc1Jlc3VsdCxcbiAgcHJvZ3JhbTogUHJvZ3JhbSB8IHVuZGVmaW5lZCxcbiAgd3JpdGVGaWxlOiAodGhpczogdm9pZCwgcGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHZvaWQsXG4gIHNob3VsZEZvcmNlOiBib29sZWFuXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nLCBlZGl0LCBzaG91bGRGb3JjZSk7XG4gICAgaWYgKHNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb24sIHdhc0ZpeGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBhc3NlcnROb25OdWxsYWJsZShlZGl0LCAnQSBmaXhhYmxlIGZpbmRpbmcgbXVzdCBjYXJyeSBhIHRleHQgZWRpdC4nKTtcbiAgICBjb25zdCBmaWxlRWRpdHMgPSBlZGl0c0J5RmlsZS5nZXQoZWRpdC5maWxlTmFtZSkgPz8gW107XG4gICAgZmlsZUVkaXRzLnB1c2goZWRpdCk7XG4gICAgZWRpdHNCeUZpbGUuc2V0KGVkaXQuZmlsZU5hbWUsIGZpbGVFZGl0cyk7XG4gICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbjogbnVsbCwgd2FzRml4ZWQ6IHRydWUgfTtcbiAgfSk7XG5cbiAgaWYgKGVkaXRzQnlGaWxlLnNpemUgPiAwKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0EgcHJvZ3JhbSBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGFyZSBlZGl0cyB0byBhcHBseS4nKTtcbiAgICBjb25zdCBzb3VyY2VUZXh0QnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVUZXh0PigpO1xuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICAgIHNvdXJjZVRleHRCeUZpbGUuc2V0KHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLCB7IGZpbGVOYW1lOiBzb3VyY2VGaWxlLmZpbGVOYW1lLCB0ZXh0OiBzb3VyY2VGaWxlLnRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2Nhbm9uaWNhbEZpbGVOYW1lLCBmaWxlRWRpdHNdIG9mIGVkaXRzQnlGaWxlKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VUZXh0QnlGaWxlLmdldChjYW5vbmljYWxGaWxlTmFtZSk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2UsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtjYW5vbmljYWxGaWxlTmFtZX1gKTtcbiAgICAgIHdyaXRlRmlsZShzb3VyY2UuZmlsZU5hbWUsIGFwcGx5RWRpdHMoc291cmNlLnRleHQsIGZpbGVFZGl0cykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kaW5ncztcbn1cblxuZnVuY3Rpb24gYXNDbGFzc01lbWJlcihub2RlOiBOb2RlKTogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZTogTm9kZSk6IEV4cG9ydGFibGVEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWVOb2RlOiBOb2RlLFxuICBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZSxcbiAgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlLFxuICBmbGFnczogRmluZGluZ0ZsYWdzXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc2tpcFJlYXNvbjogbnVsbCxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICB3YXNGaXhlZDogZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbTogUHJvZ3JhbSk6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2xsZWN0SW5Ob2RlKHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiBpbmRleDtcblxuICBmdW5jdGlvbiBjb2xsZWN0SW5Ob2RlKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJpbmdMaXRlcmFsTGlrZShub2RlKSkge1xuICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBpbmRleC5nZXQobm9kZS50ZXh0KSA/PyBbXTtcbiAgICAgIG9jY3VycmVuY2VzLnB1c2goeyBub2RlLCBzb3VyY2VGaWxlOiBub2RlLmdldFNvdXJjZUZpbGUoKSB9KTtcbiAgICAgIGluZGV4LnNldChub2RlLnRleHQsIG9jY3VycmVuY2VzKTtcbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQoY29sbGVjdEluTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlcyhuYW1lTm9kZTogTm9kZSwgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZXh0LnN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dC5nZXQobmFtZU5vZGUuZ2V0VGV4dCgpKTtcbiAgaWYgKCFvY2N1cnJlbmNlcyB8fCBvY2N1cnJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBrZXlTZXQgPSBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKTtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9jY3VycmVuY2Ugb2Ygb2NjdXJyZW5jZXMpIHtcbiAgICBpZiAoaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG9jY3VycmVuY2Uubm9kZSwga2V5U2V0LCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogb2NjdXJyZW5jZS5zb3VyY2VGaWxlLmZpbGVOYW1lLCBzdGFydDogb2NjdXJyZW5jZS5ub2RlLmdldFN0YXJ0KCkgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZywgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0LCBzaG91bGRGb3JjZTogYm9vbGVhbik6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcm90ZWN0ZWQnO1xuICB9XG4gIHJldHVybiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlLCBrZXlTZXQ6IFJlYWRvbmx5U2V0PHN0cmluZz4sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICBpZiAoIWxpdGVyYWxzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSk7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbSlcbiAgfTtcblxuICBjb25zdCBzb3VyY2VGaWxlc1RvQW5hbHl6ZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIHJldHVybiBpc093blNvdXJjZUZpbGUoZmlsZVBhdGgsIHNyY0ZvbGRlcikgJiYgIWlzVGVzdEZpbGUoZmlsZVBhdGgpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmFseXplZEZpbGVDb3VudCwgc291cmNlRmlsZV0gb2Ygc291cmNlRmlsZXNUb0FuYWx5emUuZW50cmllcygpKSB7XG4gICAgb25Qcm9ncmVzcz8uKHtcbiAgICAgIGFuYWx5emVkRmlsZUNvdW50LFxuICAgICAgY3VycmVudEZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5sZW5ndGhcbiAgICB9KTtcbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4geyBlZGl0czogY29udGV4dC5lZGl0cywgZmluZGluZ3M6IGNvbnRleHQuZmluZGluZ3MgfTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYW5hbHl6ZU1lbWJlcihub2RlLCBjb250ZXh0KTtcbiAgICBhbmFseXplRXhwb3J0KG5vZGUsIGNvbnRleHQpO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChiYXNlRm9sZGVyICE9PSB1bmRlZmluZWQgJiYgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtiYXNlRm9sZGVyfS9gKSkge1xuICAgIHJldHVybiBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpO1xuICB9XG4gIHJldHVybiBmaWxlUGF0aDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQThPQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBNERELE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQW1ELENBQUMsV0FBVyxhQUFhLFFBQVE7QUFDMUYsTUFBTSxvQkFBdUQ7QUFBQSxFQUMzRCxjQUFjO0FBQUEsRUFDZCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQ2Y7QUFDQSxNQUFNLDBCQUFrRTtBQUFBLEVBQ3RFLGFB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
676
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGgge0BsaW5rIHNob3VsZEZpeH0pLCBkZWNsYXJhdGlvbnMgaGVsZCB3aWRlIHB1cmVseSBieVxuICAgKiB0ZXN0IHJlZmVyZW5jZXMgYXJlIHRpZ2h0ZW5lZCB0b28sIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZCB3aXRoIGEgYHRlc3Qtb25seWBcbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzIHNoYXJlZCB3aXRoIGFcbiAgICogc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcywgYmVjYXVzZSBubyBlZGl0IGNhbiBiZSBhcHBsaWVkIHNhZmVseS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBwcm9qZWN0J3MgYHNyY2AgZm9sZGVyLiBPbmx5IGRlY2xhcmF0aW9ucyBpbiBub24tdGVzdCBmaWxlc1xuICAgKiB1bmRlciB0aGlzIGZvbGRlciBhcmUgYW5hbHl6ZWQ7IGRlY2xhcmF0aW9ucyBlbHNld2hlcmUgKHRlc3QgZmlsZXMsIGRlcGVuZGVuY2llcykgYXJlIGlnbm9yZWRcbiAgICogYnV0IHN0aWxsIGNvdW50ZWQgYXMgcmVmZXJlbmNlIHNpdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgdGlnaHRlbmVkIGNvbnRlbnRzIG9mIGEgY2hhbmdlZCBmaWxlIGJhY2sgdG8gZGlzay4gUmVxdWlyZWQgd2hlbiB7QGxpbmsgc2hvdWxkRml4fVxuICAgKiBpcyBgdHJ1ZWA7IGlnbm9yZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gd3JpdGUgKG9yaWdpbmFsIGNhc2luZywgYXMgc3RvcmVkIGluIHRoZSBwcm9ncmFtKS5cbiAgICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgZnVsbCBuZXcgZmlsZSBjb250ZW50cy5cbiAgICovXG4gIHdyaXRlRmlsZT8odGhpczogdm9pZCwgcGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zIHtcbiAgLyoqIFRoZSBjb21waWxlciBvcHRpb25zLiAqL1xuICByZWFkb25seSBjb21waWxlck9wdGlvbnM6IENvbXBpbGVyT3B0aW9ucztcblxuICAvKiogVGhlIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIHByb2dyYW0uICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIFRoZSBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgdG8gcmVhZCBzb3VyY2VzLiAqL1xuICByZWFkb25seSBmaWxlU3lzdGVtOiBPdmVyRXhwb3N1cmVGaWxlU3lzdGVtO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuICovXG4gIHJlYWRvbmx5IHRzQ29uZmlnUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBleHBvc3VyZSBsZXZlbCBhIGRlY2xhcmF0aW9uIGN1cnJlbnRseSBoYXMuXG4gKi9cbmV4cG9ydCB0eXBlIEN1cnJlbnRFeHBvc3VyZSA9ICdleHBvcnQnIHwgJ3Byb3RlY3RlZCcgfCAncHVibGljJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZmluZE92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZE92ZXJFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLCBmb3IgbGl2ZSBwcm9ncmVzcyByZXBvcnRpbmcuIEZvcndhcmRlZFxuICAgKiB0byB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gICAqL1xuICBvblByb2dyZXNzPyh0aGlzOiB2b2lkLCBwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpOiB2b2lkO1xuXG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QgKHRoZSBmb2xkZXIgY29udGFpbmluZyBgdHNjb25maWcuanNvbmAgYW5kIGBzcmNgKS4gKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZml4YWJsZSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIGluIHBsYWNlIG9uIGRpc2sgKHRoZSBgZXhwb3J0YCBrZXl3b3JkIGlzIGRyb3BwZWQsXG4gICAqIG9yIGEgYHByaXZhdGVgIC8gYHByb3RlY3RlZGAgbW9kaWZpZXIgaXMgaW5zZXJ0ZWQvcmVwbGFjZWQpLiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlXG4gICAqIHByb2plY3QgaXMgb25seSBhbmFseXplZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGlyZWN0b3J5IGV4aXN0cy5cbiAgICovXG4gIGRpcmVjdG9yeUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgZmlsZUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldEN1cnJlbnREaXJlY3RvcnkodGhpczogdm9pZCk6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICBnZXREaXJlY3Rvcmllcyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBSb290IGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIGV4dGVuc2lvbnMgLSBFeHRlbnNpb25zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSBleGNsdWRlIC0gUGF0dGVybnMgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIGluY2x1ZGUgLSBQYXR0ZXJucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZGVwdGggLSBNYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGZpbGUgcGF0aHMuXG4gICAqL1xuICByZWFkRGlyZWN0b3J5KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIC8qKiAxLWJhc2VkIGNvbHVtbiBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBjb2x1bW46IG51bWJlcjtcblxuICAvKiogVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwuICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGRlY2xhcmluZyB0aGUgc3ltYm9sLiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHJlZmVyZW5jZXMgYXQgYWxsIChiZXNpZGVzIGl0c2VsZikuICovXG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIHdvdWxkIHF1YWxpZnkgZm9yIGEgdGlnaHRlciBleHBvc3VyZSBpZiBub3QgZm9yIHJlZmVyZW5jZXMgY29taW5nXG4gICAqIGV4Y2x1c2l2ZWx5IGZyb20gdGVzdCBmaWxlcyBcdTIwMTQgaS5lLiBpdCBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkuXG4gICAqL1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqIGB0cnVlYCBmb3IgYSBjbGFzcyBtZW1iZXIsIGBmYWxzZWAgZm9yIGEgdG9wLWxldmVsIGV4cG9ydC4gKi9cbiAgcmVhZG9ubHkgaXNNZW1iZXI6IGJvb2xlYW47XG5cbiAgLyoqIDEtYmFzZWQgbGluZSBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBsaW5lOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBkZWNsYXJlZCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluIGEgZml4IHJ1biwgd2h5IHRoaXMgZmluZGluZyB3YXMgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiB0aWdodGVuZWQ7IGBudWxsYCB3aGVuIGl0IHdhc1xuICAgKiBmaXhlZCBvciB3aGVuIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydGVkIChgc2hvdWxkRml4YCBvZmYpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFJlYXNvbjogbnVsbCB8IE92ZXJFeHBvc3VyZVNraXBSZWFzb247XG5cbiAgLyoqIFRoZSBleHBvc3VyZSB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgdGlnaHRlbmVkIHRvLiAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG5cbiAgLyoqIGB0cnVlYCB3aGVuIGEgZml4IHJ1biB0aWdodGVuZWQgdGhpcyBkZWNsYXJhdGlvbiBpbiBwbGFjZS4gQWx3YXlzIGBmYWxzZWAgaW4gYSByZXBvcnQgcnVuLiAqL1xuICByZWFkb25seSB3YXNGaXhlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcyByZXBvcnRlZCB3aGlsZSBhbmFseXppbmcgYSBwcm9qZWN0LCBvbmUgZXZlbnQgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVByb2dyZXNzIHtcbiAgLyoqIE51bWJlciBvZiBzb3VyY2UgZmlsZXMgZnVsbHkgYW5hbHl6ZWQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSAoMC1iYXNlZCkuICovXG4gIHJlYWRvbmx5IGFuYWx5emVkRmlsZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIGFib3V0IHRvIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuICovXG4gIHJlYWRvbmx5IHRvdGFsRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2h5IGEgZml4IHJ1biBsZWZ0IGEgZmluZGluZyB1bnRvdWNoZWQ6XG4gKlxuICogLSBgZGVjb3JhdGVkYCBcdTIwMTQgdGhlIG1lbWJlciBjYXJyaWVzIGEgZGVjb3JhdG9yLCBzbyB0aGUgbW9kaWZpZXIgaW5zZXJ0aW9uIHBvaW50IGlzIGFtYmlndW91cy5cbiAqIC0gYHNoYXJlZC1leHBvcnRgIFx1MjAxNCB0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgZGVjbGFyYXRvci5cbiAqIC0gYHRlc3Qtb25seWAgXHUyMDE0IHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdHMsIHNvIHRpZ2h0ZW5pbmcgd291bGQgYnJlYWsgdGhlIHRlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE92ZXJFeHBvc3VyZVNraXBSZWFzb24gPSAnZGVjb3JhdGVkJyB8ICdzaGFyZWQtZXhwb3J0JyB8ICd0ZXN0LW9ubHknO1xuXG4vKipcbiAqIFRoZSAodGlnaHRlcikgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZWR1Y2VkIHRvLlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRFeHBvc3VyZSA9ICdmaWxlLWxvY2FsJyB8ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnO1xuXG4vKipcbiAqIExpZmVjeWNsZSBhbmQgZnJhbWV3b3JrIG1lbWJlcnMgaW52b2tlZCBieSBPYnNpZGlhbiBvciBhIGJhc2UgY2xhc3MgdmlhIHJlZ2lzdHJhdGlvbiByYXRoZXIgdGhhblxuICogYnkgcmVmZXJlbmNlcyB0aGUgbGFuZ3VhZ2Ugc2VydmljZSBjYW4gc2VlLiBUaWdodGVuaW5nIHRoZXNlIHdvdWxkIGJyZWFrIHRoZSBmcmFtZXdvcmsgY29udHJhY3QsXG4gKiBzbyB0aGV5IGFyZSBuZXZlciByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJRkVDWUNMRV9BTExPV0xJU1Q6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnZGlzcGxheScsXG4gICdoaWRlJyxcbiAgJ29uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScsXG4gICdvbkxheW91dFJlYWR5JyxcbiAgJ29ubG9hZCcsXG4gICdvbmxvYWRJbXBsJyxcbiAgJ29uTG9hZFNldHRpbmdzJyxcbiAgJ29uU2F2ZVNldHRpbmdzJyxcbiAgJ29udW5sb2FkJyxcbiAgJ29udW5sb2FkSW1wbCdcbl0pO1xuXG5pbnRlcmZhY2UgQW5hbHlzaXNDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG4gIHJlYWRvbmx5IGVkaXRzOiAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPjtcbn1cblxuaW50ZXJmYWNlIEFuYWx5c2lzUmVzdWx0IHtcbiAgcmVhZG9ubHkgZWRpdHM6IHJlYWRvbmx5IChudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpW107XG4gIHJlYWRvbmx5IGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXN9LlxuICovXG5pbnRlcmZhY2UgQXBwbHlPdmVyRXhwb3N1cmVGaXhlc1BhcmFtcyB7XG4gIC8qKiBUaGUgcHJvZ3JhbSB3aG9zZSBzb3VyY2UgZmlsZXMgc3VwcGx5IHRoZSBvcmlnaW5hbCB0ZXh0IHRoZSBlZGl0cyBhcmUgYXBwbGllZCB0bzsgYHVuZGVmaW5lZGAgd2hlbiBubyBwcm9ncmFtIGlzIGF2YWlsYWJsZS4gKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbSB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGFuYWx5c2lzIHJlc3VsdCB3aG9zZSBmaW5kaW5ncyBhbmQgZWRpdHMgYXJlIHR1cm5lZCBpbnRvIGluLXBsYWNlIGZpeGVzLiAqL1xuICByZWFkb25seSByZXN1bHQ6IEFuYWx5c2lzUmVzdWx0O1xuXG4gIC8qKiBXaGVuIGB0cnVlYCwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnkgdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG5cbiAgLyoqIFdyaXRlcyB0aGUgdGlnaHRlbmVkIGNvbnRlbnRzIG9mIGEgY2hhbmdlZCBmaWxlIGJhY2sgdG8gZGlzay4gKi9cbiAgd3JpdGVGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRGaW5kaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEJ1aWxkRmluZGluZ1BhcmFtcyB7XG4gIC8qKiBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbCBvZiB0aGUgZGVjbGFyYXRpb24uICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKiBGbGFncyBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCBvciBpcyBmb3JjZWQgd2lkZSBieSB0ZXN0LW9ubHkgcmVmZXJlbmNlcy4gKi9cbiAgcmVhZG9ubHkgZmxhZ3M6IEZpbmRpbmdGbGFncztcblxuICAvKiogVGhlIGRlY2xhcmF0aW9uJ3MgbmFtZSBub2RlLCB1c2VkIHRvIHJlc29sdmUgaXRzIHBvc2l0aW9uIGFuZCB0ZXh0LiAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcblxuICAvKiogVGhlIGRlY2xhcmF0aW9uIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgc291cmNlIGZpbGUuICovXG4gIHJlYWRvbmx5IG5vZGU6IE5vZGU7XG5cbiAgLyoqIFRoZSB0aWdodGVyIGV4cG9zdXJlIGxldmVsIHRoZSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZWR1Y2VkIHRvLiAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG59XG5cbnR5cGUgQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA9IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXN9LlxuICovXG5pbnRlcmZhY2UgQ29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqIFRoZSBhbmFseXNpcyBjb250ZXh0IHByb3ZpZGluZyB0aGUgc3RyaW5nLWxpdGVyYWwgaW5kZXggYW5kIHR5cGUgY2hlY2tlci4gKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKiBUaGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZW1iZXIgd2hvc2UgbmFtZSB0aGUgc3RyaW5nIGxpdGVyYWxzIG1pZ2h0IHJlZmVyZW5jZS4gKi9cbiAgcmVhZG9ubHkgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uO1xuXG4gIC8qKiBUaGUgbWVtYmVyJ3MgbmFtZSBub2RlLCB3aG9zZSB0ZXh0IGlzIG1hdGNoZWQgYWdhaW5zdCBzdHJpbmctbGl0ZXJhbCBvY2N1cnJlbmNlcy4gKi9cbiAgcmVhZG9ubHkgbmFtZU5vZGU6IE5vZGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbXB1dGVOZWVkZWRFeHBvc3VyZX0uXG4gKi9cbmludGVyZmFjZSBDb21wdXRlTmVlZGVkRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGFuYWx5c2lzIGNvbnRleHQgcHJvdmlkaW5nIHRoZSBwcm9ncmFtIGFuZCB0eXBlIGNoZWNrZXIuICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKiogVGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWVtYmVyIHdob3NlIG5lZWRlZCBleHBvc3VyZSBpcyBjb21wdXRlZC4gKi9cbiAgcmVhZG9ubHkgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uO1xuXG4gIC8qKiBUaGUgcmVmZXJlbmNlIGxvY2F0aW9ucyB0aGF0IG11c3QgcmVtYWluIHJlYWNoYWJsZSBhdCB0aGUgY29tcHV0ZWQgZXhwb3N1cmUuICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IFJlZmVyZW5jZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGRldGVybWluZVNraXBSZWFzb259LlxuICovXG5pbnRlcmZhY2UgRGV0ZXJtaW5lU2tpcFJlYXNvblBhcmFtcyB7XG4gIC8qKiBUaGUgdGV4dCBlZGl0IHRoYXQgd291bGQgdGlnaHRlbiB0aGUgZmluZGluZywgb3IgYG51bGxgIHdoZW4gbm8gc2FmZSBlZGl0IGV4aXN0cy4gKi9cbiAgcmVhZG9ubHkgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0O1xuXG4gIC8qKiBUaGUgZmluZGluZyB1bmRlciBjb25zaWRlcmF0aW9uLiAqL1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuXG4gIC8qKiBXaGVuIGB0cnVlYCwgdGVzdC1vbmx5IGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgcmF0aGVyIHRoYW4gc2tpcHBlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG59XG5cbnR5cGUgRXhwb3J0YWJsZURlY2xhcmF0aW9uID0gQ2xhc3NEZWNsYXJhdGlvbiB8IEVudW1EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IFR5cGVBbGlhc0RlY2xhcmF0aW9uIHwgVmFyaWFibGVTdGF0ZW1lbnQ7XG5cbmludGVyZmFjZSBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlIHtcbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcbiAgcmVhZG9ubHkgaXNQbGFpbkZpbGVMb2NhbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZpbmRpbmdGbGFncyB7XG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRDbGFzc0F0UG9zaXRpb259LlxuICovXG5pbnRlcmZhY2UgR2V0Q2xhc3NBdFBvc2l0aW9uUGFyYW1zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcG9zaXRpb24uICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIDAtYmFzZWQgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgcmVmZXJlbmNlIHdpdGhpbiB0aGUgZmlsZS4gKi9cbiAgcmVhZG9ubHkgcG9zaXRpb246IG51bWJlcjtcblxuICAvKiogVGhlIHByb2dyYW0gdXNlZCB0byByZXNvbHZlIHRoZSBzb3VyY2UgZmlsZS4gKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNEZXJpdmVkRnJvbX0uXG4gKi9cbmludGVyZmFjZSBJc0Rlcml2ZWRGcm9tUGFyYW1zIHtcbiAgLyoqIFRoZSBjYW5kaWRhdGUgYmFzZSBjbGFzcy4gKi9cbiAgcmVhZG9ubHkgYmFzZTogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG5cbiAgLyoqIFRoZSB0eXBlIGNoZWNrZXIgdXNlZCB0byByZXNvbHZlIGhlcml0YWdlIHN5bWJvbHMuICovXG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuXG4gIC8qKiBUaGUgY2FuZGlkYXRlIGRlcml2ZWQgY2xhc3MuICovXG4gIHJlYWRvbmx5IGRlcml2ZWQ6IENsYXNzTGlrZURlY2xhcmF0aW9uO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0tleVJlZmVyZW5jZVRvQ2xhc3N9LlxuICovXG5pbnRlcmZhY2UgSXNLZXlSZWZlcmVuY2VUb0NsYXNzUGFyYW1zIHtcbiAgLyoqIFRoZSB0eXBlIGNoZWNrZXIgdXNlZCB0byByZXNvbHZlIHRoZSBsaXRlcmFsJ3MgY29udGV4dHVhbCB0eXBlLiAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKiogVGhlIHNldCBvZiBwcm9wZXJ0eSBrZXlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcy4gKi9cbiAgcmVhZG9ubHkga2V5U2V0OiBSZWFkb25seVNldDxzdHJpbmc+O1xuXG4gIC8qKiBUaGUgc3RyaW5nLWxpdGVyYWwgbm9kZSBiZWluZyB0ZXN0ZWQuICovXG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc093blNvdXJjZUZpbGV9LlxuICovXG5pbnRlcmZhY2UgSXNPd25Tb3VyY2VGaWxlUGFyYW1zIHtcbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIGZpbGUgdW5kZXIgdGVzdC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci4gKi9cbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWNvcmR9LlxuICovXG5pbnRlcmZhY2UgUmVjb3JkUGFyYW1zIHtcbiAgLyoqIFRoZSBhbmFseXNpcyBjb250ZXh0IHdob3NlIGZpbmRpbmdzIGFuZCBlZGl0cyBhcmUgYXBwZW5kZWQgdG8uICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKiogVGhlIHRleHQgZWRpdCB0aGF0IHdvdWxkIHRpZ2h0ZW4gdGhlIGZpbmRpbmcsIG9yIGBudWxsYCB3aGVuIG5vIHNhZmUgZWRpdCBleGlzdHMuICovXG4gIHJlYWRvbmx5IGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdDtcblxuICAvKiogVGhlIGZpbmRpbmcgdG8gcmVjb3JkLiAqL1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZSB7XG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xuICByZWFkb25seSBzb3VyY2VGaWxlOiBTb3VyY2VGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0b0Rpc3BsYXlQYXRofS5cbiAqL1xuaW50ZXJmYWNlIFRvRGlzcGxheVBhdGhQYXJhbXMge1xuICAvKiogV2hlbiBzZXQsIHRoZSBwYXRoIGlzIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyOyBwYXRocyBvdXRzaWRlIGl0IHN0YXkgYWJzb2x1dGUuICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCB0byByZW5kZXIuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8vIEEgSlNEb2MvVFNEb2MgY29tbWVudCBvcGVucyB3aXRoIGAvKipgOiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAyIGlzIHRoZSBzZWNvbmQgYCpgLCBhbmQgdG8gZXhjbHVkZSB0aGUgZW1wdHkgYC8qKi9gIGNvbW1lbnQgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMyBtdXN0IG5vdCBiZSB0aGUgY2xvc2luZyBgL2AuXG5jb25zdCBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUID0gMjtcbmNvbnN0IEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUID0gMztcbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIFx1MjAxNFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCBcdTIwMTQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkIFx1MjAxNCB1bmxlc3NcbiAqIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZvcmNlfSBpcyBzZXQsIHdoaWNoIGFkZGl0aW9uYWxseSB0aWdodGVucyB0aGUgdGVzdC1vbmx5XG4gKiBmaW5kaW5ncyAoZGVjb3JhdGVkIGFuZCBzaGFyZWQtZXhwb3J0IG9uZXMgc3RpbGwgc3RheSBza2lwcGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtcyk7XG4gIGlmICghcGFyYW1zLnNob3VsZEZpeCkge1xuICAgIHJldHVybiBbLi4ucmVzdWx0LmZpbmRpbmdzXTtcbiAgfVxuXG4gIGNvbnN0IHsgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGFzc2VydE5vbk51bGxhYmxlKHdyaXRlRmlsZSwgJ3dyaXRlRmlsZSBpcyByZXF1aXJlZCB3aGVuIHNob3VsZEZpeCBpcyB0cnVlLicpO1xuICByZXR1cm4gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyh7XG4gICAgcHJvZ3JhbTogcGFyYW1zLmxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCksXG4gICAgcmVzdWx0LFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UsXG4gICAgd3JpdGVGaWxlXG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbEZpbGVQYXRoKTtcblxuICAgIGlmIChvdGhlckZpbGVSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKHtcbiAgICAgICAgICBjdXJyZW50RXhwb3N1cmU6ICdleHBvcnQnLFxuICAgICAgICAgIGZsYWdzOiB7IGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsIGlzRm9yY2VkQnlUZXN0T25seTogZmFsc2UgfSxcbiAgICAgICAgICBuYW1lTm9kZSxcbiAgICAgICAgICBub2RlOiBkZWNsYXJhdGlvbixcbiAgICAgICAgICBzdWdnZXN0ZWRFeHBvc3VyZTogJ2ZpbGUtbG9jYWwnXG4gICAgICAgIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gb3RoZXJGaWxlUmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuICAgIGlmIChub25UZXN0UmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyh7XG4gICAgICAgICAgY3VycmVudEV4cG9zdXJlOiAnZXhwb3J0JyxcbiAgICAgICAgICBmbGFnczogeyBoYXNOb1JlZmVyZW5jZXM6IGZhbHNlLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHRydWUgfSxcbiAgICAgICAgICBuYW1lTm9kZSxcbiAgICAgICAgICBub2RlOiBkZWNsYXJhdGlvbixcbiAgICAgICAgICBzdWdnZXN0ZWRFeHBvc3VyZTogJ2ZpbGUtbG9jYWwnXG4gICAgICAgIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuRHJvcEV4cG9ydCA9IGNhbmRpZGF0ZXMubGVuZ3RoID09PSBuYW1lTm9kZXMubGVuZ3RoICYmIGNhbmRpZGF0ZXMuZXZlcnkoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlzUGxhaW5GaWxlTG9jYWwgfHwgY29udGV4dC5zaG91bGRGb3JjZSk7XG4gIGNvbnN0IGV4cG9ydEVkaXQgPSBjYW5Ecm9wRXhwb3J0ID8gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uKSA6IG51bGw7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICByZWNvcmQoe1xuICAgICAgY29udGV4dCxcbiAgICAgIGVkaXQ6IGV4cG9ydEVkaXQsXG4gICAgICBmaW5kaW5nOiBjYW5kaWRhdGUuZmluZGluZ1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG1lbWJlciA9IGFzQ2xhc3NNZW1iZXIobm9kZSk7XG4gIGlmICghbWVtYmVyIHx8ICFpc0NsYXNzTGlrZShub2RlLnBhcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSBtZW1iZXIubmFtZTtcbiAgY29uc3QgZGVjbGFyaW5nQ2xhc3MgPSBub2RlLnBhcmVudDtcblxuICBpZiAoaXNQcml2YXRlSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhtZW1iZXIpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQobWVtYmVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGRpcmVjdFJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgbmFtZU5vZGUgfSldO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgcmVmZXJlbmNlczogbm9uVGVzdFJlZmVyZW5jZXMgfSk7XG4gIGNvbnN0IG5lZWRlZFdpdGhUZXN0cyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZSh7IGNvbnRleHQsIGRlY2xhcmluZ0NsYXNzLCByZWZlcmVuY2VzIH0pO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmluZGluZyA9IGJ1aWxkRmluZGluZyh7XG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZsYWdzOiB7XG4gICAgICBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLFxuICAgICAgaXNGb3JjZWRCeVRlc3RPbmx5OiByYW5rRXhwb3N1cmUobmVlZGVkV2l0aFRlc3RzKSA+IHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpXG4gICAgfSxcbiAgICBuYW1lTm9kZSxcbiAgICBub2RlOiBtZW1iZXIsXG4gICAgc3VnZ2VzdGVkRXhwb3N1cmU6IG5lZWRlZEZvclNyY1xuICB9KTtcbiAgcmVjb3JkKHtcbiAgICBjb250ZXh0LFxuICAgIGVkaXQ6IGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyLCBuZWVkZWRGb3JTcmMpLFxuICAgIGZpbmRpbmdcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RWRpdHModGV4dDogc3RyaW5nLCBlZGl0czogcmVhZG9ubHkgT3ZlckV4cG9zdXJlVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgdW5pcXVlRWRpdHMgPSBlZGl0c1xuICAgIC5maWx0ZXIoKGVkaXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke1N0cmluZyhlZGl0LnN0YXJ0KX06JHtTdHJpbmcoZWRpdC5sZW5ndGgpfToke2VkaXQubmV3VGV4dH1gO1xuICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGIuc3RhcnQgLSBhLnN0YXJ0KTtcblxuICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgZm9yIChjb25zdCBlZGl0IG9mIHVuaXF1ZUVkaXRzKSB7XG4gICAgcmVzdWx0ID0gYCR7cmVzdWx0LnNsaWNlKDAsIGVkaXQuc3RhcnQpfSR7ZWRpdC5uZXdUZXh0fSR7cmVzdWx0LnNsaWNlKGVkaXQuc3RhcnQgKyBlZGl0Lmxlbmd0aCl9YDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhcHBseU92ZXJFeHBvc3VyZUZpeGVzKHBhcmFtczogQXBwbHlPdmVyRXhwb3N1cmVGaXhlc1BhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHsgcHJvZ3JhbSwgcmVzdWx0LCBzaG91bGRGb3JjZSwgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVkaXRzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZVRleHRFZGl0W10+KCk7XG4gIGNvbnN0IGZpbmRpbmdzID0gcmVzdWx0LmZpbmRpbmdzLm1hcCgoZmluZGluZywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBlZGl0ID0gcmVzdWx0LmVkaXRzW2luZGV4XSA/PyBudWxsO1xuICAgIGNvbnN0IHNraXBSZWFzb24gPSBkZXRlcm1pbmVTa2lwUmVhc29uKHsgZWRpdCwgZmluZGluZywgc2hvdWxkRm9yY2UgfSk7XG4gICAgaWYgKHNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb24sIHdhc0ZpeGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBhc3NlcnROb25OdWxsYWJsZShlZGl0LCAnQSBmaXhhYmxlIGZpbmRpbmcgbXVzdCBjYXJyeSBhIHRleHQgZWRpdC4nKTtcbiAgICBjb25zdCBmaWxlRWRpdHMgPSBlZGl0c0J5RmlsZS5nZXQoZWRpdC5maWxlTmFtZSkgPz8gW107XG4gICAgZmlsZUVkaXRzLnB1c2goZWRpdCk7XG4gICAgZWRpdHNCeUZpbGUuc2V0KGVkaXQuZmlsZU5hbWUsIGZpbGVFZGl0cyk7XG4gICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbjogbnVsbCwgd2FzRml4ZWQ6IHRydWUgfTtcbiAgfSk7XG5cbiAgaWYgKGVkaXRzQnlGaWxlLnNpemUgPiAwKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0EgcHJvZ3JhbSBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGFyZSBlZGl0cyB0byBhcHBseS4nKTtcbiAgICBjb25zdCBzb3VyY2VUZXh0QnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVUZXh0PigpO1xuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICAgIHNvdXJjZVRleHRCeUZpbGUuc2V0KHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLCB7IGZpbGVOYW1lOiBzb3VyY2VGaWxlLmZpbGVOYW1lLCB0ZXh0OiBzb3VyY2VGaWxlLnRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2Nhbm9uaWNhbEZpbGVOYW1lLCBmaWxlRWRpdHNdIG9mIGVkaXRzQnlGaWxlKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VUZXh0QnlGaWxlLmdldChjYW5vbmljYWxGaWxlTmFtZSk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2UsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtjYW5vbmljYWxGaWxlTmFtZX1gKTtcbiAgICAgIHdyaXRlRmlsZShzb3VyY2UuZmlsZU5hbWUsIGFwcGx5RWRpdHMoc291cmNlLnRleHQsIGZpbGVFZGl0cykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kaW5ncztcbn1cblxuZnVuY3Rpb24gYXNDbGFzc01lbWJlcihub2RlOiBOb2RlKTogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZTogTm9kZSk6IEV4cG9ydGFibGVEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcocGFyYW1zOiBCdWlsZEZpbmRpbmdQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3QgeyBjdXJyZW50RXhwb3N1cmUsIGZsYWdzLCBuYW1lTm9kZSwgbm9kZSwgc3VnZ2VzdGVkRXhwb3N1cmUgfSA9IHBhcmFtcztcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc2tpcFJlYXNvbjogbnVsbCxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICB3YXNGaXhlZDogZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbTogUHJvZ3JhbSk6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2xsZWN0SW5Ob2RlKHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiBpbmRleDtcblxuICBmdW5jdGlvbiBjb2xsZWN0SW5Ob2RlKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJpbmdMaXRlcmFsTGlrZShub2RlKSkge1xuICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBpbmRleC5nZXQobm9kZS50ZXh0KSA/PyBbXTtcbiAgICAgIG9jY3VycmVuY2VzLnB1c2goeyBub2RlLCBzb3VyY2VGaWxlOiBub2RlLmdldFNvdXJjZUZpbGUoKSB9KTtcbiAgICAgIGluZGV4LnNldChub2RlLnRleHQsIG9jY3VycmVuY2VzKTtcbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQoY29sbGVjdEluTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlcyhwYXJhbXM6IENvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlc1BhcmFtcyk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCB7IGNvbnRleHQsIGRlY2xhcmluZ0NsYXNzLCBuYW1lTm9kZSB9ID0gcGFyYW1zO1xuICBjb25zdCBvY2N1cnJlbmNlcyA9IGNvbnRleHQuc3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VzQnlUZXh0LmdldChuYW1lTm9kZS5nZXRUZXh0KCkpO1xuICBpZiAoIW9jY3VycmVuY2VzIHx8IG9jY3VycmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGtleVNldCA9IGdldENsYXNzS2V5U2V0KGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpO1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3Qgb2NjdXJyZW5jZSBvZiBvY2N1cnJlbmNlcykge1xuICAgIGlmIChpc0tleVJlZmVyZW5jZVRvQ2xhc3MoeyBjaGVja2VyOiBjb250ZXh0LmNoZWNrZXIsIGtleVNldCwgbm9kZTogb2NjdXJyZW5jZS5ub2RlIH0pKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogb2NjdXJyZW5jZS5zb3VyY2VGaWxlLmZpbGVOYW1lLCBzdGFydDogb2NjdXJyZW5jZS5ub2RlLmdldFN0YXJ0KCkgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHBhcmFtczogQ29tcHV0ZU5lZWRlZEV4cG9zdXJlUGFyYW1zKTogTWVtYmVyRXhwb3N1cmUge1xuICBjb25zdCB7IGNvbnRleHQsIGRlY2xhcmluZ0NsYXNzLCByZWZlcmVuY2VzIH0gPSBwYXJhbXM7XG4gIGlmIChyZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cblxuICBsZXQgbmVlZGVkOiBNZW1iZXJFeHBvc3VyZSA9ICdwcml2YXRlJztcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlcykge1xuICAgIGNvbnN0IHJlZmVyZW5jZUNsYXNzID0gZ2V0Q2xhc3NBdFBvc2l0aW9uKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgcG9zaXRpb246IHJlZmVyZW5jZS5zdGFydCwgcHJvZ3JhbTogY29udGV4dC5wcm9ncmFtIH0pO1xuICAgIGlmIChyZWZlcmVuY2VDbGFzcyA9PT0gZGVjbGFyaW5nQ2xhc3MpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgJiYgaXNEZXJpdmVkRnJvbSh7IGJhc2U6IGRlY2xhcmluZ0NsYXNzLCBjaGVja2VyOiBjb250ZXh0LmNoZWNrZXIsIGRlcml2ZWQ6IHJlZmVyZW5jZUNsYXNzIH0pKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24ocGFyYW1zOiBEZXRlcm1pbmVTa2lwUmVhc29uUGFyYW1zKTogbnVsbCB8IE92ZXJFeHBvc3VyZVNraXBSZWFzb24ge1xuICBjb25zdCB7IGVkaXQsIGZpbmRpbmcsIHNob3VsZEZvcmNlIH0gPSBwYXJhbXM7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSAmJiAhc2hvdWxkRm9yY2UpIHtcbiAgICByZXR1cm4gJ3Rlc3Qtb25seSc7XG4gIH1cbiAgaWYgKCFlZGl0KSB7XG4gICAgcmV0dXJuIGZpbmRpbmcuaXNNZW1iZXIgPyAnZGVjb3JhdGVkJyA6ICdzaGFyZWQtZXhwb3J0JztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZE5vZGVBdFBvc2l0aW9uKG5vZGU6IE5vZGUsIHBvc2l0aW9uOiBudW1iZXIpOiBOb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHBvc2l0aW9uIDwgbm9kZS5nZXRTdGFydCgpIHx8IHBvc2l0aW9uID49IG5vZGUuZ2V0RW5kKCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCByZXN1bHQ6IE5vZGUgPSBub2RlO1xuICBub2RlLmZvckVhY2hDaGlsZCgoY2hpbGQpID0+IHtcbiAgICBjb25zdCBmb3VuZCA9IGZpbmROb2RlQXRQb3NpdGlvbihjaGlsZCwgcG9zaXRpb24pO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgcmVzdWx0ID0gZm91bmQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBiYXNlRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVGaW5kaW5nW10+KCk7XG4gIGZvciAoY29uc3QgZmluZGluZyBvZiBmaW5kaW5ncykge1xuICAgIGNvbnN0IGxpc3QgPSBieUZpbGUuZ2V0KGZpbmRpbmcuZmlsZVBhdGgpID8/IFtdO1xuICAgIGxpc3QucHVzaChmaW5kaW5nKTtcbiAgICBieUZpbGUuc2V0KGZpbmRpbmcuZmlsZVBhdGgsIGxpc3QpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBsaXN0XSBvZiBieUZpbGUpIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ubGlzdF0uc29ydCgoYSwgYikgPT4gYS5saW5lIC0gYi5saW5lKTtcbiAgICBjb25zdCBsb2NhdGlvbldpZHRoID0gTWF0aC5tYXgoLi4uc29ydGVkLm1hcCgoZmluZGluZykgPT4gYCR7U3RyaW5nKGZpbmRpbmcubGluZSl9OiR7U3RyaW5nKGZpbmRpbmcuY29sdW1uKX1gLmxlbmd0aCkpO1xuICAgIGxpbmVzLnB1c2godG9EaXNwbGF5UGF0aCh7IGJhc2VGb2xkZXIsIGZpbGVQYXRoIH0pKTtcbiAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2Ygc29ydGVkKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5wYWRFbmQobG9jYXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBgJHtmaW5kaW5nLmN1cnJlbnRFeHBvc3VyZX0gJHtmaW5kaW5nLm5hbWV9IC0+ICR7ZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZX1gO1xuICAgICAgbGluZXMucHVzaChgICAke2xvY2F0aW9ufSAgJHtjaGFuZ2V9IC0tICR7ZGVzY3JpYmVSZWFzb24oZmluZGluZyl9JHtkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nKX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7U3RyaW5nKGZpbmRpbmdzLmxlbmd0aCl9IGZpbmRpbmcocykuYDtcbiAgY29uc3QgZml4ZWRDb3VudCA9IGZpbmRpbmdzLmZpbHRlcigoZmluZGluZykgPT4gZmluZGluZy53YXNGaXhlZCkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkubGVuZ3RoO1xuICBpZiAoZml4ZWRDb3VudCA9PT0gMCAmJiBza2lwcGVkQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxuICByZXR1cm4gYCR7c3VtbWFyeX0gJHtTdHJpbmcoZml4ZWRDb3VudCl9IGZpeGVkLCAke1N0cmluZyhza2lwcGVkQ291bnQpfSBza2lwcGVkLmA7XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzQXRQb3NpdGlvbihwYXJhbXM6IEdldENsYXNzQXRQb3NpdGlvblBhcmFtcyk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBmaWxlTmFtZSwgcG9zaXRpb24sIHByb2dyYW0gfSA9IHBhcmFtcztcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcm90ZWN0ZWQnO1xuICB9XG4gIHJldHVybiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20ocGFyYW1zOiBJc0Rlcml2ZWRGcm9tUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYmFzZSwgY2hlY2tlciwgZGVyaXZlZCB9ID0gcGFyYW1zO1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKHsgYmFzZSwgY2hlY2tlciwgZGVyaXZlZDogZGVjbGFyYXRpb24gfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzS2V5UmVmZXJlbmNlVG9DbGFzcyhwYXJhbXM6IElzS2V5UmVmZXJlbmNlVG9DbGFzc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGNoZWNrZXIsIGtleVNldCwgbm9kZSB9ID0gcGFyYW1zO1xuICBjb25zdCBjb250ZXh0dWFsVHlwZSA9IGNoZWNrZXIuZ2V0Q29udGV4dHVhbFR5cGUobm9kZSk7XG4gIGlmICghY29udGV4dHVhbFR5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbGl0ZXJhbHMgPSBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKGNvbnRleHR1YWxUeXBlKTtcbiAgaWYgKCFsaXRlcmFscykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbHMuZXZlcnkoKGxpdGVyYWwpID0+IGtleVNldC5oYXMobGl0ZXJhbCkpO1xufVxuXG5mdW5jdGlvbiBpc093blNvdXJjZUZpbGUocGFyYW1zOiBJc093blNvdXJjZUZpbGVQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBmaWxlUGF0aCwgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIHJldHVybiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3NyY0ZvbGRlcn0vYCkgJiYgZmlsZVBhdGguZW5kc1dpdGgoJy50cycpICYmICFmaWxlUGF0aC5lbmRzV2l0aCgnLmQudHMnKTtcbn1cblxuZnVuY3Rpb24gaXNUZXN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5pbmNsdWRlcygnLnRlc3QuJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5pbnRlZ3JhdGlvbi4nKTtcbn1cblxuZnVuY3Rpb24gcmFua0V4cG9zdXJlKGV4cG9zdXJlOiBNZW1iZXJFeHBvc3VyZSk6IG51bWJlciB7XG4gIHJldHVybiBNRU1CRVJfRVhQT1NVUkVfT1JERVIuaW5kZXhPZihleHBvc3VyZSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZChwYXJhbXM6IFJlY29yZFBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGNvbnRleHQsIGVkaXQsIGZpbmRpbmcgfSA9IHBhcmFtcztcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbSlcbiAgfTtcblxuICBjb25zdCBzb3VyY2VGaWxlc1RvQW5hbHl6ZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIHJldHVybiBpc093blNvdXJjZUZpbGUoeyBmaWxlUGF0aCwgc3JjRm9sZGVyIH0pICYmICFpc1Rlc3RGaWxlKGZpbGVQYXRoKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbYW5hbHl6ZWRGaWxlQ291bnQsIHNvdXJjZUZpbGVdIG9mIHNvdXJjZUZpbGVzVG9BbmFseXplLmVudHJpZXMoKSkge1xuICAgIG9uUHJvZ3Jlc3M/Lih7XG4gICAgICBhbmFseXplZEZpbGVDb3VudCxcbiAgICAgIGN1cnJlbnRGaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgICB0b3RhbEZpbGVDb3VudDogc291cmNlRmlsZXNUb0FuYWx5emUubGVuZ3RoXG4gICAgfSk7XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIHsgZWRpdHM6IGNvbnRleHQuZWRpdHMsIGZpbmRpbmdzOiBjb250ZXh0LmZpbmRpbmdzIH07XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGFuYWx5emVNZW1iZXIobm9kZSwgY29udGV4dCk7XG4gICAgYW5hbHl6ZUV4cG9ydChub2RlLCBjb250ZXh0KTtcbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9EaXNwbGF5UGF0aChwYXJhbXM6IFRvRGlzcGxheVBhdGhQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGJhc2VGb2xkZXIsIGZpbGVQYXRoIH0gPSBwYXJhbXM7XG4gIGlmIChiYXNlRm9sZGVyICE9PSB1bmRlZmluZWQgJiYgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtiYXNlRm9sZGVyfS9gKSkge1xuICAgIHJldHVybiBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpO1xuICB9XG4gIHJldHVybiBmaWxlUGF0aDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXNQQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVB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