@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
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Which naming constraints each platform imposes, which of them a given path violates, and how to repair a
|
|
6
|
+
* name so it satisfies every enabled platform at once.
|
|
7
|
+
*
|
|
8
|
+
* Pure by design — no `App`, no vault, no I/O — so the whole correctness surface (byte counting, extension
|
|
9
|
+
* preservation, truncation order, profile composition) is unit-testable without an Obsidian instance. The
|
|
10
|
+
* vault pass that consumes it lives in each plugin that reports or repairs path problems.
|
|
11
|
+
*
|
|
12
|
+
* A vault is synced, so the platform that matters is not necessarily the one running: enabling several
|
|
13
|
+
* platforms composes their constraints by intersection, and a name has to satisfy all of them.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* A platform a vault may be synced to, and whose naming rules can therefore be enforced.
|
|
17
|
+
*/
|
|
18
|
+
export declare enum PathCompatibilityPlatform {
|
|
19
|
+
Android = "Android",
|
|
20
|
+
Ios = "Ios",
|
|
21
|
+
Linux = "Linux",
|
|
22
|
+
MacOs = "MacOs",
|
|
23
|
+
Windows = "Windows"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* What a single path or name is wrong about, on one platform.
|
|
27
|
+
*/
|
|
28
|
+
export declare enum PathCompatibilityViolationType {
|
|
29
|
+
ForbiddenCharacter = "ForbiddenCharacter",
|
|
30
|
+
NameTooLong = "NameTooLong",
|
|
31
|
+
/**
|
|
32
|
+
* The name holds a character Obsidian links do not work with (`#`, `^`, `[`, `]`, `|`). Obsidian's rule, not
|
|
33
|
+
* a platform's: the filesystem stores such a name fine, so naming a platform for it would be false.
|
|
34
|
+
*/
|
|
35
|
+
ObsidianForbiddenCharacter = "ObsidianForbiddenCharacter",
|
|
36
|
+
PathTooLong = "PathTooLong",
|
|
37
|
+
ReservedName = "ReservedName",
|
|
38
|
+
TrailingCharacter = "TrailingCharacter",
|
|
39
|
+
/**
|
|
40
|
+
* The name is stored on disk in a form other than Unicode NFC, e.g. `й` as `и` followed by a combining
|
|
41
|
+
* breve. Not a platform's rule but a sync hazard: tools outside Obsidian see the two forms as two names.
|
|
42
|
+
*/
|
|
43
|
+
UnicodeNotNormalized = "UnicodeNotNormalized"
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parameters for {@link findPathCompatibilityViolations}.
|
|
47
|
+
*/
|
|
48
|
+
export interface FindPathCompatibilityViolationsParams {
|
|
49
|
+
/**
|
|
50
|
+
* Whether the path names a folder, which has its own path budget.
|
|
51
|
+
*/
|
|
52
|
+
readonly isFolder: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* The length of the longest vault root path the vault is expected to live under, in characters.
|
|
55
|
+
*
|
|
56
|
+
* The vault root of a platform the check is not running on is unknowable, so it is stated rather than
|
|
57
|
+
* guessed — see the `maxVaultRootPathLength` setting.
|
|
58
|
+
*/
|
|
59
|
+
readonly maxVaultRootPathLength: number;
|
|
60
|
+
/**
|
|
61
|
+
* The vault-relative path to check.
|
|
62
|
+
*/
|
|
63
|
+
readonly path: string;
|
|
64
|
+
/**
|
|
65
|
+
* The platforms whose rules to enforce.
|
|
66
|
+
*/
|
|
67
|
+
readonly platforms: readonly PathCompatibilityPlatform[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A length a path or name was measured at, and the limit it exceeds.
|
|
71
|
+
*/
|
|
72
|
+
export interface PathCompatibilityMeasurement {
|
|
73
|
+
/**
|
|
74
|
+
* Whether both numbers count UTF-8 bytes rather than UTF-16 units.
|
|
75
|
+
*/
|
|
76
|
+
readonly isInBytes: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* The measured length.
|
|
79
|
+
*/
|
|
80
|
+
readonly length: number;
|
|
81
|
+
/**
|
|
82
|
+
* The largest length the platform accepts.
|
|
83
|
+
*/
|
|
84
|
+
readonly limit: number;
|
|
85
|
+
/**
|
|
86
|
+
* The vault root length counted into {@link PathCompatibilityMeasurement.length}, before the separator
|
|
87
|
+
* after it. `null` for a name, which carries no root.
|
|
88
|
+
*/
|
|
89
|
+
readonly vaultRootLength: null | number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The naming rules of one platform.
|
|
93
|
+
*/
|
|
94
|
+
export interface PathCompatibilityProfile {
|
|
95
|
+
/**
|
|
96
|
+
* Whether this platform applies Windows' naming rules: its forbidden characters, its reserved device
|
|
97
|
+
* names, and its rejection of trailing dots and spaces.
|
|
98
|
+
*
|
|
99
|
+
* One flag for three rules because they are one filesystem's rules, and no platform adopts a subset.
|
|
100
|
+
*/
|
|
101
|
+
readonly hasWindowsNamingRules: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* The longest absolute path a file may have, in this profile's unit.
|
|
104
|
+
*/
|
|
105
|
+
readonly maxFilePathLength: number;
|
|
106
|
+
/**
|
|
107
|
+
* The longest absolute path a folder may have, in this profile's unit.
|
|
108
|
+
*
|
|
109
|
+
* Below {@link PathCompatibilityProfile.maxFilePathLength} on Windows, where the shorter budget leaves
|
|
110
|
+
* room for an `8.3` name inside the folder.
|
|
111
|
+
*/
|
|
112
|
+
readonly maxFolderPathLength: number;
|
|
113
|
+
/**
|
|
114
|
+
* The longest single name — one path segment — in this profile's unit.
|
|
115
|
+
*/
|
|
116
|
+
readonly maxNameLength: number;
|
|
117
|
+
/**
|
|
118
|
+
* The platform this profile describes.
|
|
119
|
+
*/
|
|
120
|
+
readonly platform: PathCompatibilityPlatform;
|
|
121
|
+
/**
|
|
122
|
+
* Whether lengths count UTF-8 bytes (ext4, APFS) rather than UTF-16 units (NTFS).
|
|
123
|
+
*
|
|
124
|
+
* This is the whole reason the 255 limit is not a character count: a name of 128 CJK characters is 384
|
|
125
|
+
* bytes and is rejected by ext4 while being nowhere near any limit Windows has.
|
|
126
|
+
*/
|
|
127
|
+
readonly shouldMeasureInBytes: boolean;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* One thing wrong with one path, and the platform that objects to it.
|
|
131
|
+
*/
|
|
132
|
+
export interface PathCompatibilityViolation {
|
|
133
|
+
/**
|
|
134
|
+
* The offending characters, each once, in the order they first appear in the name.
|
|
135
|
+
*
|
|
136
|
+
* Set for {@link PathCompatibilityViolationType.ForbiddenCharacter} and
|
|
137
|
+
* {@link PathCompatibilityViolationType.ObsidianForbiddenCharacter}, so the report can name them.
|
|
138
|
+
*/
|
|
139
|
+
readonly characters?: readonly string[];
|
|
140
|
+
/**
|
|
141
|
+
* What was measured and the limit it was measured against.
|
|
142
|
+
*
|
|
143
|
+
* Set for {@link PathCompatibilityViolationType.NameTooLong} and
|
|
144
|
+
* {@link PathCompatibilityViolationType.PathTooLong}, so a reader of the report can verify the verdict.
|
|
145
|
+
*/
|
|
146
|
+
readonly measurement?: PathCompatibilityMeasurement;
|
|
147
|
+
/**
|
|
148
|
+
* The platform whose rules the path breaks. Another enabled platform may accept the very same path.
|
|
149
|
+
*
|
|
150
|
+
* `null` for a violation no single platform owns, which is
|
|
151
|
+
* {@link PathCompatibilityViolationType.ObsidianForbiddenCharacter} and
|
|
152
|
+
* {@link PathCompatibilityViolationType.UnicodeNotNormalized}.
|
|
153
|
+
*/
|
|
154
|
+
readonly platform: null | PathCompatibilityPlatform;
|
|
155
|
+
/**
|
|
156
|
+
* What is wrong.
|
|
157
|
+
*/
|
|
158
|
+
readonly type: PathCompatibilityViolationType;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Parameters for {@link repairName}.
|
|
162
|
+
*/
|
|
163
|
+
export interface RepairNameParams {
|
|
164
|
+
/**
|
|
165
|
+
* The name without its extension. For a folder, the whole name.
|
|
166
|
+
*/
|
|
167
|
+
readonly basename: string;
|
|
168
|
+
/**
|
|
169
|
+
* The name's extension, without the leading dot. Empty for a folder or an extension-less file.
|
|
170
|
+
*/
|
|
171
|
+
readonly extension: string;
|
|
172
|
+
/**
|
|
173
|
+
* What each forbidden character is replaced with. Empty deletes it. Must pass
|
|
174
|
+
* {@link getForbiddenCharacterReplacementValidationMessage}, or the repair would put back what it removed.
|
|
175
|
+
*/
|
|
176
|
+
readonly forbiddenCharacterReplacement: string;
|
|
177
|
+
/**
|
|
178
|
+
* Whether the name belongs to a folder.
|
|
179
|
+
*/
|
|
180
|
+
readonly isFolder: boolean;
|
|
181
|
+
/**
|
|
182
|
+
* The length of the longest vault root path the vault is expected to live under, in characters.
|
|
183
|
+
*/
|
|
184
|
+
readonly maxVaultRootPathLength: number;
|
|
185
|
+
/**
|
|
186
|
+
* The vault-relative path of the parent folder. Empty at the vault root.
|
|
187
|
+
*/
|
|
188
|
+
readonly parentPath: string;
|
|
189
|
+
/**
|
|
190
|
+
* The platforms whose rules the repaired name must satisfy.
|
|
191
|
+
*/
|
|
192
|
+
readonly platforms: readonly PathCompatibilityPlatform[];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Every platform, in the order the settings tab and the consistency report list them: the ones whose limits
|
|
196
|
+
* actually bind in practice first.
|
|
197
|
+
*/
|
|
198
|
+
export declare const PATH_COMPATIBILITY_PLATFORMS: readonly PathCompatibilityPlatform[];
|
|
199
|
+
/**
|
|
200
|
+
* How each platform is named in the settings tab and the consistency report.
|
|
201
|
+
*
|
|
202
|
+
* Not translated: these are product names, and `macOS` is spelled `macOS` in every language.
|
|
203
|
+
*/
|
|
204
|
+
export declare const PATH_COMPATIBILITY_PLATFORM_LABELS: Record<PathCompatibilityPlatform, string>;
|
|
205
|
+
/**
|
|
206
|
+
* Finds everything wrong with a path, across every enabled platform.
|
|
207
|
+
*
|
|
208
|
+
* Read-only: this is what the consistency report renders, and it never proposes a repair.
|
|
209
|
+
*
|
|
210
|
+
* @param params - The path and the platforms to check it against.
|
|
211
|
+
* @returns The violations, empty when the path is valid everywhere.
|
|
212
|
+
*/
|
|
213
|
+
export declare function findPathCompatibilityViolations(params: FindPathCompatibilityViolationsParams): PathCompatibilityViolation[];
|
|
214
|
+
/**
|
|
215
|
+
* The platform the plugin is running on, or `null` on a platform with no profile.
|
|
216
|
+
*
|
|
217
|
+
* Used only to seed the settings defaults, so that a fresh install reports on the vault in front of it
|
|
218
|
+
* without the user configuring anything first.
|
|
219
|
+
*
|
|
220
|
+
* @returns The current platform, or `null`.
|
|
221
|
+
*/
|
|
222
|
+
export declare function getCurrentPathCompatibilityPlatform(): null | PathCompatibilityPlatform;
|
|
223
|
+
/**
|
|
224
|
+
* Validates the text a forbidden character is replaced with.
|
|
225
|
+
*
|
|
226
|
+
* Every platform's set is checked, not only the enabled ones: the toggles can change after the replacement
|
|
227
|
+
* is chosen, and a replacement one platform refuses would make the repair of that platform produce a name
|
|
228
|
+
* that is still invalid there.
|
|
229
|
+
*
|
|
230
|
+
* @param replacement - The replacement text. Empty is valid and deletes the character.
|
|
231
|
+
* @returns A message naming the first refused character, or an empty string when the replacement is valid.
|
|
232
|
+
*/
|
|
233
|
+
export declare function getForbiddenCharacterReplacementValidationMessage(replacement: string): string;
|
|
234
|
+
/**
|
|
235
|
+
* Whether a name is in Unicode NFC, the form Obsidian gives every name it creates.
|
|
236
|
+
*
|
|
237
|
+
* @param name - The name as it is stored on disk.
|
|
238
|
+
* @returns Whether it is NFC.
|
|
239
|
+
*/
|
|
240
|
+
export declare function isUnicodeNormalized(name: string): boolean;
|
|
241
|
+
/**
|
|
242
|
+
* Measures a string the way a filesystem does.
|
|
243
|
+
*
|
|
244
|
+
* @param $string - The string to measure.
|
|
245
|
+
* @param shouldMeasureInBytes - Whether to count UTF-8 bytes rather than UTF-16 units.
|
|
246
|
+
* @returns The length.
|
|
247
|
+
*/
|
|
248
|
+
export declare function measure($string: string, shouldMeasureInBytes: boolean): number;
|
|
249
|
+
/**
|
|
250
|
+
* Repairs a name so that it satisfies every enabled platform.
|
|
251
|
+
*
|
|
252
|
+
* The order is deliberate: characters are replaced and a reserved name de-reserved BEFORE anything is
|
|
253
|
+
* truncated, because both can change the length, and trailing dots and spaces are trimmed AFTER every cut,
|
|
254
|
+
* because a cut can expose new ones.
|
|
255
|
+
*
|
|
256
|
+
* Truncation only ever shortens the basename — an extension is what tells Obsidian and the OS what the file
|
|
257
|
+
* is, so a truncated one turns a working `.png` into a broken `.pn`.
|
|
258
|
+
*
|
|
259
|
+
* @param params - The name and the platforms it must satisfy.
|
|
260
|
+
* @returns The repaired name, unchanged when it was already valid, or `null` when no name survives the
|
|
261
|
+
* repair — which is what the report calls out rather than failing silently.
|
|
262
|
+
*/
|
|
263
|
+
export declare function repairName(params: RepairNameParams): null | string;
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
import { Platform } from "obsidian";
|
|
34
|
+
import {
|
|
35
|
+
getOsUnsafePathCharsRegExp,
|
|
36
|
+
hasWindowsTrailingChars,
|
|
37
|
+
isWindowsReservedName,
|
|
38
|
+
OBSIDIAN_UNSAFE_FILENAME_CHARS,
|
|
39
|
+
trimWindowsTrailingChars
|
|
40
|
+
} from "./validation.mjs";
|
|
41
|
+
var PathCompatibilityPlatform = /* @__PURE__ */ ((PathCompatibilityPlatform2) => {
|
|
42
|
+
PathCompatibilityPlatform2["Android"] = "Android";
|
|
43
|
+
PathCompatibilityPlatform2["Ios"] = "Ios";
|
|
44
|
+
PathCompatibilityPlatform2["Linux"] = "Linux";
|
|
45
|
+
PathCompatibilityPlatform2["MacOs"] = "MacOs";
|
|
46
|
+
PathCompatibilityPlatform2["Windows"] = "Windows";
|
|
47
|
+
return PathCompatibilityPlatform2;
|
|
48
|
+
})(PathCompatibilityPlatform || {});
|
|
49
|
+
var PathCompatibilityViolationType = /* @__PURE__ */ ((PathCompatibilityViolationType2) => {
|
|
50
|
+
PathCompatibilityViolationType2["ForbiddenCharacter"] = "ForbiddenCharacter";
|
|
51
|
+
PathCompatibilityViolationType2["NameTooLong"] = "NameTooLong";
|
|
52
|
+
PathCompatibilityViolationType2["ObsidianForbiddenCharacter"] = "ObsidianForbiddenCharacter";
|
|
53
|
+
PathCompatibilityViolationType2["PathTooLong"] = "PathTooLong";
|
|
54
|
+
PathCompatibilityViolationType2["ReservedName"] = "ReservedName";
|
|
55
|
+
PathCompatibilityViolationType2["TrailingCharacter"] = "TrailingCharacter";
|
|
56
|
+
PathCompatibilityViolationType2["UnicodeNotNormalized"] = "UnicodeNotNormalized";
|
|
57
|
+
return PathCompatibilityViolationType2;
|
|
58
|
+
})(PathCompatibilityViolationType || {});
|
|
59
|
+
const PATH_COMPATIBILITY_PLATFORMS = [
|
|
60
|
+
"Windows" /* Windows */,
|
|
61
|
+
"Android" /* Android */,
|
|
62
|
+
"Linux" /* Linux */,
|
|
63
|
+
"MacOs" /* MacOs */,
|
|
64
|
+
"Ios" /* Ios */
|
|
65
|
+
];
|
|
66
|
+
const PATH_COMPATIBILITY_PLATFORM_LABELS = {
|
|
67
|
+
["Android" /* Android */]: "Android",
|
|
68
|
+
["Ios" /* Ios */]: "iOS",
|
|
69
|
+
["Linux" /* Linux */]: "Linux",
|
|
70
|
+
["MacOs" /* MacOs */]: "macOS",
|
|
71
|
+
["Windows" /* Windows */]: "Windows"
|
|
72
|
+
};
|
|
73
|
+
const WINDOWS_MAX_FILE_PATH_LENGTH = 259;
|
|
74
|
+
const WINDOWS_MAX_FOLDER_PATH_LENGTH = 247;
|
|
75
|
+
const WINDOWS_MAX_NAME_LENGTH = 255;
|
|
76
|
+
const UNIX_MAX_NAME_BYTES = 255;
|
|
77
|
+
const LINUX_MAX_PATH_BYTES = 4096;
|
|
78
|
+
const DARWIN_MAX_PATH_BYTES = 1024;
|
|
79
|
+
const CONTROL_CHARS_REG_EXP = /[\u{0}-\u{1F}]/gu;
|
|
80
|
+
const PATH_COMPATIBILITY_PROFILES = {
|
|
81
|
+
["Android" /* Android */]: {
|
|
82
|
+
hasWindowsNamingRules: false,
|
|
83
|
+
maxFilePathLength: LINUX_MAX_PATH_BYTES,
|
|
84
|
+
maxFolderPathLength: LINUX_MAX_PATH_BYTES,
|
|
85
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
86
|
+
platform: "Android" /* Android */,
|
|
87
|
+
shouldMeasureInBytes: true
|
|
88
|
+
},
|
|
89
|
+
["Ios" /* Ios */]: {
|
|
90
|
+
hasWindowsNamingRules: false,
|
|
91
|
+
maxFilePathLength: DARWIN_MAX_PATH_BYTES,
|
|
92
|
+
maxFolderPathLength: DARWIN_MAX_PATH_BYTES,
|
|
93
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
94
|
+
platform: "Ios" /* Ios */,
|
|
95
|
+
shouldMeasureInBytes: true
|
|
96
|
+
},
|
|
97
|
+
["Linux" /* Linux */]: {
|
|
98
|
+
hasWindowsNamingRules: false,
|
|
99
|
+
maxFilePathLength: LINUX_MAX_PATH_BYTES,
|
|
100
|
+
maxFolderPathLength: LINUX_MAX_PATH_BYTES,
|
|
101
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
102
|
+
platform: "Linux" /* Linux */,
|
|
103
|
+
shouldMeasureInBytes: true
|
|
104
|
+
},
|
|
105
|
+
["MacOs" /* MacOs */]: {
|
|
106
|
+
hasWindowsNamingRules: false,
|
|
107
|
+
maxFilePathLength: DARWIN_MAX_PATH_BYTES,
|
|
108
|
+
maxFolderPathLength: DARWIN_MAX_PATH_BYTES,
|
|
109
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
110
|
+
platform: "MacOs" /* MacOs */,
|
|
111
|
+
shouldMeasureInBytes: true
|
|
112
|
+
},
|
|
113
|
+
["Windows" /* Windows */]: {
|
|
114
|
+
hasWindowsNamingRules: true,
|
|
115
|
+
maxFilePathLength: WINDOWS_MAX_FILE_PATH_LENGTH,
|
|
116
|
+
maxFolderPathLength: WINDOWS_MAX_FOLDER_PATH_LENGTH,
|
|
117
|
+
maxNameLength: WINDOWS_MAX_NAME_LENGTH,
|
|
118
|
+
platform: "Windows" /* Windows */,
|
|
119
|
+
shouldMeasureInBytes: false
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
function findPathCompatibilityViolations(params) {
|
|
123
|
+
const violations = [];
|
|
124
|
+
const name = getName(params.path);
|
|
125
|
+
const profiles = getProfiles(params.platforms);
|
|
126
|
+
const obsidianForbiddenCharacters = findCharacters(name, OBSIDIAN_UNSAFE_FILENAME_CHARS);
|
|
127
|
+
if (profiles.length > 0 && obsidianForbiddenCharacters.length > 0) {
|
|
128
|
+
violations.push({ characters: obsidianForbiddenCharacters, platform: null, type: "ObsidianForbiddenCharacter" /* ObsidianForbiddenCharacter */ });
|
|
129
|
+
}
|
|
130
|
+
for (const profile of profiles) {
|
|
131
|
+
const maxPathLength = params.isFolder ? profile.maxFolderPathLength : profile.maxFilePathLength;
|
|
132
|
+
const fullPathLength = params.maxVaultRootPathLength + 1 + measure(params.path, profile.shouldMeasureInBytes);
|
|
133
|
+
if (fullPathLength > maxPathLength) {
|
|
134
|
+
violations.push({
|
|
135
|
+
measurement: {
|
|
136
|
+
isInBytes: profile.shouldMeasureInBytes,
|
|
137
|
+
length: fullPathLength,
|
|
138
|
+
limit: maxPathLength,
|
|
139
|
+
vaultRootLength: params.maxVaultRootPathLength
|
|
140
|
+
},
|
|
141
|
+
platform: profile.platform,
|
|
142
|
+
type: "PathTooLong" /* PathTooLong */
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const nameLength = measure(name, profile.shouldMeasureInBytes);
|
|
146
|
+
if (nameLength > profile.maxNameLength) {
|
|
147
|
+
violations.push({
|
|
148
|
+
measurement: { isInBytes: profile.shouldMeasureInBytes, length: nameLength, limit: profile.maxNameLength, vaultRootLength: null },
|
|
149
|
+
platform: profile.platform,
|
|
150
|
+
type: "NameTooLong" /* NameTooLong */
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const platformForbiddenCharacters = findCharacters(name, getPlatformForbiddenCharactersRegExp(profile));
|
|
154
|
+
if (platformForbiddenCharacters.length > 0) {
|
|
155
|
+
violations.push({ characters: platformForbiddenCharacters, platform: profile.platform, type: "ForbiddenCharacter" /* ForbiddenCharacter */ });
|
|
156
|
+
}
|
|
157
|
+
if (!profile.hasWindowsNamingRules) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (isWindowsReservedName(name)) {
|
|
161
|
+
violations.push({ platform: profile.platform, type: "ReservedName" /* ReservedName */ });
|
|
162
|
+
}
|
|
163
|
+
if (hasWindowsTrailingChars(name)) {
|
|
164
|
+
violations.push({ platform: profile.platform, type: "TrailingCharacter" /* TrailingCharacter */ });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return violations;
|
|
168
|
+
}
|
|
169
|
+
function getCurrentPathCompatibilityPlatform() {
|
|
170
|
+
if (Platform.isWin) {
|
|
171
|
+
return "Windows" /* Windows */;
|
|
172
|
+
}
|
|
173
|
+
if (Platform.isAndroidApp) {
|
|
174
|
+
return "Android" /* Android */;
|
|
175
|
+
}
|
|
176
|
+
if (Platform.isIosApp) {
|
|
177
|
+
return "Ios" /* Ios */;
|
|
178
|
+
}
|
|
179
|
+
if (Platform.isMacOS) {
|
|
180
|
+
return "MacOs" /* MacOs */;
|
|
181
|
+
}
|
|
182
|
+
return Platform.isLinux ? "Linux" /* Linux */ : null;
|
|
183
|
+
}
|
|
184
|
+
function getForbiddenCharacterReplacementValidationMessage(replacement) {
|
|
185
|
+
const regExps = [
|
|
186
|
+
getOsUnsafePathCharsRegExp(true, false),
|
|
187
|
+
getOsUnsafePathCharsRegExp(false, true),
|
|
188
|
+
getOsUnsafePathCharsRegExp(false, false),
|
|
189
|
+
OBSIDIAN_UNSAFE_FILENAME_CHARS,
|
|
190
|
+
CONTROL_CHARS_REG_EXP
|
|
191
|
+
];
|
|
192
|
+
for (const char of replacement) {
|
|
193
|
+
if (regExps.some((regExp) => char.replace(regExp, "") !== char)) {
|
|
194
|
+
return `The replacement must not contain "${char}": a file name cannot hold it on every platform.`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return "";
|
|
198
|
+
}
|
|
199
|
+
function isUnicodeNormalized(name) {
|
|
200
|
+
return name === name.normalize("NFC");
|
|
201
|
+
}
|
|
202
|
+
function measure($string, shouldMeasureInBytes) {
|
|
203
|
+
return shouldMeasureInBytes ? new Blob([$string]).size : $string.length;
|
|
204
|
+
}
|
|
205
|
+
function repairName(params) {
|
|
206
|
+
const profiles = getProfiles(params.platforms);
|
|
207
|
+
if (profiles.length === 0) {
|
|
208
|
+
return buildName(params.basename, params.extension);
|
|
209
|
+
}
|
|
210
|
+
let basename = params.basename;
|
|
211
|
+
let extension = params.extension;
|
|
212
|
+
for (const profile of profiles) {
|
|
213
|
+
basename = replaceForbiddenCharacters(basename, profile, params.forbiddenCharacterReplacement);
|
|
214
|
+
extension = replaceForbiddenCharacters(extension, profile, params.forbiddenCharacterReplacement);
|
|
215
|
+
}
|
|
216
|
+
extension = trimTrailingDotsAndSpaces(extension, profiles);
|
|
217
|
+
basename = trimTrailingDotsAndSpaces(basename, profiles);
|
|
218
|
+
if (profiles.some((profile) => profile.hasWindowsNamingRules) && isWindowsReservedName(buildName(basename, extension))) {
|
|
219
|
+
basename += "_";
|
|
220
|
+
}
|
|
221
|
+
const codePoints = [...basename];
|
|
222
|
+
while (codePoints.length > 0) {
|
|
223
|
+
const candidate = trimTrailingDotsAndSpaces(codePoints.join(""), profiles);
|
|
224
|
+
if (candidate === "") {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (doesFitEveryProfile(candidate, extension, profiles, params)) {
|
|
228
|
+
return buildName(candidate, extension);
|
|
229
|
+
}
|
|
230
|
+
codePoints.pop();
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
function buildName(basename, extension) {
|
|
235
|
+
return extension === "" ? basename : `${basename}.${extension}`;
|
|
236
|
+
}
|
|
237
|
+
function doesFitEveryProfile(basename, extension, profiles, params) {
|
|
238
|
+
const name = buildName(basename, extension);
|
|
239
|
+
const path = params.parentPath === "" ? name : `${params.parentPath}/${name}`;
|
|
240
|
+
return profiles.every((profile) => {
|
|
241
|
+
const maxPathLength = params.isFolder ? profile.maxFolderPathLength : profile.maxFilePathLength;
|
|
242
|
+
const fullPathLength = params.maxVaultRootPathLength + 1 + measure(path, profile.shouldMeasureInBytes);
|
|
243
|
+
return measure(name, profile.shouldMeasureInBytes) <= profile.maxNameLength && fullPathLength <= maxPathLength;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function findCharacters(name, regExp) {
|
|
247
|
+
return [...new Set(name.match(regExp))];
|
|
248
|
+
}
|
|
249
|
+
function getName(path) {
|
|
250
|
+
const slashIndex = path.lastIndexOf("/");
|
|
251
|
+
return slashIndex === -1 ? path : path.slice(slashIndex + 1);
|
|
252
|
+
}
|
|
253
|
+
function getPlatformForbiddenCharactersRegExp(profile) {
|
|
254
|
+
return getOsUnsafePathCharsRegExp(profile.hasWindowsNamingRules, profile.platform === "Android" /* Android */);
|
|
255
|
+
}
|
|
256
|
+
function getProfiles(platforms) {
|
|
257
|
+
return platforms.map((platform) => PATH_COMPATIBILITY_PROFILES[platform]);
|
|
258
|
+
}
|
|
259
|
+
function replaceForbiddenCharacters($string, profile, replacement) {
|
|
260
|
+
return $string.replace(getPlatformForbiddenCharactersRegExp(profile), () => replacement).replace(OBSIDIAN_UNSAFE_FILENAME_CHARS, () => replacement);
|
|
261
|
+
}
|
|
262
|
+
function trimTrailingDotsAndSpaces($string, profiles) {
|
|
263
|
+
return profiles.some((profile) => profile.hasWindowsNamingRules) ? trimWindowsTrailingChars($string) : $string;
|
|
264
|
+
}
|
|
265
|
+
export {
|
|
266
|
+
PATH_COMPATIBILITY_PLATFORMS,
|
|
267
|
+
PATH_COMPATIBILITY_PLATFORM_LABELS,
|
|
268
|
+
PathCompatibilityPlatform,
|
|
269
|
+
PathCompatibilityViolationType,
|
|
270
|
+
findPathCompatibilityViolations,
|
|
271
|
+
getCurrentPathCompatibilityPlatform,
|
|
272
|
+
getForbiddenCharacterReplacementValidationMessage,
|
|
273
|
+
isUnicodeNormalized,
|
|
274
|
+
measure,
|
|
275
|
+
repairName
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXRoLWNvbXBhdGliaWxpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFdoaWNoIG5hbWluZyBjb25zdHJhaW50cyBlYWNoIHBsYXRmb3JtIGltcG9zZXMsIHdoaWNoIG9mIHRoZW0gYSBnaXZlbiBwYXRoIHZpb2xhdGVzLCBhbmQgaG93IHRvIHJlcGFpciBhXG4gKiBuYW1lIHNvIGl0IHNhdGlzZmllcyBldmVyeSBlbmFibGVkIHBsYXRmb3JtIGF0IG9uY2UuXG4gKlxuICogUHVyZSBieSBkZXNpZ24g4oCUIG5vIGBBcHBgLCBubyB2YXVsdCwgbm8gSS9PIOKAlCBzbyB0aGUgd2hvbGUgY29ycmVjdG5lc3Mgc3VyZmFjZSAoYnl0ZSBjb3VudGluZywgZXh0ZW5zaW9uXG4gKiBwcmVzZXJ2YXRpb24sIHRydW5jYXRpb24gb3JkZXIsIHByb2ZpbGUgY29tcG9zaXRpb24pIGlzIHVuaXQtdGVzdGFibGUgd2l0aG91dCBhbiBPYnNpZGlhbiBpbnN0YW5jZS4gVGhlXG4gKiB2YXVsdCBwYXNzIHRoYXQgY29uc3VtZXMgaXQgbGl2ZXMgaW4gZWFjaCBwbHVnaW4gdGhhdCByZXBvcnRzIG9yIHJlcGFpcnMgcGF0aCBwcm9ibGVtcy5cbiAqXG4gKiBBIHZhdWx0IGlzIHN5bmNlZCwgc28gdGhlIHBsYXRmb3JtIHRoYXQgbWF0dGVycyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIG9uZSBydW5uaW5nOiBlbmFibGluZyBzZXZlcmFsXG4gKiBwbGF0Zm9ybXMgY29tcG9zZXMgdGhlaXIgY29uc3RyYWludHMgYnkgaW50ZXJzZWN0aW9uLCBhbmQgYSBuYW1lIGhhcyB0byBzYXRpc2Z5IGFsbCBvZiB0aGVtLlxuICovXG5cbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cCxcbiAgaGFzV2luZG93c1RyYWlsaW5nQ2hhcnMsXG4gIGlzV2luZG93c1Jlc2VydmVkTmFtZSxcbiAgT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTLFxuICB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnNcbn0gZnJvbSAnLi92YWxpZGF0aW9uLnRzJztcblxuLyoqXG4gKiBBIHBsYXRmb3JtIGEgdmF1bHQgbWF5IGJlIHN5bmNlZCB0bywgYW5kIHdob3NlIG5hbWluZyBydWxlcyBjYW4gdGhlcmVmb3JlIGJlIGVuZm9yY2VkLlxuICovXG5leHBvcnQgZW51bSBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtIHtcbiAgQW5kcm9pZCA9ICdBbmRyb2lkJyxcbiAgSW9zID0gJ0lvcycsXG4gIExpbnV4ID0gJ0xpbnV4JyxcbiAgTWFjT3MgPSAnTWFjT3MnLFxuICBXaW5kb3dzID0gJ1dpbmRvd3MnXG59XG5cbi8qKlxuICogV2hhdCBhIHNpbmdsZSBwYXRoIG9yIG5hbWUgaXMgd3JvbmcgYWJvdXQsIG9uIG9uZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGVudW0gUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlIHtcbiAgRm9yYmlkZGVuQ2hhcmFjdGVyID0gJ0ZvcmJpZGRlbkNoYXJhY3RlcicsXG4gIE5hbWVUb29Mb25nID0gJ05hbWVUb29Mb25nJyxcblxuICAvKipcbiAgICogVGhlIG5hbWUgaG9sZHMgYSBjaGFyYWN0ZXIgT2JzaWRpYW4gbGlua3MgZG8gbm90IHdvcmsgd2l0aCAoYCNgLCBgXmAsIGBbYCwgYF1gLCBgfGApLiBPYnNpZGlhbidzIHJ1bGUsIG5vdFxuICAgKiBhIHBsYXRmb3JtJ3M6IHRoZSBmaWxlc3lzdGVtIHN0b3JlcyBzdWNoIGEgbmFtZSBmaW5lLCBzbyBuYW1pbmcgYSBwbGF0Zm9ybSBmb3IgaXQgd291bGQgYmUgZmFsc2UuXG4gICAqL1xuICBPYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3RlciA9ICdPYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3RlcicsXG4gIFBhdGhUb29Mb25nID0gJ1BhdGhUb29Mb25nJyxcbiAgUmVzZXJ2ZWROYW1lID0gJ1Jlc2VydmVkTmFtZScsXG4gIFRyYWlsaW5nQ2hhcmFjdGVyID0gJ1RyYWlsaW5nQ2hhcmFjdGVyJyxcblxuICAvKipcbiAgICogVGhlIG5hbWUgaXMgc3RvcmVkIG9uIGRpc2sgaW4gYSBmb3JtIG90aGVyIHRoYW4gVW5pY29kZSBORkMsIGUuZy4gYNC5YCBhcyBg0LhgIGZvbGxvd2VkIGJ5IGEgY29tYmluaW5nXG4gICAqIGJyZXZlLiBOb3QgYSBwbGF0Zm9ybSdzIHJ1bGUgYnV0IGEgc3luYyBoYXphcmQ6IHRvb2xzIG91dHNpZGUgT2JzaWRpYW4gc2VlIHRoZSB0d28gZm9ybXMgYXMgdHdvIG5hbWVzLlxuICAgKi9cbiAgVW5pY29kZU5vdE5vcm1hbGl6ZWQgPSAnVW5pY29kZU5vdE5vcm1hbGl6ZWQnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbnNQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBuYW1lcyBhIGZvbGRlciwgd2hpY2ggaGFzIGl0cyBvd24gcGF0aCBidWRnZXQuXG4gICAqL1xuICByZWFkb25seSBpc0ZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCB2YXVsdCByb290IHBhdGggdGhlIHZhdWx0IGlzIGV4cGVjdGVkIHRvIGxpdmUgdW5kZXIsIGluIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIFRoZSB2YXVsdCByb290IG9mIGEgcGxhdGZvcm0gdGhlIGNoZWNrIGlzIG5vdCBydW5uaW5nIG9uIGlzIHVua25vd2FibGUsIHNvIGl0IGlzIHN0YXRlZCByYXRoZXIgdGhhblxuICAgKiBndWVzc2VkIOKAlCBzZWUgdGhlIGBtYXhWYXVsdFJvb3RQYXRoTGVuZ3RoYCBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VmF1bHRSb290UGF0aExlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgcGF0aCB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsYXRmb3JtcyB3aG9zZSBydWxlcyB0byBlbmZvcmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm1zOiByZWFkb25seSBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtW107XG59XG5cbi8qKlxuICogQSBsZW5ndGggYSBwYXRoIG9yIG5hbWUgd2FzIG1lYXN1cmVkIGF0LCBhbmQgdGhlIGxpbWl0IGl0IGV4Y2VlZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aENvbXBhdGliaWxpdHlNZWFzdXJlbWVudCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGJvdGggbnVtYmVycyBjb3VudCBVVEYtOCBieXRlcyByYXRoZXIgdGhhbiBVVEYtMTYgdW5pdHMuXG4gICAqL1xuICByZWFkb25seSBpc0luQnl0ZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtZWFzdXJlZCBsZW5ndGguXG4gICAqL1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxhcmdlc3QgbGVuZ3RoIHRoZSBwbGF0Zm9ybSBhY2NlcHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGltaXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHJvb3QgbGVuZ3RoIGNvdW50ZWQgaW50byB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlNZWFzdXJlbWVudC5sZW5ndGh9LCBiZWZvcmUgdGhlIHNlcGFyYXRvclxuICAgKiBhZnRlciBpdC4gYG51bGxgIGZvciBhIG5hbWUsIHdoaWNoIGNhcnJpZXMgbm8gcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0Um9vdExlbmd0aDogbnVsbCB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtaW5nIHJ1bGVzIG9mIG9uZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGUge1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIHBsYXRmb3JtIGFwcGxpZXMgV2luZG93cycgbmFtaW5nIHJ1bGVzOiBpdHMgZm9yYmlkZGVuIGNoYXJhY3RlcnMsIGl0cyByZXNlcnZlZCBkZXZpY2VcbiAgICogbmFtZXMsIGFuZCBpdHMgcmVqZWN0aW9uIG9mIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcy5cbiAgICpcbiAgICogT25lIGZsYWcgZm9yIHRocmVlIHJ1bGVzIGJlY2F1c2UgdGhleSBhcmUgb25lIGZpbGVzeXN0ZW0ncyBydWxlcywgYW5kIG5vIHBsYXRmb3JtIGFkb3B0cyBhIHN1YnNldC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1dpbmRvd3NOYW1pbmdSdWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxvbmdlc3QgYWJzb2x1dGUgcGF0aCBhIGZpbGUgbWF5IGhhdmUsIGluIHRoaXMgcHJvZmlsZSdzIHVuaXQuXG4gICAqL1xuICByZWFkb25seSBtYXhGaWxlUGF0aExlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9uZ2VzdCBhYnNvbHV0ZSBwYXRoIGEgZm9sZGVyIG1heSBoYXZlLCBpbiB0aGlzIHByb2ZpbGUncyB1bml0LlxuICAgKlxuICAgKiBCZWxvdyB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlQcm9maWxlLm1heEZpbGVQYXRoTGVuZ3RofSBvbiBXaW5kb3dzLCB3aGVyZSB0aGUgc2hvcnRlciBidWRnZXQgbGVhdmVzXG4gICAqIHJvb20gZm9yIGFuIGA4LjNgIG5hbWUgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBtYXhGb2xkZXJQYXRoTGVuZ3RoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb25nZXN0IHNpbmdsZSBuYW1lIOKAlCBvbmUgcGF0aCBzZWdtZW50IOKAlCBpbiB0aGlzIHByb2ZpbGUncyB1bml0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4TmFtZUxlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm0gdGhpcyBwcm9maWxlIGRlc2NyaWJlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGxlbmd0aHMgY291bnQgVVRGLTggYnl0ZXMgKGV4dDQsIEFQRlMpIHJhdGhlciB0aGFuIFVURi0xNiB1bml0cyAoTlRGUykuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHdob2xlIHJlYXNvbiB0aGUgMjU1IGxpbWl0IGlzIG5vdCBhIGNoYXJhY3RlciBjb3VudDogYSBuYW1lIG9mIDEyOCBDSksgY2hhcmFjdGVycyBpcyAzODRcbiAgICogYnl0ZXMgYW5kIGlzIHJlamVjdGVkIGJ5IGV4dDQgd2hpbGUgYmVpbmcgbm93aGVyZSBuZWFyIGFueSBsaW1pdCBXaW5kb3dzIGhhcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZE1lYXN1cmVJbkJ5dGVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9uZSB0aGluZyB3cm9uZyB3aXRoIG9uZSBwYXRoLCBhbmQgdGhlIHBsYXRmb3JtIHRoYXQgb2JqZWN0cyB0byBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgb2ZmZW5kaW5nIGNoYXJhY3RlcnMsIGVhY2ggb25jZSwgaW4gdGhlIG9yZGVyIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBuYW1lLlxuICAgKlxuICAgKiBTZXQgZm9yIHtAbGluayBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuRm9yYmlkZGVuQ2hhcmFjdGVyfSBhbmRcbiAgICoge0BsaW5rIFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5PYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3Rlcn0sIHNvIHRoZSByZXBvcnQgY2FuIG5hbWUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYXJhY3RlcnM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hhdCB3YXMgbWVhc3VyZWQgYW5kIHRoZSBsaW1pdCBpdCB3YXMgbWVhc3VyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogU2V0IGZvciB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLk5hbWVUb29Mb25nfSBhbmRcbiAgICoge0BsaW5rIFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5QYXRoVG9vTG9uZ30sIHNvIGEgcmVhZGVyIG9mIHRoZSByZXBvcnQgY2FuIHZlcmlmeSB0aGUgdmVyZGljdC5cbiAgICovXG4gIHJlYWRvbmx5IG1lYXN1cmVtZW50PzogUGF0aENvbXBhdGliaWxpdHlNZWFzdXJlbWVudDtcblxuICAvKipcbiAgICogVGhlIHBsYXRmb3JtIHdob3NlIHJ1bGVzIHRoZSBwYXRoIGJyZWFrcy4gQW5vdGhlciBlbmFibGVkIHBsYXRmb3JtIG1heSBhY2NlcHQgdGhlIHZlcnkgc2FtZSBwYXRoLlxuICAgKlxuICAgKiBgbnVsbGAgZm9yIGEgdmlvbGF0aW9uIG5vIHNpbmdsZSBwbGF0Zm9ybSBvd25zLCB3aGljaCBpc1xuICAgKiB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLk9ic2lkaWFuRm9yYmlkZGVuQ2hhcmFjdGVyfSBhbmRcbiAgICoge0BsaW5rIFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5Vbmljb2RlTm90Tm9ybWFsaXplZH0uXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogbnVsbCB8IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm07XG5cbiAgLyoqXG4gICAqIFdoYXQgaXMgd3JvbmcuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlcGFpck5hbWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcGFpck5hbWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLiBGb3IgYSBmb2xkZXIsIHRoZSB3aG9sZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZW5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUncyBleHRlbnNpb24sIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LiBFbXB0eSBmb3IgYSBmb2xkZXIgb3IgYW4gZXh0ZW5zaW9uLWxlc3MgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IGVhY2ggZm9yYmlkZGVuIGNoYXJhY3RlciBpcyByZXBsYWNlZCB3aXRoLiBFbXB0eSBkZWxldGVzIGl0LiBNdXN0IHBhc3NcbiAgICoge0BsaW5rIGdldEZvcmJpZGRlbkNoYXJhY3RlclJlcGxhY2VtZW50VmFsaWRhdGlvbk1lc3NhZ2V9LCBvciB0aGUgcmVwYWlyIHdvdWxkIHB1dCBiYWNrIHdoYXQgaXQgcmVtb3ZlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZvcmJpZGRlbkNoYXJhY3RlclJlcGxhY2VtZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5hbWUgYmVsb25ncyB0byBhIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlzRm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHZhdWx0IHJvb3QgcGF0aCB0aGUgdmF1bHQgaXMgZXhwZWN0ZWQgdG8gbGl2ZSB1bmRlciwgaW4gY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IG1heFZhdWx0Um9vdFBhdGhMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIuIEVtcHR5IGF0IHRoZSB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm1zIHdob3NlIHJ1bGVzIHRoZSByZXBhaXJlZCBuYW1lIG11c3Qgc2F0aXNmeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtczogcmVhZG9ubHkgUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybVtdO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHBsYXRmb3JtLCBpbiB0aGUgb3JkZXIgdGhlIHNldHRpbmdzIHRhYiBhbmQgdGhlIGNvbnNpc3RlbmN5IHJlcG9ydCBsaXN0IHRoZW06IHRoZSBvbmVzIHdob3NlIGxpbWl0c1xuICogYWN0dWFsbHkgYmluZCBpbiBwcmFjdGljZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBBVEhfQ09NUEFUSUJJTElUWV9QTEFURk9STVM6IHJlYWRvbmx5IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm1bXSA9IFtcbiAgUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5XaW5kb3dzLFxuICBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkFuZHJvaWQsXG4gIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTGludXgsXG4gIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTWFjT3MsXG4gIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uSW9zXG5dO1xuXG4vKipcbiAqIEhvdyBlYWNoIHBsYXRmb3JtIGlzIG5hbWVkIGluIHRoZSBzZXR0aW5ncyB0YWIgYW5kIHRoZSBjb25zaXN0ZW5jeSByZXBvcnQuXG4gKlxuICogTm90IHRyYW5zbGF0ZWQ6IHRoZXNlIGFyZSBwcm9kdWN0IG5hbWVzLCBhbmQgYG1hY09TYCBpcyBzcGVsbGVkIGBtYWNPU2AgaW4gZXZlcnkgbGFuZ3VhZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBQQVRIX0NPTVBBVElCSUxJVFlfUExBVEZPUk1fTEFCRUxTOiBSZWNvcmQ8UGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybSwgc3RyaW5nPiA9IHtcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uQW5kcm9pZF06ICdBbmRyb2lkJyxcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uSW9zXTogJ2lPUycsXG4gIFtQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkxpbnV4XTogJ0xpbnV4JyxcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTWFjT3NdOiAnbWFjT1MnLFxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5XaW5kb3dzXTogJ1dpbmRvd3MnXG59O1xuXG4vKipcbiAqIGBNQVhfUEFUSGAgaXMgMjYwIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLCBzbyAyNTkgdXNhYmxlIGNoYXJhY3RlcnMgZm9yIGEgZmlsZS5cbiAqL1xuY29uc3QgV0lORE9XU19NQVhfRklMRV9QQVRIX0xFTkdUSCA9IDI1OTtcblxuLyoqXG4gKiBBIGZvbGRlciBnZXRzIDEyIGZld2VyLCBsZWF2aW5nIHJvb20gZm9yIGEgYFxcYCBhbmQgYW4gOC4zIG5hbWUgaW5zaWRlIGl0LlxuICovXG5jb25zdCBXSU5ET1dTX01BWF9GT0xERVJfUEFUSF9MRU5HVEggPSAyNDc7XG5cbi8qKlxuICogTlRGUydzIHBlci1uYW1lIGNhcCwgaW4gVVRGLTE2IHVuaXRzLiBOZXZlciB0aGUgYmluZGluZyBjb25zdHJhaW50OiBhIHBhdGggdGhhdCBmaXRzIGluXG4gKiB7QGxpbmsgV0lORE9XU19NQVhfRklMRV9QQVRIX0xFTkdUSH0gY2hhcmFjdGVycyBjb250YWlucyBubyBsb25nZXIgbmFtZS5cbiAqL1xuY29uc3QgV0lORE9XU19NQVhfTkFNRV9MRU5HVEggPSAyNTU7XG5cbi8qKlxuICogRXh0NCAvIGYyZnMgLyBBUEZTIGFsbCBjYXAgYSBzaW5nbGUgbmFtZSBhdCAyNTUgQllURVMuIFRoaXMgaXMgdGhlIGxpbWl0IGEgY2hhcmFjdGVyIGNvdW50IGdldHMgd3JvbmcuXG4gKi9cbmNvbnN0IFVOSVhfTUFYX05BTUVfQllURVMgPSAyNTU7XG5cbi8qKlxuICogYFBBVEhfTUFYYCBvbiBMaW51eCBhbmQgQW5kcm9pZC4gU28gZmFyIGFib3ZlIGFueXRoaW5nIGEgdmF1bHQgcHJvZHVjZXMgdGhhdCBvbmx5IHRoZSBuYW1lIGxpbWl0IGJpbmRzLlxuICovXG5jb25zdCBMSU5VWF9NQVhfUEFUSF9CWVRFUyA9IDQwOTY7XG5cbi8qKlxuICogYFBBVEhfTUFYYCBvbiBtYWNPUyBhbmQgaU9TLlxuICovXG5jb25zdCBEQVJXSU5fTUFYX1BBVEhfQllURVMgPSAxMDI0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBDb250cm9sIGNoYXJhY3RlcnMgYXJlIGV4YWN0bHkgd2hhdCB0aGlzIG1hdGNoZXMuXG5jb25zdCBDT05UUk9MX0NIQVJTX1JFR19FWFAgPSAvW1xcdXswfS1cXHV7MUZ9XS9ndTtcblxuY29uc3QgUEFUSF9DT01QQVRJQklMSVRZX1BST0ZJTEVTOiBSZWNvcmQ8UGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybSwgUGF0aENvbXBhdGliaWxpdHlQcm9maWxlPiA9IHtcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uQW5kcm9pZF06IHtcbiAgICBoYXNXaW5kb3dzTmFtaW5nUnVsZXM6IGZhbHNlLFxuICAgIG1heEZpbGVQYXRoTGVuZ3RoOiBMSU5VWF9NQVhfUEFUSF9CWVRFUyxcbiAgICBtYXhGb2xkZXJQYXRoTGVuZ3RoOiBMSU5VWF9NQVhfUEFUSF9CWVRFUyxcbiAgICBtYXhOYW1lTGVuZ3RoOiBVTklYX01BWF9OQU1FX0JZVEVTLFxuICAgIHBsYXRmb3JtOiBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkFuZHJvaWQsXG4gICAgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IHRydWVcbiAgfSxcblxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5Jb3NdOiB7XG4gICAgaGFzV2luZG93c05hbWluZ1J1bGVzOiBmYWxzZSxcbiAgICBtYXhGaWxlUGF0aExlbmd0aDogREFSV0lOX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heEZvbGRlclBhdGhMZW5ndGg6IERBUldJTl9NQVhfUEFUSF9CWVRFUyxcbiAgICBtYXhOYW1lTGVuZ3RoOiBVTklYX01BWF9OQU1FX0JZVEVTLFxuICAgIHBsYXRmb3JtOiBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLklvcyxcbiAgICBzaG91bGRNZWFzdXJlSW5CeXRlczogdHJ1ZVxuICB9LFxuXG4gIFtQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkxpbnV4XToge1xuICAgIGhhc1dpbmRvd3NOYW1pbmdSdWxlczogZmFsc2UsXG4gICAgbWF4RmlsZVBhdGhMZW5ndGg6IExJTlVYX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heEZvbGRlclBhdGhMZW5ndGg6IExJTlVYX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heE5hbWVMZW5ndGg6IFVOSVhfTUFYX05BTUVfQllURVMsXG4gICAgcGxhdGZvcm06IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTGludXgsXG4gICAgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IHRydWVcbiAgfSxcblxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5NYWNPc106IHtcbiAgICBoYXNXaW5kb3dzTmFtaW5nUnVsZXM6IGZhbHNlLFxuICAgIG1heEZpbGVQYXRoTGVuZ3RoOiBEQVJXSU5fTUFYX1BBVEhfQllURVMsXG4gICAgbWF4Rm9sZGVyUGF0aExlbmd0aDogREFSV0lOX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heE5hbWVMZW5ndGg6IFVOSVhfTUFYX05BTUVfQllURVMsXG4gICAgcGxhdGZvcm06IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTWFjT3MsXG4gICAgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IHRydWVcbiAgfSxcblxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5XaW5kb3dzXToge1xuICAgIGhhc1dpbmRvd3NOYW1pbmdSdWxlczogdHJ1ZSxcbiAgICBtYXhGaWxlUGF0aExlbmd0aDogV0lORE9XU19NQVhfRklMRV9QQVRIX0xFTkdUSCxcbiAgICBtYXhGb2xkZXJQYXRoTGVuZ3RoOiBXSU5ET1dTX01BWF9GT0xERVJfUEFUSF9MRU5HVEgsXG4gICAgbWF4TmFtZUxlbmd0aDogV0lORE9XU19NQVhfTkFNRV9MRU5HVEgsXG4gICAgcGxhdGZvcm06IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uV2luZG93cyxcbiAgICBzaG91bGRNZWFzdXJlSW5CeXRlczogZmFsc2VcbiAgfVxufTtcblxuLyoqXG4gKiBGaW5kcyBldmVyeXRoaW5nIHdyb25nIHdpdGggYSBwYXRoLCBhY3Jvc3MgZXZlcnkgZW5hYmxlZCBwbGF0Zm9ybS5cbiAqXG4gKiBSZWFkLW9ubHk6IHRoaXMgaXMgd2hhdCB0aGUgY29uc2lzdGVuY3kgcmVwb3J0IHJlbmRlcnMsIGFuZCBpdCBuZXZlciBwcm9wb3NlcyBhIHJlcGFpci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhdGggYW5kIHRoZSBwbGF0Zm9ybXMgdG8gY2hlY2sgaXQgYWdhaW5zdC5cbiAqIEByZXR1cm5zIFRoZSB2aW9sYXRpb25zLCBlbXB0eSB3aGVuIHRoZSBwYXRoIGlzIHZhbGlkIGV2ZXJ5d2hlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25zKHBhcmFtczogRmluZFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uc1BhcmFtcyk6IFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uW10ge1xuICBjb25zdCB2aW9sYXRpb25zOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbltdID0gW107XG4gIGNvbnN0IG5hbWUgPSBnZXROYW1lKHBhcmFtcy5wYXRoKTtcbiAgY29uc3QgcHJvZmlsZXMgPSBnZXRQcm9maWxlcyhwYXJhbXMucGxhdGZvcm1zKTtcblxuICAvKlxuICAgKiBPbmNlLCB3aXRoIG5vIHBsYXRmb3JtOiBldmVyeSBwbGF0Zm9ybSBzdG9yZXMgc3VjaCBhIG5hbWUsIGFuZCBvbmx5IE9ic2lkaWFuJ3MgbGlua3MgcmVmdXNlIGl0LiBTdGlsbFxuICAgKiBnYXRlZCBvbiBhIHBsYXRmb3JtIGJlaW5nIGVuYWJsZWQsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHN3aXRjaGVzIHRoZSB3aG9sZSBjaGVjayBvbiwgYW5kIHRoZSByZXBhaXIgb25seVxuICAgKiByZXBsYWNlcyB0aGVzZSBjaGFyYWN0ZXJzIHVuZGVyIGEgcHJvZmlsZS5cbiAgICovXG4gIGNvbnN0IG9ic2lkaWFuRm9yYmlkZGVuQ2hhcmFjdGVycyA9IGZpbmRDaGFyYWN0ZXJzKG5hbWUsIE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyk7XG5cbiAgaWYgKHByb2ZpbGVzLmxlbmd0aCA+IDAgJiYgb2JzaWRpYW5Gb3JiaWRkZW5DaGFyYWN0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2aW9sYXRpb25zLnB1c2goeyBjaGFyYWN0ZXJzOiBvYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3RlcnMsIHBsYXRmb3JtOiBudWxsLCB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuT2JzaWRpYW5Gb3JiaWRkZW5DaGFyYWN0ZXIgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgcHJvZmlsZXMpIHtcbiAgICBjb25zdCBtYXhQYXRoTGVuZ3RoID0gcGFyYW1zLmlzRm9sZGVyID8gcHJvZmlsZS5tYXhGb2xkZXJQYXRoTGVuZ3RoIDogcHJvZmlsZS5tYXhGaWxlUGF0aExlbmd0aDtcbiAgICBjb25zdCBmdWxsUGF0aExlbmd0aCA9IHBhcmFtcy5tYXhWYXVsdFJvb3RQYXRoTGVuZ3RoICsgMSArIG1lYXN1cmUocGFyYW1zLnBhdGgsIHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMpO1xuXG4gICAgaWYgKGZ1bGxQYXRoTGVuZ3RoID4gbWF4UGF0aExlbmd0aCkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgbWVhc3VyZW1lbnQ6IHtcbiAgICAgICAgICBpc0luQnl0ZXM6IHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMsXG4gICAgICAgICAgbGVuZ3RoOiBmdWxsUGF0aExlbmd0aCxcbiAgICAgICAgICBsaW1pdDogbWF4UGF0aExlbmd0aCxcbiAgICAgICAgICB2YXVsdFJvb3RMZW5ndGg6IHBhcmFtcy5tYXhWYXVsdFJvb3RQYXRoTGVuZ3RoXG4gICAgICAgIH0sXG4gICAgICAgIHBsYXRmb3JtOiBwcm9maWxlLnBsYXRmb3JtLFxuICAgICAgICB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuUGF0aFRvb0xvbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVMZW5ndGggPSBtZWFzdXJlKG5hbWUsIHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMpO1xuXG4gICAgaWYgKG5hbWVMZW5ndGggPiBwcm9maWxlLm1heE5hbWVMZW5ndGgpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgIG1lYXN1cmVtZW50OiB7IGlzSW5CeXRlczogcHJvZmlsZS5zaG91bGRNZWFzdXJlSW5CeXRlcywgbGVuZ3RoOiBuYW1lTGVuZ3RoLCBsaW1pdDogcHJvZmlsZS5tYXhOYW1lTGVuZ3RoLCB2YXVsdFJvb3RMZW5ndGg6IG51bGwgfSxcbiAgICAgICAgcGxhdGZvcm06IHByb2ZpbGUucGxhdGZvcm0sXG4gICAgICAgIHR5cGU6IFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5OYW1lVG9vTG9uZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhdGZvcm1Gb3JiaWRkZW5DaGFyYWN0ZXJzID0gZmluZENoYXJhY3RlcnMobmFtZSwgZ2V0UGxhdGZvcm1Gb3JiaWRkZW5DaGFyYWN0ZXJzUmVnRXhwKHByb2ZpbGUpKTtcblxuICAgIGlmIChwbGF0Zm9ybUZvcmJpZGRlbkNoYXJhY3RlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHsgY2hhcmFjdGVyczogcGxhdGZvcm1Gb3JiaWRkZW5DaGFyYWN0ZXJzLCBwbGF0Zm9ybTogcHJvZmlsZS5wbGF0Zm9ybSwgdHlwZTogUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLkZvcmJpZGRlbkNoYXJhY3RlciB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2ZpbGUuaGFzV2luZG93c05hbWluZ1J1bGVzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNXaW5kb3dzUmVzZXJ2ZWROYW1lKG5hbWUpKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2goeyBwbGF0Zm9ybTogcHJvZmlsZS5wbGF0Zm9ybSwgdHlwZTogUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLlJlc2VydmVkTmFtZSB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGFzV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZSkpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaCh7IHBsYXRmb3JtOiBwcm9maWxlLnBsYXRmb3JtLCB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuVHJhaWxpbmdDaGFyYWN0ZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZpb2xhdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsYXRmb3JtIHRoZSBwbHVnaW4gaXMgcnVubmluZyBvbiwgb3IgYG51bGxgIG9uIGEgcGxhdGZvcm0gd2l0aCBubyBwcm9maWxlLlxuICpcbiAqIFVzZWQgb25seSB0byBzZWVkIHRoZSBzZXR0aW5ncyBkZWZhdWx0cywgc28gdGhhdCBhIGZyZXNoIGluc3RhbGwgcmVwb3J0cyBvbiB0aGUgdmF1bHQgaW4gZnJvbnQgb2YgaXRcbiAqIHdpdGhvdXQgdGhlIHVzZXIgY29uZmlndXJpbmcgYW55dGhpbmcgZmlyc3QuXG4gKlxuICogQHJldHVybnMgVGhlIGN1cnJlbnQgcGxhdGZvcm0sIG9yIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtKCk6IG51bGwgfCBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtIHtcbiAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgcmV0dXJuIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uV2luZG93cztcbiAgfVxuXG4gIGlmIChQbGF0Zm9ybS5pc0FuZHJvaWRBcHApIHtcbiAgICByZXR1cm4gUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5BbmRyb2lkO1xuICB9XG5cbiAgaWYgKFBsYXRmb3JtLmlzSW9zQXBwKSB7XG4gICAgcmV0dXJuIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uSW9zO1xuICB9XG5cbiAgaWYgKFBsYXRmb3JtLmlzTWFjT1MpIHtcbiAgICByZXR1cm4gUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5NYWNPcztcbiAgfVxuXG4gIHJldHVybiBQbGF0Zm9ybS5pc0xpbnV4ID8gUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5MaW51eCA6IG51bGw7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB0ZXh0IGEgZm9yYmlkZGVuIGNoYXJhY3RlciBpcyByZXBsYWNlZCB3aXRoLlxuICpcbiAqIEV2ZXJ5IHBsYXRmb3JtJ3Mgc2V0IGlzIGNoZWNrZWQsIG5vdCBvbmx5IHRoZSBlbmFibGVkIG9uZXM6IHRoZSB0b2dnbGVzIGNhbiBjaGFuZ2UgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50XG4gKiBpcyBjaG9zZW4sIGFuZCBhIHJlcGxhY2VtZW50IG9uZSBwbGF0Zm9ybSByZWZ1c2VzIHdvdWxkIG1ha2UgdGhlIHJlcGFpciBvZiB0aGF0IHBsYXRmb3JtIHByb2R1Y2UgYSBuYW1lXG4gKiB0aGF0IGlzIHN0aWxsIGludmFsaWQgdGhlcmUuXG4gKlxuICogQHBhcmFtIHJlcGxhY2VtZW50IC0gVGhlIHJlcGxhY2VtZW50IHRleHQuIEVtcHR5IGlzIHZhbGlkIGFuZCBkZWxldGVzIHRoZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBBIG1lc3NhZ2UgbmFtaW5nIHRoZSBmaXJzdCByZWZ1c2VkIGNoYXJhY3Rlciwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIHJlcGxhY2VtZW50IGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9yYmlkZGVuQ2hhcmFjdGVyUmVwbGFjZW1lbnRWYWxpZGF0aW9uTWVzc2FnZShyZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnRXhwcyA9IFtcbiAgICBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cCh0cnVlLCBmYWxzZSksXG4gICAgZ2V0T3NVbnNhZmVQYXRoQ2hhcnNSZWdFeHAoZmFsc2UsIHRydWUpLFxuICAgIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGZhbHNlLCBmYWxzZSksXG4gICAgT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTLFxuICAgIENPTlRST0xfQ0hBUlNfUkVHX0VYUFxuICBdO1xuXG4gIC8vIEEgc3RyaW5nIGl0ZXJhdGVzIGJ5IGNvZGUgcG9pbnQsIHNvIGEgc3Vycm9nYXRlIHBhaXIgaXMgbmFtZWQgd2hvbGUsIGFzIHRoZSB1c2VyIHR5cGVkIGl0LlxuICBmb3IgKGNvbnN0IGNoYXIgb2YgcmVwbGFjZW1lbnQpIHtcbiAgICAvLyBgcmVwbGFjZWAgcmF0aGVyIHRoYW4gYHRlc3RgLCBmb3IgdGhlIHJlYXNvbiBnaXZlbiBhdCBgcmVwbGFjZUZvcmJpZGRlbkNoYXJhY3RlcnNgLlxuICAgIGlmIChyZWdFeHBzLnNvbWUoKHJlZ0V4cCkgPT4gY2hhci5yZXBsYWNlKHJlZ0V4cCwgJycpICE9PSBjaGFyKSkge1xuICAgICAgcmV0dXJuIGBUaGUgcmVwbGFjZW1lbnQgbXVzdCBub3QgY29udGFpbiBcIiR7Y2hhcn1cIjogYSBmaWxlIG5hbWUgY2Fubm90IGhvbGQgaXQgb24gZXZlcnkgcGxhdGZvcm0uYDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBhIG5hbWUgaXMgaW4gVW5pY29kZSBORkMsIHRoZSBmb3JtIE9ic2lkaWFuIGdpdmVzIGV2ZXJ5IG5hbWUgaXQgY3JlYXRlcy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIGFzIGl0IGlzIHN0b3JlZCBvbiBkaXNrLlxuICogQHJldHVybnMgV2hldGhlciBpdCBpcyBORkMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaWNvZGVOb3JtYWxpemVkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmFtZSA9PT0gbmFtZS5ub3JtYWxpemUoJ05GQycpO1xufVxuXG4vKipcbiAqIE1lYXN1cmVzIGEgc3RyaW5nIHRoZSB3YXkgYSBmaWxlc3lzdGVtIGRvZXMuXG4gKlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIG1lYXN1cmUuXG4gKiBAcGFyYW0gc2hvdWxkTWVhc3VyZUluQnl0ZXMgLSBXaGV0aGVyIHRvIGNvdW50IFVURi04IGJ5dGVzIHJhdGhlciB0aGFuIFVURi0xNiB1bml0cy5cbiAqIEByZXR1cm5zIFRoZSBsZW5ndGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWFzdXJlKCRzdHJpbmc6IHN0cmluZywgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IGJvb2xlYW4pOiBudW1iZXIge1xuICByZXR1cm4gc2hvdWxkTWVhc3VyZUluQnl0ZXMgPyBuZXcgQmxvYihbJHN0cmluZ10pLnNpemUgOiAkc3RyaW5nLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXBhaXJzIGEgbmFtZSBzbyB0aGF0IGl0IHNhdGlzZmllcyBldmVyeSBlbmFibGVkIHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcmRlciBpcyBkZWxpYmVyYXRlOiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCBhbmQgYSByZXNlcnZlZCBuYW1lIGRlLXJlc2VydmVkIEJFRk9SRSBhbnl0aGluZyBpc1xuICogdHJ1bmNhdGVkLCBiZWNhdXNlIGJvdGggY2FuIGNoYW5nZSB0aGUgbGVuZ3RoLCBhbmQgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIGFyZSB0cmltbWVkIEFGVEVSIGV2ZXJ5IGN1dCxcbiAqIGJlY2F1c2UgYSBjdXQgY2FuIGV4cG9zZSBuZXcgb25lcy5cbiAqXG4gKiBUcnVuY2F0aW9uIG9ubHkgZXZlciBzaG9ydGVucyB0aGUgYmFzZW5hbWUg4oCUIGFuIGV4dGVuc2lvbiBpcyB3aGF0IHRlbGxzIE9ic2lkaWFuIGFuZCB0aGUgT1Mgd2hhdCB0aGUgZmlsZVxuICogaXMsIHNvIGEgdHJ1bmNhdGVkIG9uZSB0dXJucyBhIHdvcmtpbmcgYC5wbmdgIGludG8gYSBicm9rZW4gYC5wbmAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBuYW1lIGFuZCB0aGUgcGxhdGZvcm1zIGl0IG11c3Qgc2F0aXNmeS5cbiAqIEByZXR1cm5zIFRoZSByZXBhaXJlZCBuYW1lLCB1bmNoYW5nZWQgd2hlbiBpdCB3YXMgYWxyZWFkeSB2YWxpZCwgb3IgYG51bGxgIHdoZW4gbm8gbmFtZSBzdXJ2aXZlcyB0aGVcbiAqIHJlcGFpciDigJQgd2hpY2ggaXMgd2hhdCB0aGUgcmVwb3J0IGNhbGxzIG91dCByYXRoZXIgdGhhbiBmYWlsaW5nIHNpbGVudGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyTmFtZShwYXJhbXM6IFJlcGFpck5hbWVQYXJhbXMpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgcHJvZmlsZXMgPSBnZXRQcm9maWxlcyhwYXJhbXMucGxhdGZvcm1zKTtcblxuICBpZiAocHJvZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGJ1aWxkTmFtZShwYXJhbXMuYmFzZW5hbWUsIHBhcmFtcy5leHRlbnNpb24pO1xuICB9XG5cbiAgbGV0IGJhc2VuYW1lID0gcGFyYW1zLmJhc2VuYW1lO1xuICBsZXQgZXh0ZW5zaW9uID0gcGFyYW1zLmV4dGVuc2lvbjtcblxuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgcHJvZmlsZXMpIHtcbiAgICBiYXNlbmFtZSA9IHJlcGxhY2VGb3JiaWRkZW5DaGFyYWN0ZXJzKGJhc2VuYW1lLCBwcm9maWxlLCBwYXJhbXMuZm9yYmlkZGVuQ2hhcmFjdGVyUmVwbGFjZW1lbnQpO1xuICAgIGV4dGVuc2lvbiA9IHJlcGxhY2VGb3JiaWRkZW5DaGFyYWN0ZXJzKGV4dGVuc2lvbiwgcHJvZmlsZSwgcGFyYW1zLmZvcmJpZGRlbkNoYXJhY3RlclJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIC8vIGBub3RlLm1kIGAgcGFyc2VzIGFzIGJhc2VuYW1lIGBub3RlYCArIGV4dGVuc2lvbiBgbWQgYCwgc28gdHJpbW1pbmcgb25seSB0aGUgYmFzZW5hbWUgd291bGQgbGVhdmUgdGhlXG4gIC8vIHRyYWlsaW5nIHNwYWNlIGV4YWN0bHkgd2hlcmUgV2luZG93cyByZWplY3RzIGl0IOKAlCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lLlxuICBleHRlbnNpb24gPSB0cmltVHJhaWxpbmdEb3RzQW5kU3BhY2VzKGV4dGVuc2lvbiwgcHJvZmlsZXMpO1xuXG4gIC8qXG4gICAqIFRyaW0gQkVGT1JFIHRoZSBkZS1yZXNlcnZpbmcgYmVsb3csIG5ldmVyIGFmdGVyLiBgaXNXaW5kb3dzUmVzZXJ2ZWROYW1lYCB0cmltcyBmb3IgaXRzIG93biBhbnN3ZXIsIHNvXG4gICAqIGBDT04gYCBpcyByZXBvcnRlZCByZXNlcnZlZCBlaXRoZXIgd2F5IOKAlCBidXQgdGhlIHVuZGVyc2NvcmUgaXMgYXBwZW5kZWQgdG8gd2hhdGV2ZXIgaXMgaGVyZSwgYW5kIGFuXG4gICAqIHVudHJpbW1lZCBgQ09OIGAgd291bGQgZGUtcmVzZXJ2ZSB0byBgQ09OIF9gIGluc3RlYWQgb2YgYENPTl9gLlxuICAgKi9cbiAgYmFzZW5hbWUgPSB0cmltVHJhaWxpbmdEb3RzQW5kU3BhY2VzKGJhc2VuYW1lLCBwcm9maWxlcyk7XG5cbiAgLypcbiAgICogVGhlIFJFQlVJTFQgbmFtZSwgbmV2ZXIgdGhlIGJhcmUgYmFzZW5hbWU6IGBwYXJhbXMuYmFzZW5hbWVgIGhhcyBhbHJlYWR5IGhhZCBpdHMgZXh0ZW5zaW9uIHNwbGl0IG9mZixcbiAgICogYW5kIHRoZSBsaWJyYXJ5IGRyb3BzIG9uZSBleHRlbnNpb24gb2YgaXRzIG93biwgc28gcGFzc2luZyB0aGUgYmFzZW5hbWUgd291bGQgc3RyaXAgYSBzZWNvbmQgc2VnbWVudFxuICAgKiBhbmQgY2FsbCBgQ09OLnhgICsgYG1kYCByZXNlcnZlZCDigJQgd2hpY2ggaXMgbm90IHdoYXQgdGhlIHJlcG9ydCBzYXlzIGFib3V0IGBDT04ueC5tZGAuXG4gICAqL1xuICBpZiAocHJvZmlsZXMuc29tZSgocHJvZmlsZSkgPT4gcHJvZmlsZS5oYXNXaW5kb3dzTmFtaW5nUnVsZXMpICYmIGlzV2luZG93c1Jlc2VydmVkTmFtZShidWlsZE5hbWUoYmFzZW5hbWUsIGV4dGVuc2lvbikpKSB7XG4gICAgLy8gQSB0cmFpbGluZyB1bmRlcnNjb3JlIHJhdGhlciB0aGFuIGEgcHJlZml4OiBpdCBrZWVwcyB0aGUgbmFtZSBzb3J0aW5nIHdoZXJlIHRoZSB1c2VyIGV4cGVjdHMgaXQuXG4gICAgYmFzZW5hbWUgKz0gJ18nO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXNwcmVhZCAtLSBDb2RlIHBvaW50cyBhcmUgZXhhY3RseSB0aGUgdW5pdCB3YW50ZWQ6IGN1dHRpbmcgYnkgVVRGLTE2IHVuaXQgd291bGQgc3BsaXQgYSBzdXJyb2dhdGUgcGFpciBhbmQgbGVhdmUgaGFsZiBhbiBlbW9qaS5cbiAgY29uc3QgY29kZVBvaW50cyA9IFsuLi5iYXNlbmFtZV07XG5cbiAgd2hpbGUgKGNvZGVQb2ludHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHRyaW1UcmFpbGluZ0RvdHNBbmRTcGFjZXMoY29kZVBvaW50cy5qb2luKCcnKSwgcHJvZmlsZXMpO1xuXG4gICAgaWYgKGNhbmRpZGF0ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkb2VzRml0RXZlcnlQcm9maWxlKGNhbmRpZGF0ZSwgZXh0ZW5zaW9uLCBwcm9maWxlcywgcGFyYW1zKSkge1xuICAgICAgcmV0dXJuIGJ1aWxkTmFtZShjYW5kaWRhdGUsIGV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgY29kZVBvaW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBidWlsZE5hbWUoYmFzZW5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9uID09PSAnJyA/IGJhc2VuYW1lIDogYCR7YmFzZW5hbWV9LiR7ZXh0ZW5zaW9ufWA7XG59XG5cbmZ1bmN0aW9uIGRvZXNGaXRFdmVyeVByb2ZpbGUoYmFzZW5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcsIHByb2ZpbGVzOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGVbXSwgcGFyYW1zOiBSZXBhaXJOYW1lUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5hbWUgPSBidWlsZE5hbWUoYmFzZW5hbWUsIGV4dGVuc2lvbik7XG4gIGNvbnN0IHBhdGggPSBwYXJhbXMucGFyZW50UGF0aCA9PT0gJycgPyBuYW1lIDogYCR7cGFyYW1zLnBhcmVudFBhdGh9LyR7bmFtZX1gO1xuXG4gIHJldHVybiBwcm9maWxlcy5ldmVyeSgocHJvZmlsZSkgPT4ge1xuICAgIGNvbnN0IG1heFBhdGhMZW5ndGggPSBwYXJhbXMuaXNGb2xkZXIgPyBwcm9maWxlLm1heEZvbGRlclBhdGhMZW5ndGggOiBwcm9maWxlLm1heEZpbGVQYXRoTGVuZ3RoO1xuICAgIGNvbnN0IGZ1bGxQYXRoTGVuZ3RoID0gcGFyYW1zLm1heFZhdWx0Um9vdFBhdGhMZW5ndGggKyAxICsgbWVhc3VyZShwYXRoLCBwcm9maWxlLnNob3VsZE1lYXN1cmVJbkJ5dGVzKTtcblxuICAgIHJldHVybiBtZWFzdXJlKG5hbWUsIHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMpIDw9IHByb2ZpbGUubWF4TmFtZUxlbmd0aCAmJiBmdWxsUGF0aExlbmd0aCA8PSBtYXhQYXRoTGVuZ3RoO1xuICB9KTtcbn1cblxuLypcbiAqIEVhY2ggY2hhcmFjdGVyIG9uY2UsIGluIG9yZGVyIG9mIGZpcnN0IGFwcGVhcmFuY2UuIGBtYXRjaGAgb24gYSBgZ2AtZmxhZ2dlZCByZWdleHAgcmV0dXJucyBldmVyeSBtYXRjaCBhbmRcbiAqIGlnbm9yZXMgYGxhc3RJbmRleGAsIHNvIHRoZSBzaGFyZWQgY29uc3RhbnRzIGFyZSBzYWZlIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDaGFyYWN0ZXJzKG5hbWU6IHN0cmluZywgcmVnRXhwOiBSZWdFeHApOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChuYW1lLm1hdGNoKHJlZ0V4cCkpXTtcbn1cblxuZnVuY3Rpb24gZ2V0TmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICByZXR1cm4gc2xhc2hJbmRleCA9PT0gLTEgPyBwYXRoIDogcGF0aC5zbGljZShzbGFzaEluZGV4ICsgMSk7XG59XG5cbi8qXG4gKiBCb3RoIGZsYWdzIGV4cGxpY2l0bHk6IHRoZSBsaWJyYXJ5IGRlZmF1bHRzIGFuIG9taXR0ZWQgb25lIHRvIHRoZSBwbGF0Zm9ybSBSVU5OSU5HIHRoZSBjaGVjaywgd2hpY2ggd291bGQgbWFrZVxuICogdGhlIEFuZHJvaWQgcHJvZmlsZSdzIHZlcmRpY3QgZGVwZW5kIG9uIHdoZXJlIHRoZSBjaGVjayBydW5zIHJhdGhlciB0aGFuIG9uIHRoZSBwcm9maWxlLiBBbmRyb2lkJ3Mgc2hhcmVkXG4gKiBzdG9yYWdlIHJlZnVzZXMgYCogPyA8ID4gXCJgIHRvbzogT2JzaWRpYW4gU3luYyBpdHNlbGYgc2tpcHMgc3VjaCBhIHJlbW90ZSBuYW1lIG9uIEFuZHJvaWQuXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtRm9yYmlkZGVuQ2hhcmFjdGVyc1JlZ0V4cChwcm9maWxlOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGUpOiBSZWdFeHAge1xuICByZXR1cm4gZ2V0T3NVbnNhZmVQYXRoQ2hhcnNSZWdFeHAocHJvZmlsZS5oYXNXaW5kb3dzTmFtaW5nUnVsZXMsIHByb2ZpbGUucGxhdGZvcm0gPT09IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uQW5kcm9pZCk7XG59XG5cbmZ1bmN0aW9uIGdldFByb2ZpbGVzKHBsYXRmb3JtczogcmVhZG9ubHkgUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybVtdKTogUGF0aENvbXBhdGliaWxpdHlQcm9maWxlW10ge1xuICByZXR1cm4gcGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IFBBVEhfQ09NUEFUSUJJTElUWV9QUk9GSUxFU1twbGF0Zm9ybV0pO1xufVxuXG4vKlxuICogYHJlcGxhY2VgIHJhdGhlciB0aGFuIGB0ZXN0YDogdGhlIGxpYnJhcnkncyByZWdleHBzIGNhcnJ5IHRoZSBgZ2AgZmxhZywgYW5kIGB0ZXN0YCBvbiBhIGBnYC1mbGFnZ2VkIHJlZ2V4cFxuICogYWR2YW5jZXMgYGxhc3RJbmRleGAsIHNvIGNvbnNlY3V0aXZlIGNhbGxzIG9uIHRoZSBzYW1lIGNvbnN0YW50IGFuc3dlciBkaWZmZXJlbnRseS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUZvcmJpZGRlbkNoYXJhY3RlcnMoJHN0cmluZzogc3RyaW5nLCBwcm9maWxlOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvKlxuICAgKiBPbmUgcmVwbGFjZW1lbnQgcGVyIGZvcmJpZGRlbiBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gb25lIHBlciBydW46IGl0IGtlZXBzIHRoZSBuYW1lJ3MgdmlzdWFsIHN0cnVjdHVyZSxcbiAgICogd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgcmVwYWlyZWQgbmFtZSBzdGlsbCByZWNvZ25pemFibGUgdG8gd2hvZXZlciB3cm90ZSBpdC4gTm90aGluZyBpcyBsb3N0IGVpdGhlciB3YXkg4oCUXG4gICAqIHRoZSBvcmlnaW5hbCBuYW1lIGlzIHByZXNlcnZlZCBpbiB0aGUgbm90ZSdzIGZyb250bWF0dGVyLiBBIHJlcGxhY2VyIEZVTkNUSU9OLCBzbyBhIGAkJmAgaW4gdGhlXG4gICAqIHJlcGxhY2VtZW50IGlzIG5vdCBleHBhbmRlZCBhcyBhIGJhY2tyZWZlcmVuY2UuXG4gICAqL1xuICByZXR1cm4gJHN0cmluZ1xuICAgIC5yZXBsYWNlKGdldFBsYXRmb3JtRm9yYmlkZGVuQ2hhcmFjdGVyc1JlZ0V4cChwcm9maWxlKSwgKCkgPT4gcmVwbGFjZW1lbnQpXG4gICAgLnJlcGxhY2UoT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTLCAoKSA9PiByZXBsYWNlbWVudCk7XG59XG5cbi8qXG4gKiBUaGUgcHJvZmlsZSBndWFyZCBpcyB0aGUgcGx1Z2luJ3MsIG5vdCB0aGUgbGlicmFyeSdzOiB0aGUgbGlicmFyeSBhbnN3ZXJzIGZvciBXaW5kb3dzIHVuY29uZGl0aW9uYWxseSwgYW5kXG4gKiB0aGlzIGRlY2lkZXMgd2hldGhlciBXaW5kb3dzIGlzIG9uZSBvZiB0aGUgcGxhdGZvcm1zIHRoZSB2YXVsdCBoYXMgdG8gc2F0aXNmeS5cbiAqL1xuZnVuY3Rpb24gdHJpbVRyYWlsaW5nRG90c0FuZFNwYWNlcygkc3RyaW5nOiBzdHJpbmcsIHByb2ZpbGVzOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9maWxlcy5zb21lKChwcm9maWxlKSA9PiBwcm9maWxlLmhhc1dpbmRvd3NOYW1pbmdSdWxlcykgPyB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnMoJHN0cmluZykgOiAkc3RyaW5nO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMsZ0JBQWdCO0FBRXpCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsSUFBSyw0QkFBTCxrQkFBS0EsK0JBQUw7QUFDTCxFQUFBQSwyQkFBQSxhQUFVO0FBQ1YsRUFBQUEsMkJBQUEsU0FBTTtBQUNOLEVBQUFBLDJCQUFB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R0FBRztBQUN2QyxTQUFPLGVBQWUsS0FBSyxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDN0Q7QUFPQSxTQUFTLHFDQUFxQyxTQUEyQztBQUN2RixTQUFPLDJCQUEyQixRQUFRLHVCQUF1QixRQUFRLGFBQWEsdUJBQWlDO0FBQ3pIO0FBRUEsU0FBUyxZQUFZLFdBQTZFO0FBQ2hHLFNBQU8sVUFBVSxJQUFJLENBQUMsYUFBYSw0QkFBNEIsUUFBUSxDQUFDO0FBQzFFO0FBTUEsU0FBUywyQkFBMkIsU0FBaUIsU0FBbUMsYUFBNkI7QUFPbkgsU0FBTyxRQUNKLFFBQVEscUNBQXFDLE9BQU8sR0FBRyxNQUFNLFdBQVcsRUFDeEUsUUFBUSxnQ0FBZ0MsTUFBTSxXQUFXO0FBQzlEO0FBTUEsU0FBUywwQkFBMEIsU0FBaUIsVUFBOEM7QUFDaEcsU0FBTyxTQUFTLEtBQUssQ0FBQyxZQUFZLFFBQVEscUJBQXFCLElBQUkseUJBQXlCLE9BQU8sSUFBSTtBQUN6RzsiLCJuYW1lcyI6WyJQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtIiwiUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlIl19
|
|
@@ -4,7 +4,9 @@ export * as 'plugin-async-cleanup' from './plugin-async-cleanup.mjs';
|
|
|
4
4
|
export * as 'plugin-context' from './plugin-context.mjs';
|
|
5
5
|
export * as 'plugin-event-source' from './plugin-event-source.mjs';
|
|
6
6
|
export * as 'plugin-install-state' from './plugin-install-state.mjs';
|
|
7
|
+
export * as 'plugin-instance' from './plugin-instance.mjs';
|
|
7
8
|
export * as 'plugin-lifecycle-events' from './plugin-lifecycle-events.mjs';
|
|
8
9
|
export * as 'plugin-settings-tab' from './plugin-settings-tab.mjs';
|
|
9
10
|
export * as 'plugin' from './plugin.mjs';
|
|
10
11
|
export * as 'settings-migration-api' from './settings-migration-api.mjs';
|
|
12
|
+
export * as 'third-party-plugin' from './third-party-plugin.mjs';
|
|
@@ -8,10 +8,12 @@ import * as plugin_async_cleanup from "./plugin-async-cleanup.mjs";
|
|
|
8
8
|
import * as plugin_context from "./plugin-context.mjs";
|
|
9
9
|
import * as plugin_event_source from "./plugin-event-source.mjs";
|
|
10
10
|
import * as plugin_install_state from "./plugin-install-state.mjs";
|
|
11
|
+
import * as plugin_instance from "./plugin-instance.mjs";
|
|
11
12
|
import * as plugin_lifecycle_events from "./plugin-lifecycle-events.mjs";
|
|
12
13
|
import * as plugin_settings_tab from "./plugin-settings-tab.mjs";
|
|
13
14
|
import * as plugin from "./plugin.mjs";
|
|
14
15
|
import * as settings_migration_api from "./settings-migration-api.mjs";
|
|
16
|
+
import * as third_party_plugin from "./third-party-plugin.mjs";
|
|
15
17
|
export {
|
|
16
18
|
plugin,
|
|
17
19
|
plugin_api as "plugin-api",
|
|
@@ -19,8 +21,10 @@ export {
|
|
|
19
21
|
plugin_context as "plugin-context",
|
|
20
22
|
plugin_event_source as "plugin-event-source",
|
|
21
23
|
plugin_install_state as "plugin-install-state",
|
|
24
|
+
plugin_instance as "plugin-instance",
|
|
22
25
|
plugin_lifecycle_events as "plugin-lifecycle-events",
|
|
23
26
|
plugin_settings_tab as "plugin-settings-tab",
|
|
24
|
-
settings_migration_api as "settings-migration-api"
|
|
27
|
+
settings_migration_api as "settings-migration-api",
|
|
28
|
+
third_party_plugin as "third-party-plugin"
|
|
25
29
|
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdwbHVnaW4tYXBpJyBmcm9tICcuL3BsdWdpbi1hcGkudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1hc3luYy1jbGVhbnVwJyBmcm9tICcuL3BsdWdpbi1hc3luYy1jbGVhbnVwLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dCcgZnJvbSAnLi9wbHVnaW4tY29udGV4dC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWV2ZW50LXNvdXJjZScgZnJvbSAnLi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4taW5zdGFsbC1zdGF0ZScgZnJvbSAnLi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWluc3RhbmNlJyBmcm9tICcuL3BsdWdpbi1pbnN0YW5jZS50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWxpZmVjeWNsZS1ldmVudHMnIGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy10YWInIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luJyBmcm9tICcuL3BsdWdpbi50cyc7XG5leHBvcnQgKiBhcyAnc2V0dGluZ3MtbWlncmF0aW9uLWFwaScgZnJvbSAnLi9zZXR0aW5ncy1taWdyYXRpb24tYXBpLnRzJztcbmV4cG9ydCAqIGFzICd0aGlyZC1wYXJ0eS1wbHVnaW4nIGZyb20gJy4vdGhpcmQtcGFydHktcGx1Z2luLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWUEsZ0JBQWtCO0FBQzlCLFlBQVlDLDBCQUE0QjtBQUN4QyxZQUFZQyxvQkFBc0I7QUFDbEMsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVlDLDBCQUE0QjtBQUN4QyxZQUFZQyxxQkFBdUI7QUFDbkMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZLFlBQWM7QUFDMUIsWUFBWUMsNEJBQThCO0FBQzFDLFlBQVlDLHdCQUEwQjsiLAogICJuYW1lcyI6IFsicGx1Z2luLWFwaSIsICJwbHVnaW4tYXN5bmMtY2xlYW51cCIsICJwbHVnaW4tY29udGV4dCIsICJwbHVnaW4tZXZlbnQtc291cmNlIiwgInBsdWdpbi1pbnN0YWxsLXN0YXRlIiwgInBsdWdpbi1pbnN0YW5jZSIsICJwbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cyIsICJwbHVnaW4tc2V0dGluZ3MtdGFiIiwgInNldHRpbmdzLW1pZ3JhdGlvbi1hcGkiLCAidGhpcmQtcGFydHktcGx1Z2luIl0KfQo=
|