@mnaoumov/obsidian-lib 10.12.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/components/worker-component/package.json +6 -0
- package/components/worker-pool-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +409 -292
- package/dist/lib/cjs/__merged.d.cts +17 -8
- 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.cjs +3 -3
- 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 +6 -6
- 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 +3 -3
- 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 +1 -1
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +8 -8
- 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 +46 -40
- package/dist/lib/cjs/components/index.d.cts +2 -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 +68 -28
- 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 +113 -17
- 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 +6 -6
- 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 +7 -7
- 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/data-handler.cjs +111 -4
- package/dist/lib/cjs/data-handler.d.cts +92 -1
- 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 +2 -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 +1 -1
- 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 +5 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +4 -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 +4 -0
- package/dist/lib/cjs/index.cjs +145 -127
- package/dist/lib/cjs/index.d.cts +6 -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 +3 -3
- 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 +4 -4
- package/dist/lib/cjs/modals/index.cjs +12 -12
- 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 +5 -5
- 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 +16 -13
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +8 -8
- 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 +4 -4
- package/dist/lib/cjs/plugin/plugin-instance.cjs +14 -12
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +7 -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 +118 -34
- package/dist/lib/cjs/plugin/plugin.d.cts +28 -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 +17 -8
- package/dist/lib/esm/__merged.mjs +133 -3
- 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/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/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/index.d.mts +2 -0
- package/dist/lib/esm/components/index.mjs +5 -1
- package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
- package/dist/lib/esm/components/plugin-gate-component.mjs +57 -14
- 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 +99 -3
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
- 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.mjs +1 -1
- package/dist/lib/esm/data-handler.d.mts +92 -1
- package/dist/lib/esm/data-handler.mjs +112 -3
- 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-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 +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +4 -0
- package/dist/lib/esm/i18n/locales/en.mjs +5 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -0
- package/dist/lib/esm/index.d.mts +6 -0
- package/dist/lib/esm/index.mjs +13 -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/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/prompt.d.mts +1 -1
- package/dist/lib/esm/modals/prompt.mjs +1 -1
- 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 +1 -0
- package/dist/lib/esm/plugin/index.mjs +4 -2
- 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-instance.d.mts +7 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +2 -1
- 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 +28 -5
- package/dist/lib/esm/plugin/plugin.mjs +103 -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/package.json +9 -8
- package/plugin/third-party-plugin/package.json +6 -0
|
@@ -117,10 +117,14 @@ __export(data_handler_exports, {
|
|
|
117
117
|
DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES: () => DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES,
|
|
118
118
|
PluginDataHandler: () => PluginDataHandler,
|
|
119
119
|
PluginDataOperation: () => PluginDataOperation,
|
|
120
|
+
PluginDataParseError: () => PluginDataParseError,
|
|
120
121
|
PluginDataSizeLimitExceededError: () => PluginDataSizeLimitExceededError
|
|
121
122
|
});
|
|
122
123
|
module.exports = __toCommonJS(data_handler_exports);
|
|
123
|
-
var import_obsidian = require(
|
|
124
|
+
var import_obsidian = require("obsidian");
|
|
125
|
+
var import_plugin_notice_component = require("./components/plugin-notice-component.cjs");
|
|
126
|
+
var import_i18n = require("./i18n/i18n.cjs");
|
|
127
|
+
var import_settings_recovery = require("./settings-recovery.cjs");
|
|
124
128
|
const OBSIDIAN_JSON_INDENT = 2;
|
|
125
129
|
const DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES = 16777216;
|
|
126
130
|
var PluginDataOperation = /* @__PURE__ */ ((PluginDataOperation2) => {
|
|
@@ -142,8 +146,13 @@ class PluginDataHandler {
|
|
|
142
146
|
throw new RangeError(`maxSizeInBytes must be a non-negative number, got ${String(maxSizeInBytes)}.`);
|
|
143
147
|
}
|
|
144
148
|
this.maxSizeInBytes = maxSizeInBytes;
|
|
149
|
+
this.recoveryStore = options.recoveryStore === void 0 ? new import_settings_recovery.LocalSettingsRecoveryStore({ app: plugin.app, pluginId: plugin.manifest.id }) : options.recoveryStore;
|
|
145
150
|
}
|
|
146
151
|
plugin;
|
|
152
|
+
/**
|
|
153
|
+
* Where recovery copies of `data.json` are kept, or `null` when none are.
|
|
154
|
+
*/
|
|
155
|
+
recoveryStore;
|
|
147
156
|
/**
|
|
148
157
|
* The maximum size of `data.json`, in bytes.
|
|
149
158
|
*/
|
|
@@ -152,17 +161,45 @@ class PluginDataHandler {
|
|
|
152
161
|
* Loads data from the plugin's data file.
|
|
153
162
|
*
|
|
154
163
|
* The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
|
|
155
|
-
* loaded into memory.
|
|
164
|
+
* loaded into memory. When Obsidian answers `undefined` or `null`, the file is read raw and parsed here, because
|
|
165
|
+
* Obsidian answers `undefined` for a file that exists but does not parse too.
|
|
156
166
|
*
|
|
157
167
|
* @returns The loaded data.
|
|
158
168
|
* @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
|
|
169
|
+
* @throws {@link PluginDataParseError} If the existing file is not valid JSON. The file is left untouched, and a
|
|
170
|
+
* recovery copy of it is kept first when the handler has a recovery store.
|
|
159
171
|
*/
|
|
160
172
|
async loadData() {
|
|
161
173
|
const sizeInBytes = await this.getExistingFileSize();
|
|
162
174
|
if (sizeInBytes !== null && sizeInBytes > this.maxSizeInBytes) {
|
|
163
175
|
throw this.createError("load" /* Load */, sizeInBytes);
|
|
164
176
|
}
|
|
165
|
-
|
|
177
|
+
const data = await this.plugin.loadData();
|
|
178
|
+
if (data !== void 0 && data !== null) {
|
|
179
|
+
return data;
|
|
180
|
+
}
|
|
181
|
+
const path = this.getDataFilePath();
|
|
182
|
+
if (path === null) {
|
|
183
|
+
return data;
|
|
184
|
+
}
|
|
185
|
+
const rawText = await this.readRawFile(path);
|
|
186
|
+
if (rawText === null) {
|
|
187
|
+
return data;
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const parsed = JSON.parse(rawText);
|
|
191
|
+
return parsed;
|
|
192
|
+
} catch (parseError) {
|
|
193
|
+
const error = new PluginDataParseError({
|
|
194
|
+
cause: parseError,
|
|
195
|
+
path,
|
|
196
|
+
pluginId: this.plugin.manifest.id,
|
|
197
|
+
pluginName: this.plugin.manifest.name,
|
|
198
|
+
recoveryCopy: await this.keepRecoveryCopy(path, rawText)
|
|
199
|
+
});
|
|
200
|
+
this.reportParseError(error);
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
166
203
|
}
|
|
167
204
|
/**
|
|
168
205
|
* Saves data to the plugin's data file.
|
|
@@ -195,6 +232,21 @@ class PluginDataHandler {
|
|
|
195
232
|
const directory = this.plugin.manifest.dir;
|
|
196
233
|
return directory ? (0, import_obsidian.normalizePath)(`${directory}/data.json`) : null;
|
|
197
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Tells the user that `data.json` could not be parsed: a notice naming the plugin and the path, and the error in the
|
|
237
|
+
* console.
|
|
238
|
+
*
|
|
239
|
+
* @param error - The parse error.
|
|
240
|
+
*/
|
|
241
|
+
reportParseError(error) {
|
|
242
|
+
console.error(error);
|
|
243
|
+
new import_plugin_notice_component.PluginNoticeComponent({
|
|
244
|
+
app: this.plugin.app,
|
|
245
|
+
pluginName: this.plugin.manifest.name
|
|
246
|
+
}).showNotice(
|
|
247
|
+
error.recoveryCopy === null ? (0, import_i18n.t)(($) => $.obsidianLib.notices.dataFileUnparseable, { path: error.path }) : (0, import_i18n.t)(($) => $.obsidianLib.notices.dataFileUnparseableCopyKept, { path: error.path })
|
|
248
|
+
);
|
|
249
|
+
}
|
|
198
250
|
createError(operation, sizeInBytes) {
|
|
199
251
|
return new PluginDataSizeLimitExceededError({
|
|
200
252
|
maxSizeInBytes: this.maxSizeInBytes,
|
|
@@ -220,6 +272,60 @@ class PluginDataHandler {
|
|
|
220
272
|
return null;
|
|
221
273
|
}
|
|
222
274
|
}
|
|
275
|
+
async keepRecoveryCopy(path, rawText) {
|
|
276
|
+
if (this.recoveryStore === null) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
return await this.recoveryStore.keep({ path, rawText, reason: import_settings_recovery.SettingsRecoveryReason.InvalidJson });
|
|
281
|
+
} catch (error) {
|
|
282
|
+
console.error(new Error(`Could not keep a recovery copy of "${path}"`, { cause: error }));
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
async readRawFile(path) {
|
|
287
|
+
const adapter = this.plugin.app.vault.adapter;
|
|
288
|
+
try {
|
|
289
|
+
return await adapter.exists(path) ? await adapter.read(path) : null;
|
|
290
|
+
} catch {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
class PluginDataParseError extends Error {
|
|
296
|
+
/**
|
|
297
|
+
* The path of the plugin's `data.json`.
|
|
298
|
+
*/
|
|
299
|
+
path;
|
|
300
|
+
/**
|
|
301
|
+
* The `manifest.id` of the plugin.
|
|
302
|
+
*/
|
|
303
|
+
pluginId;
|
|
304
|
+
/**
|
|
305
|
+
* The `manifest.name` of the plugin.
|
|
306
|
+
*/
|
|
307
|
+
pluginName;
|
|
308
|
+
/**
|
|
309
|
+
* The recovery copy kept of the file, or `null` when none could be kept.
|
|
310
|
+
*/
|
|
311
|
+
recoveryCopy;
|
|
312
|
+
/**
|
|
313
|
+
* Creates a {@link PluginDataParseError}.
|
|
314
|
+
*
|
|
315
|
+
* @param params - The parameters for the error.
|
|
316
|
+
*/
|
|
317
|
+
constructor(params) {
|
|
318
|
+
const copy = params.recoveryCopy === null ? "No recovery copy could be kept." : `A recovery copy was kept on this device as "${params.recoveryCopy.id}".`;
|
|
319
|
+
super(
|
|
320
|
+
`Plugin "${params.pluginName}" (${params.pluginId}): "${params.path}" is not valid JSON, so it could not be loaded. The file was left untouched. ${copy}`,
|
|
321
|
+
{ cause: params.cause }
|
|
322
|
+
);
|
|
323
|
+
this.name = "PluginDataParseError";
|
|
324
|
+
this.path = params.path;
|
|
325
|
+
this.pluginId = params.pluginId;
|
|
326
|
+
this.pluginName = params.pluginName;
|
|
327
|
+
this.recoveryCopy = params.recoveryCopy;
|
|
328
|
+
}
|
|
223
329
|
}
|
|
224
330
|
class PluginDataSizeLimitExceededError extends Error {
|
|
225
331
|
/**
|
|
@@ -271,6 +377,7 @@ class PluginDataSizeLimitExceededError extends Error {
|
|
|
271
377
|
DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES,
|
|
272
378
|
PluginDataHandler,
|
|
273
379
|
PluginDataOperation,
|
|
380
|
+
PluginDataParseError,
|
|
274
381
|
PluginDataSizeLimitExceededError
|
|
275
382
|
});
|
|
276
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLWhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICpcbiAqIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0gYm91bmRzIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCBpbiBieXRlcywgaW4gYm90aCBkaXJlY3Rpb25zLCBiZWNhdXNlIE9ic2lkaWFuIGRvZXNcbiAqIG5vdC4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOiBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyB0aGUgd2hvbGUgZmlsZSBhbmQgYEpTT04ucGFyc2VgcyBpdCB3aXRoIG5vIGxpbWl0LCBzbyBhblxuICogb3ZlcnNpemVkIGZpbGUgaXMgZnVsbHkgcmVhZCBhbmQgcGFyc2VkIGludG8gbWVtb3J5IG9uIGV2ZXJ5IHN0YXJ0dXAsIGFuZCBgUGx1Z2luLnNhdmVEYXRhYCB3cml0ZXNcbiAqIGBKU09OLnN0cmluZ2lmeShkYXRhLCB1bmRlZmluZWQsIDIpYCB3aXRoIG5vIGxpbWl0IGVpdGhlci4gT2JzaWRpYW4gYWxzbyBzd2FsbG93cyBhIGZhaWxlZCByZWFkIG9yIHdyaXRlOiBpdHNcbiAqIGByZWFkSnNvbmAgbG9ncyBhIHBhcnNlIGZhaWx1cmUgYW5kIHJlc29sdmVzIGB1bmRlZmluZWRgLCBhbmQgaXRzIGB3cml0ZUpzb25gIGNhdGNoZXMgZXZlcnkgZXJyb3IuIFNvIHRoZSBndWFyZFxuICogaGFzIHRvIGRlY2lkZSBCRUZPUkUgaGFuZGluZyB0aGUgY2FsbCB0byBPYnNpZGlhbiwgd2hpY2ggaXMgdGhlIG9ubHkgcG9pbnQgd2hlcmUgcmVmdXNpbmcgc3RpbGwgY2hhbmdlcyB0aGVcbiAqIG91dGNvbWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogVGhlIGluZGVudGF0aW9uIE9ic2lkaWFuJ3MgYFZhdWx0LndyaXRlSnNvbmAgcGFzc2VzIHRvIGBKU09OLnN0cmluZ2lmeWAgZm9yIGBkYXRhLmpzb25gIChyZWFkIGZyb20gYDEuMTUuMWApLlxuICovXG5jb25zdCBPQlNJRElBTl9KU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgbWF4aW11bSBzaXplIG9mIGEgcGx1Z2luJ3MgYGRhdGEuanNvbmAsIGluIGJ5dGVzOiAxNiBNaUIuXG4gKlxuICogVGhpcyBpcyBhIHByb3RlY3RpdmUgYnVkZ2V0IGFnYWluc3Qgc3RhcnR1cCBleGhhdXN0aW9uLCBub3QgYSBzeW5jIHF1b3RhLiBPYnNpZGlhbiBTeW5jJ3Mgb3duIHBlci1maWxlIGxpbWl0XG4gKiBkZXBlbmRzIG9uIHRoZSBwbGFuIGFuZCBpcyBhIHNlcGFyYXRlIGNvbnN0cmFpbnQgYSBwbHVnaW4gbWF5IHdhbnQgdG8gc3RheSB3ZWxsIHVuZGVyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFUyA9IDE2Xzc3N18yMTY7XG5cbi8qKlxuICogVGhlIG9wZXJhdGlvbiBhIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0gcmVmdXNlZC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luRGF0YU9wZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMb2FkaW5nIHRoZSBleGlzdGluZyBgZGF0YS5qc29uYC5cbiAgICovXG4gIExvYWQgPSAnbG9hZCcsXG5cbiAgLyoqXG4gICAqIFNhdmluZyBhIG5ldyBgZGF0YS5qc29uYC5cbiAgICovXG4gIFNhdmUgPSAnc2F2ZSdcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIGxvYWRpbmcgYW5kIHNhdmluZyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byBsb2FkIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBsb2FkRGF0YTogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byBzYXZlIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2F2ZURhdGE6IChkYXRhOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YUhhbmRsZXJDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBgZGF0YS5qc29uYCwgaW4gVVRGLTggYnl0ZXMgYXMgd3JpdHRlbiB0byBkaXNrLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFU30uIFBhc3MgYEluZmluaXR5YCB0byBkaXNhYmxlIHRoZSBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemVJbkJ5dGVzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmdXNlZCBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IFBsdWdpbkRhdGFPcGVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIGZpbGUgKGxvYWQpIG9yIG9mIHRoZSBzZXJpYWxpemVkIGRhdGEgKHNhdmUpLCBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLCByZWZ1c2luZyBhIGBkYXRhLmpzb25gIGxhcmdlciB0aGFuIGEgYnl0ZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkRhdGFIYW5kbGVyIGltcGxlbWVudHMgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBgZGF0YS5qc29uYCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gZGF0YSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM6IFBsdWdpbkRhdGFIYW5kbGVyQ29uc3RydWN0b3JPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhTaXplSW5CeXRlcyA9IG9wdGlvbnMubWF4U2l6ZUluQnl0ZXMgPz8gREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFUztcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG1heFNpemVJbkJ5dGVzKSB8fCBtYXhTaXplSW5CeXRlcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhTaXplSW5CeXRlcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKG1heFNpemVJbkJ5dGVzKX0uYCk7XG4gICAgfVxuICAgIHRoaXMubWF4U2l6ZUluQnl0ZXMgPSBtYXhTaXplSW5CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBkYXRhIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogVGhlIGZpbGUncyBzaXplIGlzIHJlYWQgdGhyb3VnaCB0aGUgYWRhcHRlciBCRUZPUkUgT2JzaWRpYW4gcmVhZHMgYW5kIHBhcnNlcyBpdCwgc28gYW4gb3ZlcnNpemVkIGZpbGUgaXMgbmV2ZXJcbiAgICogbG9hZGVkIGludG8gbWVtb3J5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2l6ZUluQnl0ZXMgPSBhd2FpdCB0aGlzLmdldEV4aXN0aW5nRmlsZVNpemUoKTtcbiAgICBpZiAoc2l6ZUluQnl0ZXMgIT09IG51bGwgJiYgc2l6ZUluQnl0ZXMgPiB0aGlzLm1heFNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKFBsdWdpbkRhdGFPcGVyYXRpb24uTG9hZCwgc2l6ZUluQnl0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ubG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIFRoZSBkYXRhIGlzIHNlcmlhbGl6ZWQgZXhhY3RseSBhcyBPYnNpZGlhbiB3cml0ZXMgaXQsIGFuZCBpdHMgVVRGLTggYnl0ZSBsZW5ndGggaXMgY2hlY2tlZCBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICogd3JpdHRlbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYXZlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIGlzIHNhdmVkLlxuICAgKiBAdGhyb3dzIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0gSWYgdGhlIHNlcmlhbGl6ZWQgZGF0YSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZURhdGEoZGF0YTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzICE9PSBJbmZpbml0eSkge1xuICAgICAgLy8gT2JzaWRpYW4ncyBgd3JpdGVKc29uYCB3b3VsZCBzd2FsbG93IGEgc2VyaWFsaXphdGlvbiBmYWlsdXJlIGFuZCB3cml0ZSBub3RoaW5nOyB0aHJvd2luZyBoZXJlIGluc3RlYWQga2VlcHNcbiAgICAgIC8vIHRoZSBkaXNrIHVuY2hhbmdlZCB0b28sIGFuZCB0ZWxscyB0aGUgY2FsbGVyLlxuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIHVuZGVmaW5lZCwgT0JTSURJQU5fSlNPTl9JTkRFTlQpO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzaXplSW5CeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzZXJpYWxpemVkKS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAoc2l6ZUluQnl0ZXMgPiB0aGlzLm1heFNpemVJbkJ5dGVzKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihQbHVnaW5EYXRhT3BlcmF0aW9uLlNhdmUsIHNpemVJbkJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgYXMgT2JzaWRpYW4ncyBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyBpdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBhdGgsIG9yIGBudWxsYCB3aGVuIHRoZSBtYW5pZmVzdCBoYXMgbm8gZm9sZGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERhdGFGaWxlUGF0aCgpOiBudWxsIHwgc3RyaW5nIHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLnBsdWdpbi5tYW5pZmVzdC5kaXI7XG4gICAgcmV0dXJuIGRpcmVjdG9yeSA/IG5vcm1hbGl6ZVBhdGgoYCR7ZGlyZWN0b3J5fS9kYXRhLmpzb25gKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yKG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbiwgc2l6ZUluQnl0ZXM6IG51bWJlcik6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yKHtcbiAgICAgIG1heFNpemVJbkJ5dGVzOiB0aGlzLm1heFNpemVJbkJ5dGVzLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgcGF0aDogdGhpcy5nZXREYXRhRmlsZVBhdGgoKSA/PyAnZGF0YS5qc29uJyxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBzaXplSW5CeXRlc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeGlzdGluZ0ZpbGVTaXplKCk6IFByb21pc2U8bnVsbCB8IG51bWJlcj4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldERhdGFGaWxlUGF0aCgpO1xuICAgIGlmIChwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXQ/LnNpemUgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzaXplIGlzIHVua25vd24sIG5vdCBvdmVyc2l6ZWQ6IE9ic2lkaWFuJ3Mgb3duIHJlYWQgZGVjaWRlcyB3aGF0IGhhcHBlbnMgbmV4dCwgYXMgYmVmb3JlIHRoaXMgZ3VhcmQuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGlzLCBvciB3b3VsZCBiZWNvbWUsIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0LlxuICpcbiAqIFRoZSBmaWxlIG9uIGRpc2sgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duOiBhbiBvdmVyc2l6ZWQgZXhpc3RpbmcgZmlsZSBpcyBsZWZ0IGludGFjdCBmb3IgdGhlIHVzZXIgdG9cbiAqIGluc3BlY3Qgb3IgdHJpbSwgYW5kIGFuIG92ZXJzaXplZCBzYXZlIGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSBsYXN0IGdvb2QgZmlsZSByZW1haW5zLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlZnVzZWQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZXhpc3RpbmcgZmlsZSAobG9hZCkgb3Igb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSAoc2F2ZSksIGluIGJ5dGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB3aGF0ID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/IGBSZWZ1c2luZyB0byBsb2FkIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGZpbGUgaXMgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgXG4gICAgICA6IGBSZWZ1c2luZyB0byBzYXZlIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGRhdGEgd291bGQgYmUgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgO1xuICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/ICdUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuJ1xuICAgICAgOiAnTm90aGluZyB3YXMgd3JpdHRlbiwgc28gdGhlIGxhc3Qgc2F2ZWQgZmlsZSByZW1haW5zLic7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogJHt3aGF0fSwgb3ZlciB0aGUgJHtTdHJpbmcocGFyYW1zLm1heFNpemVJbkJ5dGVzKX0tYnl0ZSBsaW1pdC4gJHtjb25zZXF1ZW5jZX0gYFxuICAgICAgICArICdLZWVwIGRhdGEuanNvbiBmb3Igc21hbGwgc2V0dGluZ3MsIGFuZCBtb3ZlIGxhcmdlIG9yIGdyb3dpbmcgc3RhdGUgdG8gTG9jYWxEYXRhU3RvcmUgb3IgU2hhcmVkRGF0YVN0b3JlLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcic7XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IHBhcmFtcy5tYXhTaXplSW5CeXRlcztcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHBhcmFtcy5vcGVyYXRpb247XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnNpemVJbkJ5dGVzID0gcGFyYW1zLnNpemVJbkJ5dGVzO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEsc0JBQThCO0FBSzlCLE1BQU0sdUJBQXVCO0FBUXRCLE1BQU0sd0NBQXdDO0FBSzlDLElBQUssc0JBQUwsa0JBQUtBLHlCQUFMO0FBSUwsRUFBQUEscUJBQUEsVUFBTztBQUtQLEVBQUFBLHFCQUFBLFVBQU87QUFURyxTQUFBQTtBQUFBLEdBQUE7QUFnRkwsTUFBTSxrQkFBeUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVk3QyxZQUErQixRQUFnQixVQUErQyxDQUFDLEdBQUc7QUFBbkU7QUFDcEMsVUFBTSxpQkFBaUIsUUFBUSxrQkFBa0I7QUFDakQsUUFBSSxPQUFPLE1BQU0sY0FBYyxLQUFLLGlCQUFpQixHQUFHO0FBQ3RELFlBQU0sSUFBSSxXQUFXLHFEQUFxRCxPQUFPLGNBQWMsQ0FBQyxHQUFHO0FBQUEsSUFDckc7QUFDQSxTQUFLLGlCQUFpQjtB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
|
|
383
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLWhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICpcbiAqIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0gYm91bmRzIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCBpbiBieXRlcywgaW4gYm90aCBkaXJlY3Rpb25zLCBiZWNhdXNlIE9ic2lkaWFuIGRvZXNcbiAqIG5vdC4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOiBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyB0aGUgd2hvbGUgZmlsZSBhbmQgYEpTT04ucGFyc2VgcyBpdCB3aXRoIG5vIGxpbWl0LCBzbyBhblxuICogb3ZlcnNpemVkIGZpbGUgaXMgZnVsbHkgcmVhZCBhbmQgcGFyc2VkIGludG8gbWVtb3J5IG9uIGV2ZXJ5IHN0YXJ0dXAsIGFuZCBgUGx1Z2luLnNhdmVEYXRhYCB3cml0ZXNcbiAqIGBKU09OLnN0cmluZ2lmeShkYXRhLCB1bmRlZmluZWQsIDIpYCB3aXRoIG5vIGxpbWl0IGVpdGhlci4gT2JzaWRpYW4gYWxzbyBzd2FsbG93cyBhIGZhaWxlZCByZWFkIG9yIHdyaXRlOiBpdHNcbiAqIGByZWFkSnNvbmAgbG9ncyBhIHBhcnNlIGZhaWx1cmUgYW5kIHJlc29sdmVzIGB1bmRlZmluZWRgLCBhbmQgaXRzIGB3cml0ZUpzb25gIGNhdGNoZXMgZXZlcnkgZXJyb3IuIFNvIHRoZSBndWFyZFxuICogaGFzIHRvIGRlY2lkZSBCRUZPUkUgaGFuZGluZyB0aGUgY2FsbCB0byBPYnNpZGlhbiwgd2hpY2ggaXMgdGhlIG9ubHkgcG9pbnQgd2hlcmUgcmVmdXNpbmcgc3RpbGwgY2hhbmdlcyB0aGVcbiAqIG91dGNvbWUuXG4gKlxuICogVGhlIHNhbWUgYHJlYWRKc29uYCBtYWtlcyBhIGBkYXRhLmpzb25gIHRoYXQgRVhJU1RTIGJ1dCBkb2VzIG5vdCBwYXJzZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG5vIGZpbGUgYXQgYWxsOiBib3RoXG4gKiByZXNvbHZlIGB1bmRlZmluZWRgLiBBIHNldHRpbmdzIGNvbXBvbmVudCByZWFkaW5nIHRoYXQgYXMgXCJub3RoaW5nIHN0b3JlZFwiIHNhdmVzIGl0cyBkZWZhdWx0cyBvdmVyIHRoZSBmaWxlLCBhbmRcbiAqIHRoZSB1c2VyJ3Mgc2V0dGluZ3MgYXJlIGdvbmUuIFNvIHdoZW4gT2JzaWRpYW4gYW5zd2VycyBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlci5sb2FkRGF0YX1cbiAqIHJlYWRzIHRoZSBmaWxlIHJhdyBhbmQgcGFyc2VzIGl0IGl0c2VsZjsgYSBmaWxlIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgY29waWVkIGludG8gdGhlIGRldmljZS1sb2NhbFxuICoge0BsaW5rIFNldHRpbmdzUmVjb3ZlcnlTdG9yZX0gYW5kIHJlcG9ydGVkIGFzIGEge0BsaW5rIFBsdWdpbkRhdGFQYXJzZUVycm9yfSwgbmV2ZXIgYXMgbWlzc2luZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBTZXR0aW5nc1JlY292ZXJ5Q29weSxcbiAgU2V0dGluZ3NSZWNvdmVyeVN0b3JlXG59IGZyb20gJy4vc2V0dGluZ3MtcmVjb3ZlcnkudHMnO1xuXG5pbXBvcnQgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlLFxuICBTZXR0aW5nc1JlY292ZXJ5UmVhc29uXG59IGZyb20gJy4vc2V0dGluZ3MtcmVjb3ZlcnkudHMnO1xuXG4vKipcbiAqIFRoZSBpbmRlbnRhdGlvbiBPYnNpZGlhbidzIGBWYXVsdC53cml0ZUpzb25gIHBhc3NlcyB0byBgSlNPTi5zdHJpbmdpZnlgIGZvciBgZGF0YS5qc29uYCAocmVhZCBmcm9tIGAxLjE1LjFgKS5cbiAqL1xuY29uc3QgT0JTSURJQU5fSlNPTl9JTkRFTlQgPSAyO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IG1heGltdW0gc2l6ZSBvZiBhIHBsdWdpbidzIGBkYXRhLmpzb25gLCBpbiBieXRlczogMTYgTWlCLlxuICpcbiAqIFRoaXMgaXMgYSBwcm90ZWN0aXZlIGJ1ZGdldCBhZ2FpbnN0IHN0YXJ0dXAgZXhoYXVzdGlvbiwgbm90IGEgc3luYyBxdW90YS4gT2JzaWRpYW4gU3luYydzIG93biBwZXItZmlsZSBsaW1pdFxuICogZGVwZW5kcyBvbiB0aGUgcGxhbiBhbmQgaXMgYSBzZXBhcmF0ZSBjb25zdHJhaW50IGEgcGx1Z2luIG1heSB3YW50IHRvIHN0YXkgd2VsbCB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExVR0lOX0RBVEFfTUFYX1NJWkVfSU5fQllURVMgPSAxNl83NzdfMjE2O1xuXG4vKipcbiAqIFRoZSBvcGVyYXRpb24gYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9IHJlZnVzZWQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkRhdGFPcGVyYXRpb24ge1xuICAvKipcbiAgICogTG9hZGluZyB0aGUgZXhpc3RpbmcgYGRhdGEuanNvbmAuXG4gICAqL1xuICBMb2FkID0gJ2xvYWQnLFxuXG4gIC8qKlxuICAgKiBTYXZpbmcgYSBuZXcgYGRhdGEuanNvbmAuXG4gICAqL1xuICBTYXZlID0gJ3NhdmUnXG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdG8gbG9hZCBkYXRhIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxvYWRlZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZERhdGE6ICgpID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgY29weSBvZiB0aGUgZGF0YSBmaWxlIGlzIGtlcHQgYmVmb3JlIGFueXRoaW5nIGNvdWxkIGxvc2Ugd2hhdCBpdCBoZWxkLCBvciBgbnVsbGAgKG9yIGFic2VudCkgd2hlbiB0aGVcbiAgICogaGFuZGxlciBrZWVwcyBub25lLiBBIHNldHRpbmdzIGNvbXBvbmVudCBrZWVwcyBhIGNvcHkgaGVyZSBiZWZvcmUgYSBmaXJzdCBzYXZlIHRoYXQgd291bGQgZHJvcCBvciBjaGFuZ2UgYVxuICAgKiBzdG9yZWQgdmFsdWUsIGFuZCBza2lwcyB0aGF0IHNhdmUgd2hlbiB0aGUgY29weSBjYW5ub3QgYmUga2VwdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlY292ZXJ5U3RvcmU/OiBudWxsIHwgU2V0dGluZ3NSZWNvdmVyeVN0b3JlO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIHNhdmUgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBzYXZlRGF0YTogKGRhdGE6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbkRhdGFIYW5kbGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5EYXRhSGFuZGxlckNvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGBkYXRhLmpzb25gLCBpbiBVVEYtOCBieXRlcyBhcyB3cml0dGVuIHRvIGRpc2suIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX1BMVUdJTl9EQVRBX01BWF9TSVpFX0lOX0JZVEVTfS4gUGFzcyBgSW5maW5pdHlgIHRvIGRpc2FibGUgdGhlIGd1YXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHJlY292ZXJ5IGNvcGllcyBvZiBgZGF0YS5qc29uYCBhcmUga2VwdC4gRGVmYXVsdHMgdG8gYSBkZXZpY2UtbG9jYWwge0BsaW5rIExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlfVxuICAgKiBmb3IgdGhlIHBsdWdpbi4gUGFzcyBgbnVsbGAgdG8ga2VlcCBub25lOiBhbiB1bnBhcnNlYWJsZSBmaWxlIGlzIHRoZW4gc3RpbGwgcmVwb3J0ZWQgYW5kIG5ldmVyIG92ZXJ3cml0dGVuLCBzbyBhXG4gICAqIHNldHRpbmdzIGNvbXBvbmVudCBidWlsdCBvbiB0aGlzIGhhbmRsZXIgZmFpbHMgaXRzIGxvYWQgcmF0aGVyIHRoYW4gcnVuIG9uIGRlZmF1bHRzLCBhbmQgYSBmaXJzdCBzYXZlIHRoYXQgZHJvcHNcbiAgICogb3IgY2hhbmdlcyBhIHN0b3JlZCB2YWx1ZSBpcyB3cml0dGVuIHdpdGggbm8gY29weSBrZXB0LCBhcyBiZWZvcmUgcmVjb3ZlcnkgY29waWVzIGV4aXN0ZWQuXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyeVN0b3JlPzogbnVsbCB8IFNldHRpbmdzUmVjb3ZlcnlTdG9yZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luRGF0YVBhcnNlRXJyb3J9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRhdGFQYXJzZUVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVycm9yIGBKU09OLnBhcnNlYCB0aHJldy5cbiAgICovXG4gIHJlYWRvbmx5IGNhdXNlOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb3B5IGtlcHQgb2YgdGhlIGZpbGUsIG9yIGBudWxsYCB3aGVuIG5vbmUgY291bGQgYmUga2VwdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlY292ZXJ5Q29weTogbnVsbCB8IFNldHRpbmdzUmVjb3ZlcnlDb3B5O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmdXNlZCBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IFBsdWdpbkRhdGFPcGVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIGZpbGUgKGxvYWQpIG9yIG9mIHRoZSBzZXJpYWxpemVkIGRhdGEgKHNhdmUpLCBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLCByZWZ1c2luZyBhIGBkYXRhLmpzb25gIGxhcmdlciB0aGFuIGEgYnl0ZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkRhdGFIYW5kbGVyIGltcGxlbWVudHMgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogV2hlcmUgcmVjb3ZlcnkgY29waWVzIG9mIGBkYXRhLmpzb25gIGFyZSBrZXB0LCBvciBgbnVsbGAgd2hlbiBub25lIGFyZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWNvdmVyeVN0b3JlOiBudWxsIHwgU2V0dGluZ3NSZWNvdmVyeVN0b3JlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGBkYXRhLmpzb25gLCBpbiBieXRlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBkYXRhIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbiwgb3B0aW9uczogUGx1Z2luRGF0YUhhbmRsZXJDb25zdHJ1Y3Rvck9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG1heFNpemVJbkJ5dGVzID0gb3B0aW9ucy5tYXhTaXplSW5CeXRlcyA/PyBERUZBVUxUX1BMVUdJTl9EQVRBX01BWF9TSVpFX0lOX0JZVEVTO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obWF4U2l6ZUluQnl0ZXMpIHx8IG1heFNpemVJbkJ5dGVzIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYG1heFNpemVJbkJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3QgJHtTdHJpbmcobWF4U2l6ZUluQnl0ZXMpfS5gKTtcbiAgICB9XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IG1heFNpemVJbkJ5dGVzO1xuICAgIHRoaXMucmVjb3ZlcnlTdG9yZSA9IG9wdGlvbnMucmVjb3ZlcnlTdG9yZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IG5ldyBMb2NhbFNldHRpbmdzUmVjb3ZlcnlTdG9yZSh7IGFwcDogcGx1Z2luLmFwcCwgcGx1Z2luSWQ6IHBsdWdpbi5tYW5pZmVzdC5pZCB9KVxuICAgICAgOiBvcHRpb25zLnJlY292ZXJ5U3RvcmU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIFRoZSBmaWxlJ3Mgc2l6ZSBpcyByZWFkIHRocm91Z2ggdGhlIGFkYXB0ZXIgQkVGT1JFIE9ic2lkaWFuIHJlYWRzIGFuZCBwYXJzZXMgaXQsIHNvIGFuIG92ZXJzaXplZCBmaWxlIGlzIG5ldmVyXG4gICAqIGxvYWRlZCBpbnRvIG1lbW9yeS4gV2hlbiBPYnNpZGlhbiBhbnN3ZXJzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgdGhlIGZpbGUgaXMgcmVhZCByYXcgYW5kIHBhcnNlZCBoZXJlLCBiZWNhdXNlXG4gICAqIE9ic2lkaWFuIGFuc3dlcnMgYHVuZGVmaW5lZGAgZm9yIGEgZmlsZSB0aGF0IGV4aXN0cyBidXQgZG9lcyBub3QgcGFyc2UgdG9vLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFQYXJzZUVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBub3QgdmFsaWQgSlNPTi4gVGhlIGZpbGUgaXMgbGVmdCB1bnRvdWNoZWQsIGFuZCBhXG4gICAqIHJlY292ZXJ5IGNvcHkgb2YgaXQgaXMga2VwdCBmaXJzdCB3aGVuIHRoZSBoYW5kbGVyIGhhcyBhIHJlY292ZXJ5IHN0b3JlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWREYXRhKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gYXdhaXQgdGhpcy5nZXRFeGlzdGluZ0ZpbGVTaXplKCk7XG4gICAgaWYgKHNpemVJbkJ5dGVzICE9PSBudWxsICYmIHNpemVJbkJ5dGVzID4gdGhpcy5tYXhTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihQbHVnaW5EYXRhT3BlcmF0aW9uLkxvYWQsIHNpemVJbkJ5dGVzKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YTogdW5rbm93biA9IGF3YWl0IHRoaXMucGx1Z2luLmxvYWREYXRhKCk7XG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXREYXRhRmlsZVBhdGgoKTtcbiAgICBpZiAocGF0aCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHJhd1RleHQgPSBhd2FpdCB0aGlzLnJlYWRSYXdGaWxlKHBhdGgpO1xuICAgIGlmIChyYXdUZXh0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZShyYXdUZXh0KTtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUGx1Z2luRGF0YVBhcnNlRXJyb3Ioe1xuICAgICAgICBjYXVzZTogcGFyc2VFcnJvcixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkLFxuICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lLFxuICAgICAgICByZWNvdmVyeUNvcHk6IGF3YWl0IHRoaXMua2VlcFJlY292ZXJ5Q29weShwYXRoLCByYXdUZXh0KVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlcG9ydFBhcnNlRXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogVGhlIGRhdGEgaXMgc2VyaWFsaXplZCBleGFjdGx5IGFzIE9ic2lkaWFuIHdyaXRlcyBpdCwgYW5kIGl0cyBVVEYtOCBieXRlIGxlbmd0aCBpcyBjaGVja2VkIGJlZm9yZSBhbnl0aGluZyBpc1xuICAgKiB3cml0dGVuLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhdmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRhdGEgaXMgc2F2ZWQuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgc2VyaWFsaXplZCBkYXRhIGlzIGxhcmdlciB0aGFuIHRoZSBsaW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlRGF0YShkYXRhOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWF4U2l6ZUluQnl0ZXMgIT09IEluZmluaXR5KSB7XG4gICAgICAvLyBPYnNpZGlhbidzIGB3cml0ZUpzb25gIHdvdWxkIHN3YWxsb3cgYSBzZXJpYWxpemF0aW9uIGZhaWx1cmUgYW5kIHdyaXRlIG5vdGhpbmc7IHRocm93aW5nIGhlcmUgaW5zdGVhZCBrZWVwc1xuICAgICAgLy8gdGhlIGRpc2sgdW5jaGFuZ2VkIHRvbywgYW5kIHRlbGxzIHRoZSBjYWxsZXIuXG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgdW5kZWZpbmVkLCBPQlNJRElBTl9KU09OX0lOREVOVCk7XG4gICAgICBpZiAoc2VyaWFsaXplZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHNlcmlhbGl6ZWQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChzaXplSW5CeXRlcyA+IHRoaXMubWF4U2l6ZUluQnl0ZXMpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKFBsdWdpbkRhdGFPcGVyYXRpb24uU2F2ZSwgc2l6ZUluQnl0ZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLCBhcyBPYnNpZGlhbidzIGBQbHVnaW4ubG9hZERhdGFgIHJlYWRzIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCwgb3IgYG51bGxgIHdoZW4gdGhlIG1hbmlmZXN0IGhhcyBubyBmb2xkZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGF0YUZpbGVQYXRoKCk6IG51bGwgfCBzdHJpbmcge1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRoaXMucGx1Z2luLm1hbmlmZXN0LmRpcjtcbiAgICByZXR1cm4gZGlyZWN0b3J5ID8gbm9ybWFsaXplUGF0aChgJHtkaXJlY3Rvcnl9L2RhdGEuanNvbmApIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyB0aGUgdXNlciB0aGF0IGBkYXRhLmpzb25gIGNvdWxkIG5vdCBiZSBwYXJzZWQ6IGEgbm90aWNlIG5hbWluZyB0aGUgcGx1Z2luIGFuZCB0aGUgcGF0aCwgYW5kIHRoZSBlcnJvciBpbiB0aGVcbiAgICogY29uc29sZS5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIHBhcnNlIGVycm9yLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlcG9ydFBhcnNlRXJyb3IoZXJyb3I6IFBsdWdpbkRhdGFQYXJzZUVycm9yKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgICBhcHA6IHRoaXMucGx1Z2luLmFwcCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWVcbiAgICB9KS5zaG93Tm90aWNlKFxuICAgICAgZXJyb3IucmVjb3ZlcnlDb3B5ID09PSBudWxsXG4gICAgICAgID8gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmRhdGFGaWxlVW5wYXJzZWFibGUsIHsgcGF0aDogZXJyb3IucGF0aCB9KVxuICAgICAgICA6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5kYXRhRmlsZVVucGFyc2VhYmxlQ29weUtlcHQsIHsgcGF0aDogZXJyb3IucGF0aCB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yKG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbiwgc2l6ZUluQnl0ZXM6IG51bWJlcik6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yKHtcbiAgICAgIG1heFNpemVJbkJ5dGVzOiB0aGlzLm1heFNpemVJbkJ5dGVzLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgcGF0aDogdGhpcy5nZXREYXRhRmlsZVBhdGgoKSA/PyAnZGF0YS5qc29uJyxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBzaXplSW5CeXRlc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeGlzdGluZ0ZpbGVTaXplKCk6IFByb21pc2U8bnVsbCB8IG51bWJlcj4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldERhdGFGaWxlUGF0aCgpO1xuICAgIGlmIChwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXQ/LnNpemUgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzaXplIGlzIHVua25vd24sIG5vdCBvdmVyc2l6ZWQ6IE9ic2lkaWFuJ3Mgb3duIHJlYWQgZGVjaWRlcyB3aGF0IGhhcHBlbnMgbmV4dCwgYXMgYmVmb3JlIHRoaXMgZ3VhcmQuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGtlZXBSZWNvdmVyeUNvcHkocGF0aDogc3RyaW5nLCByYXdUZXh0OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBTZXR0aW5nc1JlY292ZXJ5Q29weT4ge1xuICAgIGlmICh0aGlzLnJlY292ZXJ5U3RvcmUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVjb3ZlcnlTdG9yZS5rZWVwKHsgcGF0aCwgcmF3VGV4dCwgcmVhc29uOiBTZXR0aW5nc1JlY292ZXJ5UmVhc29uLkludmFsaWRKc29uIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQ291bGQgbm90IGtlZXAgYSByZWNvdmVyeSBjb3B5IG9mIFwiJHtwYXRofVwiYCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkUmF3RmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXI7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhZGFwdGVyLmV4aXN0cyhwYXRoKSA/IGF3YWl0IGFkYXB0ZXIucmVhZChwYXRoKSA6IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBVbnJlYWRhYmxlIGlzIG5vdCB1bnBhcnNlYWJsZTogT2JzaWRpYW4ncyBvd24gYW5zd2VyIHN0YW5kcywgYXMgYmVmb3JlIHRoaXMgY2hlY2suXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIEpTT04uXG4gKlxuICogVGhlIGZpbGUgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duLiBXaGVuIHtAbGluayByZWNvdmVyeUNvcHl9IGlzIG5vdCBgbnVsbGAsIGEgY29weSBvZiB0aGUgZmlsZSdzIHJhdyB0ZXh0XG4gKiB3YXMga2VwdCBvbiB0aGlzIGRldmljZSBmaXJzdCwgc28gZXZlbiBhIGxhdGVyIHNhdmUgb3ZlciB0aGUgZmlsZSBsb3NlcyBub3RoaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVBhcnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb3B5IGtlcHQgb2YgdGhlIGZpbGUsIG9yIGBudWxsYCB3aGVuIG5vbmUgY291bGQgYmUga2VwdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWNvdmVyeUNvcHk6IG51bGwgfCBTZXR0aW5nc1JlY292ZXJ5Q29weTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5EYXRhUGFyc2VFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luRGF0YVBhcnNlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IGNvcHkgPSBwYXJhbXMucmVjb3ZlcnlDb3B5ID09PSBudWxsXG4gICAgICA/ICdObyByZWNvdmVyeSBjb3B5IGNvdWxkIGJlIGtlcHQuJ1xuICAgICAgOiBgQSByZWNvdmVyeSBjb3B5IHdhcyBrZXB0IG9uIHRoaXMgZGV2aWNlIGFzIFwiJHtwYXJhbXMucmVjb3ZlcnlDb3B5LmlkfVwiLmA7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogXCIke3BhcmFtcy5wYXRofVwiIGlzIG5vdCB2YWxpZCBKU09OLCBzbyBpdCBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuICR7Y29weX1gLFxuICAgICAgeyBjYXVzZTogcGFyYW1zLmNhdXNlIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhUGFyc2VFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnJlY292ZXJ5Q29weSA9IHBhcmFtcy5yZWNvdmVyeUNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGlzLCBvciB3b3VsZCBiZWNvbWUsIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0LlxuICpcbiAqIFRoZSBmaWxlIG9uIGRpc2sgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duOiBhbiBvdmVyc2l6ZWQgZXhpc3RpbmcgZmlsZSBpcyBsZWZ0IGludGFjdCBmb3IgdGhlIHVzZXIgdG9cbiAqIGluc3BlY3Qgb3IgdHJpbSwgYW5kIGFuIG92ZXJzaXplZCBzYXZlIGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSBsYXN0IGdvb2QgZmlsZSByZW1haW5zLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlZnVzZWQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZXhpc3RpbmcgZmlsZSAobG9hZCkgb3Igb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSAoc2F2ZSksIGluIGJ5dGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB3aGF0ID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/IGBSZWZ1c2luZyB0byBsb2FkIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGZpbGUgaXMgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgXG4gICAgICA6IGBSZWZ1c2luZyB0byBzYXZlIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGRhdGEgd291bGQgYmUgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgO1xuICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/ICdUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuJ1xuICAgICAgOiAnTm90aGluZyB3YXMgd3JpdHRlbiwgc28gdGhlIGxhc3Qgc2F2ZWQgZmlsZSByZW1haW5zLic7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogJHt3aGF0fSwgb3ZlciB0aGUgJHtTdHJpbmcocGFyYW1zLm1heFNpemVJbkJ5dGVzKX0tYnl0ZSBsaW1pdC4gJHtjb25zZXF1ZW5jZX0gYFxuICAgICAgICArICdLZWVwIGRhdGEuanNvbiBmb3Igc21hbGwgc2V0dGluZ3MsIGFuZCBtb3ZlIGxhcmdlIG9yIGdyb3dpbmcgc3RhdGUgdG8gTG9jYWxEYXRhU3RvcmUgb3IgU2hhcmVkRGF0YVN0b3JlLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcic7XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IHBhcmFtcy5tYXhTaXplSW5CeXRlcztcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHBhcmFtcy5vcGVyYXRpb247XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnNpemVJbkJ5dGVzID0gcGFyYW1zLnNpemVJbkJ5dGVzO1xuICB9XG59XG4iXSwibWFw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
|
|
@@ -11,8 +11,15 @@
|
|
|
11
11
|
* `readJson` logs a parse failure and resolves `undefined`, and its `writeJson` catches every error. So the guard
|
|
12
12
|
* has to decide BEFORE handing the call to Obsidian, which is the only point where refusing still changes the
|
|
13
13
|
* outcome.
|
|
14
|
+
*
|
|
15
|
+
* The same `readJson` makes a `data.json` that EXISTS but does not parse indistinguishable from no file at all: both
|
|
16
|
+
* resolve `undefined`. A settings component reading that as "nothing stored" saves its defaults over the file, and
|
|
17
|
+
* the user's settings are gone. So when Obsidian answers `undefined` or `null`, {@link PluginDataHandler.loadData}
|
|
18
|
+
* reads the file raw and parses it itself; a file that does not parse is copied into the device-local
|
|
19
|
+
* {@link SettingsRecoveryStore} and reported as a {@link PluginDataParseError}, never as missing.
|
|
14
20
|
*/
|
|
15
21
|
import type { Plugin } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
22
|
+
import type { SettingsRecoveryCopy, SettingsRecoveryStore } from './settings-recovery.cjs';
|
|
16
23
|
/**
|
|
17
24
|
* The default maximum size of a plugin's `data.json`, in bytes: 16 MiB.
|
|
18
25
|
*
|
|
@@ -43,6 +50,12 @@ export interface DataHandler {
|
|
|
43
50
|
* @returns The loaded data.
|
|
44
51
|
*/
|
|
45
52
|
readonly loadData: () => Promise<unknown>;
|
|
53
|
+
/**
|
|
54
|
+
* Where a copy of the data file is kept before anything could lose what it held, or `null` (or absent) when the
|
|
55
|
+
* handler keeps none. A settings component keeps a copy here before a first save that would drop or change a
|
|
56
|
+
* stored value, and skips that save when the copy cannot be kept.
|
|
57
|
+
*/
|
|
58
|
+
readonly recoveryStore?: null | SettingsRecoveryStore;
|
|
46
59
|
/**
|
|
47
60
|
* A function to save data to the plugin's data file.
|
|
48
61
|
*
|
|
@@ -59,6 +72,38 @@ export interface PluginDataHandlerConstructorOptions {
|
|
|
59
72
|
* {@link DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES}. Pass `Infinity` to disable the guard.
|
|
60
73
|
*/
|
|
61
74
|
readonly maxSizeInBytes?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Where recovery copies of `data.json` are kept. Defaults to a device-local {@link LocalSettingsRecoveryStore}
|
|
77
|
+
* for the plugin. Pass `null` to keep none: an unparseable file is then still reported and never overwritten, so a
|
|
78
|
+
* settings component built on this handler fails its load rather than run on defaults, and a first save that drops
|
|
79
|
+
* or changes a stored value is written with no copy kept, as before recovery copies existed.
|
|
80
|
+
*/
|
|
81
|
+
readonly recoveryStore?: null | SettingsRecoveryStore;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parameters for {@link PluginDataParseError}.
|
|
85
|
+
*/
|
|
86
|
+
export interface PluginDataParseErrorConstructorParams {
|
|
87
|
+
/**
|
|
88
|
+
* The error `JSON.parse` threw.
|
|
89
|
+
*/
|
|
90
|
+
readonly cause: unknown;
|
|
91
|
+
/**
|
|
92
|
+
* The path of the plugin's `data.json`.
|
|
93
|
+
*/
|
|
94
|
+
readonly path: string;
|
|
95
|
+
/**
|
|
96
|
+
* The `manifest.id` of the plugin.
|
|
97
|
+
*/
|
|
98
|
+
readonly pluginId: string;
|
|
99
|
+
/**
|
|
100
|
+
* The `manifest.name` of the plugin.
|
|
101
|
+
*/
|
|
102
|
+
readonly pluginName: string;
|
|
103
|
+
/**
|
|
104
|
+
* The recovery copy kept of the file, or `null` when none could be kept.
|
|
105
|
+
*/
|
|
106
|
+
readonly recoveryCopy: null | SettingsRecoveryCopy;
|
|
62
107
|
}
|
|
63
108
|
/**
|
|
64
109
|
* Parameters for {@link PluginDataSizeLimitExceededError}.
|
|
@@ -94,6 +139,10 @@ export interface PluginDataSizeLimitExceededErrorConstructorParams {
|
|
|
94
139
|
*/
|
|
95
140
|
export declare class PluginDataHandler implements DataHandler {
|
|
96
141
|
protected readonly plugin: Plugin;
|
|
142
|
+
/**
|
|
143
|
+
* Where recovery copies of `data.json` are kept, or `null` when none are.
|
|
144
|
+
*/
|
|
145
|
+
readonly recoveryStore: null | SettingsRecoveryStore;
|
|
97
146
|
/**
|
|
98
147
|
* The maximum size of `data.json`, in bytes.
|
|
99
148
|
*/
|
|
@@ -109,10 +158,13 @@ export declare class PluginDataHandler implements DataHandler {
|
|
|
109
158
|
* Loads data from the plugin's data file.
|
|
110
159
|
*
|
|
111
160
|
* The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
|
|
112
|
-
* loaded into memory.
|
|
161
|
+
* loaded into memory. When Obsidian answers `undefined` or `null`, the file is read raw and parsed here, because
|
|
162
|
+
* Obsidian answers `undefined` for a file that exists but does not parse too.
|
|
113
163
|
*
|
|
114
164
|
* @returns The loaded data.
|
|
115
165
|
* @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
|
|
166
|
+
* @throws {@link PluginDataParseError} If the existing file is not valid JSON. The file is left untouched, and a
|
|
167
|
+
* recovery copy of it is kept first when the handler has a recovery store.
|
|
116
168
|
*/
|
|
117
169
|
loadData(): Promise<unknown>;
|
|
118
170
|
/**
|
|
@@ -132,8 +184,47 @@ export declare class PluginDataHandler implements DataHandler {
|
|
|
132
184
|
* @returns The path, or `null` when the manifest has no folder.
|
|
133
185
|
*/
|
|
134
186
|
protected getDataFilePath(): null | string;
|
|
187
|
+
/**
|
|
188
|
+
* Tells the user that `data.json` could not be parsed: a notice naming the plugin and the path, and the error in the
|
|
189
|
+
* console.
|
|
190
|
+
*
|
|
191
|
+
* @param error - The parse error.
|
|
192
|
+
*/
|
|
193
|
+
protected reportParseError(error: PluginDataParseError): void;
|
|
135
194
|
private createError;
|
|
136
195
|
private getExistingFileSize;
|
|
196
|
+
private keepRecoveryCopy;
|
|
197
|
+
private readRawFile;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Thrown when a plugin's `data.json` exists but is not valid JSON.
|
|
201
|
+
*
|
|
202
|
+
* The file is never touched when this is thrown. When {@link recoveryCopy} is not `null`, a copy of the file's raw text
|
|
203
|
+
* was kept on this device first, so even a later save over the file loses nothing.
|
|
204
|
+
*/
|
|
205
|
+
export declare class PluginDataParseError extends Error {
|
|
206
|
+
/**
|
|
207
|
+
* The path of the plugin's `data.json`.
|
|
208
|
+
*/
|
|
209
|
+
readonly path: string;
|
|
210
|
+
/**
|
|
211
|
+
* The `manifest.id` of the plugin.
|
|
212
|
+
*/
|
|
213
|
+
readonly pluginId: string;
|
|
214
|
+
/**
|
|
215
|
+
* The `manifest.name` of the plugin.
|
|
216
|
+
*/
|
|
217
|
+
readonly pluginName: string;
|
|
218
|
+
/**
|
|
219
|
+
* The recovery copy kept of the file, or `null` when none could be kept.
|
|
220
|
+
*/
|
|
221
|
+
readonly recoveryCopy: null | SettingsRecoveryCopy;
|
|
222
|
+
/**
|
|
223
|
+
* Creates a {@link PluginDataParseError}.
|
|
224
|
+
*
|
|
225
|
+
* @param params - The parameters for the error.
|
|
226
|
+
*/
|
|
227
|
+
constructor(params: PluginDataParseErrorConstructorParams);
|
|
137
228
|
}
|
|
138
229
|
/**
|
|
139
230
|
* Thrown when a plugin's `data.json` is, or would become, larger than the configured limit.
|
|
@@ -117,8 +117,8 @@ __export(data_store_locations_exports, {
|
|
|
117
117
|
DataStoreLocations: () => DataStoreLocations
|
|
118
118
|
});
|
|
119
119
|
module.exports = __toCommonJS(data_store_locations_exports);
|
|
120
|
-
var import_type_guards = require(
|
|
121
|
-
var import_data_store_transport = require(
|
|
120
|
+
var import_type_guards = require("@mnaoumov/typescript-lib/type-guards");
|
|
121
|
+
var import_data_store_transport = require("./data-store-transport.cjs");
|
|
122
122
|
const MAX_LOCATIONS = 32;
|
|
123
123
|
class DataStoreLocations {
|
|
124
124
|
/**
|
|
@@ -164,25 +164,7 @@ class DataStoreLocations {
|
|
|
164
164
|
this.validateLocation(value.to);
|
|
165
165
|
transitions.push(value);
|
|
166
166
|
}
|
|
167
|
-
const locations =
|
|
168
|
-
let currentIdentity = identity(this.initial);
|
|
169
|
-
while (transitions.length > 0) {
|
|
170
|
-
const sourceIdentity = currentIdentity;
|
|
171
|
-
const next = transitions.filter((transition) => identity(transition.from) === sourceIdentity);
|
|
172
|
-
const targets = new Set(next.map((transition) => identity(transition.to)));
|
|
173
|
-
if (targets.size !== 1) {
|
|
174
|
-
throw new Error("Conflicting or incomplete data-store relocation chain");
|
|
175
|
-
}
|
|
176
|
-
const target = (0, import_type_guards.ensureNonNullable)(next[0]);
|
|
177
|
-
if (locations.some((location) => identity(location) === identity(target.to)) || locations.length >= MAX_LOCATIONS) {
|
|
178
|
-
throw new Error("Data-store relocation loop or location limit");
|
|
179
|
-
}
|
|
180
|
-
locations.push(target.to);
|
|
181
|
-
currentIdentity = identity(target.to);
|
|
182
|
-
for (const transition of next) {
|
|
183
|
-
transitions.splice(transitions.indexOf(transition), 1);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
167
|
+
const locations = this.buildChain(await this.resolveMovedAnchor(transitions));
|
|
186
168
|
for (const location of locations) {
|
|
187
169
|
this.validateLocation(location, locations);
|
|
188
170
|
}
|
|
@@ -215,13 +197,73 @@ class DataStoreLocations {
|
|
|
215
197
|
if (this.locations.some((previous) => identity(previous) === identity(location)) || this.locations.length >= MAX_LOCATIONS) {
|
|
216
198
|
throw new Error("Data-store relocation loop or location limit");
|
|
217
199
|
}
|
|
218
|
-
const value = { format: 1, from, to: location };
|
|
200
|
+
const value = { anchor: this.initial, format: 1, from, to: location };
|
|
219
201
|
await this.anchor.write(`${this.anchor.root}/locations-v1/${window.crypto.randomUUID()}.json`, value);
|
|
220
202
|
await this.refresh();
|
|
221
203
|
}
|
|
204
|
+
buildChain(transitions) {
|
|
205
|
+
const remaining = [...transitions];
|
|
206
|
+
const locations = [this.initial];
|
|
207
|
+
let currentIdentity = identity(this.initial);
|
|
208
|
+
while (remaining.length > 0) {
|
|
209
|
+
const sourceIdentity = currentIdentity;
|
|
210
|
+
const next = remaining.filter((transition) => identity(transition.from) === sourceIdentity);
|
|
211
|
+
const targets = new Set(next.map((transition) => identity(transition.to)));
|
|
212
|
+
if (targets.size !== 1) {
|
|
213
|
+
throw new Error("Conflicting or incomplete data-store relocation chain");
|
|
214
|
+
}
|
|
215
|
+
const target = (0, import_type_guards.ensureNonNullable)(next[0]);
|
|
216
|
+
if (locations.some((location) => identity(location) === identity(target.to)) || locations.length >= MAX_LOCATIONS) {
|
|
217
|
+
throw new Error("Data-store relocation loop or location limit");
|
|
218
|
+
}
|
|
219
|
+
locations.push(target.to);
|
|
220
|
+
currentIdentity = identity(target.to);
|
|
221
|
+
for (const transition of next) {
|
|
222
|
+
remaining.splice(remaining.indexOf(transition), 1);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return locations;
|
|
226
|
+
}
|
|
222
227
|
createTransport(location) {
|
|
223
228
|
return new import_data_store_transport.DataStoreTransport({ ...this.params, folder: location.folder, format: location.format ?? "markdown" });
|
|
224
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Maps the records of an anchor folder that was moved (or sits under a moved folder) onto the folder the store is open
|
|
232
|
+
* at, because records name absolute folders.
|
|
233
|
+
*
|
|
234
|
+
* A transition that names its `anchor` is remapped from that folder exactly, so several successive moves resolve too.
|
|
235
|
+
* A transition written before that field existed names no anchor, and a moved anchor then looks the same as a chain whose
|
|
236
|
+
* first record has not arrived yet. So the former folder is inferred only when nothing starts at the initial identity,
|
|
237
|
+
* exactly one candidate folder (one the legacy records start from, in the initial format) yields a complete chain, and
|
|
238
|
+
* that folder no longer holds this store. Anything else is left for `buildChain` to reject.
|
|
239
|
+
*
|
|
240
|
+
* @param transitions - The transitions recorded at the anchor.
|
|
241
|
+
* @returns The transitions to build the chain from.
|
|
242
|
+
*/
|
|
243
|
+
async resolveMovedAnchor(transitions) {
|
|
244
|
+
const anchored = transitions.map((transition) => transition.anchor ? remapTransition(transition, transition.anchor.folder, this.initial.folder) : transition);
|
|
245
|
+
const initialIdentity = identity(this.initial);
|
|
246
|
+
if (anchored.some((transition) => identity(transition.from) === initialIdentity)) {
|
|
247
|
+
return anchored;
|
|
248
|
+
}
|
|
249
|
+
const candidates = new Set(anchored.filter((transition) => !transition.anchor).map((transition) => transition.from.folder));
|
|
250
|
+
const resolved = [];
|
|
251
|
+
for (const formerFolder of candidates) {
|
|
252
|
+
const remapped = anchored.map((transition) => transition.anchor ? transition : remapTransition(transition, formerFolder, this.initial.folder));
|
|
253
|
+
try {
|
|
254
|
+
this.buildChain(remapped);
|
|
255
|
+
} catch {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
resolved.push({ formerFolder, transitions: remapped });
|
|
259
|
+
}
|
|
260
|
+
const match = resolved.length === 1 ? (0, import_type_guards.ensureNonNullable)(resolved[0]) : null;
|
|
261
|
+
if (!match) {
|
|
262
|
+
return anchored;
|
|
263
|
+
}
|
|
264
|
+
const formerFiles = await this.createTransport({ ...this.initial, folder: match.formerFolder }).list();
|
|
265
|
+
return formerFiles.length > 0 ? anchored : match.transitions;
|
|
266
|
+
}
|
|
225
267
|
validateLocation(location, locations = this.locations) {
|
|
226
268
|
const transport = this.createTransport(location);
|
|
227
269
|
for (const previous of locations) {
|
|
@@ -239,10 +281,26 @@ function isLocation(value) {
|
|
|
239
281
|
return typeof value === "object" && value !== null && "folder" in value && typeof value.folder === "string" && (!("format" in value) || value.format === "json" || value.format === "markdown");
|
|
240
282
|
}
|
|
241
283
|
function isTransition(value) {
|
|
242
|
-
return typeof value === "object" && value !== null && "format" in value && value.format === 1 && "from" in value && isLocation(value.from) && "to" in value && isLocation(value.to);
|
|
284
|
+
return typeof value === "object" && value !== null && "format" in value && value.format === 1 && "from" in value && isLocation(value.from) && "to" in value && isLocation(value.to) && (!("anchor" in value) || isLocation(value.anchor));
|
|
285
|
+
}
|
|
286
|
+
function remapLocation(location, formerFolder, folder) {
|
|
287
|
+
if (location.folder === formerFolder) {
|
|
288
|
+
return { ...location, folder };
|
|
289
|
+
}
|
|
290
|
+
if (location.folder.startsWith(`${formerFolder}/`)) {
|
|
291
|
+
return { ...location, folder: `${folder}${location.folder.slice(formerFolder.length)}` };
|
|
292
|
+
}
|
|
293
|
+
return location;
|
|
294
|
+
}
|
|
295
|
+
function remapTransition(transition, formerFolder, folder) {
|
|
296
|
+
return {
|
|
297
|
+
...transition,
|
|
298
|
+
from: remapLocation(transition.from, formerFolder, folder),
|
|
299
|
+
to: remapLocation(transition.to, formerFolder, folder)
|
|
300
|
+
};
|
|
243
301
|
}
|
|
244
302
|
// Annotate the CommonJS export names for ESM import in node:
|
|
245
303
|
0 && (module.exports = {
|
|
246
304
|
DataStoreLocations
|
|
247
305
|
});
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqIEFwcGVuZC1vbmx5LCBhbmNob3JlZCBkaXNjb3Zlcnkgb2YgaGlzdG9yeS1wcmVzZXJ2aW5nIHRyYW5zcG9ydCB0cmFuc2l0aW9ucy5cbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuaW1wb3J0IHsgRGF0YVN0b3JlVHJhbnNwb3J0IH0gZnJvbSAnLi9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyc7XG5cbmNvbnN0IE1BWF9MT0NBVElPTlMgPSAzMjtcblxuLyoqXG5BIHRyYW5zcG9ydCBkZXN0aW5hdGlvbi4gS2VlcCB0aGUgb3JpZ2luYWwgb3BlbiBwYXJhbWV0ZXJzIGFzIHRoZSBkaXNjb3ZlcnkgYW5jaG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZUxvY2F0aW9uIHtcbiAgLyoqXG4gIFZhdWx0LXJlbGF0aXZlIHBhcmVudCBvZiB0aGUgcGx1Z2luL3N0b3JlIHN1YnRyZWUuXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIE5ldyBkb2N1bWVudCBlbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xufVxuXG5pbnRlcmZhY2UgVHJhbnNpdGlvbiB7XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkgZnJvbTogRGF0YVN0b3JlTG9jYXRpb247XG4gIHJlYWRvbmx5IHRvOiBEYXRhU3RvcmVMb2NhdGlvbjtcbn1cblxuLyoqXG5BbmNob3JlZCByZWxvY2F0aW9uIGNvb3JkaW5hdG9yOyBzb3VyY2UgaGlzdG9yaWVzIGFyZSBuZXZlciByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlTG9jYXRpb25zIHtcbiAgLyoqXG4gIEFsbCByZWFkZXJzLCBvbGRlc3QgZmlyc3Q7IHRoZSBsYXN0IHRyYW5zcG9ydCBpcyB0aGUgYWN0aXZlIHdyaXRlci5cbiAgICpcbiAgICogQHJldHVybnMgQWxsIHJldGFpbmVkIHJlYWRlciB0cmFuc3BvcnRzIGluIHRyYW5zaXRpb24gb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydHMoKTogRGF0YVN0b3JlVHJhbnNwb3J0W10ge1xuICAgIHJldHVybiB0aGlzLmxvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiB0aGlzLmNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbikpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhbmNob3I6IERhdGFTdG9yZVRyYW5zcG9ydDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsOiBEYXRhU3RvcmVMb2NhdGlvbjtcblxuICBwcml2YXRlIGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25bXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvb3JkaW5hdG9yIHdpdGhvdXQgYWRhcHRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcm1hbmVudCBkaXNjb3ZlcnkgYW5jaG9yIGFuZCBzdG9yZSBpZGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFuY2hvciA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQocGFyYW1zKTtcbiAgICB0aGlzLmluaXRpYWwgPSB7IGZvbGRlcjogcGFyYW1zLmZvbGRlciA/PyAnUGx1Z2luIGRhdGEnLCBmb3JtYXQ6IHBhcmFtcy5mb3JtYXQgPz8gJ21hcmtkb3duJyB9O1xuICAgIHRoaXMubG9jYXRpb25zID0gW3RoaXMuaW5pdGlhbF07XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGFuZCBmaW5pc2hlcyBwZW5kaW5nIGNvcGllcyBiZWZvcmUgYWxsb3dpbmcgYSB3cml0ZXIgdG8gc3dpdGNoIGRlc3RpbmF0aW9ucy5cbiAgICogQ29uZmxpY3RpbmcgYnJhbmNoZXMgYW5kIHJlb3JkZXJlZCBpbmNvbXBsZXRlIGNoYWlucyBmYWlsIGNsb3NlZCB1bnRpbCBkZWxpdmVyeSBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgZGlzY292ZXJ5IGFuZCB2ZXJpZmljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc2l0aW9uczogVHJhbnNpdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGF3YWl0IHRoaXMuYW5jaG9yLmxpc3QoKSkge1xuICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5hbmNob3Iucm9vdH0vbG9jYXRpb25zLXYxL2ApIHx8ICFwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmFuY2hvci5yZWFkKHBhdGgpO1xuICAgICAgaWYgKCFpc1RyYW5zaXRpb24odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb21wbGV0ZSBvciBpbnZhbGlkIGRhdGEtc3RvcmUgdHJhbnNpdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLmZyb20pO1xuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLnRvKTtcbiAgICAgIHRyYW5zaXRpb25zLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbnMgPSBbdGhpcy5pbml0aWFsXTtcbiAgICBsZXQgY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHkodGhpcy5pbml0aWFsKTtcbiAgICB3aGlsZSAodHJhbnNpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc291cmNlSWRlbnRpdHkgPSBjdXJyZW50SWRlbnRpdHk7XG4gICAgICBjb25zdCBuZXh0ID0gdHJhbnNpdGlvbnMuZmlsdGVyKCh0cmFuc2l0aW9uKSA9PiBpZGVudGl0eSh0cmFuc2l0aW9uLmZyb20pID09PSBzb3VyY2VJZGVudGl0eSk7XG4gICAgICBjb25zdCB0YXJnZXRzID0gbmV3IFNldChuZXh0Lm1hcCgodHJhbnNpdGlvbikgPT4gaWRlbnRpdHkodHJhbnNpdGlvbi50bykpKTtcbiAgICAgIGlmICh0YXJnZXRzLnNpemUgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBvciBpbmNvbXBsZXRlIGRhdGEtc3RvcmUgcmVsb2NhdGlvbiBjaGFpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUobmV4dFswXSk7XG4gICAgICBpZiAobG9jYXRpb25zLnNvbWUoKGxvY2F0aW9uKSA9PiBpZGVudGl0eShsb2NhdGlvbikgPT09IGlkZW50aXR5KHRhcmdldC50bykpIHx8IGxvY2F0aW9ucy5sZW5ndGggPj0gTUFYX0xPQ0FUSU9OUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgcmVsb2NhdGlvbiBsb29wIG9yIGxvY2F0aW9uIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBsb2NhdGlvbnMucHVzaCh0YXJnZXQudG8pO1xuICAgICAgY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHkodGFyZ2V0LnRvKTtcbiAgICAgIGZvciAoY29uc3QgdHJhbnNpdGlvbiBvZiBuZXh0KSB7XG4gICAgICAgIHRyYW5zaXRpb25zLnNwbGljZSh0cmFuc2l0aW9ucy5pbmRleE9mKHRyYW5zaXRpb24pLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgdGhlIGVudGlyZSBjaGFpbiBiZWZvcmUgbWFraW5nIGFueSBjb3BpZXMgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uLCBsb2NhdGlvbnMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobG9jYXRpb24pO1xuICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgbG9jYXRpb25zLnNsaWNlKDAsIGxvY2F0aW9ucy5pbmRleE9mKGxvY2F0aW9uKSkpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQoc291cmNlKTtcbiAgICAgICAgaWYgKHRyYW5zcG9ydC5yb290ICE9PSB0YXJnZXQucm9vdCkge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC5jb3B5SGlzdG9yeVRvKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQW5ub3VuY2VzIGEgdHJhbnNpdGlvbiBkdXJhYmx5IGF0IHRoZSBhbmNob3IsIHRoZW4gY29waWVzIGFuZCB2ZXJpZmllcyBiZWZvcmUgYWN0aXZhdGlvbi5cbiAgICogUmV0cnlpbmcgdGhlIHNhbWUgZGVzdGluYXRpb24gZmluaXNoZXMgYW4gaW50ZXJydXB0ZWQgY29weS5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gUmVxdWVzdGVkIGRlc3RpbmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXcgd3JpdGVyIGlzIHJlYWR5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbG9jYXRlKGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICBjb25zdCBmcm9tID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5sb2NhdGlvbnMuYXQoLTEpKTtcbiAgICBpZiAoaWRlbnRpdHkoZnJvbSkgPT09IGlkZW50aXR5KGxvY2F0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2NhdGlvbnMuc29tZSgocHJldmlvdXMpID0+IGlkZW50aXR5KHByZXZpb3VzKSA9PT0gaWRlbnRpdHkobG9jYXRpb24pKSB8fCB0aGlzLmxvY2F0aW9ucy5sZW5ndGggPj0gTUFYX0xPQ0FUSU9OUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHJlbG9jYXRpb24gbG9vcCBvciBsb2NhdGlvbiBsaW1pdCcpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZTogVHJhbnNpdGlvbiA9IHsgZm9ybWF0OiAxLCBmcm9tLCB0bzogbG9jYXRpb24gfTtcbiAgICBhd2FpdCB0aGlzLmFuY2hvci53cml0ZShgJHt0aGlzLmFuY2hvci5yb290fS9sb2NhdGlvbnMtdjEvJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0uanNvbmAsIHZhbHVlKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVHJhbnNwb3J0KGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbik6IERhdGFTdG9yZVRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiBsb2NhdGlvbi5mb2xkZXIsIGZvcm1hdDogbG9jYXRpb24uZm9ybWF0ID8/ICdtYXJrZG93bicgfSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlTG9jYXRpb24obG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uLCBsb2NhdGlvbnM6IHJlYWRvbmx5IERhdGFTdG9yZUxvY2F0aW9uW10gPSB0aGlzLmxvY2F0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRoaXMuY3JlYXRlVHJhbnNwb3J0KGxvY2F0aW9uKTtcbiAgICBmb3IgKGNvbnN0IHByZXZpb3VzIG9mIGxvY2F0aW9ucykge1xuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuY3JlYXRlVHJhbnNwb3J0KHByZXZpb3VzKS5yb290O1xuICAgICAgaWYgKHRyYW5zcG9ydC5yb290ICE9PSByb290ICYmICh0cmFuc3BvcnQucm9vdC5zdGFydHNXaXRoKGAke3Jvb3R9L2ApIHx8IHJvb3Quc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vYCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZGF0YS1zdG9yZSByZWxvY2F0aW9uIHJvb3RzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIGVzbGludC1lbmFibGUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZXNlIGFyZSBPYnNpZGlhbiByZW5kZXJlciBXZWIgQVBJcywgbm90IE5vZGUgYnVpbHRpbnMuICovXG5cbmZ1bmN0aW9uIGlkZW50aXR5KGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtsb2NhdGlvbi5mb2xkZXJ9OiR7bG9jYXRpb24uZm9ybWF0ID8/ICdtYXJrZG93bid9YDtcbn1cblxuZnVuY3Rpb24gaXNMb2NhdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGFTdG9yZUxvY2F0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2ZvbGRlcicgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmZvbGRlciA9PT0gJ3N0cmluZydcbiAgICAmJiAoISgnZm9ybWF0JyBpbiB2YWx1ZSkgfHwgdmFsdWUuZm9ybWF0ID09PSAnanNvbicgfHwgdmFsdWUuZm9ybWF0ID09PSAnbWFya2Rvd24nKTtcbn1cblxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVHJhbnNpdGlvbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdmb3JtYXQnIGluIHZhbHVlICYmIHZhbHVlLmZvcm1hdCA9PT0gMVxuICAgICYmICdmcm9tJyBpbiB2YWx1ZSAmJiBpc0xvY2F0aW9uKHZhbHVlLmZyb20pICYmICd0bycgaW4gdmFsdWUgJiYgaXNMb2NhdGlvbih2YWx1ZS50byk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSx5QkFBa0M7QUFJbEMsa0NBQW1DO0FBRW5DLE1BQU0sZ0JBQWdCO0FBMkJmLE1BQU0sbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBb0J2QixZQUE2QixRQUE2QztBQUE3QztBQUNsQyxTQUFLLFNBQVMsSUFBSSwrQ0FBbUIsTUFB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
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBBcHBlbmQtb25seSwgYW5jaG9yZWQgZGlzY292ZXJ5IG9mIGhpc3RvcnktcHJlc2VydmluZyB0cmFuc3BvcnQgdHJhbnNpdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZVRyYW5zcG9ydENvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyc7XG5cbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBNQVhfTE9DQVRJT05TID0gMzI7XG5cbi8qKlxuQSB0cmFuc3BvcnQgZGVzdGluYXRpb24uIEtlZXAgdGhlIG9yaWdpbmFsIG9wZW4gcGFyYW1ldGVycyBhcyB0aGUgZGlzY292ZXJ5IGFuY2hvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVMb2NhdGlvbiB7XG4gIC8qKlxuICBWYXVsdC1yZWxhdGl2ZSBwYXJlbnQgb2YgdGhlIHBsdWdpbi9zdG9yZSBzdWJ0cmVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOZXcgZG9jdW1lbnQgZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbWFya2Rvd24nYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0PzogJ2pzb24nIHwgJ21hcmtkb3duJztcbn1cblxuaW50ZXJmYWNlIEluZmVycmVkQ2hhaW4ge1xuICByZWFkb25seSBmb3JtZXJGb2xkZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgdHJhbnNpdGlvbnM6IHJlYWRvbmx5IFRyYW5zaXRpb25bXTtcbn1cblxuaW50ZXJmYWNlIFRyYW5zaXRpb24ge1xuICAvKipcbiAgICogVGhlIGFuY2hvciB0aGUgdHJhbnNpdGlvbiB3YXMgd3JpdHRlbiBhdC4gQWJzZW50IGZyb20gdHJhbnNpdGlvbnMgd3JpdHRlbiBiZWZvcmUgaXQgd2FzIGFkZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yPzogRGF0YVN0b3JlTG9jYXRpb247XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkgZnJvbTogRGF0YVN0b3JlTG9jYXRpb247XG4gIHJlYWRvbmx5IHRvOiBEYXRhU3RvcmVMb2NhdGlvbjtcbn1cblxuLyoqXG5BbmNob3JlZCByZWxvY2F0aW9uIGNvb3JkaW5hdG9yOyBzb3VyY2UgaGlzdG9yaWVzIGFyZSBuZXZlciByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlTG9jYXRpb25zIHtcbiAgLyoqXG4gIEFsbCByZWFkZXJzLCBvbGRlc3QgZmlyc3Q7IHRoZSBsYXN0IHRyYW5zcG9ydCBpcyB0aGUgYWN0aXZlIHdyaXRlci5cbiAgICpcbiAgICogQHJldHVybnMgQWxsIHJldGFpbmVkIHJlYWRlciB0cmFuc3BvcnRzIGluIHRyYW5zaXRpb24gb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydHMoKTogRGF0YVN0b3JlVHJhbnNwb3J0W10ge1xuICAgIHJldHVybiB0aGlzLmxvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiB0aGlzLmNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbikpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhbmNob3I6IERhdGFTdG9yZVRyYW5zcG9ydDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsOiBEYXRhU3RvcmVMb2NhdGlvbjtcblxuICBwcml2YXRlIGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25bXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvb3JkaW5hdG9yIHdpdGhvdXQgYWRhcHRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcm1hbmVudCBkaXNjb3ZlcnkgYW5jaG9yIGFuZCBzdG9yZSBpZGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFuY2hvciA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQocGFyYW1zKTtcbiAgICB0aGlzLmluaXRpYWwgPSB7IGZvbGRlcjogcGFyYW1zLmZvbGRlciA/PyAnUGx1Z2luIGRhdGEnLCBmb3JtYXQ6IHBhcmFtcy5mb3JtYXQgPz8gJ21hcmtkb3duJyB9O1xuICAgIHRoaXMubG9jYXRpb25zID0gW3RoaXMuaW5pdGlhbF07XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGFuZCBmaW5pc2hlcyBwZW5kaW5nIGNvcGllcyBiZWZvcmUgYWxsb3dpbmcgYSB3cml0ZXIgdG8gc3dpdGNoIGRlc3RpbmF0aW9ucy5cbiAgICogQ29uZmxpY3RpbmcgYnJhbmNoZXMgYW5kIHJlb3JkZXJlZCBpbmNvbXBsZXRlIGNoYWlucyBmYWlsIGNsb3NlZCB1bnRpbCBkZWxpdmVyeSBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgZGlzY292ZXJ5IGFuZCB2ZXJpZmljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc2l0aW9uczogVHJhbnNpdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGF3YWl0IHRoaXMuYW5jaG9yLmxpc3QoKSkge1xuICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5hbmNob3Iucm9vdH0vbG9jYXRpb25zLXYxL2ApIHx8ICFwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmFuY2hvci5yZWFkKHBhdGgpO1xuICAgICAgaWYgKCFpc1RyYW5zaXRpb24odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb21wbGV0ZSBvciBpbnZhbGlkIGRhdGEtc3RvcmUgdHJhbnNpdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLmZyb20pO1xuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLnRvKTtcbiAgICAgIHRyYW5zaXRpb25zLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbnMgPSB0aGlzLmJ1aWxkQ2hhaW4oYXdhaXQgdGhpcy5yZXNvbHZlTW92ZWRBbmNob3IodHJhbnNpdGlvbnMpKTtcbiAgICAvLyBWYWxpZGF0ZSB0aGUgZW50aXJlIGNoYWluIGJlZm9yZSBtYWtpbmcgYW55IGNvcGllcyBvciBhY3RpdmF0aW5nIGEgd3JpdGVyLlxuICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24sIGxvY2F0aW9ucyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zLnNsaWNlKDEpKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbik7XG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBsb2NhdGlvbnMuc2xpY2UoMCwgbG9jYXRpb25zLmluZGV4T2YobG9jYXRpb24pKSkge1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydChzb3VyY2UpO1xuICAgICAgICBpZiAodHJhbnNwb3J0LnJvb3QgIT09IHRhcmdldC5yb290KSB7XG4gICAgICAgICAgYXdhaXQgdHJhbnNwb3J0LmNvcHlIaXN0b3J5VG8odGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY2F0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbm5vdW5jZXMgYSB0cmFuc2l0aW9uIGR1cmFibHkgYXQgdGhlIGFuY2hvciwgdGhlbiBjb3BpZXMgYW5kIHZlcmlmaWVzIGJlZm9yZSBhY3RpdmF0aW9uLlxuICAgKiBSZXRyeWluZyB0aGUgc2FtZSBkZXN0aW5hdGlvbiBmaW5pc2hlcyBhbiBpbnRlcnJ1cHRlZCBjb3B5LlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYXRpb24gLSBSZXF1ZXN0ZWQgZGVzdGluYXRpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5ldyB3cml0ZXIgaXMgcmVhZHkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLnZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24pO1xuICAgIGNvbnN0IGZyb20gPSBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy5hdCgtMSkpO1xuICAgIGlmIChpZGVudGl0eShmcm9tKSA9PT0gaWRlbnRpdHkobG9jYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2F0aW9ucy5zb21lKChwcmV2aW91cykgPT4gaWRlbnRpdHkocHJldmlvdXMpID09PSBpZGVudGl0eShsb2NhdGlvbikpIHx8IHRoaXMubG9jYXRpb25zLmxlbmd0aCA+PSBNQVhfTE9DQVRJT05TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgcmVsb2NhdGlvbiBsb29wIG9yIGxvY2F0aW9uIGxpbWl0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlOiBUcmFuc2l0aW9uID0geyBhbmNob3I6IHRoaXMuaW5pdGlhbCwgZm9ybWF0OiAxLCBmcm9tLCB0bzogbG9jYXRpb24gfTtcbiAgICBhd2FpdCB0aGlzLmFuY2hvci53cml0ZShgJHt0aGlzLmFuY2hvci5yb290fS9sb2NhdGlvbnMtdjEvJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0uanNvbmAsIHZhbHVlKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGFpbih0cmFuc2l0aW9uczogcmVhZG9ubHkgVHJhbnNpdGlvbltdKTogRGF0YVN0b3JlTG9jYXRpb25bXSB7XG4gICAgY29uc3QgcmVtYWluaW5nID0gWy4uLnRyYW5zaXRpb25zXTtcbiAgICBjb25zdCBsb2NhdGlvbnMgPSBbdGhpcy5pbml0aWFsXTtcbiAgICBsZXQgY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHkodGhpcy5pbml0aWFsKTtcbiAgICB3aGlsZSAocmVtYWluaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvdXJjZUlkZW50aXR5ID0gY3VycmVudElkZW50aXR5O1xuICAgICAgY29uc3QgbmV4dCA9IHJlbWFpbmluZy5maWx0ZXIoKHRyYW5zaXRpb24pID0+IGlkZW50aXR5KHRyYW5zaXRpb24uZnJvbSkgPT09IHNvdXJjZUlkZW50aXR5KTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBuZXcgU2V0KG5leHQubWFwKCh0cmFuc2l0aW9uKSA9PiBpZGVudGl0eSh0cmFuc2l0aW9uLnRvKSkpO1xuICAgICAgaWYgKHRhcmdldHMuc2l6ZSAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIG9yIGluY29tcGxldGUgZGF0YS1zdG9yZSByZWxvY2F0aW9uIGNoYWluJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZShuZXh0WzBdKTtcbiAgICAgIGlmIChsb2NhdGlvbnMuc29tZSgobG9jYXRpb24pID0+IGlkZW50aXR5KGxvY2F0aW9uKSA9PT0gaWRlbnRpdHkodGFyZ2V0LnRvKSkgfHwgbG9jYXRpb25zLmxlbmd0aCA+PSBNQVhfTE9DQVRJT05TKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSByZWxvY2F0aW9uIGxvb3Agb3IgbG9jYXRpb24gbGltaXQnKTtcbiAgICAgIH1cbiAgICAgIGxvY2F0aW9ucy5wdXNoKHRhcmdldC50byk7XG4gICAgICBjdXJyZW50SWRlbnRpdHkgPSBpZGVudGl0eSh0YXJnZXQudG8pO1xuICAgICAgZm9yIChjb25zdCB0cmFuc2l0aW9uIG9mIG5leHQpIHtcbiAgICAgICAgcmVtYWluaW5nLnNwbGljZShyZW1haW5pbmcuaW5kZXhPZih0cmFuc2l0aW9uKSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2NhdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbjogRGF0YVN0b3JlTG9jYXRpb24pOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBuZXcgRGF0YVN0b3JlVHJhbnNwb3J0KHsgLi4udGhpcy5wYXJhbXMsIGZvbGRlcjogbG9jYXRpb24uZm9sZGVyLCBmb3JtYXQ6IGxvY2F0aW9uLmZvcm1hdCA/PyAnbWFya2Rvd24nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhlIHJlY29yZHMgb2YgYW4gYW5jaG9yIGZvbGRlciB0aGF0IHdhcyBtb3ZlZCAob3Igc2l0cyB1bmRlciBhIG1vdmVkIGZvbGRlcikgb250byB0aGUgZm9sZGVyIHRoZSBzdG9yZSBpcyBvcGVuXG4gICAqIGF0LCBiZWNhdXNlIHJlY29yZHMgbmFtZSBhYnNvbHV0ZSBmb2xkZXJzLlxuICAgKlxuICAgKiBBIHRyYW5zaXRpb24gdGhhdCBuYW1lcyBpdHMgYGFuY2hvcmAgaXMgcmVtYXBwZWQgZnJvbSB0aGF0IGZvbGRlciBleGFjdGx5LCBzbyBzZXZlcmFsIHN1Y2Nlc3NpdmUgbW92ZXMgcmVzb2x2ZSB0b28uXG4gICAqIEEgdHJhbnNpdGlvbiB3cml0dGVuIGJlZm9yZSB0aGF0IGZpZWxkIGV4aXN0ZWQgbmFtZXMgbm8gYW5jaG9yLCBhbmQgYSBtb3ZlZCBhbmNob3IgdGhlbiBsb29rcyB0aGUgc2FtZSBhcyBhIGNoYWluIHdob3NlXG4gICAqIGZpcnN0IHJlY29yZCBoYXMgbm90IGFycml2ZWQgeWV0LiBTbyB0aGUgZm9ybWVyIGZvbGRlciBpcyBpbmZlcnJlZCBvbmx5IHdoZW4gbm90aGluZyBzdGFydHMgYXQgdGhlIGluaXRpYWwgaWRlbnRpdHksXG4gICAqIGV4YWN0bHkgb25lIGNhbmRpZGF0ZSBmb2xkZXIgKG9uZSB0aGUgbGVnYWN5IHJlY29yZHMgc3RhcnQgZnJvbSwgaW4gdGhlIGluaXRpYWwgZm9ybWF0KSB5aWVsZHMgYSBjb21wbGV0ZSBjaGFpbiwgYW5kXG4gICAqIHRoYXQgZm9sZGVyIG5vIGxvbmdlciBob2xkcyB0aGlzIHN0b3JlLiBBbnl0aGluZyBlbHNlIGlzIGxlZnQgZm9yIGBidWlsZENoYWluYCB0byByZWplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9ucyAtIFRoZSB0cmFuc2l0aW9ucyByZWNvcmRlZCBhdCB0aGUgYW5jaG9yLlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNpdGlvbnMgdG8gYnVpbGQgdGhlIGNoYWluIGZyb20uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNb3ZlZEFuY2hvcih0cmFuc2l0aW9uczogcmVhZG9ubHkgVHJhbnNpdGlvbltdKTogUHJvbWlzZTxyZWFkb25seSBUcmFuc2l0aW9uW10+IHtcbiAgICBjb25zdCBhbmNob3JlZCA9IHRyYW5zaXRpb25zLm1hcCgodHJhbnNpdGlvbikgPT4gdHJhbnNpdGlvbi5hbmNob3IgPyByZW1hcFRyYW5zaXRpb24odHJhbnNpdGlvbiwgdHJhbnNpdGlvbi5hbmNob3IuZm9sZGVyLCB0aGlzLmluaXRpYWwuZm9sZGVyKSA6IHRyYW5zaXRpb24pO1xuICAgIGNvbnN0IGluaXRpYWxJZGVudGl0eSA9IGlkZW50aXR5KHRoaXMuaW5pdGlhbCk7XG4gICAgaWYgKGFuY2hvcmVkLnNvbWUoKHRyYW5zaXRpb24pID0+IGlkZW50aXR5KHRyYW5zaXRpb24uZnJvbSkgPT09IGluaXRpYWxJZGVudGl0eSkpIHtcbiAgICAgIHJldHVybiBhbmNob3JlZDtcbiAgICB9XG4gICAgLy8gQSBjYW5kaWRhdGUgdGhhdCBjYW5ub3QgcHJvZHVjZSBhIHRyYW5zaXRpb24gZnJvbSB0aGUgaW5pdGlhbCBpZGVudGl0eSBmYWlscyBgYnVpbGRDaGFpbmAgYmVsb3cuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IG5ldyBTZXQoYW5jaG9yZWQuZmlsdGVyKCh0cmFuc2l0aW9uKSA9PiAhdHJhbnNpdGlvbi5hbmNob3IpLm1hcCgodHJhbnNpdGlvbikgPT4gdHJhbnNpdGlvbi5mcm9tLmZvbGRlcikpO1xuICAgIGNvbnN0IHJlc29sdmVkOiBJbmZlcnJlZENoYWluW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZvcm1lckZvbGRlciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICBjb25zdCByZW1hcHBlZCA9IGFuY2hvcmVkLm1hcCgodHJhbnNpdGlvbikgPT4gdHJhbnNpdGlvbi5hbmNob3IgPyB0cmFuc2l0aW9uIDogcmVtYXBUcmFuc2l0aW9uKHRyYW5zaXRpb24sIGZvcm1lckZvbGRlciwgdGhpcy5pbml0aWFsLmZvbGRlcikpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5idWlsZENoYWluKHJlbWFwcGVkKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmVkLnB1c2goeyBmb3JtZXJGb2xkZXIsIHRyYW5zaXRpb25zOiByZW1hcHBlZCB9KTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSByZXNvbHZlZC5sZW5ndGggPT09IDEgPyBlbnN1cmVOb25OdWxsYWJsZShyZXNvbHZlZFswXSkgOiBudWxsO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbmNob3JlZDtcbiAgICB9XG4gICAgY29uc3QgZm9ybWVyRmlsZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh7IC4uLnRoaXMuaW5pdGlhbCwgZm9sZGVyOiBtYXRjaC5mb3JtZXJGb2xkZXIgfSkubGlzdCgpO1xuICAgIHJldHVybiBmb3JtZXJGaWxlcy5sZW5ndGggPiAwID8gYW5jaG9yZWQgOiBtYXRjaC50cmFuc2l0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbjogRGF0YVN0b3JlTG9jYXRpb24sIGxvY2F0aW9uczogcmVhZG9ubHkgRGF0YVN0b3JlTG9jYXRpb25bXSA9IHRoaXMubG9jYXRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobG9jYXRpb24pO1xuICAgIGZvciAoY29uc3QgcHJldmlvdXMgb2YgbG9jYXRpb25zKSB7XG4gICAgICBjb25zdCByb290ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQocHJldmlvdXMpLnJvb3Q7XG4gICAgICBpZiAodHJhbnNwb3J0LnJvb3QgIT09IHJvb3QgJiYgKHRyYW5zcG9ydC5yb290LnN0YXJ0c1dpdGgoYCR7cm9vdH0vYCkgfHwgcm9vdC5zdGFydHNXaXRoKGAke3RyYW5zcG9ydC5yb290fS9gKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBkYXRhLXN0b3JlIHJlbG9jYXRpb24gcm9vdHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaWRlbnRpdHkobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2F0aW9uLmZvbGRlcn06JHtsb2NhdGlvbi5mb3JtYXQgPz8gJ21hcmtkb3duJ31gO1xufVxuXG5mdW5jdGlvbiBpc0xvY2F0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0YVN0b3JlTG9jYXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnZm9sZGVyJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuZm9sZGVyID09PSAnc3RyaW5nJ1xuICAgICYmICghKCdmb3JtYXQnIGluIHZhbHVlKSB8fCB2YWx1ZS5mb3JtYXQgPT09ICdqc29uJyB8fCB2YWx1ZS5mb3JtYXQgPT09ICdtYXJrZG93bicpO1xufVxuXG5mdW5jdGlvbiBpc1RyYW5zaXRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUcmFuc2l0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2Zvcm1hdCcgaW4gdmFsdWUgJiYgdmFsdWUuZm9ybWF0ID09PSAxXG4gICAgJiYgJ2Zyb20nIGluIHZhbHVlICYmIGlzTG9jYXRpb24odmFsdWUuZnJvbSkgJiYgJ3RvJyBpbiB2YWx1ZSAmJiBpc0xvY2F0aW9uKHZhbHVlLnRvKVxuICAgICYmICghKCdhbmNob3InIGluIHZhbHVlKSB8fCBpc0xvY2F0aW9uKHZhbHVlLmFuY2hvcikpO1xufVxuXG5mdW5jdGlvbiByZW1hcExvY2F0aW9uKGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbiwgZm9ybWVyRm9sZGVyOiBzdHJpbmcsIGZvbGRlcjogc3RyaW5nKTogRGF0YVN0b3JlTG9jYXRpb24ge1xuICBpZiAobG9jYXRpb24uZm9sZGVyID09PSBmb3JtZXJGb2xkZXIpIHtcbiAgICByZXR1cm4geyAuLi5sb2NhdGlvbiwgZm9sZGVyIH07XG4gIH1cbiAgaWYgKGxvY2F0aW9uLmZvbGRlci5zdGFydHNXaXRoKGAke2Zvcm1lckZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4geyAuLi5sb2NhdGlvbiwgZm9sZGVyOiBgJHtmb2xkZXJ9JHtsb2NhdGlvbi5mb2xkZXIuc2xpY2UoZm9ybWVyRm9sZGVyLmxlbmd0aCl9YCB9O1xuICB9XG4gIHJldHVybiBsb2NhdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtYXBUcmFuc2l0aW9uKHRyYW5zaXRpb246IFRyYW5zaXRpb24sIGZvcm1lckZvbGRlcjogc3RyaW5nLCBmb2xkZXI6IHN0cmluZyk6IFRyYW5zaXRpb24ge1xuICByZXR1cm4ge1xuICAgIC4uLnRyYW5zaXRpb24sXG4gICAgZnJvbTogcmVtYXBMb2NhdGlvbih0cmFuc2l0aW9uLmZyb20sIGZvcm1lckZvbGRlciwgZm9sZGVyKSxcbiAgICB0bzogcmVtYXBMb2NhdGlvbih0cmFuc2l0aW9uLnRvLCBmb3JtZXJGb2xkZXIsIGZvbGRlcilcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBLHlCQUFrQztBQUlsQyxrQ0FBbUM7QUFFbkMsTUFBTSxnQkFBZ0I7QUFvQ2YsTUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFvQnZCLFlBQTZCLFFBQTZDO0FBQTdDO0FBQ2xDLFNBQUssU0FBUyxJQUFJLCtDQUFtQixNQUFNO0FBQzNDLFNBQUssVUFBVSxFQUFFLFFBQVEsT0FBTyxVQUFVLGVBQWUsUUFBUSxPQUFPLFVBQVUsV0FBVztBQUM3RixTQUFLLFlBQVksQ0FBQyxLQUFLLE9BQU87QUFBQSxFQUNoQztBQUFBLEVBSm9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZHBDLElBQVcsYUFBbUM7QUFDNUMsV0FBTyxLQUFLLFVBQVUsSUFBSSxDQUFDLGFBQWEsS0FBSyxnQkFBZ0IsUUFBUSxDQUFDO0FBQUEsRUFDeEU7QUFBQSxFQUVpQjtBQUFBLEVBQ0E7QUFBQSxFQUVUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtQlIsTUFBYSxV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
|
|
@@ -55,6 +55,21 @@ export declare class DataStoreLocations {
|
|
|
55
55
|
* @returns A promise that resolves when the new writer is ready.
|
|
56
56
|
*/
|
|
57
57
|
relocate(location: DataStoreLocation): Promise<void>;
|
|
58
|
+
private buildChain;
|
|
58
59
|
private createTransport;
|
|
60
|
+
/**
|
|
61
|
+
* Maps the records of an anchor folder that was moved (or sits under a moved folder) onto the folder the store is open
|
|
62
|
+
* at, because records name absolute folders.
|
|
63
|
+
*
|
|
64
|
+
* A transition that names its `anchor` is remapped from that folder exactly, so several successive moves resolve too.
|
|
65
|
+
* A transition written before that field existed names no anchor, and a moved anchor then looks the same as a chain whose
|
|
66
|
+
* first record has not arrived yet. So the former folder is inferred only when nothing starts at the initial identity,
|
|
67
|
+
* exactly one candidate folder (one the legacy records start from, in the initial format) yields a complete chain, and
|
|
68
|
+
* that folder no longer holds this store. Anything else is left for `buildChain` to reject.
|
|
69
|
+
*
|
|
70
|
+
* @param transitions - The transitions recorded at the anchor.
|
|
71
|
+
* @returns The transitions to build the chain from.
|
|
72
|
+
*/
|
|
73
|
+
private resolveMovedAnchor;
|
|
59
74
|
private validateLocation;
|
|
60
75
|
}
|