@mnaoumov/obsidian-lib 10.11.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/components/all-windows-status-bar-item-component/package.json +6 -0
- package/components/shared-component-pool-component/package.json +6 -0
- package/components/worker-component/package.json +6 -0
- package/components/worker-pool-component/package.json +6 -0
- package/components/workspace-layout-state-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +477 -285
- package/dist/lib/cjs/__merged.d.cts +26 -10
- package/dist/lib/cjs/anchored-suggest.cjs +1 -1
- package/dist/lib/cjs/app.cjs +2 -2
- package/dist/lib/cjs/async-with-notice.cjs +4 -4
- package/dist/lib/cjs/attachment-path.cjs +9 -9
- package/dist/lib/cjs/attachment-path.d.cts +3 -3
- package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
- package/dist/lib/cjs/backlink-index.cjs +5 -5
- package/dist/lib/cjs/backlink.cjs +7 -7
- package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
- package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
- package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
- package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
- package/dist/lib/cjs/bug-report.cjs +38 -12
- package/dist/lib/cjs/bug-report.d.cts +65 -0
- package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
- package/dist/lib/cjs/bulk-operation.cjs +2 -2
- package/dist/lib/cjs/callout.cjs +6 -6
- package/dist/lib/cjs/canvas.cjs +11 -9
- package/dist/lib/cjs/canvas.d.cts +13 -0
- package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
- package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
- package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
- package/dist/lib/cjs/codemirror/index.cjs +7 -7
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
- package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
- package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
- package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
- package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
- package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
- package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/index.cjs +15 -15
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
- package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
- package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
- package/dist/lib/cjs/community-plugins.cjs +3 -3
- package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
- package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
- package/dist/lib/cjs/components/async-events-component.cjs +1 -1
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
- package/dist/lib/cjs/components/component-ex.cjs +21 -11
- package/dist/lib/cjs/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
- package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
- package/dist/lib/cjs/components/disposable-component.cjs +2 -2
- package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
- package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
- package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
- package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
- package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
- package/dist/lib/cjs/components/index.cjs +54 -39
- package/dist/lib/cjs/components/index.d.cts +5 -0
- package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
- package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
- package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
- package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
- package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
- package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
- package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
- package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
- package/dist/lib/cjs/components/registry-component.cjs +2 -2
- package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
- package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
- package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
- package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
- package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
- package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
- package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
- package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
- package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
- package/dist/lib/cjs/components/worker-component.cjs +363 -0
- package/dist/lib/cjs/components/worker-component.d.cts +156 -0
- package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
- package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
- package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
- package/dist/lib/cjs/constructors/index.cjs +1 -1
- package/dist/lib/cjs/css-class.cjs +5 -1
- package/dist/lib/cjs/css-class.d.cts +16 -0
- package/dist/lib/cjs/data-handler.cjs +264 -6
- package/dist/lib/cjs/data-handler.d.cts +219 -2
- package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
- package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
- package/dist/lib/cjs/data-stores/index.cjs +6 -6
- package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
- package/dist/lib/cjs/dataview-link.cjs +2 -2
- package/dist/lib/cjs/dataview.cjs +27 -7
- package/dist/lib/cjs/dataview.d.cts +14 -0
- package/dist/lib/cjs/debug.cjs +3 -3
- package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
- package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
- package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
- package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
- package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
- package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
- package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
- package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
- package/dist/lib/cjs/disposable.cjs +150 -0
- package/dist/lib/cjs/disposable.d.cts +39 -0
- package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
- package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
- package/dist/lib/cjs/editor-suggest.cjs +1 -1
- package/dist/lib/cjs/editor.cjs +6 -6
- package/dist/lib/cjs/events.cjs +2 -2
- package/dist/lib/cjs/extensions-registrar.cjs +1 -1
- package/dist/lib/cjs/feature-request.cjs +1 -1
- package/dist/lib/cjs/file-change.cjs +10 -10
- package/dist/lib/cjs/file-explorer.cjs +2 -2
- package/dist/lib/cjs/file-manager.cjs +5 -5
- package/dist/lib/cjs/file-system.cjs +10 -10
- package/dist/lib/cjs/folder-note.cjs +4 -4
- package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
- package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
- package/dist/lib/cjs/frontmatter.cjs +5 -5
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/git-rename-history.cjs +1 -1
- package/dist/lib/cjs/git-rename-history.d.cts +2 -2
- package/dist/lib/cjs/hotkey.cjs +1 -1
- package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
- package/dist/lib/cjs/html-element.cjs +2 -2
- package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
- package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
- package/dist/lib/cjs/i18n/i18n.cjs +7 -7
- package/dist/lib/cjs/i18n/index.cjs +4 -4
- package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
- package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
- package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
- package/dist/lib/cjs/index.cjs +147 -126
- package/dist/lib/cjs/index.d.cts +7 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
- package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/library-styles.cjs +3 -3
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
- package/dist/lib/cjs/link.cjs +76 -56
- package/dist/lib/cjs/link.d.cts +20 -14
- package/dist/lib/cjs/logger.cjs +4 -4
- package/dist/lib/cjs/loop.cjs +10 -16
- package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
- package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
- package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
- package/dist/lib/cjs/markdown-view.cjs +191 -3
- package/dist/lib/cjs/markdown-view.d.cts +48 -1
- package/dist/lib/cjs/markdown.cjs +12 -12
- package/dist/lib/cjs/metadata-cache.cjs +23 -23
- package/dist/lib/cjs/metadata-cache.d.cts +5 -4
- package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
- package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
- package/dist/lib/cjs/mobile-app-info.cjs +1 -1
- package/dist/lib/cjs/modals/alert.cjs +4 -4
- package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
- package/dist/lib/cjs/modals/confirm.cjs +4 -4
- package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
- package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
- package/dist/lib/cjs/modals/index.cjs +17 -11
- package/dist/lib/cjs/modals/index.d.cts +2 -0
- package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
- package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
- package/dist/lib/cjs/modals/modal.cjs +3 -3
- package/dist/lib/cjs/modals/prompt.cjs +10 -10
- package/dist/lib/cjs/modals/prompt.d.cts +1 -1
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
- package/dist/lib/cjs/modals/select-item.cjs +6 -6
- package/dist/lib/cjs/modals/select-option.cjs +3 -3
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
- package/dist/lib/cjs/note-priority.cjs +2 -2
- package/dist/lib/cjs/notebook-navigator.cjs +12 -2
- package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
- package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
- package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian-settings.cjs +1 -1
- package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
- package/dist/lib/cjs/parse-link.cjs +14 -14
- package/dist/lib/cjs/path-compatibility.cjs +368 -0
- package/dist/lib/cjs/path-compatibility.d.cts +263 -0
- package/dist/lib/cjs/path-settings.cjs +3 -3
- package/dist/lib/cjs/pdf.cjs +2 -2
- package/dist/lib/cjs/plugin/index.cjs +18 -12
- package/dist/lib/cjs/plugin/index.d.cts +2 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
- package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
- package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
- package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
- package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
- package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
- package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
- package/dist/lib/cjs/plugin/plugin.cjs +133 -34
- package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
- package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
- package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
- package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
- package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
- package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
- package/dist/lib/cjs/popovers/index.cjs +3 -3
- package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
- package/dist/lib/cjs/popovers/popover.cjs +5 -5
- package/dist/lib/cjs/queue.cjs +8 -8
- package/dist/lib/cjs/react/app-context.cjs +3 -3
- package/dist/lib/cjs/react/index.cjs +1 -1
- package/dist/lib/cjs/reference-definition.cjs +1 -1
- package/dist/lib/cjs/reference.cjs +3 -3
- package/dist/lib/cjs/release-asset.cjs +5 -5
- package/dist/lib/cjs/rendered-markdown.cjs +4 -4
- package/dist/lib/cjs/request-url.cjs +4 -4
- package/dist/lib/cjs/resource-lock.cjs +46 -42
- package/dist/lib/cjs/resource-lock.d.cts +8 -7
- package/dist/lib/cjs/resource-url.cjs +3 -3
- package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
- package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/index.cjs +30 -30
- package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
- package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
- package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
- package/dist/lib/cjs/setting-ex.cjs +26 -26
- package/dist/lib/cjs/setting-group-ex.cjs +2 -2
- package/dist/lib/cjs/settings-recovery.cjs +217 -0
- package/dist/lib/cjs/settings-recovery.d.cts +178 -0
- package/dist/lib/cjs/settings-tabs.cjs +5 -5
- package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
- package/dist/lib/cjs/templater.cjs +14 -4
- package/dist/lib/cjs/templater.d.cts +6 -0
- package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
- package/dist/lib/cjs/transformers/index.cjs +1 -1
- package/dist/lib/cjs/trusted-input.cjs +1 -1
- package/dist/lib/cjs/validation.cjs +4 -4
- package/dist/lib/cjs/vault-delete.cjs +6 -6
- package/dist/lib/cjs/vault-transaction.cjs +5 -5
- package/dist/lib/cjs/vault.cjs +12 -12
- package/dist/lib/cjs/view-registrar.cjs +1 -1
- package/dist/lib/cjs/virtual-file.cjs +16 -14
- package/dist/lib/cjs/virtual-file.d.cts +2 -1
- package/dist/lib/cjs/wasm.cjs +119 -0
- package/dist/lib/cjs/wasm.d.cts +54 -0
- package/dist/lib/cjs/worker-protocol.cjs +209 -0
- package/dist/lib/cjs/worker-protocol.d.cts +282 -0
- package/dist/lib/cjs/workspace.cjs +1 -1
- package/dist/lib/esm/__merged.d.mts +26 -10
- package/dist/lib/esm/__merged.mjs +215 -5
- package/dist/lib/esm/app.mjs +2 -2
- package/dist/lib/esm/attachment-path.d.mts +3 -3
- package/dist/lib/esm/attachment-path.mjs +2 -2
- package/dist/lib/esm/backlink-index.mjs +2 -2
- package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
- package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
- package/dist/lib/esm/bug-report.d.mts +65 -0
- package/dist/lib/esm/bug-report.mjs +33 -10
- package/dist/lib/esm/canvas.d.mts +13 -0
- package/dist/lib/esm/canvas.mjs +6 -5
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
- package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
- package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
- package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
- package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
- package/dist/lib/esm/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/components/component-ex.mjs +19 -6
- package/dist/lib/esm/components/disposable-component.mjs +1 -1
- package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
- package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
- package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
- package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
- package/dist/lib/esm/components/index.d.mts +5 -0
- package/dist/lib/esm/components/index.mjs +12 -2
- package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
- package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
- package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
- package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
- package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
- package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
- package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
- package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
- package/dist/lib/esm/components/worker-component.d.mts +156 -0
- package/dist/lib/esm/components/worker-component.mjs +279 -0
- package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
- package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
- package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
- package/dist/lib/esm/css-class.d.mts +16 -0
- package/dist/lib/esm/css-class.mjs +5 -1
- package/dist/lib/esm/data-handler.d.mts +219 -2
- package/dist/lib/esm/data-handler.mjs +262 -5
- package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
- package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
- package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
- package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
- package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
- package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
- package/dist/lib/esm/dataview.d.mts +14 -0
- package/dist/lib/esm/dataview.mjs +19 -1
- package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
- package/dist/lib/esm/demo-vault-helper.mjs +29 -1
- package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
- package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
- package/dist/lib/esm/desktop-git-runner.mjs +3 -3
- package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
- package/dist/lib/esm/disposable.d.mts +39 -0
- package/dist/lib/esm/disposable.mjs +64 -0
- package/dist/lib/esm/file-system.mjs +2 -2
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/git-rename-history.d.mts +2 -2
- package/dist/lib/esm/git-rename-history.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
- package/dist/lib/esm/i18n/locales/en.mjs +27 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
- package/dist/lib/esm/index.d.mts +7 -0
- package/dist/lib/esm/index.mjs +15 -1
- package/dist/lib/esm/link.d.mts +20 -14
- package/dist/lib/esm/link.mjs +57 -38
- package/dist/lib/esm/loop.mjs +2 -8
- package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
- package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
- package/dist/lib/esm/markdown-view.d.mts +48 -1
- package/dist/lib/esm/markdown-view.mjs +192 -2
- package/dist/lib/esm/metadata-cache.d.mts +5 -4
- package/dist/lib/esm/metadata-cache.mjs +6 -6
- package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
- package/dist/lib/esm/misplaced-attachment.mjs +212 -0
- package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
- package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
- package/dist/lib/esm/modals/index.d.mts +2 -0
- package/dist/lib/esm/modals/index.mjs +5 -1
- package/dist/lib/esm/modals/prompt.d.mts +1 -1
- package/dist/lib/esm/modals/prompt.mjs +1 -1
- package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
- package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
- package/dist/lib/esm/notebook-navigator.d.mts +6 -0
- package/dist/lib/esm/notebook-navigator.mjs +11 -2
- package/dist/lib/esm/parse-link.mjs +4 -4
- package/dist/lib/esm/path-compatibility.d.mts +263 -0
- package/dist/lib/esm/path-compatibility.mjs +277 -0
- package/dist/lib/esm/plugin/index.d.mts +2 -0
- package/dist/lib/esm/plugin/index.mjs +6 -2
- package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
- package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
- package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
- package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
- package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
- package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
- package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
- package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
- package/dist/lib/esm/plugin/plugin.d.mts +35 -5
- package/dist/lib/esm/plugin/plugin.mjs +118 -9
- package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
- package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
- package/dist/lib/esm/release-asset.mjs +1 -1
- package/dist/lib/esm/resource-lock.d.mts +8 -7
- package/dist/lib/esm/resource-lock.mjs +31 -26
- package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
- package/dist/lib/esm/settings-recovery.d.mts +178 -0
- package/dist/lib/esm/settings-recovery.mjs +125 -0
- package/dist/lib/esm/settings-tabs.mjs +2 -2
- package/dist/lib/esm/templater.d.mts +6 -0
- package/dist/lib/esm/templater.mjs +11 -2
- package/dist/lib/esm/vault.mjs +1 -1
- package/dist/lib/esm/virtual-file.d.mts +2 -1
- package/dist/lib/esm/virtual-file.mjs +7 -5
- package/dist/lib/esm/wasm.d.mts +54 -0
- package/dist/lib/esm/wasm.mjs +30 -0
- package/dist/lib/esm/worker-protocol.d.mts +282 -0
- package/dist/lib/esm/worker-protocol.mjs +113 -0
- package/dist/styles.css +16 -1
- package/modals/copy-text-manually/package.json +6 -0
- package/modals/review-bug-report-diagnostics/package.json +6 -0
- package/package.json +10 -8
- package/plugin/plugin-instance/package.json +6 -0
- package/plugin/third-party-plugin/package.json +6 -0
|
@@ -31,10 +31,7 @@ ensureBrowserProcess();
|
|
|
31
31
|
})();
|
|
32
32
|
|
|
33
33
|
import { convertAsyncToSync } from "@mnaoumov/typescript-lib/async";
|
|
34
|
-
import {
|
|
35
|
-
compare as compareVersions,
|
|
36
|
-
satisfies as satisfiesVersion
|
|
37
|
-
} from "compare-versions";
|
|
34
|
+
import { satisfies as satisfiesVersion } from "compare-versions";
|
|
38
35
|
import {
|
|
39
36
|
ButtonComponent,
|
|
40
37
|
PluginSettingTab
|
|
@@ -52,16 +49,23 @@ import {
|
|
|
52
49
|
watchPluginApi
|
|
53
50
|
} from "../plugin/plugin-api.mjs";
|
|
54
51
|
import {
|
|
52
|
+
comparePluginVersionWithMinimum,
|
|
55
53
|
getInstalledPluginState,
|
|
56
54
|
getInstalledPluginVersion,
|
|
57
55
|
installAndEnablePlugin,
|
|
58
56
|
InstalledPluginState,
|
|
57
|
+
PluginVersionComparison,
|
|
59
58
|
updatePlugin
|
|
60
59
|
} from "../plugin/plugin-install-state.mjs";
|
|
60
|
+
import { PLUGINS_CHANGED_EVENT_NAME } from "../plugin/plugin-instance.mjs";
|
|
61
61
|
import {
|
|
62
62
|
PLUGIN_LOADED_EVENT_NAME,
|
|
63
63
|
PLUGIN_UNLOADED_EVENT_NAME
|
|
64
64
|
} from "../plugin/plugin-lifecycle-events.mjs";
|
|
65
|
+
import {
|
|
66
|
+
isThirdPartyPluginDependency,
|
|
67
|
+
watchThirdPartyPluginApi
|
|
68
|
+
} from "../plugin/third-party-plugin.mjs";
|
|
65
69
|
import { openSettingTab } from "../settings-modal.mjs";
|
|
66
70
|
import { registerAsyncEvent } from "./async-events-component.mjs";
|
|
67
71
|
import { ComponentEx } from "./component-ex.mjs";
|
|
@@ -93,7 +97,7 @@ class BlockedPluginSettingTab extends PluginSettingTab {
|
|
|
93
97
|
}
|
|
94
98
|
class PluginGateComponent extends ComponentEx {
|
|
95
99
|
announcedWarningPluginIds = /* @__PURE__ */ new Set();
|
|
96
|
-
|
|
100
|
+
apiWatches = /* @__PURE__ */ new Map();
|
|
97
101
|
blockedSettingTab = null;
|
|
98
102
|
conflicts;
|
|
99
103
|
dependencies;
|
|
@@ -141,20 +145,21 @@ class PluginGateComponent extends ComponentEx {
|
|
|
141
145
|
*/
|
|
142
146
|
onload() {
|
|
143
147
|
for (const dependency of this.dependencies) {
|
|
144
|
-
const
|
|
145
|
-
apiVersionRange: dependency.apiVersionRange,
|
|
146
|
-
app: this.app,
|
|
147
|
-
component: this,
|
|
148
|
-
pluginId: dependency.pluginId
|
|
149
|
-
});
|
|
148
|
+
const apiWatch = this.watchDependencyApi(dependency);
|
|
150
149
|
registerAsyncEvent(
|
|
151
150
|
this,
|
|
152
|
-
|
|
151
|
+
apiWatch.ref.on("change", async () => {
|
|
153
152
|
await this.refresh();
|
|
154
153
|
})
|
|
155
154
|
);
|
|
156
|
-
this.
|
|
155
|
+
this.apiWatches.set(dependency.pluginId, apiWatch);
|
|
157
156
|
}
|
|
157
|
+
this.registerEvent(this.app.plugins.on(
|
|
158
|
+
PLUGINS_CHANGED_EVENT_NAME,
|
|
159
|
+
convertAsyncToSync(async () => {
|
|
160
|
+
await this.refresh();
|
|
161
|
+
})
|
|
162
|
+
));
|
|
158
163
|
const lifecycleEventNames = [PLUGIN_LOADED_EVENT_NAME, PLUGIN_UNLOADED_EVENT_NAME];
|
|
159
164
|
for (const eventName of lifecycleEventNames) {
|
|
160
165
|
this.registerEvent(this.app.workspace.on(
|
|
@@ -301,7 +306,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
301
306
|
return this.conflicts.filter((conflict) => conflict.severity === severity && this.isConflictActive(conflict));
|
|
302
307
|
}
|
|
303
308
|
getUnsatisfiedDependencies() {
|
|
304
|
-
return this.dependencies.filter((dependency) => !this.
|
|
309
|
+
return this.dependencies.filter((dependency) => !this.apiWatches.get(dependency.pluginId)?.ref.value || this.isBelowMinPluginVersion(dependency));
|
|
305
310
|
}
|
|
306
311
|
hideBlockedSettingTab() {
|
|
307
312
|
if (!this.blockedSettingTab) {
|
|
@@ -317,7 +322,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
317
322
|
* reloading the provider, which fires the API watch's `change`, so the gate opens without a restart.
|
|
318
323
|
*
|
|
319
324
|
* @param dependency - The declared dependency.
|
|
320
|
-
* @returns Whether the dependency is enabled below its {@link
|
|
325
|
+
* @returns Whether the dependency is enabled below its {@link PluginDependencyBase.minPluginVersion}; `false`
|
|
321
326
|
* when it declares none or is not enabled, since its API is then absent anyway.
|
|
322
327
|
*/
|
|
323
328
|
isBelowMinPluginVersion(dependency) {
|
|
@@ -328,14 +333,7 @@ class PluginGateComponent extends ComponentEx {
|
|
|
328
333
|
app: this.app,
|
|
329
334
|
pluginId: dependency.pluginId
|
|
330
335
|
});
|
|
331
|
-
|
|
332
|
-
return false;
|
|
333
|
-
}
|
|
334
|
-
try {
|
|
335
|
-
return !compareVersions(installedVersion, dependency.minPluginVersion, ">=");
|
|
336
|
-
} catch {
|
|
337
|
-
return true;
|
|
338
|
-
}
|
|
336
|
+
return installedVersion !== null && comparePluginVersionWithMinimum(installedVersion, dependency.minPluginVersion) !== PluginVersionComparison.AtLeastMinimum;
|
|
339
337
|
}
|
|
340
338
|
/**
|
|
341
339
|
* Decides whether one declared conflict is in force right now.
|
|
@@ -384,14 +382,14 @@ class PluginGateComponent extends ComponentEx {
|
|
|
384
382
|
/**
|
|
385
383
|
* Decides whether a dependency is running but too old for this plugin, so the advice is "update it".
|
|
386
384
|
*
|
|
387
|
-
* Two independent signals say so: a release below {@link
|
|
385
|
+
* Two independent signals say so: a release below {@link PluginDependencyBase.minPluginVersion}, and a published
|
|
388
386
|
* API whose contract version is outside {@link PluginDependency.apiVersionRange}.
|
|
389
387
|
*
|
|
390
388
|
* @param dependency - The declared dependency.
|
|
391
389
|
* @returns Whether updating the dependency is what it needs.
|
|
392
390
|
*/
|
|
393
391
|
isTooOld(dependency) {
|
|
394
|
-
return this.isBelowMinPluginVersion(dependency) || this.
|
|
392
|
+
return this.isBelowMinPluginVersion(dependency) || this.apiWatches.get(dependency.pluginId)?.isApiVersionMismatch() === true;
|
|
395
393
|
}
|
|
396
394
|
/**
|
|
397
395
|
* Says what is in the way, and puts the same explanation where the user will look for the plugin's
|
|
@@ -550,9 +548,46 @@ class PluginGateComponent extends ComponentEx {
|
|
|
550
548
|
this.app.setting.addSettingTab(blockedSettingTab);
|
|
551
549
|
this.blockedSettingTab = blockedSettingTab;
|
|
552
550
|
}
|
|
551
|
+
/**
|
|
552
|
+
* Starts watching one dependency's API, the way its kind is read.
|
|
553
|
+
*
|
|
554
|
+
* A third-party dependency is read through its adapter, which has no contract version, so it never reports
|
|
555
|
+
* an API version mismatch: its "too old" signal is {@link PluginDependencyBase.minPluginVersion} alone, which
|
|
556
|
+
* `isBelowMinPluginVersion` reads for both kinds. So the watch is NOT handed the minimum: the ref would only
|
|
557
|
+
* read `null` for the same reason, and the gate could no longer tell "update it" from "install it".
|
|
558
|
+
*
|
|
559
|
+
* @param dependency - The declared dependency.
|
|
560
|
+
* @returns The watch.
|
|
561
|
+
*/
|
|
562
|
+
watchDependencyApi(dependency) {
|
|
563
|
+
if (isThirdPartyPluginDependency(dependency)) {
|
|
564
|
+
return {
|
|
565
|
+
isApiVersionMismatch: () => false,
|
|
566
|
+
ref: watchThirdPartyPluginApi({
|
|
567
|
+
adapter: {
|
|
568
|
+
getApi: dependency.adapter.getApi,
|
|
569
|
+
pluginId: dependency.adapter.pluginId,
|
|
570
|
+
pluginName: dependency.adapter.pluginName
|
|
571
|
+
},
|
|
572
|
+
app: this.app,
|
|
573
|
+
component: this
|
|
574
|
+
})
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
const apiRef = watchPluginApi({
|
|
578
|
+
apiVersionRange: dependency.apiVersionRange,
|
|
579
|
+
app: this.app,
|
|
580
|
+
component: this,
|
|
581
|
+
pluginId: dependency.pluginId
|
|
582
|
+
});
|
|
583
|
+
return {
|
|
584
|
+
isApiVersionMismatch: () => apiRef.unavailabilityReason === PluginApiUnavailabilityReason.VersionMismatch,
|
|
585
|
+
ref: apiRef
|
|
586
|
+
};
|
|
587
|
+
}
|
|
553
588
|
}
|
|
554
589
|
export {
|
|
555
590
|
PluginConflictSeverity,
|
|
556
591
|
PluginGateComponent
|
|
557
592
|
};
|
|
558
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgb3BlblNldHRpbmdUYWIgfSBmcm9tICcuLi9zZXR0aW5ncy1tb2RhbC50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0xheW91dFJlYWR5Q29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtcmVhZHktY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIGdhdGUgdGhhdCBjbG9zZWQgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZyB3YWl0cyBiZWZvcmUgc2F5aW5nIHNvLlxuICpcbiAqIExvbmcgZW5vdWdoIHRvIGNvdmVyIE9ic2lkaWFuIHJlbG9hZGluZyBhIHBsdWdpbiB0byBhcHBseSBpdHMgdXBkYXRlLCBzaG9ydCBlbm91Z2ggdGhhdCBhIHVzZXIgd2hvXG4gKiBkaXNhYmxlZCB0aGUgZGVwZW5kZW5jeSBieSBoYW5kIHN0aWxsIGNvbm5lY3RzIHRoZSBub3RpY2UgdG8gd2hhdCB0aGV5IGp1c3QgZGlkLlxuICovXG5jb25zdCBMT1NTX0FOTk9VTkNFTUVOVF9HUkFDRV9QRVJJT0RfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuLyoqXG4gKiBIb3cgYmFkbHkgdHdvIHBsdWdpbnMgcnVubmluZyBzaWRlIGJ5IHNpZGUgZ29lcyB3cm9uZywgYW5kIHRoZXJlZm9yZSB3aGF0IHRoaXMgb25lIGRvZXMgYWJvdXQgaXQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkge1xuICAvKipcbiAgICogVGhlIGhvc3QgcmVmdXNlcyB0byBydW4gYXQgYWxsIHdoaWxlIHRoZSBjb25mbGljdCBob2xkczogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vdGhpbmcgaXNcbiAgICogcmVnaXN0ZXJlZCwgYW5kIHRoZSBwbHVnaW4gZXhwbGFpbnMgaXRzZWxmIHRoZSB3YXkgYSBtaXNzaW5nIGRlcGVuZGVuY3kgZG9lcy5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgd2hlcmUgYm90aCBwbHVnaW5zIGFjdGluZyBvbiB0aGUgc2FtZSBvcGVyYXRpb24gZGFtYWdlcyB0aGUgdmF1bHQuXG4gICAqL1xuICBCbG9jayA9ICdibG9jaycsXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IHJ1bnMgYW55d2F5IGFuZCBzYXlzIHRoZSBvdmVybGFwIGlzIHRoZXJlLlxuICAgKlxuICAgKiBGb3IgYW4gb3ZlcmxhcCB0aGF0IGlzIGFubm95aW5nIHJhdGhlciB0aGFuIGRlc3RydWN0aXZlIOKAlCBkdXBsaWNhdGUgY29tbWFuZHMsIHdvcmsgZG9uZSB0d2ljZSDigJQgd2hlcmVcbiAgICogcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBjb3N0IHRoZSB1c2VyIG1vcmUgdGhhbiB0aGUgb3ZlcmxhcCBkb2VzLlxuICAgKi9cbiAgV2FybiA9ICd3YXJuJ1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIGFub3RoZXIgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSwgb3Igd2FybnMgYWJvdXQgcnVubmluZyBiZXNpZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQ29uZmxpY3Qge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiB0aGUgT1RIRVIgcGx1Z2luJ3MgdmVyc2lvbnMgdGhhdCBjb25mbGljdCwgZS5nLiBgJzwxMi4wLjAnYCBmb3IgXCJldmVyeSB2ZXJzaW9uXG4gICAqIGJlZm9yZSB0aGUgb25lIHRoYXQgZ2F2ZSB0aGlzIGJlaGF2aW9yIHVwXCIuXG4gICAqXG4gICAqIEEgcmFuZ2UgcmF0aGVyIHRoYW4gYSBtaW5pbXVtLCBzbyBhbiBvdmVybGFwIGNvbmZpbmVkIHRvIG9uZSBtYWpvciAoYCc+PTMgPDQnYCkgaXMgZXhwcmVzc2libGUsIGFuZCBzb1xuICAgKiBpcyBhIHBsdWdpbiB0aGF0IGNvbmZsaWN0cyBhdCBldmVyeSB2ZXJzaW9uIOKAlCBzcGVsbCB0aGF0IGAnPj0wLjAuMCdgLCBzaW5jZSBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0c1xuICAgKiBhIGJhcmUgYCpgLiBFdmFsdWF0ZWQgYWdhaW5zdCBgbWFuaWZlc3QudmVyc2lvbmA7IGEgdmVyc2lvbiB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgY291bnRzIGFzXG4gICAqIGNvbmZsaWN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RpbmdWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiwgYXMgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiwgc2hvd24gdG8gdGhlIHVzZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbG9jYWxpemVkIHNlbnRlbmNlIHNheWluZyB3aGF0IGdvZXMgd3Jvbmcgd2hlbiBib3RoIHJ1biwgc2hvd24gaW4gdGhlIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlY2xhcmluZyBwbHVnaW4gb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCB0aGUgdHdvIG9mIHRoZW0gY29sbGlkZSBvdmVyLCBhbmQgYVxuICAgKiB1c2VyIGJlaW5nIGFza2VkIHRvIGRpc2FibGUgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCB0aGlzIHBsdWdpbiBkb2VzIGFib3V0IHRoZSBjb25mbGljdC5cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5O1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIGFub3RoZXIgcGx1Z2luIGNhbm5vdCB3b3JrIHdpdGhvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGVwZW5kZW5jeSB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIEFQSSBjb250cmFjdCB2ZXJzaW9ucyB0aGUgZGVwZW5kZW50IGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLlxuICAgKlxuICAgKiBBIGRlcGVuZGVuY3kgd2hvc2UgcHVibGlzaGVkIEFQSSBmYWxscyBvdXRzaWRlIHRoZSByYW5nZSBjb3VudHMgYXMgVU5TQVRJU0ZJRUQsIHdoaWNoIGlzIHdoYXQgdHVybnMgYVxuICAgKiBzaWxlbnQgYmVoYXZpb3JhbCBtaXNtYXRjaCBiZXR3ZWVuIHR3byBpbmRlcGVuZGVudGx5IHJlbGVhc2VkIHBsdWdpbnMgaW50byBhIHZpc2libGUgXCJ1cGRhdGUgdGhpc1xuICAgKiBvbmVcIiBtZXNzYWdlLiBTcGVsbCBcImFueSB2ZXJzaW9uXCIgYXMgYCc+PTAuMC4wJ2Ag4oCUIGBjb21wYXJlLXZlcnNpb25zYCByZWplY3RzIGEgYmFyZSBgKmAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZGVzdCByZWxlYXNlIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4gdGhlIGRlcGVuZGVudCB3b3JrcyB3aXRoLCBlLmcuIGAnMi4yLjAnYC5cbiAgICpcbiAgICogRm9yIGEgcHJvdmlkZXIgd2hvc2UgQkVIQVZJT1IgY2hhbmdlZCB3aGlsZSBpdHMgQVBJIGNvbnRyYWN0IHN0YXllZCB0aGUgc2FtZSwgd2hpY2hcbiAgICoge0BsaW5rIGFwaVZlcnNpb25SYW5nZX0gY2Fubm90IHNlZS4gQSBkZXBlbmRlbmN5IGVuYWJsZWQgYmVsb3cgaXQgY291bnRzIGFzIFVOU0FUSVNGSUVEIGFuZCBhc2tzIHRoZVxuICAgKiB1c2VyIHRvIHVwZGF0ZSBpdC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhcyB0b29cbiAgICogb2xkLiBBIG1pbmltdW0gcmF0aGVyIHRoYW4gYSByYW5nZSwgYmVjYXVzZSB0aGUgb25seSBhZHZpY2UgdGhlIGdhdGUgY2FuIGdpdmUgaXMgXCJ1cGRhdGUgaXRcIiwgYW5kIGFuXG4gICAqIHVwcGVyIGJvdW5kIGlzIGEgdmVyc2lvbiBubyB1cGRhdGUgcmVhY2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pblBsdWdpblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCB0aGUgZGVwZW5kZW50IGRvZXMgd2l0aCB0aGlzIHBsdWdpbiwgc2hvd24gaW4gdGhlIHNldHRpbmdzIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlcGVuZGVudCBvd25zIHRoaXMgc3RyaW5nIGJlY2F1c2Ugb25seSBpdCBrbm93cyB3aGF0IGl0IHVzZXMgdGhlIG90aGVyIHBsdWdpbiBmb3IsIGFuZCBhIHVzZXJcbiAgICogYmVpbmcgYXNrZWQgdG8gaW5zdGFsbCBzb21ldGhpbmcgZGVzZXJ2ZXMgdG8gYmUgdG9sZCB3aHkuXG4gICAqXG4gICAqIFBhc3MgYSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gdG8gbWFyayB1cCBwYXJ0IG9mIHRoZSBzZW50ZW5jZSwgc3VjaCBhcyBhIHBsdWdpbiBuYW1lIHJlbmRlcmVkIGFzXG4gICAqIGNvZGUuIEVhY2ggcmVuZGVyIGFwcGVuZHMgYSBmcmVzaCBjbG9uZSBvZiBpdCwgc2luY2UgdGhlIGJhbm5lciBpcyByZW5kZXJlZCBhZ2FpbiBvbiBldmVyeSByZWZyZXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25mbGljdHMgdG8gZW5mb3JjZS4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGUgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwZW5kZW5jaWVzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiBkZXBlbmRzIG9uIG5vdGhpbmcsIGFuZCBpdHMgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGxvYWRzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W107XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIG9uY2UgZXZlcnkgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgYW5kIG5vIGJsb2NraW5nXG4gICAqIGNvbmZsaWN0IGhvbGRzLCBhbmQgYWdhaW4gYWZ0ZXIgYSBnYXRlIHRoYXQgaGFkIGNsb3NlZCBvcGVucyBiYWNrIHVwLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgaXMgbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4g4oCUIHRoZSBvbmUgZGVjbGFyaW5nIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4ncyBub3RpY2UgY29tcG9uZW50LCB1c2VkIHRvIHNheSB3aGF0IGlzIG1pc3NpbmcsIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHdoYXQgY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIHdoZW4gYSBnYXRlIHRoYXQgaGFkIGJlZW4gb3BlbiBjbG9zZXMuXG4gICAqL1xuICByZWFkb25seSB1bmxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifSBjb25zdHJ1Y3Rvci5cbiAqL1xuaW50ZXJmYWNlIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJsb2NrZWQgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byB0aGUgdGFiJ3MgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgdGFiJ3MgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRhYiBhIGJsb2NrZWQgcGx1Z2luIHNob3dzIGluIHBsYWNlIG9mIHRoZSBvbmUgaXQgbmV2ZXIgZ290IHRvIHJlZ2lzdGVyLlxuICpcbiAqIEEgYmxvY2tlZCBwbHVnaW4ncyBgb25sb2FkSW1wbGAgbmV2ZXIgcmFuLCBzbyBpdHMgcmVhbCBzZXR0aW5ncyB0YWIgZG9lcyBub3QgZXhpc3Qg4oCUIGFuZCBhIHVzZXIgd2hvIGdvZXNcbiAqIGxvb2tpbmcgZm9yIHRoZSBwbHVnaW4ncyBzZXR0aW5ncyBpcyBwcmVjaXNlbHkgdGhlIHVzZXIgYXNraW5nIFwid2h5IGlzbid0IHRoaXMgZG9pbmcgYW55dGhpbmc/XCIuIEFuXG4gKiBlbXB0eSBzcGFjZSBpcyB0aGUgd29yc3QgcG9zc2libGUgYW5zd2VyIHRvIHRoYXQgcXVlc3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3NldHRpbmdzLXRhYi9wcmVmZXItc2V0dGluZy1kZWZpbml0aW9ucyAtLSBUaGlzIHRhYiBoYXMgbm8gc2V0dGluZ3MgdG8gZGVjbGFyZS4gSXQgc3RhbmRzIGluIGZvciBhIHNldHRpbmdzIHRhYiB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCwgY2FycnlpbmcgYW4gZXhwbGFuYXRpb24gYW5kIGEgcmVwYWlyIGJ1dHRvbiwgYW5kIHRoZSBwbHVnaW4ncyByZWFsIHNldHRpbmdzIGFwcGVhciB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zLlxuY2xhc3MgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQmxvY2tlZFBsdWdpblNldHRpbmdUYWJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lciA9IHBhcmFtcy5yZW5kZXJCYW5uZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuICAgIHRoaXMucmVuZGVyQmFubmVyKHRoaXMuY29udGFpbmVyRWwpO1xuICB9XG59XG5cbi8qKlxuICogRW5mb3JjZXMgYSBwbHVnaW4ncyBtYW5kYXRvcnkgZGVwZW5kZW5jaWVzIGFuZCBkZWNsYXJlZCBjb25mbGljdHMsIGdhdGluZyBpdHMgZmVhdHVyZSBzdXJmYWNlIG9uIGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5HYXRlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbkFwaVJlZjxvYmplY3Q+PigpO1xuICBwcml2YXRlIGJsb2NrZWRTZXR0aW5nVGFiOiBudWxsIHwgUGx1Z2luU2V0dGluZ1RhYiA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuICBwcml2YXRlIGhhc0Fubm91bmNlZEJsb2NrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0ZlYXR1cmVTdXJmYWNlTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNMYXlvdXRSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBsb3NzQW5ub3VuY2VtZW50VGltZXJJZDogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IEFwcCB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5HYXRlQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZsaWN0cyA9IHBhcmFtcy5jb25mbGljdHM7XG4gICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBwYXJhbXMuZGVwZW5kZW5jaWVzO1xuICAgIHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLmxvYWRGZWF0dXJlU3VyZmFjZTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UgPSBwYXJhbXMudW5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGV0aGVyIGFueSB3YXJuaW5nIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogVGhlIHByZWRpY2F0ZSBhIGRlY2xhcmF0aXZlIHNldHRpbmdzIHRhYiBuZWVkcywgYW5kIHRoZSBjb3VudGVycGFydCB0b1xuICAgKiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZWAuIFN1Y2ggYSB0YWIgZGVjaWRlcyB3aGV0aGVyIGEgcm93IGV4aXN0c1xuICAgKiBCRUZPUkUgaXQgcmVuZGVycyBhbnl0aGluZyBpbnRvIGl0LCBzbyB7QGxpbmsgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyfSB3cml0aW5nIG5vdGhpbmcgY2Fubm90XG4gICAqIGFuc3dlciB0aGUgcXVlc3Rpb24gZm9yIGl0IOKAlCBhIHJvdyB0aGF0IHJlbmRlcnMgZW1wdHkgaXMgc3RpbGwgYSByb3csIHdpdGggdGhlIGRpdmlkZXIgYW5kIHBhZGRpbmdcbiAgICogZXZlcnkgb3RoZXIgc2V0dGluZyBoYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYXQgbGVhc3Qgb25lIGRlY2xhcmVkIHdhcm5pbmcgY29uZmxpY3QgaG9sZHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQWN0aXZlV2FybmluZ0NvbmZsaWN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB3YXRjaGluZyBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGFuZCBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBhcGlSZWYgPSB3YXRjaFBsdWdpbkFwaTxvYmplY3Q+KHtcbiAgICAgICAgYXBpVmVyc2lvblJhbmdlOiBkZXBlbmRlbmN5LmFwaVZlcnNpb25SYW5nZSxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgfSk7XG4gICAgICByZWdpc3RlckFzeW5jRXZlbnQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGFwaVJlZi5vbignY2hhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuYXBpUmVmcy5zZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCwgYXBpUmVmKTtcbiAgICB9XG5cbiAgICAvLyBBIGNvbmZsaWN0IGhhcyBubyBBUEkgdG8gd2F0Y2gg4oCUIGl0IGlzIHJlYWQgb3V0IG9mIHRoZSBtYW5pZmVzdHMg4oCUIHNvIHRoZSB0cmlnZ2VyIHRvIHJlLXJlYWQgaXMgdGhlXG4gICAgLy8gbGlicmFyeSdzIG93biBsaWZlY3ljbGUgYnJvYWRjYXN0LiBJdCBjb3ZlcnMgZXZlcnkgY29uZmxpY3RpbmcgcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeTsgb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaXMgY2F1Z2h0IGF0IHRoZSBuZXh0IGxvYWQsIGFzIHRoZSBmaWxlIGhlYWRlciBzYXlzLlxuICAgIGNvbnN0IGxpZmVjeWNsZUV2ZW50TmFtZXM6IFBsdWdpbkxpZmVjeWNsZUV2ZW50TmFtZVtdID0gW1BMVUdJTl9MT0FERURfRVZFTlRfTkFNRSwgUExVR0lOX1VOTE9BREVEX0VWRU5UX05BTUVdO1xuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGxpZmVjeWNsZUV2ZW50TmFtZXMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgY29udmVydEFzeW5jVG9TeW5jKGFzeW5jIChwYXlsb2FkOiBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQpID0+IHtcbiAgICAgICAgICBpZiAocGF5bG9hZC5wbHVnaW5JZCA9PT0gdGhpcy5wbHVnaW4ubWFuaWZlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgaXMgU0FJRCBhYm91dCBhIG1pc3NpbmcgZGVwZW5kZW5jeSB1bnRpbCB0aGUgbGF5b3V0IGlzIHJlYWR5LiBQbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWRcbiAgICAvLyBvcmRlciwgc28gYSBkZXBlbmRlbmN5IHRoYXQgc2ltcGx5IGhhcyBub3QgbG9hZGVkIHlldCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBhdCB0aGlzIHBvaW50IGZyb20gb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaW5zdGFsbGVkIOKAlCBhbm5vdW5jaW5nIGhlcmUgd291bGQgcHV0IGEgXCJtaXNzaW5nIHBsdWdpblwiIG5vdGljZSBvbiBzY3JlZW4gYXQgZXZlcnlcbiAgICAvLyBzdGFydHVwIGFuZCB0YWtlIGl0IGF3YXkgYSBtb21lbnQgbGF0ZXIuIFRoZSBnYXRlIGl0c2VsZiBkb2VzIG5vdCB3YWl0OiB0aGUgc3VyZmFjZSBsb2FkcyB0aGVcbiAgICAvLyBpbnN0YW50IHRoZSBkZXBlbmRlbmN5IGlzIHRoZXJlLCB3aGVuZXZlciB0aGF0IGlzLlxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCh0aGlzLmFwcCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTGF5b3V0UmVhZHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh0aGlzLmdldFVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKCksIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZVdhcm5pbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgdGhlIGdhdGUgb25jZSB0aGUgd2F0Y2hlcyBhcmUgaW4gcGxhY2UsIGxvYWRpbmcgdGhlIGZlYXR1cmUgc3VyZmFjZSBpZiBpdCBpcyBhbHJlYWR5IG9wZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZmlyc3QgZXZhbHVhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgYmFubmVyIGZvciBldmVyeSBjb25mbGljdCB0aGUgaG9zdCBpcyBydW5uaW5nIGFsb25nc2lkZSwgc28gYSBwbHVnaW4gY2FuIHB1dCB0aGUgb3ZlcmxhcCBpblxuICAgKiBpdHMgb3duIHNldHRpbmdzIHRhYi5cbiAgICpcbiAgICogQ29uc3VtZXItaW52b2tlZCwgZXhhY3RseSBsaWtlIGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50LnJlbmRlckJhbm5lcmA6IHRoZSBsaWJyYXJ5IHJlZ2lzdGVycyB0aGVcbiAgICogc2V0dGluZ3MgdGFiIGEgQkxPQ0tFRCBwbHVnaW4gbmVlZHMsIGJlY2F1c2UgdGhhdCBwbHVnaW4gbmV2ZXIgZ290IHRvIHJlZ2lzdGVyIG9uZSBvZiBpdHMgb3duLCBidXQgaXRcbiAgICogaGFzIG5vIGhvb2sgaW50byB0aGUgdGFiIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzLiBSZW5kZXJzIG5vdGhpbmcgd2hlbiBubyB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJDb25mbGljdFdhcm5pbmdCYW5uZXIoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm4pKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IHdlbnQgYXdheSB3aGlsZSB0aGUgcGx1Z2luIHdhcyBydW5uaW5nLCBub3cgdGhhdCB0aGUgZ3JhY2UgcGVyaW9kIGlzIG92ZXIuXG4gICAqXG4gICAqIFJlLXJlYWRzIHRoZSBnYXRlIHJhdGhlciB0aGFuIHRydXN0aW5nIHdoYXQgY2xvc2VkIGl0LCBzbyBhIGRlcGVuZGVuY3kgdGhhdCB3ZW50IGF3YXkgZHVyaW5nIHRoZVxuICAgKiB3aW5kb3cgaXMgYW5ub3VuY2VkIHdpdGggdGhlIHJlc3QuIE9uZSB0aGF0IGNhbWUgYmFjayBpbiB0aW1lIG5ldmVyIGdldHMgaGVyZTogdGhlIGdhdGUgcmVvcGVuaW5nXG4gICAqIGNhbmNlbHMgdGhlIHRpbWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdW5jZUxvc3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFubm91bmNlV2FybmluZ3MoKTogdm9pZCB7XG4gICAgLy8gQSB3YXJuaW5nIGRlc2NyaWJlcyB0d28gcGx1Z2lucyB0aGF0IGFyZSBib3RoIFJVTk5JTkcsIHNvIGl0IGlzIHBvaW50bGVzcyB3aGlsZSB0aGlzIG9uZSBpcyBibG9ja2VkXG4gICAgLy8g4oCUIGFuZCBpdCB3YWl0cyBmb3IgbGF5b3V0LXJlYWR5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGJsb2NrZWQgbm90aWNlIGRvZXMuXG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgaWYgKHRoaXMuYW5ub3VuY2VkV2FybmluZ1BsdWdpbklkcy5oYXMoY29uZmxpY3QucGx1Z2luSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuYWRkKGNvbmZsaWN0LnBsdWdpbklkKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkKTtcbiAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzVG9vT2xkKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUnVubmluZyhkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3QuY29uZmxpY3RBcHBlYXJlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEJsb2NrZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3QuYmxvY2tlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3Qud2FybmluZ05vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBlbmRlbmN5TG9zdE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzVG9vT2xkKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUnVubmluZyhkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOb1JlYWRhYmxlQXBpTWVzc2FnZShkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5Lm5vUmVhZGFibGVBcGlOb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS52ZXJzaW9uTWlzbWF0Y2hOb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGRlY2xhcmVkIGNvbmZsaWN0cyBvZiBvbmUgc2V2ZXJpdHkgdGhhdCBhcmUgY3VycmVudGx5IGluIGZvcmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V2ZXJpdHkgLSBUaGUgc2V2ZXJpdHkgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmxpY3RzIGhvbGRpbmcgcmlnaHQgbm93LCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBY3RpdmVDb25mbGljdHMoc2V2ZXJpdHk6IFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkpOiBQbHVnaW5Db25mbGljdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25mbGljdHMuZmlsdGVyKChjb25mbGljdCkgPT4gY29uZmxpY3Quc2V2ZXJpdHkgPT09IHNldmVyaXR5ICYmIHRoaXMuaXNDb25mbGljdEFjdGl2ZShjb25mbGljdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpOiBQbHVnaW5EZXBlbmRlbmN5W10ge1xuICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+ICF0aGlzLmFwaVJlZnMuZ2V0KGRlcGVuZGVuY3kucGx1Z2luSWQpPy52YWx1ZSB8fCB0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ibG9ja2VkU2V0dGluZ1RhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYXBwLnNldHRpbmcucmVtb3ZlU2V0dGluZ1RhYih0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYXQgYSByZWxlYXNlIG9sZGVyIHRoYW4gaXQgZGVjbGFyZWQgaXQgbmVlZHMuXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgbWFuaWZlc3QsIGxpa2UgYSBjb25mbGljdCwgYW5kIHJlLXJlYWQgb24gZXZlcnkgZXZhbHVhdGlvbjogT2JzaWRpYW4gYXBwbGllcyBhbiB1cGRhdGUgYnlcbiAgICogcmVsb2FkaW5nIHRoZSBwcm92aWRlciwgd2hpY2ggZmlyZXMgdGhlIEFQSSB3YXRjaCdzIGBjaGFuZ2VgLCBzbyB0aGUgZ2F0ZSBvcGVucyB3aXRob3V0IGEgcmVzdGFydC5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZGVwZW5kZW5jeSBpcyBlbmFibGVkIGJlbG93IGl0cyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufTsgYGZhbHNlYFxuICAgKiB3aGVuIGl0IGRlY2xhcmVzIG5vbmUgb3IgaXMgbm90IGVuYWJsZWQsIHNpbmNlIGl0cyBBUEkgaXMgdGhlbiBhYnNlbnQgYW55d2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgaWYgKGRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24oe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIWNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZWRWZXJzaW9uLCBkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24sICc+PScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgZGVjbGFyZWQgY29uZmxpY3QgaXMgaW4gZm9yY2UgcmlnaHQgbm93LlxuICAgKlxuICAgKiBPbmx5IGFuIEVOQUJMRUQgcGx1Z2luIGNvdW50cy4gT25lIHRoYXQgaXMgaW5zdGFsbGVkIGJ1dCBzd2l0Y2hlZCBvZmYgcmVnaXN0ZXJzIG5vdGhpbmcsIHNvIGl0IGNhbm5vdFxuICAgKiBjb2xsaWRlLCBhbmQgYWN0aW5nIG9uIGl0IHdvdWxkIGJlIGFuIGFsYXJtIHRoZSB1c2VyIGNhbiBvbmx5IGFuc3dlciBieSB1bmluc3RhbGxpbmcgc29tZXRoaW5nIHRoZXlcbiAgICogaGF2ZSBhbHJlYWR5IHR1cm5lZCBvZmYuXG4gICAqXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBkZWNsYXJlZCBjb25mbGljdC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYSBjb25mbGljdGluZyB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmZsaWN0QWN0aXZlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICB9KTtcblxuICAgIGlmIChpbnN0YWxsZWRWZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzYXRpc2ZpZXNWZXJzaW9uKGluc3RhbGxlZFZlcnNpb24sIGNvbmZsaWN0LmNvbmZsaWN0aW5nVmVyc2lvblJhbmdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYW4gdW5zYXRpc2ZpZWQgZGVwZW5kZW5jeSBpcyBub25ldGhlbGVzcyBlbmFibGVkIGFuZCBsb2FkZWQuXG4gICAqXG4gICAqIFN1Y2ggYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYnV0IHB1Ymxpc2hlcyBubyBBUEkgdGhpcyBwbHVnaW4gY2FuIHJlYWQg4oCUIG5vbmUgYXQgYWxsLCBvciBvbmUgd2hvc2Ugc2hhcGVcbiAgICogZmFpbHMgdGhlIGNvbnRyYWN0LiBUaGUgdXN1YWwgY2F1c2UgaXMgYSByZWxlYXNlIGJ1aWx0IG9uIGEgY29weSBvZiB0aGlzIGxpYnJhcnkgdGhhdCBwdWJsaXNoZXNcbiAgICogc29tZXdoZXJlIHRoaXMgb25lIGRvZXMgbm90IGxvb2ssIHNvIFwiaW5zdGFsbCBhbmQgZW5hYmxlIGl0XCIgd291bGQgYmUgZmFsc2UgYW5kIFwidXBkYXRlIGl0XCIgaXMgdGhlIGZpeC5cbiAgICpcbiAgICogQmVpbmcgaW4gYGVuYWJsZWRQbHVnaW5zYCBpcyBub3QgZW5vdWdoOiBPYnNpZGlhbidzIHBsYWluIGBkaXNhYmxlUGx1Z2luYCB1bmxvYWRzIGEgcGx1Z2luIGFuZCBsZWF2ZXMgaXRcbiAgICogdGhlcmUgKG9ubHkgYGRpc2FibGVQbHVnaW5BbmRTYXZlYCByZW1vdmVzIGl0KSwgc28gYSBwcm92aWRlciB0aGF0IHdlbnQgYXdheSB3b3VsZCBvdGhlcndpc2UgcmVhZCBhc1xuICAgKiBydW5uaW5nIHdpdGggYW4gdW5yZWFkYWJsZSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBhbmQgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1J1bm5pbmcoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgICB9KSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCAmJiB0aGlzLmFwcC5wbHVnaW5zLmdldFBsdWdpbihkZXBlbmRlbmN5LnBsdWdpbklkKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYnV0IHRvbyBvbGQgZm9yIHRoaXMgcGx1Z2luLCBzbyB0aGUgYWR2aWNlIGlzIFwidXBkYXRlIGl0XCIuXG4gICAqXG4gICAqIFR3byBpbmRlcGVuZGVudCBzaWduYWxzIHNheSBzbzogYSByZWxlYXNlIGJlbG93IHtAbGluayBQbHVnaW5EZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb259LCBhbmQgYSBwdWJsaXNoZWRcbiAgICogQVBJIHdob3NlIGNvbnRyYWN0IHZlcnNpb24gaXMgb3V0c2lkZSB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2V9LlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeSAtIFRoZSBkZWNsYXJlZCBkZXBlbmRlbmN5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHVwZGF0aW5nIHRoZSBkZXBlbmRlbmN5IGlzIHdoYXQgaXQgbmVlZHMuXG4gICAqL1xuICBwcml2YXRlIGlzVG9vT2xkKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KVxuICAgICAgfHwgdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udW5hdmFpbGFiaWxpdHlSZWFzb24gPT09IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlZlcnNpb25NaXNtYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXlzIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHB1dHMgdGhlIHNhbWUgZXhwbGFuYXRpb24gd2hlcmUgdGhlIHVzZXIgd2lsbCBsb29rIGZvciB0aGUgcGx1Z2luJ3NcbiAgICogc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcHJlc2VudFVuc2F0aXNmaWVkKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcblxuICAgIGlmICh0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1ldmFsdWF0ZXMgdGhlIGdhdGUgYW5kIG1vdmVzIHRoZSBmZWF0dXJlIHN1cmZhY2UgdG8gbWF0Y2guXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc3VyZmFjZSBtYXRjaGVzIHRoZSBnYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzID0gdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IGJsb2NraW5nQ29uZmxpY3RzID0gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5CbG9jayk7XG5cbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwICYmIGJsb2NraW5nQ29uZmxpY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk7XG4gICAgICB0aGlzLmhpZGVCbG9ja2VkU2V0dGluZ1RhYigpO1xuICAgICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG5cbiAgICAgIGlmICghdGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy51bmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuXG4gICAgICAvLyBBIGdhdGUgdGhhdCBjbG9zZXMgd2hpbGUgdGhlIHBsdWdpbiBpcyBSVU5OSU5HIGlzIHRoZSBjYXNlIHdvcnRoIGJlaW5nIGxvdWQgYWJvdXQ6IHRoZSB1c2VyIGp1c3RcbiAgICAgIC8vIGRpZCBzb21ldGhpbmcsIGFuZCB0aGUgY29uc2VxdWVuY2UgaXMgaW1tZWRpYXRlIGFuZCBpbnZpc2libGUgd2l0aG91dCB0aGlzLiBBbm5vdW5jZWQgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgbGF5b3V0IHJlYWRpbmVzcywgYmVjYXVzZSBhIHJ1bm5pbmcgcGx1Z2luIG1lYW5zIHRoZSBsYXlvdXQgaXMgbG9uZyBzaW5jZSByZWFkeSDigJQgYnV0IG9ubHlcbiAgICAgIC8vIG9uY2UgdGhlIGdyYWNlIHBlcmlvZCBoYXMgc2hvd24gdGhlIGxvc3MgaXMgbm90IGFuIHVwZGF0ZSByZWxvYWRpbmcgdGhlIHByb3ZpZGVyIChzZWUgdGhlIGZpbGVcbiAgICAgIC8vIGhlYWRlcikuXG4gICAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFubm91bmNlTG9zcygpO1xuICAgICAgfSwgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLnNob3dCbG9ja2VkU2V0dGluZ1RhYih1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VudFVuc2F0aXNmaWVkKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmxvY2tlZCBleHBsYW5hdGlvbiBpbnRvIGEgc2V0dGluZ3MtdGFiIGNvbnRhaW5lcjogd2hhdCBpcyBtaXNzaW5nIG9yIGluIHRoZSB3YXksIHdoeSBpdFxuICAgKiBtYXR0ZXJzLCBhbmQgdGhlIGJ1dHRvbiB0aGF0IGZpeGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzIC0gVGhlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHNhdGlzZmllZC5cbiAgICogQHBhcmFtIGJsb2NraW5nQ29uZmxpY3RzIC0gVGhlIGNvbmZsaWN0cyBjdXJyZW50bHkgcmVmdXNpbmcgdGhlIHBsdWdpbiB0aGUgcmlnaHQgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCbG9ja2VkQmFubmVyKFxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5zZXR0aW5nc0hlYWRpbmcpIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luRGVwZW5kZW5jeUJhbm5lcl1cbiAgICAgIH0pO1xuICAgICAgYmFubmVyRWwuYXBwZW5kKHRoaXMuY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeSkpO1xuICAgICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShiYW5uZXJFbC5jcmVhdGVEaXYoKSwgZGVwZW5kZW5jeS5yZWFzb24pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IGdldEluc3RhbGxlZFBsdWdpblN0YXRlKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbiBlbmFibGVkIGRlcGVuZGVuY3kgdGhhdCBpcyBzdGlsbCB1bnNhdGlzZmllZCBpcyB0b28gb2xkLCBhbmQgaW5zdGFsbGluZyBvciBlbmFibGluZyBpdCBhZ2FpbiBkb2VzXG4gICAgICAvLyBub3RoaW5nLCBzbyBpdCBpcyBvZmZlcmVkIGFuIHVwZGF0ZSBpbnN0ZWFkLlxuICAgICAgaWYgKHN0YXRlICE9PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT5cbiAgICAgICAgICAgIHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICAgICAgICA/ICQub2JzaWRpYW5MaWIucGx1Z2luU3VnZ2VzdGlvbi5lbmFibGVcbiAgICAgICAgICAgICAgOiAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uaW5zdGFsbFxuICAgICAgICAgICkpXG4gICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGxBbmRFbmFibGVQbHVnaW4oe1xuICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBPYnNpZGlhbiBhcHBsaWVzIHRoZSB1cGRhdGUgYnkgcmVsb2FkaW5nIHRoZSBkZXBlbmRlbmN5LCB3aGljaCByZXB1Ymxpc2hlcyBpdHMgQVBJLCBzbyB0aGUgd2F0Y2gnc1xuICAgICAgLy8gYGNoYW5nZWAgcmVvcGVucyB0aGUgZ2F0ZSB3aXRoIG5vIGZ1cnRoZXIgc3RlcCBoZXJlLlxuICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LnVwZGF0ZSwgeyBkZXBlbmRlbmN5UGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lIH0pKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB1cGRhdGVQbHVnaW4oe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkLFxuICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICAgIHJlcXVlc3RpbmdQbHVnaW5OYW1lOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcblxuICAgICAgLy8gVGhlIGxpbmsgT1VUIHRvIHRoZSBkZXBlbmRlbmN5J3Mgb3duIHNldHRpbmdzLCBzaG93biBvbmx5IG9uY2UgaXQgaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkIOKAlCB0aGVcbiAgICAgIC8vIG90aGVyIGhhbGYgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyB2aXNpYmxlIGZyb20gYm90aCBlbmRzLiBJdCBpcyB3aGF0IHN0b3BzIFwiY29uZmlndXJlIG9uZVxuICAgICAgLy8gb3BlcmF0aW9uIGFjcm9zcyB0d28gcGx1Z2luc1wiIGZyb20gbWVhbmluZyBcImdvIGFuZCBmaW5kIHRoZSBvdGhlciBwbHVnaW4geW91cnNlbGZcIi5cbiAgICAgIHRoaXMucmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsLCBkZXBlbmRlbmN5LnBsdWdpbklkLCBkZXBlbmRlbmN5LnBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3Quc2V0dGluZ3NIZWFkaW5nKSB9KTtcblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgYmxvY2tpbmdDb25mbGljdHMpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbCwgY29uZmxpY3QsIHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIG9uZSBjb25mbGljdDogd2hhdCBpdCBpcywgd2h5IGl0IG1hdHRlcnMsIGFuZCB0aGUgdHdvIHdheXMgb3V0IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWlyIGlzIG9mZmVyZWQgb24gdGhlIE9USEVSIHBsdWdpbiDigJQgZGlzYWJsaW5nIGl0IGlzIHRoZSBvbmUgdGhpbmcgdGhpcyBwbHVnaW4gY2FuIGRvIGluIGFcbiAgICogY2xpY2ssIHNpbmNlIGl0IGNhbm5vdCB1cGRhdGUgc29tZW9uZSBlbHNlJ3MgcGx1Z2luIOKAlCBhbmQgaXQgaXMgdGhlIHBlcnNpc3RlZCBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgXG4gICAqIHJhdGhlciB0aGFuIHRoZSB0cmFuc2llbnQgZGlzYWJsZSwgYmVjYXVzZSB0aGUgdXNlciBhc2tlZCBmb3IgaXQgYnkgY2xpY2tpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgY29uZmxpY3QgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0gbWVzc2FnZUZyYWdtZW50IC0gVGhlIHNlbnRlbmNlIGV4cGxhaW5pbmcgdGhlIGNvbmZsaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0LCBtZXNzYWdlRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBiYW5uZXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7XG4gICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luQ29uZmxpY3RCYW5uZXJdXG4gICAgfSk7XG4gICAgYmFubmVyRWwuYXBwZW5kKG1lc3NhZ2VGcmFnbWVudCk7XG4gICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShiYW5uZXJFbC5jcmVhdGVEaXYoKSwgY29uZmxpY3QucmVhc29uKTtcblxuICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAuc2V0QnV0dG9uVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmRpc2FibGUsIHsgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBjb25mbGljdC5wbHVnaW5OYW1lIH0pKVxuICAgICAgLnNldEN0YSgpXG4gICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiBjb25mbGljdC5wbHVnaW5JZFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgY29uZmxpY3QucGx1Z2luSWQsIGNvbmZsaWN0LnBsdWdpbk5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWw6IEhUTUxFbGVtZW50LCBwbHVnaW5JZDogc3RyaW5nLCBwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5Lm9wZW5EZXBlbmRlbmN5U2V0dGluZ3MsIHtcbiAgICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IHBsdWdpbk5hbWVcbiAgICAgIH0pKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBvcGVuU2V0dGluZ1RhYih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICB0YWJJZDogcGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZGRlZCB0aHJvdWdoIGBhcHAuc2V0dGluZ2AgcmF0aGVyIHRoYW4gYHBsdWdpbi5hZGRTZXR0aW5nVGFiYCwgYmVjYXVzZSB0aGlzIHRhYiBoYXMgdG8gY29tZSBiYWNrXG4gICAgLy8gT0ZGIGFnYWluIHRoZSBtb21lbnQgdGhlIGdhdGUgb3BlbnMg4oCUIG90aGVyd2lzZSB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmdzIHRhYiwgcmVnaXN0ZXJlZCBieVxuICAgIC8vIGBvbmxvYWRJbXBsYCwgd291bGQgYXBwZWFyIGJlc2lkZSBhIHN0YWxlIFwicmVxdWlyZWQgcGx1Z2luIG1pc3NpbmdcIiBvbmUuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmBcbiAgICAvLyBvbmx5IGV2ZXIgcmVtb3ZlcyBhdCBwbHVnaW4gdW5sb2FkLlxuICAgIGNvbnN0IGJsb2NrZWRTZXR0aW5nVGFiID0gbmV3IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiKHtcbiAgICAgIHBsdWdpbjogdGhpcy5wbHVnaW4sXG4gICAgICByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlckJsb2NrZWRCYW5uZXIoY29udGFpbmVyRWwsIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5hZGRTZXR0aW5nVGFiKGJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gYmxvY2tlZFNldHRpbmdUYWI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwRkEsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxPQUNSO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFTUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFNBQVM7QUFDbEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxvQ0FBb0M7QUFRN0MsTUFBTSxpREFBaUQ7QUFLaEQsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFPTCxFQUFBQSx3QkFBQSxXQUFRO0FBUVIsRUFBQUEsd0JBQUEsVUFBTztBQWZHLFNBQUFBO0FBQUEsR0FBQTtBQTBLWixNQUFNLGdDQUFnQyxpQkFBaUI7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsVUFBTSxPQUFPLE9BQU8sS0FBSyxPQUFPLE1BQU07QUFDdEMsU0FBSyxlQUFlLE9BQU87QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFVBQWdCO0FBQzlCLFNBQUssWUFBWSxNQUFNO0FBQ3ZCLFNBQUssYUFBYSxLQUFLLFdBQVc7QUFBQSxFQUNwQztBQUNGO0FBS08sTUFBTSw0QkFBNEIsWUFBWTtBQUFBLEVBQ2xDLDRCQUE0QixvQkFBSSxJQUFZO0FBQUEsRUFDNUMsVUFBVSxvQkFBSSxJQUFrQztBQUFBLEVBQ3pELG9CQUE2QztBQUFBLEVBQ3BDO0FBQUEsRUFDQTtBQUFBLEVBQ1Qsc0JBQXNCO0FBQUEsRUFDdEIseUJBQXlCO0FBQUEsRUFDekIsZ0JBQWdCO0FBQUEsRUFDUDtBQUFBLEVBQ1QsMEJBQXlDO0FBQUEsRUFDaEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRWpCLElBQVksTUFBVztBQUNyQixXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sWUFBWSxRQUE4QztBQUMvRCxVQUFNO0FBQ04sU0FBSyxZQUFZLE9BQU87QUFDeEIsU0FBSyxlQUFlLE9BQU87QUFDM0IsU0FBSyxxQkFBcUIsT0FBTztBQUNqQyxTQUFLLFNBQVMsT0FBTztBQUNyQixTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssdUJBQXVCLE9BQU87QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFPLDRCQUFxQztBQUMxQyxXQUFPLEtBQUssbUJBQW1CLGlCQUEyQixFQUFFLFNBQVM7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFNBQWU7QUFDN0IsZUFBVyxjQUFjLEtBQUssY0FBYztBQUMxQyxZQUFNLFNBQVMsZUFBdUI7QUFBQSxRQUNwQyxpQkFBaUIsV0FBVztBQUFBLFFBQzVCLEtBQUssS0FBSztBQUFBLFFBQ1YsV0FBVztBQUFBLFFBQ1gsVUFBVSxXQUFXO0FBQUEsTUFDdkIsQ0FBQztBQUNEO0FBQUEsUUFDRTtBQUFBLFFBQ0EsT0FBTyxHQUFHLFVBQVUsWUFBWTtBQUM5QixnQkFBTSxLQUFLLFFBQVE7QUFBQSxRQUNyQixDQUFDO0FBQUEsTUFDSDtBQUNBLFdBQUssUUFBUSxJQUFJLFdBQVcsVUFBVSxNQUFNO0FBQUEsSUFDOUM7QUFLQSxVQUFNLHNCQUFrRCxDQUFDLDBCQUEwQiwwQkFBMEI7QUFDN0csZUFBVyxhQUFhLHFCQUFxQjtBQUMzQyxXQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVU7QUFBQSxRQUNwQztBQUFBLFFBQ0EsbUJBQW1CLE9BQU8sWUFBeUM7QUFDakUsY0FBSSxRQUFRLGFBQWEsS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUNoRDtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxLQUFLLFFBQVE7QUFBQSxRQUNyQixDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQUEsSUFDSDtBQU9BLFNBQUs7QUFBQSxNQUNILElBQUksNkJBQTZCLEtBQUssS0FBSyxNQUFNO0FBQy9DLGFBQUssZ0JBQWdCO0FBQ3JCLGFBQUssbUJBQW1CLEtBQUssMkJBQTJCLEdBQUcsS0FBSyxtQkFBbUIsbUJBQTRCLENBQUM7QUFDaEgsYUFBSyxpQkFBaUI7QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSDtBQUVBLFNBQUssU0FBUyxNQUFNO0FBQ2xCLFdBQUssdUJBQXVCO0FBQzVCLFdBQUssc0JBQXNCO0FBQUEsSUFDN0IsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFzQixjQUE2QjtBQUNqRCxVQUFNLEtBQUssUUFBUTtBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlPLDRCQUE0QixhQUFnQztBQUNqRSxlQUFXLFlBQVksS0FBSyxtQkFBbUIsaUJBQTJCLEdBQUc7QUFDM0UsV0FBSyxvQkFBb0IsYUFBYSxVQUFVLEtBQUssNkJBQTZCLFFBQVEsQ0FBQztBQUFBLElBQzdGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTUSxlQUFxQjtBQUMzQixTQUFLLDBCQUEwQjtBQUUvQixlQUFXLGNBQWMsS0FBSywyQkFBMkIsR0FBRztBQUMxRCxXQUFLLHNCQUFzQixXQUFXLEtBQUssNEJBQTRCLFVBQVUsQ0FBQztBQUFBLElBQ3BGO0FBRUEsZUFBVyxZQUFZLEtBQUssbUJBQW1CLG1CQUE0QixHQUFHO0FBQzVFLFdBQUssc0JBQXNCLFdBQVcsS0FBSyw4QkFBOEIsUUFBUSxDQUFDO0FBQUEsSUFDcEY7QUFBQSxFQUNGO0FBQUEsRUFFUSxtQkFBeUI7QUFHL0IsUUFBSSxDQUFDLEtBQUssaUJBQWlCLENBQUMsS0FBSyx3QkFBd0I7QUFDdkQ7QUFBQSxJQUNGO0FBRUEsZUFBVyxZQUFZLEtBQUssbUJBQW1CLGlCQUEyQixHQUFHO0FBQzNFLFVBQUksS0FBSywwQkFBMEIsSUFBSSxTQUFTLFFBQVEsR0FBRztBQUN6RDtBQUFBLE1BQ0Y7QUFFQSxXQUFLLDBCQUEwQixJQUFJLFNBQVMsUUFBUTtBQUNwRCxXQUFLLHNCQUFzQixXQUFXLEtBQUssNkJBQTZCLFFBQVEsQ0FBQztBQUFBLElBQ25GO0FBQUEsRUFDRjtBQUFBLEVBRVEseUJBQStCO0FBQ3JDLFFBQUksS0FBSyw0QkFBNEIsTUFBTTtBQUN6QztBQUFBLElBQ0Y7QUFFQSxXQUFPLGFBQWEsS0FBSyx1QkFBdUI7QUFDaEQsU0FBSywwQkFBMEI7QUFBQSxFQUNqQztBQUFBLEVBRVEscUJBQXFCLFlBQWdEO0FBQzNFLFFBQUksS0FBSyxTQUFTLFVBQVUsR0FBRztBQUM3QixhQUFPLEtBQUssNkJBQTZCLFVBQVU7QUFBQSxJQUNyRDtBQUVBLFFBQUksS0FBSyxVQUFVLFVBQVUsR0FBRztBQUM5QixhQUFPLEtBQUssMkJBQTJCLFVBQVU7QUFBQSxJQUNuRDtBQUVBLFdBQU8sNkJBQTZCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsZUFBZTtBQUFBLE1BQ3pGLHNCQUFzQixZQUFZLFdBQVcsVUFBVTtBQUFBLE1BQ3ZELFlBQVksWUFBWSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbkQsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRVEsOEJBQThCLFVBQTRDO0FBQ2hGLFdBQU8sNkJBQTZCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLHdCQUF3QjtBQUFBLE1BQ2hHLHVCQUF1QixZQUFZLFNBQVMsVUFBVTtBQUFBLE1BQ3RELFlBQVksWUFBWSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbkQsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRVEsNkJBQTZCLFVBQTRDO0FBQy9FLFdBQU8sNkJBQTZCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLGVBQWU7QUFBQSxNQUN2Rix1QkFBdUIsWUFBWSxTQUFTLFVBQVU7QUFBQSxNQUN0RCxZQUFZLFlBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVRLDZCQUE2QixVQUE0QztBQUMvRSxXQUFPLDZCQUE2QixFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksZUFBZSxlQUFlO0FBQUEsTUFDdkYsdUJBQXVCLFlBQVksU0FBUyxVQUFVO0FBQUEsTUFDdEQsWUFBWSxZQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSw0QkFBNEIsWUFBZ0Q7QUFDbEYsUUFBSSxLQUFLLFNBQVMsVUFBVSxHQUFHO0FBQzdCLGFBQU8sS0FBSyw2QkFBNkIsVUFBVTtBQUFBLElBQ3JEO0FBRUEsUUFBSSxLQUFLLFVBQVUsVUFBVSxHQUFHO0FBQzlCLGFBQU8sS0FBSywyQkFBMkIsVUFBVTtBQUFBLElBQ25EO0FBRUEsV0FBTyw2QkFBNkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQixzQkFBc0I7QUFBQSxNQUNoRyxzQkFBc0IsWUFBWSxXQUFXLFVBQVU7QUFBQSxNQUN2RCxZQUFZLFlBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVRLDJCQUEyQixZQUFnRDtBQUNqRixXQUFPLDZCQUE2QixFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLHFCQUFxQjtBQUFBLE1BQy9GLHNCQUFzQixZQUFZLFdBQVcsVUFBVTtBQUFBLE1BQ3ZELFlBQVksWUFBWSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbkQsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRVEsNkJBQTZCLFlBQWdEO0FBQ25GLFdBQU8sNkJBQTZCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsdUJBQXVCO0FBQUEsTUFDakcsc0JBQXNCLFlBQVksV0FBVyxVQUFVO0FBQUEsTUFDdkQsWUFBWSxZQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRUSxtQkFBbUIsVUFBb0Q7QUFDN0UsV0FBTyxLQUFLLFVBQVUsT0FBTyxDQUFDLGFBQWEsU0FBUyxhQUFhLFlBQVksS0FBSyxpQkFBaUIsUUFBUSxDQUFDO0FBQUEsRUFDOUc7QUFBQSxFQUVRLDZCQUFpRDtBQUN2RCxXQUFPLEtBQUssYUFBYSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssUUFBUSxJQUFJLFdBQVcsUUFBUSxHQUFHLFNBQVMsS0FBSyx3QkFBd0IsVUFBVSxDQUFDO0FBQUEsRUFDM0k7QUFBQSxFQUVRLHdCQUE4QjtBQUNwQyxRQUFJLENBQUMsS0FBSyxtQkFBbUI7QUFDM0I7QUFBQSxJQUNGO0FBRUEsU0FBSyxJQUFJLFFBQVEsaUJBQWlCLEtBQUssaUJBQWlCO0FBQ3hELFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVEsd0JBQXdCLFlBQXVDO0FBQ3JFLFFBQUksV0FBVyxxQkFBcUIsUUFBVztBQUM3QyxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sbUJBQW1CLDBCQUEwQjtBQUFBLE1BQ2pELEtBQUssS0FBSztBQUFBLE1BQ1YsVUFBVSxXQUFXO0FBQUEsSUFDdkIsQ0FBQztBQUVELFFBQUkscUJBQXFCLE1BQU07QUFDN0IsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJO0FBQ0YsYUFBTyxDQUFDLGdCQUFnQixrQkFBa0IsV0FBVyxrQkFBa0IsSUFBSTtBQUFBLElBQzdFLFFBQVE7QUFDTixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVEsaUJBQWlCLFVBQW1DO0FBQzFELFVBQU0sbUJBQW1CLDBCQUEwQjtBQUFBLE1BQ2pELEtBQUssS0FBSztBQUFBLE1BQ1YsVUFBVSxTQUFTO0FBQUEsSUFDckIsQ0FBQztBQUVELFFBQUkscUJBQXFCLE1BQU07QUFDN0IsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJO0FBQ0YsYUFBTyxpQkFBaUIsa0JBQWtCLFNBQVMsdUJBQXVCO0FBQUEsSUFDNUUsUUFBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCUSxVQUFVLFlBQXVDO0FBQ3ZELFdBQU8sd0JBQXdCO0FBQUEsTUFDekIsS0FBSyxLQUFLO0FBQUEsTUFDVixVQUFVLFdBQVc7QUFBQSxJQUN2QixDQUFDLE1BQU0scUJBQXFCLFdBQVcsS0FBSyxJQUFJLFFBQVEsVUFBVSxXQUFXLFFBQVEsTUFBTTtBQUFBLEVBQ2pHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXUSxTQUFTLFlBQXVDO0FBQ3RELFdBQU8sS0FBSyx3QkFBd0IsVUFBVSxLQUN6QyxLQUFLLFFBQVEsSUFBSSxXQUFXLFFBQVEsR0FBRyx5QkFBeUIsOEJBQThCO0FBQUEsRUFDckc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU1EsbUJBQ04seUJBQ0EsbUJBQ007QUFDTixRQUFJLENBQUMsS0FBSyxpQkFBa0Isd0JBQXdCLFdBQVcsS0FBSyxrQkFBa0IsV0FBVyxHQUFJO0FBQ25HO0FBQUEsSUFDRjtBQUVBLFNBQUssc0JBQXNCLHlCQUF5QixpQkFBaUI7QUFFckUsUUFBSSxLQUFLLHFCQUFxQjtBQUM1QjtBQUFBLElBQ0Y7QUFFQSxTQUFLLHNCQUFzQjtBQUMzQixlQUFXLGNBQWMseUJBQXlCO0FBQ2hELFdBQUssc0JBQXNCLFdBQVcsS0FBSyxxQkFBcUIsVUFBVSxDQUFDO0FBQUEsSUFDN0U7QUFFQSxlQUFXLFlBQVksbUJBQW1CO0FBQ3hDLFdBQUssc0JBQXNCLFdBQVcsS0FBSyw2QkFBNkIsUUFBUSxDQUFDO0FBQUEsSUFDbkY7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYyxVQUF5QjtBQUNyQyxVQUFNLDBCQUEwQixLQUFLLDJCQUEyQjtBQUNoRSxVQUFNLG9CQUFvQixLQUFLLG1CQUFtQixtQkFBNEI7QUFFOUUsUUFBSSx3QkFBd0IsV0FBVyxLQUFLLGtCQUFrQixXQUFXLEdBQUc7QUFDMUUsV0FBSyx1QkFBdUI7QUFDNUIsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxzQkFBc0I7QUFFM0IsVUFBSSxDQUFDLEtBQUssd0JBQXdCO0FBQ2hDLGFBQUsseUJBQXlCO0FBQzlCLGNBQU0sS0FBSyxtQkFBbUI7QUFBQSxNQUNoQztBQUVBLFdBQUssaUJBQWlCO0FBQ3RCO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBSyx3QkFBd0I7QUFDL0IsV0FBSyx5QkFBeUI7QUFDOUIsV0FBSyxxQkFBcUI7QUFPMUIsV0FBSywwQkFBMEIsT0FBTyxXQUFXLE1BQU07QUFDckQsYUFBSyxhQUFhO0FBQUEsTUFDcEIsR0FBRyw4Q0FBOEM7QUFFakQsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxzQkFBc0IseUJBQXlCLGlCQUFpQjtBQUNyRTtBQUFBLElBQ0Y7QUFFQSxTQUFLLG1CQUFtQix5QkFBeUIsaUJBQWlCO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVUSxvQkFDTixhQUNBLHlCQUNBLG1CQUNNO0FBQ04sUUFBSSx3QkFBd0IsU0FBUyxHQUFHO0FBQ3RDLGtCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQixlQUFlLEVBQUUsQ0FBQztBQUFBLElBQy9GO0FBRUEsZUFBVyxjQUFjLHlCQUF5QjtBQUNoRCxZQUFNLFdBQVcsWUFBWSxVQUFVO0FBQUEsUUFDckMsS0FBSyxDQUFDLFNBQVMsYUFBYSxTQUFTLHNCQUFzQjtBQUFBLE1BQzdELENBQUM7QUFDRCxlQUFTLE9BQU8sS0FBSyxxQkFBcUIsVUFBVSxDQUFDO0FBQ3JELGdDQUEwQixTQUFTLFVBQVUsR0FBRyxXQUFXLE1BQU07QUFFakUsWUFBTSxRQUFRLHdCQUF3QjtBQUFBLFFBQ3BDLEtBQUssS0FBSztBQUFBLFFBQ1YsVUFBVSxXQUFXO0FBQUEsTUFDdkIsQ0FBQztBQUlELFVBQUksVUFBVSxxQkFBcUIsU0FBUztBQUMxQyxZQUFJLGdCQUFnQixRQUFRLEVBQ3pCLGNBQWM7QUFBQSxVQUFFLENBQUMsTUFDaEIsVUFBVSxxQkFBcUIsdUJBQzNCLEVBQUUsWUFBWSxpQkFBaUIsU0FDL0IsRUFBRSxZQUFZLGlCQUFpQjtBQUFBLFFBQ3JDLENBQUMsRUFDQSxPQUFPLEVBQ1AsUUFBUSxtQkFBbUIsWUFBWTtBQUN0QyxnQkFBTSx1QkFBdUI7QUFBQSxZQUMzQixLQUFLLEtBQUs7QUFBQSxZQUNWLFVBQVUsV0FBVztBQUFBLFlBQ3JCLFlBQVksV0FBVztBQUFBLFlBQ3ZCLHVCQUF1QixLQUFLO0FBQUEsVUFDOUIsQ0FBQztBQUFBLFFBQ0gsQ0FBQyxDQUFDO0FBQ0o7QUFBQSxNQUNGO0FBSUEsVUFBSSxnQkFBZ0IsUUFBUSxFQUN6QixjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsUUFBUSxFQUFFLHNCQUFzQixXQUFXLFdBQVcsQ0FBQyxDQUFDLEVBQzlHLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sYUFBYTtBQUFBLFVBQ2pCLEtBQUssS0FBSztBQUFBLFVBQ1YsVUFBVSxXQUFXO0FBQUEsVUFDckIsWUFBWSxXQUFXO0FBQUEsVUFDdkIsdUJBQXVCLEtBQUs7QUFBQSxVQUM1QixzQkFBc0IsS0FBSyxPQUFPLFNBQVM7QUFBQSxRQUM3QyxDQUFDO0FBQUEsTUFDSCxDQUFDLENBQUM7QUFLSixXQUFLLHlCQUF5QixVQUFVLFdBQVcsVUFBVSxXQUFXLFVBQVU7QUFBQSxJQUNwRjtBQUVBLFFBQUksa0JBQWtCLFdBQVcsR0FBRztBQUNsQztBQUFBLElBQ0Y7QUFFQSxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLGVBQWUsRUFBRSxDQUFDO0FBRTNGLGVBQVcsWUFBWSxtQkFBbUI7QUFDeEMsV0FBSyxvQkFBb0IsYUFBYSxVQUFVLEtBQUssNkJBQTZCLFFBQVEsQ0FBQztBQUFBLElBQzdGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFRLG9CQUFvQixhQUEwQixVQUEwQixpQkFBeUM7QUFDdkgsVUFBTSxXQUFXLFlBQVksVUFBVTtBQUFBLE1BQ3JDLEtBQUssQ0FBQyxTQUFTLGFBQWEsU0FBUyxvQkFBb0I7QUFBQSxJQUMzRCxDQUFDO0FBQ0QsYUFBUyxPQUFPLGVBQWU7QUFDL0IsOEJBQTBCLFNBQVMsVUFBVSxHQUFHLFNBQVMsTUFBTTtBQUUvRCxRQUFJLGdCQUFnQixRQUFRLEVBQ3pCLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsU0FBUyxFQUFFLHVCQUF1QixTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQzVHLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLFlBQU0sdUJBQXVCO0FBQUEsUUFDM0IsS0FBSyxLQUFLO0FBQUEsUUFDVixVQUFVLFNBQVM7QUFBQSxNQUNyQixDQUFDO0FBQ0QsWUFBTSxLQUFLLFFBQVE7QUFBQSxJQUNyQixDQUFDLENBQUM7QUFFSixTQUFLLHlCQUF5QixVQUFVLFNBQVMsVUFBVSxTQUFTLFVBQVU7QUFBQSxFQUNoRjtBQUFBLEVBRVEseUJBQXlCLFVBQXVCLFVBQWtCLFlBQTBCO0FBQ2xHLFFBQUksZ0JBQWdCLFFBQVEsRUFDekIsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLHdCQUF3QjtBQUFBLE1BQzdFLHNCQUFzQjtBQUFBLElBQ3hCLENBQUMsQ0FBQyxFQUNELFFBQVEsTUFBTTtBQUNiLHFCQUFlO0FBQUEsUUFDYixLQUFLLEtBQUs7QUFBQSxRQUNWLE9BQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFUSxzQkFDTix5QkFDQSxtQkFDTTtBQUNOLFFBQUksS0FBSyxtQkFBbUI7QUFDMUI7QUFBQSxJQUNGO0FBTUEsVUFBTSxvQkFBb0IsSUFBSSx3QkFBd0I7QUFBQSxNQUNwRCxRQUFRLEtBQUs7QUFBQSxNQUNiLGNBQWMsQ0FBQyxnQkFBc0I7QUFDbkMsYUFBSyxvQkFBb0IsYUFBYSx5QkFBeUIsaUJBQWlCO0FBQUEsTUFDbEY7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLElBQUksUUFBUSxjQUFjLGlCQUFpQjtBQUNoRCxTQUFLLG9CQUFvQjtBQUFBLEVBQzNCO0FBQ0Y7IiwibmFtZXMiOlsiUGx1Z2luQ29uZmxpY3RTZXZlcml0eSJdfQ==
|
|
593
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIEV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBjYXVnaHQgdGhlIG1vbWVudCBpdCBpcyBlbmFibGVkLCBkaXNhYmxlZCwgaW5zdGFsbGVkLCB1bmluc3RhbGxlZCBvclxuICogdXBkYXRlZCwgd2hvZXZlciB3cm90ZSBpdC4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOiBgYXBwLnBsdWdpbnNgIGlzIGFuIGBFdmVudHNgIHNvdXJjZSB3aG9zZVxuICogYGRpZENoYW5nZWAgdHJpZ2dlcnMgYGNoYW5nZWRgLCBkZWJvdW5jZWQgYnkgb25lIG1hY3JvdGFzaywgYWZ0ZXIgZWFjaCBvZiB0aG9zZSwgYW5kIHRoZSBnYXRlIHJlLXJlYWRzXG4gKiB0aGUgbWFuaWZlc3RzIG9uIGl0LiBBIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnkgYWxzbyBhbm5vdW5jZXMgaXRzZWxmIHRocm91Z2ggdGhlIGxpZmVjeWNsZVxuICogYnJvYWRjYXN0IChgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSwgd2hpY2ggdGhlIGdhdGUgcmUtcmVhZHMgb24gdG9vLlxuICpcbiAqICMjIFdoeSBhIGxvc3MgaXMgYW5ub3VuY2VkIGxhdGVcbiAqXG4gKiBPYnNpZGlhbiB1cGRhdGVzIGFuIGVuYWJsZWQgcGx1Z2luIGJ5IHJlbG9hZGluZyBpdDogdGhlIG9sZCBjb3B5IHVubG9hZHMsIHRoZSBuZXcgb25lIGxvYWRzLiBGb3IgdGhlXG4gKiBtb21lbnQgaW4gYmV0d2VlbiB0aGUgcHJvdmlkZXIncyBBUEkgaXMgcmV2b2tlZCwgc28gZXZlcnkgZGVwZW5kZW50IHNlZXMgaXRzIGRlcGVuZGVuY3kgZ28gYXdheSBhbmRcbiAqIGNvbWUgYmFjay4gVGhlIGZlYXR1cmUgc3VyZmFjZSBzdGlsbCBjb21lcyBkb3duIGF0IG9uY2Ug4oCUIHRoZSBkZXBlbmRlbmN5IHJlYWxseSBpcyBnb25lIGZvciB0aGF0XG4gKiBtb21lbnQg4oCUIGJ1dCB0aGUgbm90aWNlIHdhaXRzIHtAbGluayBMT1NTX0FOTk9VTkNFTUVOVF9HUkFDRV9QRVJJT0RfSU5fTUlMTElTRUNPTkRTfSwgYW5kIGEgbG9zcyB0aGF0XG4gKiBoZWFsZWQgaW4gdGhlIG1lYW50aW1lIGlzIG5ldmVyIGFubm91bmNlZC4gV2l0aG91dCB0aGF0LCB1cGRhdGluZyBvbmUgcGx1Z2luIHB1dCBhIFwibm8gbG9uZ2VyXG4gKiBhdmFpbGFibGVcIiBub3RpY2Ugb24gc2NyZWVuIGluIGV2ZXJ5IHBsdWdpbiBkZXBlbmRpbmcgb24gaXQsIGRlc2NyaWJpbmcgYSBzdGF0ZSB0aGF0IG5vIGxvbmdlciBoZWxkIGJ5XG4gKiB0aGUgdGltZSB0aGUgdXNlciByZWFkIGl0LiBBIGxvc3MgdGhlIHVzZXIgY2F1c2VkIG9uIHB1cnBvc2Ug4oCUIGRpc2FibGluZyBvciB1bmluc3RhbGxpbmcgdGhlXG4gKiBkZXBlbmRlbmN5IOKAlCBvdXRsYXN0cyB0aGUgd2luZG93IGFuZCBpcyBhbm5vdW5jZWQgYXMgYmVmb3JlLCBvbmx5IGEgZmV3IHNlY29uZHMgbGF0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBc3luY0V2ZW50U291cmNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIFBsdWdpblNldHRpbmdUYWJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50TmFtZSxcbiAgUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cy50cyc7XG5pbXBvcnQgdHlwZSB7IFRoaXJkUGFydHlQbHVnaW5EZXBlbmRlbmN5IH0gZnJvbSAnLi4vcGx1Z2luL3RoaXJkLXBhcnR5LXBsdWdpbi50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luIH0gZnJvbSAnLi4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHtcbiAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZSxcbiAgYXNDb2RlQmxvY2ssXG4gIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3Ncbn0gZnJvbSAnLi4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHtcbiAgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24sXG4gIHdhdGNoUGx1Z2luQXBpXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tYXBpLnRzJztcbmltcG9ydCB7XG4gIGNvbXBhcmVQbHVnaW5WZXJzaW9uV2l0aE1pbmltdW0sXG4gIGdldEluc3RhbGxlZFBsdWdpblN0YXRlLFxuICBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uLFxuICBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luLFxuICBJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgUGx1Z2luVmVyc2lvbkNvbXBhcmlzb24sXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHsgUExVR0lOU19DSEFOR0VEX0VWRU5UX05BTUUgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbmNlLnRzJztcbmltcG9ydCB7XG4gIFBMVUdJTl9MT0FERURfRVZFTlRfTkFNRSxcbiAgUExVR0lOX1VOTE9BREVEX0VWRU5UX05BTUVcbn0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1saWZlY3ljbGUtZXZlbnRzLnRzJztcbmltcG9ydCB7XG4gIGlzVGhpcmRQYXJ0eVBsdWdpbkRlcGVuZGVuY3ksXG4gIHdhdGNoVGhpcmRQYXJ0eVBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vdGhpcmQtcGFydHktcGx1Z2luLnRzJztcbmltcG9ydCB7IG9wZW5TZXR0aW5nVGFiIH0gZnJvbSAnLi4vc2V0dGluZ3MtbW9kYWwudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIGRlcGVuZGVuY3kgYFBsdWdpbkJhc2UuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzKClgIG1heSBkZWNsYXJlOiBhIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnkgdGhhdCBwdWJsaXNoZXNcbiAqIGl0cyBBUEkgKHtAbGluayBQbHVnaW5EZXBlbmRlbmN5fSksIG9yIGEgdGhpcmQtcGFydHkgcGx1Z2luIHJlYWQgdGhyb3VnaCBhbiBhZGFwdGVyXG4gKiAoe0BsaW5rIFRoaXJkUGFydHlQbHVnaW5EZXBlbmRlbmN5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeSA9IFBsdWdpbkRlcGVuZGVuY3kgfCBUaGlyZFBhcnR5UGx1Z2luRGVwZW5kZW5jeTtcblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LCBwdWJsaXNoaW5nIGl0cyBBUEkgdGhyb3VnaCB0aGlzIGxpYnJhcnkncyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5EZXBlbmRlbmN5IGV4dGVuZHMgUGx1Z2luRGVwZW5kZW5jeUJhc2Uge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGhhcywgd2hpY2hldmVyIHdheSBpdHMgQVBJIGlzIHJlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGVwZW5kZW5jeUJhc2Uge1xuICAvKipcbiAgICogVGhlIG9sZGVzdCByZWxlYXNlIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4gdGhlIGRlcGVuZGVudCB3b3JrcyB3aXRoLCBlLmcuIGAnMi4yLjAnYC5cbiAgICpcbiAgICogRm9yIGEgcHJvdmlkZXIgd2hvc2UgQkVIQVZJT1IgY2hhbmdlZCB3aGlsZSBpdHMgQVBJIGNvbnRyYWN0IHN0YXllZCB0aGUgc2FtZSwgd2hpY2hcbiAgICoge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfSBjYW5ub3Qgc2VlLiBBIGRlcGVuZGVuY3kgZW5hYmxlZCBiZWxvdyBpdCBjb3VudHMgYXMgVU5TQVRJU0ZJRUQgYW5kIGFza3MgdGhlXG4gICAqIHVzZXIgdG8gdXBkYXRlIGl0LiBFdmFsdWF0ZWQgYWdhaW5zdCBgbWFuaWZlc3QudmVyc2lvbmA7IGEgdmVyc2lvbiB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgY291bnRzIGFzIHRvb1xuICAgKiBvbGQuIEEgbWluaW11bSByYXRoZXIgdGhhbiBhIHJhbmdlLCBiZWNhdXNlIHRoZSBvbmx5IGFkdmljZSB0aGUgZ2F0ZSBjYW4gZ2l2ZSBpcyBcInVwZGF0ZSBpdFwiLCBhbmQgYW5cbiAgICogdXBwZXIgYm91bmQgaXMgYSB2ZXJzaW9uIG5vIHVwZGF0ZSByZWFjaGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluUGx1Z2luVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHJlcXVpcmVkIHBsdWdpbiwgYXMgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHJlcXVpcmVkIHBsdWdpbiwgc2hvd24gdG8gdGhlIHVzZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbG9jYWxpemVkIHNlbnRlbmNlIHNheWluZyB3aGF0IHRoZSBkZXBlbmRlbnQgZG9lcyB3aXRoIHRoaXMgcGx1Z2luLCBzaG93biBpbiB0aGUgc2V0dGluZ3MgYmFubmVyLlxuICAgKlxuICAgKiBUaGUgZGVwZW5kZW50IG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgaXQgdXNlcyB0aGUgb3RoZXIgcGx1Z2luIGZvciwgYW5kIGEgdXNlclxuICAgKiBiZWluZyBhc2tlZCB0byBpbnN0YWxsIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5HYXRlQ29tcG9uZW50fSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5HYXRlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbmZsaWN0cyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gcmVmdXNlcyB0byBydW4gYmVzaWRlIG5vdGhpbmcuXG4gICAqL1xuICByZWFkb25seSBjb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W107XG5cbiAgLyoqXG4gICAqIFRoZSBkZXBlbmRlbmNpZXMgdG8gZW5mb3JjZS4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGUgcGx1Z2luIGRlcGVuZHMgb24gbm90aGluZywgYW5kIGl0cyBmZWF0dXJlXG4gICAqIHN1cmZhY2UgbG9hZHMgaW1tZWRpYXRlbHkuXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGBQbHVnaW5BcGlSZWZgIGFuZCBgVGhpcmRQYXJ0eVBsdWdpbkFwaVJlZmAgdGhlIGdhdGUgcmVhZHMuXG4gKi9cbmludGVyZmFjZSBEZXBlbmRlbmN5QXBpUmVmIGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxEZXBlbmRlbmN5QXBpUmVmRXZlbnRNYXA+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEksIG9yIGBudWxsYCB3aGlsZSB1bmF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBudWxsIHwgb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBldmVudHMgYSB7QGxpbmsgRGVwZW5kZW5jeUFwaVJlZn0gZmlyZXMuXG4gKi9cbmludGVyZmFjZSBEZXBlbmRlbmN5QXBpUmVmRXZlbnRNYXAge1xuICAvKipcbiAgICogRmlyZWQgd2hlbmV2ZXIge0BsaW5rIERlcGVuZGVuY3lBcGlSZWYudmFsdWV9IGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGdhdGUgcmVhZHMgb2ZmIG9uZSBkZXBlbmRlbmN5J3MgQVBJIHdhdGNoLCB3aGljaGV2ZXIga2luZCBpdCBpcy5cbiAqL1xuaW50ZXJmYWNlIERlcGVuZGVuY3lBcGlXYXRjaCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkZXBlbmRlbmN5IHB1Ymxpc2hlcyBhbiBBUEkgd2hvc2UgY29udHJhY3QgdmVyc2lvbiBpcyBvdXRzaWRlIHRoZSBkZWNsYXJlZCByYW5nZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGFuc3dlciwgcmVhZCBub3cuXG4gICAqL1xuICByZWFkb25seSBpc0FwaVZlcnNpb25NaXNtYXRjaDogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpdmUgcmVmZXJlbmNlOyBpdHMgYHZhbHVlYCBpcyB0aGUgQVBJLCBvciBgbnVsbGAgd2hpbGUgdW5hdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSByZWY6IERlcGVuZGVuY3lBcGlSZWY7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRhYiBhIGJsb2NrZWQgcGx1Z2luIHNob3dzIGluIHBsYWNlIG9mIHRoZSBvbmUgaXQgbmV2ZXIgZ290IHRvIHJlZ2lzdGVyLlxuICpcbiAqIEEgYmxvY2tlZCBwbHVnaW4ncyBgb25sb2FkSW1wbGAgbmV2ZXIgcmFuLCBzbyBpdHMgcmVhbCBzZXR0aW5ncyB0YWIgZG9lcyBub3QgZXhpc3Qg4oCUIGFuZCBhIHVzZXIgd2hvIGdvZXNcbiAqIGxvb2tpbmcgZm9yIHRoZSBwbHVnaW4ncyBzZXR0aW5ncyBpcyBwcmVjaXNlbHkgdGhlIHVzZXIgYXNraW5nIFwid2h5IGlzbid0IHRoaXMgZG9pbmcgYW55dGhpbmc/XCIuIEFuXG4gKiBlbXB0eSBzcGFjZSBpcyB0aGUgd29yc3QgcG9zc2libGUgYW5zd2VyIHRvIHRoYXQgcXVlc3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3NldHRpbmdzLXRhYi9wcmVmZXItc2V0dGluZy1kZWZpbml0aW9ucyAtLSBUaGlzIHRhYiBoYXMgbm8gc2V0dGluZ3MgdG8gZGVjbGFyZS4gSXQgc3RhbmRzIGluIGZvciBhIHNldHRpbmdzIHRhYiB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCwgY2FycnlpbmcgYW4gZXhwbGFuYXRpb24gYW5kIGEgcmVwYWlyIGJ1dHRvbiwgYW5kIHRoZSBwbHVnaW4ncyByZWFsIHNldHRpbmdzIGFwcGVhciB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zLlxuY2xhc3MgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQmxvY2tlZFBsdWdpblNldHRpbmdUYWJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lciA9IHBhcmFtcy5yZW5kZXJCYW5uZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuICAgIHRoaXMucmVuZGVyQmFubmVyKHRoaXMuY29udGFpbmVyRWwpO1xuICB9XG59XG5cbi8qKlxuICogRW5mb3JjZXMgYSBwbHVnaW4ncyBtYW5kYXRvcnkgZGVwZW5kZW5jaWVzIGFuZCBkZWNsYXJlZCBjb25mbGljdHMsIGdhdGluZyBpdHMgZmVhdHVyZSBzdXJmYWNlIG9uIGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5HYXRlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlXYXRjaGVzID0gbmV3IE1hcDxzdHJpbmcsIERlcGVuZGVuY3lBcGlXYXRjaD4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeVtdO1xuICBwcml2YXRlIGhhc0Fubm91bmNlZEJsb2NrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0ZlYXR1cmVTdXJmYWNlTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNMYXlvdXRSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBsb3NzQW5ub3VuY2VtZW50VGltZXJJZDogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IEFwcCB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5HYXRlQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZsaWN0cyA9IHBhcmFtcy5jb25mbGljdHM7XG4gICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBwYXJhbXMuZGVwZW5kZW5jaWVzO1xuICAgIHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLmxvYWRGZWF0dXJlU3VyZmFjZTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UgPSBwYXJhbXMudW5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGV0aGVyIGFueSB3YXJuaW5nIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogVGhlIHByZWRpY2F0ZSBhIGRlY2xhcmF0aXZlIHNldHRpbmdzIHRhYiBuZWVkcywgYW5kIHRoZSBjb3VudGVycGFydCB0b1xuICAgKiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZWAuIFN1Y2ggYSB0YWIgZGVjaWRlcyB3aGV0aGVyIGEgcm93IGV4aXN0c1xuICAgKiBCRUZPUkUgaXQgcmVuZGVycyBhbnl0aGluZyBpbnRvIGl0LCBzbyB7QGxpbmsgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyfSB3cml0aW5nIG5vdGhpbmcgY2Fubm90XG4gICAqIGFuc3dlciB0aGUgcXVlc3Rpb24gZm9yIGl0IOKAlCBhIHJvdyB0aGF0IHJlbmRlcnMgZW1wdHkgaXMgc3RpbGwgYSByb3csIHdpdGggdGhlIGRpdmlkZXIgYW5kIHBhZGRpbmdcbiAgICogZXZlcnkgb3RoZXIgc2V0dGluZyBoYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYXQgbGVhc3Qgb25lIGRlY2xhcmVkIHdhcm5pbmcgY29uZmxpY3QgaG9sZHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQWN0aXZlV2FybmluZ0NvbmZsaWN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB3YXRjaGluZyBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGFuZCBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBhcGlXYXRjaCA9IHRoaXMud2F0Y2hEZXBlbmRlbmN5QXBpKGRlcGVuZGVuY3kpO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlXYXRjaC5yZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVdhdGNoZXMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVdhdGNoKTtcbiAgICB9XG5cbiAgICAvLyBBIGNvbmZsaWN0IGhhcyBubyBBUEkgdG8gd2F0Y2gg4oCUIGl0IGlzIHJlYWQgb3V0IG9mIHRoZSBtYW5pZmVzdHMg4oCUIHNvIHRoZSB0cmlnZ2VycyB0byByZS1yZWFkIGFyZVxuICAgIC8vIGBhcHAucGx1Z2luc2AgYGNoYW5nZWRgLCB3aGljaCBPYnNpZGlhbiByYWlzZXMgYWZ0ZXIgZXZlcnkgZW5hYmxlLCBkaXNhYmxlLCBpbnN0YWxsLCB1bmluc3RhbGwgYW5kXG4gICAgLy8gbWFuaWZlc3QgcmVsb2FkIG9mIEFOWSBwbHVnaW4sIGFuZCB0aGUgbGlicmFyeSdzIG93biBsaWZlY3ljbGUgYnJvYWRjYXN0LiBUaGUgYnJvYWRjYXN0IHN0YXlzOiBhXG4gICAgLy8gcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeSBmaW5pc2hlcyBsb2FkaW5nIGFmdGVyIGBjaGFuZ2VkYCBoYXMgZmlyZWQsIGFuZCBpdHMgYGxvYWRlZGAgcGF5bG9hZCBpc1xuICAgIC8vIHRoZSBvbmUgbW9tZW50IGl0cyB3aG9sZSBzdXJmYWNlIGlzIHVwLiBSZS1yZWFkaW5nIG9uIGJvdGggY29zdHMgYSBtYW5pZmVzdCBsb29rdXAgcGVyIGNvbmZsaWN0LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5wbHVnaW5zLm9uKFxuICAgICAgUExVR0lOU19DSEFOR0VEX0VWRU5UX05BTUUsXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH0pXG4gICAgKSk7XG5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzVG9vT2xkKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUnVubmluZyhkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3QuY29uZmxpY3RBcHBlYXJlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEJsb2NrZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3QuYmxvY2tlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3Qud2FybmluZ05vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBlbmRlbmN5TG9zdE1lc3NhZ2UoZGVwZW5kZW5jeTogRGVjbGFyZWRQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgaWYgKHRoaXMuaXNUb29PbGQoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVOb1JlYWRhYmxlQXBpTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuZGVwZW5kZW5jeUxvc3ROb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3k6IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ub1JlYWRhYmxlQXBpTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS52ZXJzaW9uTWlzbWF0Y2hOb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGRlY2xhcmVkIGNvbmZsaWN0cyBvZiBvbmUgc2V2ZXJpdHkgdGhhdCBhcmUgY3VycmVudGx5IGluIGZvcmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V2ZXJpdHkgLSBUaGUgc2V2ZXJpdHkgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmxpY3RzIGhvbGRpbmcgcmlnaHQgbm93LCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBY3RpdmVDb25mbGljdHMoc2V2ZXJpdHk6IFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkpOiBQbHVnaW5Db25mbGljdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25mbGljdHMuZmlsdGVyKChjb25mbGljdCkgPT4gY29uZmxpY3Quc2V2ZXJpdHkgPT09IHNldmVyaXR5ICYmIHRoaXMuaXNDb25mbGljdEFjdGl2ZShjb25mbGljdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpOiBEZWNsYXJlZFBsdWdpbkRlcGVuZGVuY3lbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gIXRoaXMuYXBpV2F0Y2hlcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnJlZi52YWx1ZSB8fCB0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ibG9ja2VkU2V0dGluZ1RhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYXBwLnNldHRpbmcucmVtb3ZlU2V0dGluZ1RhYih0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYXQgYSByZWxlYXNlIG9sZGVyIHRoYW4gaXQgZGVjbGFyZWQgaXQgbmVlZHMuXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgbWFuaWZlc3QsIGxpa2UgYSBjb25mbGljdCwgYW5kIHJlLXJlYWQgb24gZXZlcnkgZXZhbHVhdGlvbjogT2JzaWRpYW4gYXBwbGllcyBhbiB1cGRhdGUgYnlcbiAgICogcmVsb2FkaW5nIHRoZSBwcm92aWRlciwgd2hpY2ggZmlyZXMgdGhlIEFQSSB3YXRjaCdzIGBjaGFuZ2VgLCBzbyB0aGUgZ2F0ZSBvcGVucyB3aXRob3V0IGEgcmVzdGFydC5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZGVwZW5kZW5jeSBpcyBlbmFibGVkIGJlbG93IGl0cyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeUJhc2UubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogRGVjbGFyZWRQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgaWYgKGRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24oe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5zdGFsbGVkVmVyc2lvbiAhPT0gbnVsbCAmJiBjb21wYXJlUGx1Z2luVmVyc2lvbldpdGhNaW5pbXVtKGluc3RhbGxlZFZlcnNpb24sIGRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbikgIT09IFBsdWdpblZlcnNpb25Db21wYXJpc29uLkF0TGVhc3RNaW5pbXVtO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgZGVjbGFyZWQgY29uZmxpY3QgaXMgaW4gZm9yY2UgcmlnaHQgbm93LlxuICAgKlxuICAgKiBPbmx5IGFuIEVOQUJMRUQgcGx1Z2luIGNvdW50cy4gT25lIHRoYXQgaXMgaW5zdGFsbGVkIGJ1dCBzd2l0Y2hlZCBvZmYgcmVnaXN0ZXJzIG5vdGhpbmcsIHNvIGl0IGNhbm5vdFxuICAgKiBjb2xsaWRlLCBhbmQgYWN0aW5nIG9uIGl0IHdvdWxkIGJlIGFuIGFsYXJtIHRoZSB1c2VyIGNhbiBvbmx5IGFuc3dlciBieSB1bmluc3RhbGxpbmcgc29tZXRoaW5nIHRoZXlcbiAgICogaGF2ZSBhbHJlYWR5IHR1cm5lZCBvZmYuXG4gICAqXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBkZWNsYXJlZCBjb25mbGljdC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYSBjb25mbGljdGluZyB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmZsaWN0QWN0aXZlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICB9KTtcblxuICAgIGlmIChpbnN0YWxsZWRWZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzYXRpc2ZpZXNWZXJzaW9uKGluc3RhbGxlZFZlcnNpb24sIGNvbmZsaWN0LmNvbmZsaWN0aW5nVmVyc2lvblJhbmdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYW4gdW5zYXRpc2ZpZWQgZGVwZW5kZW5jeSBpcyBub25ldGhlbGVzcyBlbmFibGVkIGFuZCBsb2FkZWQuXG4gICAqXG4gICAqIFN1Y2ggYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYnV0IHB1Ymxpc2hlcyBubyBBUEkgdGhpcyBwbHVnaW4gY2FuIHJlYWQg4oCUIG5vbmUgYXQgYWxsLCBvciBvbmUgd2hvc2Ugc2hhcGVcbiAgICogZmFpbHMgdGhlIGNvbnRyYWN0LiBUaGUgdXN1YWwgY2F1c2UgaXMgYSByZWxlYXNlIGJ1aWx0IG9uIGEgY29weSBvZiB0aGlzIGxpYnJhcnkgdGhhdCBwdWJsaXNoZXNcbiAgICogc29tZXdoZXJlIHRoaXMgb25lIGRvZXMgbm90IGxvb2ssIHNvIFwiaW5zdGFsbCBhbmQgZW5hYmxlIGl0XCIgd291bGQgYmUgZmFsc2UgYW5kIFwidXBkYXRlIGl0XCIgaXMgdGhlIGZpeC5cbiAgICpcbiAgICogQmVpbmcgaW4gYGVuYWJsZWRQbHVnaW5zYCBpcyBub3QgZW5vdWdoOiBPYnNpZGlhbidzIHBsYWluIGBkaXNhYmxlUGx1Z2luYCB1bmxvYWRzIGEgcGx1Z2luIGFuZCBsZWF2ZXMgaXRcbiAgICogdGhlcmUgKG9ubHkgYGRpc2FibGVQbHVnaW5BbmRTYXZlYCByZW1vdmVzIGl0KSwgc28gYSBwcm92aWRlciB0aGF0IHdlbnQgYXdheSB3b3VsZCBvdGhlcndpc2UgcmVhZCBhc1xuICAgKiBydW5uaW5nIHdpdGggYW4gdW5yZWFkYWJsZSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBhbmQgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1J1bm5pbmcoZGVwZW5kZW5jeTogRGVjbGFyZWRQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldEluc3RhbGxlZFBsdWdpblN0YXRlKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICAgIH0pID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkICYmIHRoaXMuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKGRlcGVuZGVuY3kucGx1Z2luSWQpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIGRlcGVuZGVuY3kgaXMgcnVubmluZyBidXQgdG9vIG9sZCBmb3IgdGhpcyBwbHVnaW4sIHNvIHRoZSBhZHZpY2UgaXMgXCJ1cGRhdGUgaXRcIi5cbiAgICpcbiAgICogVHdvIGluZGVwZW5kZW50IHNpZ25hbHMgc2F5IHNvOiBhIHJlbGVhc2UgYmVsb3cge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3lCYXNlLm1pblBsdWdpblZlcnNpb259LCBhbmQgYSBwdWJsaXNoZWRcbiAgICogQVBJIHdob3NlIGNvbnRyYWN0IHZlcnNpb24gaXMgb3V0c2lkZSB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2V9LlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeSAtIFRoZSBkZWNsYXJlZCBkZXBlbmRlbmN5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHVwZGF0aW5nIHRoZSBkZXBlbmRlbmN5IGlzIHdoYXQgaXQgbmVlZHMuXG4gICAqL1xuICBwcml2YXRlIGlzVG9vT2xkKGRlcGVuZGVuY3k6IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpXG4gICAgICB8fCB0aGlzLmFwaVdhdGNoZXMuZ2V0KGRlcGVuZGVuY3kucGx1Z2luSWQpPy5pc0FwaVZlcnNpb25NaXNtYXRjaCgpID09PSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCBpcyBpbiB0aGUgd2F5LCBhbmQgcHV0cyB0aGUgc2FtZSBleHBsYW5hdGlvbiB3aGVyZSB0aGUgdXNlciB3aWxsIGxvb2sgZm9yIHRoZSBwbHVnaW4nc1xuICAgKiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzIC0gVGhlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHNhdGlzZmllZC5cbiAgICogQHBhcmFtIGJsb2NraW5nQ29uZmxpY3RzIC0gVGhlIGNvbmZsaWN0cyBjdXJyZW50bHkgcmVmdXNpbmcgdGhlIHBsdWdpbiB0aGUgcmlnaHQgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVzZW50VW5zYXRpc2ZpZWQoXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5zZXR0aW5nc0hlYWRpbmcpIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luRGVwZW5kZW5jeUJhbm5lcl1cbiAgICAgIH0pO1xuICAgICAgYmFubmVyRWwuYXBwZW5kKHRoaXMuY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeSkpO1xuICAgICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShiYW5uZXJFbC5jcmVhdGVEaXYoKSwgZGVwZW5kZW5jeS5yZWFzb24pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IGdldEluc3RhbGxlZFBsdWdpblN0YXRlKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbiBlbmFibGVkIGRlcGVuZGVuY3kgdGhhdCBpcyBzdGlsbCB1bnNhdGlzZmllZCBpcyB0b28gb2xkLCBhbmQgaW5zdGFsbGluZyBvciBlbmFibGluZyBpdCBhZ2FpbiBkb2VzXG4gICAgICAvLyBub3RoaW5nLCBzbyBpdCBpcyBvZmZlcmVkIGFuIHVwZGF0ZSBpbnN0ZWFkLlxuICAgICAgaWYgKHN0YXRlICE9PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT5cbiAgICAgICAgICAgIHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICAgICAgICA/ICQub2JzaWRpYW5MaWIucGx1Z2luU3VnZ2VzdGlvbi5lbmFibGVcbiAgICAgICAgICAgICAgOiAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uaW5zdGFsbFxuICAgICAgICAgICkpXG4gICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGxBbmRFbmFibGVQbHVnaW4oe1xuICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBPYnNpZGlhbiBhcHBsaWVzIHRoZSB1cGRhdGUgYnkgcmVsb2FkaW5nIHRoZSBkZXBlbmRlbmN5LCB3aGljaCByZXB1Ymxpc2hlcyBpdHMgQVBJLCBzbyB0aGUgd2F0Y2gnc1xuICAgICAgLy8gYGNoYW5nZWAgcmVvcGVucyB0aGUgZ2F0ZSB3aXRoIG5vIGZ1cnRoZXIgc3RlcCBoZXJlLlxuICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LnVwZGF0ZSwgeyBkZXBlbmRlbmN5UGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lIH0pKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB1cGRhdGVQbHVnaW4oe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkLFxuICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICAgIHJlcXVlc3RpbmdQbHVnaW5OYW1lOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcblxuICAgICAgLy8gVGhlIGxpbmsgT1VUIHRvIHRoZSBkZXBlbmRlbmN5J3Mgb3duIHNldHRpbmdzLCBzaG93biBvbmx5IG9uY2UgaXQgaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkIOKAlCB0aGVcbiAgICAgIC8vIG90aGVyIGhhbGYgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyB2aXNpYmxlIGZyb20gYm90aCBlbmRzLiBJdCBpcyB3aGF0IHN0b3BzIFwiY29uZmlndXJlIG9uZVxuICAgICAgLy8gb3BlcmF0aW9uIGFjcm9zcyB0d28gcGx1Z2luc1wiIGZyb20gbWVhbmluZyBcImdvIGFuZCBmaW5kIHRoZSBvdGhlciBwbHVnaW4geW91cnNlbGZcIi5cbiAgICAgIHRoaXMucmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsLCBkZXBlbmRlbmN5LnBsdWdpbklkLCBkZXBlbmRlbmN5LnBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3Quc2V0dGluZ3NIZWFkaW5nKSB9KTtcblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgYmxvY2tpbmdDb25mbGljdHMpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbCwgY29uZmxpY3QsIHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIG9uZSBjb25mbGljdDogd2hhdCBpdCBpcywgd2h5IGl0IG1hdHRlcnMsIGFuZCB0aGUgdHdvIHdheXMgb3V0IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWlyIGlzIG9mZmVyZWQgb24gdGhlIE9USEVSIHBsdWdpbiDigJQgZGlzYWJsaW5nIGl0IGlzIHRoZSBvbmUgdGhpbmcgdGhpcyBwbHVnaW4gY2FuIGRvIGluIGFcbiAgICogY2xpY2ssIHNpbmNlIGl0IGNhbm5vdCB1cGRhdGUgc29tZW9uZSBlbHNlJ3MgcGx1Z2luIOKAlCBhbmQgaXQgaXMgdGhlIHBlcnNpc3RlZCBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgXG4gICAqIHJhdGhlciB0aGFuIHRoZSB0cmFuc2llbnQgZGlzYWJsZSwgYmVjYXVzZSB0aGUgdXNlciBhc2tlZCBmb3IgaXQgYnkgY2xpY2tpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgY29uZmxpY3QgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0gbWVzc2FnZUZyYWdtZW50IC0gVGhlIHNlbnRlbmNlIGV4cGxhaW5pbmcgdGhlIGNvbmZsaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0LCBtZXNzYWdlRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBiYW5uZXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7XG4gICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luQ29uZmxpY3RCYW5uZXJdXG4gICAgfSk7XG4gICAgYmFubmVyRWwuYXBwZW5kKG1lc3NhZ2VGcmFnbWVudCk7XG4gICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShiYW5uZXJFbC5jcmVhdGVEaXYoKSwgY29uZmxpY3QucmVhc29uKTtcblxuICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAuc2V0QnV0dG9uVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmRpc2FibGUsIHsgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBjb25mbGljdC5wbHVnaW5OYW1lIH0pKVxuICAgICAgLnNldEN0YSgpXG4gICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiBjb25mbGljdC5wbHVnaW5JZFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgY29uZmxpY3QucGx1Z2luSWQsIGNvbmZsaWN0LnBsdWdpbk5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWw6IEhUTUxFbGVtZW50LCBwbHVnaW5JZDogc3RyaW5nLCBwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5Lm9wZW5EZXBlbmRlbmN5U2V0dGluZ3MsIHtcbiAgICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IHBsdWdpbk5hbWVcbiAgICAgIH0pKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBvcGVuU2V0dGluZ1RhYih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICB0YWJJZDogcGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBEZWNsYXJlZFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ibG9ja2VkU2V0dGluZ1RhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFkZGVkIHRocm91Z2ggYGFwcC5zZXR0aW5nYCByYXRoZXIgdGhhbiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgLCBiZWNhdXNlIHRoaXMgdGFiIGhhcyB0byBjb21lIGJhY2tcbiAgICAvLyBPRkYgYWdhaW4gdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucyDigJQgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBvd24gc2V0dGluZ3MgdGFiLCByZWdpc3RlcmVkIGJ5XG4gICAgLy8gYG9ubG9hZEltcGxgLCB3b3VsZCBhcHBlYXIgYmVzaWRlIGEgc3RhbGUgXCJyZXF1aXJlZCBwbHVnaW4gbWlzc2luZ1wiIG9uZS4gYHBsdWdpbi5hZGRTZXR0aW5nVGFiYFxuICAgIC8vIG9ubHkgZXZlciByZW1vdmVzIGF0IHBsdWdpbiB1bmxvYWQuXG4gICAgY29uc3QgYmxvY2tlZFNldHRpbmdUYWIgPSBuZXcgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIoe1xuICAgICAgcGx1Z2luOiB0aGlzLnBsdWdpbixcbiAgICAgIHJlbmRlckJhbm5lcjogKGNvbnRhaW5lckVsKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyQmxvY2tlZEJhbm5lcihjb250YWluZXJFbCwgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmFwcC5zZXR0aW5nLmFkZFNldHRpbmdUYWIoYmxvY2tlZFNldHRpbmdUYWIpO1xuICAgIHRoaXMuYmxvY2tlZFNldHRpbmdUYWIgPSBibG9ja2VkU2V0dGluZ1RhYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgb25lIGRlcGVuZGVuY3kncyBBUEksIHRoZSB3YXkgaXRzIGtpbmQgaXMgcmVhZC5cbiAgICpcbiAgICogQSB0aGlyZC1wYXJ0eSBkZXBlbmRlbmN5IGlzIHJlYWQgdGhyb3VnaCBpdHMgYWRhcHRlciwgd2hpY2ggaGFzIG5vIGNvbnRyYWN0IHZlcnNpb24sIHNvIGl0IG5ldmVyIHJlcG9ydHNcbiAgICogYW4gQVBJIHZlcnNpb24gbWlzbWF0Y2g6IGl0cyBcInRvbyBvbGRcIiBzaWduYWwgaXMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3lCYXNlLm1pblBsdWdpblZlcnNpb259IGFsb25lLCB3aGljaFxuICAgKiBgaXNCZWxvd01pblBsdWdpblZlcnNpb25gIHJlYWRzIGZvciBib3RoIGtpbmRzLiBTbyB0aGUgd2F0Y2ggaXMgTk9UIGhhbmRlZCB0aGUgbWluaW11bTogdGhlIHJlZiB3b3VsZCBvbmx5XG4gICAqIHJlYWQgYG51bGxgIGZvciB0aGUgc2FtZSByZWFzb24sIGFuZCB0aGUgZ2F0ZSBjb3VsZCBubyBsb25nZXIgdGVsbCBcInVwZGF0ZSBpdFwiIGZyb20gXCJpbnN0YWxsIGl0XCIuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFRoZSB3YXRjaC5cbiAgICovXG4gIHByaXZhdGUgd2F0Y2hEZXBlbmRlbmN5QXBpKGRlcGVuZGVuY3k6IERlY2xhcmVkUGx1Z2luRGVwZW5kZW5jeSk6IERlcGVuZGVuY3lBcGlXYXRjaCB7XG4gICAgaWYgKGlzVGhpcmRQYXJ0eVBsdWdpbkRlcGVuZGVuY3koZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXBpVmVyc2lvbk1pc21hdGNoOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgcmVmOiB3YXRjaFRoaXJkUGFydHlQbHVnaW5BcGkoe1xuICAgICAgICAgIGFkYXB0ZXI6IHtcbiAgICAgICAgICAgIGdldEFwaTogZGVwZW5kZW5jeS5hZGFwdGVyLmdldEFwaSxcbiAgICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LmFkYXB0ZXIucGx1Z2luSWQsXG4gICAgICAgICAgICBwbHVnaW5OYW1lOiBkZXBlbmRlbmN5LmFkYXB0ZXIucGx1Z2luTmFtZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb21wb25lbnQ6IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICBhcGlWZXJzaW9uUmFuZ2U6IGRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXBpVmVyc2lvbk1pc21hdGNoOiAoKSA9PiBhcGlSZWYudW5hdmFpbGFiaWxpdHlSZWFzb24gPT09IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlZlcnNpb25NaXNtYXRjaCxcbiAgICAgIHJlZjogYXBpUmVmXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBGQSxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGFBQWEsd0JBQXdCO0FBQzlDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBQ2xCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0NBQWtDO0FBQzNDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLG9DQUFvQztBQVE3QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHlCQUFMLGtCQUFLQSw0QkFBTDtBQU9MLEVBQUFB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
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Component that manages displaying notices to the user.
|
|
7
7
|
*/
|
|
8
|
+
import type { DisposableEx } from '@mnaoumov/typescript-lib/disposable';
|
|
8
9
|
import type { ValueProvider } from '@mnaoumov/typescript-lib/value-provider';
|
|
9
10
|
import type { App } from 'obsidian';
|
|
10
11
|
import type { Promisable } from 'type-fest';
|
|
@@ -51,10 +52,10 @@ export interface PluginNoticeCloseClickEvent {
|
|
|
51
52
|
}
|
|
52
53
|
/**
|
|
53
54
|
* A handle to a delayed notice created by {@link PluginNoticeComponent.showNoticeAfterDelay}. It is a
|
|
54
|
-
* {@link
|
|
55
|
+
* {@link DisposableEx} (so it can be used with `using`) that also lets the content be updated while the
|
|
55
56
|
* notice is shown.
|
|
56
57
|
*/
|
|
57
|
-
export interface PluginNoticeComponentDelayedNotice extends
|
|
58
|
+
export interface PluginNoticeComponentDelayedNotice extends DisposableEx {
|
|
58
59
|
/**
|
|
59
60
|
* Replaces this handle's message, re-applying the plugin-name prefix, the interactive-click guard, and
|
|
60
61
|
* the Cancel button. Useful for reporting progress. If the delay has not elapsed yet, the new content
|
|
@@ -243,7 +244,7 @@ export declare class PluginNoticeComponent extends ComponentEx {
|
|
|
243
244
|
/**
|
|
244
245
|
* Shows a notice describing a long-running operation, but only once the operation has run for longer
|
|
245
246
|
* than {@link PluginNoticeComponentShowNoticeAfterDelayParams.delayInMilliseconds} — so operations
|
|
246
|
-
* that finish sooner never flash a notice. The notice stays until the returned {@link
|
|
247
|
+
* that finish sooner never flash a notice. The notice stays until the returned {@link DisposableEx} is
|
|
247
248
|
* disposed (which also cancels the pending timer if it has not fired yet), so it can be used with
|
|
248
249
|
* `using`. When an {@link PluginNoticeComponentShowNoticeAfterDelayParams.abortController} is given, a
|
|
249
250
|
* Cancel button that aborts it is appended (and, being interactive, does not dismiss the notice).
|