@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
|
@@ -31,6 +31,12 @@ ensureBrowserProcess();
|
|
|
31
31
|
})();
|
|
32
32
|
|
|
33
33
|
import { normalizePath } from "obsidian";
|
|
34
|
+
import { PluginNoticeComponent } from "./components/plugin-notice-component.mjs";
|
|
35
|
+
import { t } from "./i18n/i18n.mjs";
|
|
36
|
+
import {
|
|
37
|
+
LocalSettingsRecoveryStore,
|
|
38
|
+
SettingsRecoveryReason
|
|
39
|
+
} from "./settings-recovery.mjs";
|
|
34
40
|
const OBSIDIAN_JSON_INDENT = 2;
|
|
35
41
|
const DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES = 16777216;
|
|
36
42
|
var PluginDataOperation = /* @__PURE__ */ ((PluginDataOperation2) => {
|
|
@@ -52,8 +58,13 @@ class PluginDataHandler {
|
|
|
52
58
|
throw new RangeError(`maxSizeInBytes must be a non-negative number, got ${String(maxSizeInBytes)}.`);
|
|
53
59
|
}
|
|
54
60
|
this.maxSizeInBytes = maxSizeInBytes;
|
|
61
|
+
this.recoveryStore = options.recoveryStore === void 0 ? new LocalSettingsRecoveryStore({ app: plugin.app, pluginId: plugin.manifest.id }) : options.recoveryStore;
|
|
55
62
|
}
|
|
56
63
|
plugin;
|
|
64
|
+
/**
|
|
65
|
+
* Where recovery copies of `data.json` are kept, or `null` when none are.
|
|
66
|
+
*/
|
|
67
|
+
recoveryStore;
|
|
57
68
|
/**
|
|
58
69
|
* The maximum size of `data.json`, in bytes.
|
|
59
70
|
*/
|
|
@@ -62,17 +73,45 @@ class PluginDataHandler {
|
|
|
62
73
|
* Loads data from the plugin's data file.
|
|
63
74
|
*
|
|
64
75
|
* The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
|
|
65
|
-
* loaded into memory.
|
|
76
|
+
* loaded into memory. When Obsidian answers `undefined` or `null`, the file is read raw and parsed here, because
|
|
77
|
+
* Obsidian answers `undefined` for a file that exists but does not parse too.
|
|
66
78
|
*
|
|
67
79
|
* @returns The loaded data.
|
|
68
80
|
* @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
|
|
81
|
+
* @throws {@link PluginDataParseError} If the existing file is not valid JSON. The file is left untouched, and a
|
|
82
|
+
* recovery copy of it is kept first when the handler has a recovery store.
|
|
69
83
|
*/
|
|
70
84
|
async loadData() {
|
|
71
85
|
const sizeInBytes = await this.getExistingFileSize();
|
|
72
86
|
if (sizeInBytes !== null && sizeInBytes > this.maxSizeInBytes) {
|
|
73
87
|
throw this.createError("load" /* Load */, sizeInBytes);
|
|
74
88
|
}
|
|
75
|
-
|
|
89
|
+
const data = await this.plugin.loadData();
|
|
90
|
+
if (data !== void 0 && data !== null) {
|
|
91
|
+
return data;
|
|
92
|
+
}
|
|
93
|
+
const path = this.getDataFilePath();
|
|
94
|
+
if (path === null) {
|
|
95
|
+
return data;
|
|
96
|
+
}
|
|
97
|
+
const rawText = await this.readRawFile(path);
|
|
98
|
+
if (rawText === null) {
|
|
99
|
+
return data;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(rawText);
|
|
103
|
+
return parsed;
|
|
104
|
+
} catch (parseError) {
|
|
105
|
+
const error = new PluginDataParseError({
|
|
106
|
+
cause: parseError,
|
|
107
|
+
path,
|
|
108
|
+
pluginId: this.plugin.manifest.id,
|
|
109
|
+
pluginName: this.plugin.manifest.name,
|
|
110
|
+
recoveryCopy: await this.keepRecoveryCopy(path, rawText)
|
|
111
|
+
});
|
|
112
|
+
this.reportParseError(error);
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
76
115
|
}
|
|
77
116
|
/**
|
|
78
117
|
* Saves data to the plugin's data file.
|
|
@@ -105,6 +144,21 @@ class PluginDataHandler {
|
|
|
105
144
|
const directory = this.plugin.manifest.dir;
|
|
106
145
|
return directory ? normalizePath(`${directory}/data.json`) : null;
|
|
107
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Tells the user that `data.json` could not be parsed: a notice naming the plugin and the path, and the error in the
|
|
149
|
+
* console.
|
|
150
|
+
*
|
|
151
|
+
* @param error - The parse error.
|
|
152
|
+
*/
|
|
153
|
+
reportParseError(error) {
|
|
154
|
+
console.error(error);
|
|
155
|
+
new PluginNoticeComponent({
|
|
156
|
+
app: this.plugin.app,
|
|
157
|
+
pluginName: this.plugin.manifest.name
|
|
158
|
+
}).showNotice(
|
|
159
|
+
error.recoveryCopy === null ? t(($) => $.obsidianLib.notices.dataFileUnparseable, { path: error.path }) : t(($) => $.obsidianLib.notices.dataFileUnparseableCopyKept, { path: error.path })
|
|
160
|
+
);
|
|
161
|
+
}
|
|
108
162
|
createError(operation, sizeInBytes) {
|
|
109
163
|
return new PluginDataSizeLimitExceededError({
|
|
110
164
|
maxSizeInBytes: this.maxSizeInBytes,
|
|
@@ -130,6 +184,60 @@ class PluginDataHandler {
|
|
|
130
184
|
return null;
|
|
131
185
|
}
|
|
132
186
|
}
|
|
187
|
+
async keepRecoveryCopy(path, rawText) {
|
|
188
|
+
if (this.recoveryStore === null) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
return await this.recoveryStore.keep({ path, rawText, reason: SettingsRecoveryReason.InvalidJson });
|
|
193
|
+
} catch (error) {
|
|
194
|
+
console.error(new Error(`Could not keep a recovery copy of "${path}"`, { cause: error }));
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async readRawFile(path) {
|
|
199
|
+
const adapter = this.plugin.app.vault.adapter;
|
|
200
|
+
try {
|
|
201
|
+
return await adapter.exists(path) ? await adapter.read(path) : null;
|
|
202
|
+
} catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
class PluginDataParseError extends Error {
|
|
208
|
+
/**
|
|
209
|
+
* The path of the plugin's `data.json`.
|
|
210
|
+
*/
|
|
211
|
+
path;
|
|
212
|
+
/**
|
|
213
|
+
* The `manifest.id` of the plugin.
|
|
214
|
+
*/
|
|
215
|
+
pluginId;
|
|
216
|
+
/**
|
|
217
|
+
* The `manifest.name` of the plugin.
|
|
218
|
+
*/
|
|
219
|
+
pluginName;
|
|
220
|
+
/**
|
|
221
|
+
* The recovery copy kept of the file, or `null` when none could be kept.
|
|
222
|
+
*/
|
|
223
|
+
recoveryCopy;
|
|
224
|
+
/**
|
|
225
|
+
* Creates a {@link PluginDataParseError}.
|
|
226
|
+
*
|
|
227
|
+
* @param params - The parameters for the error.
|
|
228
|
+
*/
|
|
229
|
+
constructor(params) {
|
|
230
|
+
const copy = params.recoveryCopy === null ? "No recovery copy could be kept." : `A recovery copy was kept on this device as "${params.recoveryCopy.id}".`;
|
|
231
|
+
super(
|
|
232
|
+
`Plugin "${params.pluginName}" (${params.pluginId}): "${params.path}" is not valid JSON, so it could not be loaded. The file was left untouched. ${copy}`,
|
|
233
|
+
{ cause: params.cause }
|
|
234
|
+
);
|
|
235
|
+
this.name = "PluginDataParseError";
|
|
236
|
+
this.path = params.path;
|
|
237
|
+
this.pluginId = params.pluginId;
|
|
238
|
+
this.pluginName = params.pluginName;
|
|
239
|
+
this.recoveryCopy = params.recoveryCopy;
|
|
240
|
+
}
|
|
133
241
|
}
|
|
134
242
|
class PluginDataSizeLimitExceededError extends Error {
|
|
135
243
|
/**
|
|
@@ -180,6 +288,7 @@ export {
|
|
|
180
288
|
DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES,
|
|
181
289
|
PluginDataHandler,
|
|
182
290
|
PluginDataOperation,
|
|
291
|
+
PluginDataParseError,
|
|
183
292
|
PluginDataSizeLimitExceededError
|
|
184
293
|
};
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLWhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICpcbiAqIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0gYm91bmRzIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCBpbiBieXRlcywgaW4gYm90aCBkaXJlY3Rpb25zLCBiZWNhdXNlIE9ic2lkaWFuIGRvZXNcbiAqIG5vdC4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOiBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyB0aGUgd2hvbGUgZmlsZSBhbmQgYEpTT04ucGFyc2VgcyBpdCB3aXRoIG5vIGxpbWl0LCBzbyBhblxuICogb3ZlcnNpemVkIGZpbGUgaXMgZnVsbHkgcmVhZCBhbmQgcGFyc2VkIGludG8gbWVtb3J5IG9uIGV2ZXJ5IHN0YXJ0dXAsIGFuZCBgUGx1Z2luLnNhdmVEYXRhYCB3cml0ZXNcbiAqIGBKU09OLnN0cmluZ2lmeShkYXRhLCB1bmRlZmluZWQsIDIpYCB3aXRoIG5vIGxpbWl0IGVpdGhlci4gT2JzaWRpYW4gYWxzbyBzd2FsbG93cyBhIGZhaWxlZCByZWFkIG9yIHdyaXRlOiBpdHNcbiAqIGByZWFkSnNvbmAgbG9ncyBhIHBhcnNlIGZhaWx1cmUgYW5kIHJlc29sdmVzIGB1bmRlZmluZWRgLCBhbmQgaXRzIGB3cml0ZUpzb25gIGNhdGNoZXMgZXZlcnkgZXJyb3IuIFNvIHRoZSBndWFyZFxuICogaGFzIHRvIGRlY2lkZSBCRUZPUkUgaGFuZGluZyB0aGUgY2FsbCB0byBPYnNpZGlhbiwgd2hpY2ggaXMgdGhlIG9ubHkgcG9pbnQgd2hlcmUgcmVmdXNpbmcgc3RpbGwgY2hhbmdlcyB0aGVcbiAqIG91dGNvbWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogVGhlIGluZGVudGF0aW9uIE9ic2lkaWFuJ3MgYFZhdWx0LndyaXRlSnNvbmAgcGFzc2VzIHRvIGBKU09OLnN0cmluZ2lmeWAgZm9yIGBkYXRhLmpzb25gIChyZWFkIGZyb20gYDEuMTUuMWApLlxuICovXG5jb25zdCBPQlNJRElBTl9KU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgbWF4aW11bSBzaXplIG9mIGEgcGx1Z2luJ3MgYGRhdGEuanNvbmAsIGluIGJ5dGVzOiAxNiBNaUIuXG4gKlxuICogVGhpcyBpcyBhIHByb3RlY3RpdmUgYnVkZ2V0IGFnYWluc3Qgc3RhcnR1cCBleGhhdXN0aW9uLCBub3QgYSBzeW5jIHF1b3RhLiBPYnNpZGlhbiBTeW5jJ3Mgb3duIHBlci1maWxlIGxpbWl0XG4gKiBkZXBlbmRzIG9uIHRoZSBwbGFuIGFuZCBpcyBhIHNlcGFyYXRlIGNvbnN0cmFpbnQgYSBwbHVnaW4gbWF5IHdhbnQgdG8gc3RheSB3ZWxsIHVuZGVyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFUyA9IDE2Xzc3N18yMTY7XG5cbi8qKlxuICogVGhlIG9wZXJhdGlvbiBhIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0gcmVmdXNlZC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luRGF0YU9wZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMb2FkaW5nIHRoZSBleGlzdGluZyBgZGF0YS5qc29uYC5cbiAgICovXG4gIExvYWQgPSAnbG9hZCcsXG5cbiAgLyoqXG4gICAqIFNhdmluZyBhIG5ldyBgZGF0YS5qc29uYC5cbiAgICovXG4gIFNhdmUgPSAnc2F2ZSdcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIGxvYWRpbmcgYW5kIHNhdmluZyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byBsb2FkIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBsb2FkRGF0YTogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byBzYXZlIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2F2ZURhdGE6IChkYXRhOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YUhhbmRsZXJDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBgZGF0YS5qc29uYCwgaW4gVVRGLTggYnl0ZXMgYXMgd3JpdHRlbiB0byBkaXNrLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFU30uIFBhc3MgYEluZmluaXR5YCB0byBkaXNhYmxlIHRoZSBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemVJbkJ5dGVzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmdXNlZCBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IFBsdWdpbkRhdGFPcGVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIGZpbGUgKGxvYWQpIG9yIG9mIHRoZSBzZXJpYWxpemVkIGRhdGEgKHNhdmUpLCBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLCByZWZ1c2luZyBhIGBkYXRhLmpzb25gIGxhcmdlciB0aGFuIGEgYnl0ZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkRhdGFIYW5kbGVyIGltcGxlbWVudHMgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBgZGF0YS5qc29uYCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gZGF0YSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM6IFBsdWdpbkRhdGFIYW5kbGVyQ29uc3RydWN0b3JPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhTaXplSW5CeXRlcyA9IG9wdGlvbnMubWF4U2l6ZUluQnl0ZXMgPz8gREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFUztcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG1heFNpemVJbkJ5dGVzKSB8fCBtYXhTaXplSW5CeXRlcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhTaXplSW5CeXRlcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKG1heFNpemVJbkJ5dGVzKX0uYCk7XG4gICAgfVxuICAgIHRoaXMubWF4U2l6ZUluQnl0ZXMgPSBtYXhTaXplSW5CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBkYXRhIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogVGhlIGZpbGUncyBzaXplIGlzIHJlYWQgdGhyb3VnaCB0aGUgYWRhcHRlciBCRUZPUkUgT2JzaWRpYW4gcmVhZHMgYW5kIHBhcnNlcyBpdCwgc28gYW4gb3ZlcnNpemVkIGZpbGUgaXMgbmV2ZXJcbiAgICogbG9hZGVkIGludG8gbWVtb3J5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2l6ZUluQnl0ZXMgPSBhd2FpdCB0aGlzLmdldEV4aXN0aW5nRmlsZVNpemUoKTtcbiAgICBpZiAoc2l6ZUluQnl0ZXMgIT09IG51bGwgJiYgc2l6ZUluQnl0ZXMgPiB0aGlzLm1heFNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKFBsdWdpbkRhdGFPcGVyYXRpb24uTG9hZCwgc2l6ZUluQnl0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ubG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIFRoZSBkYXRhIGlzIHNlcmlhbGl6ZWQgZXhhY3RseSBhcyBPYnNpZGlhbiB3cml0ZXMgaXQsIGFuZCBpdHMgVVRGLTggYnl0ZSBsZW5ndGggaXMgY2hlY2tlZCBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICogd3JpdHRlbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYXZlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIGlzIHNhdmVkLlxuICAgKiBAdGhyb3dzIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0gSWYgdGhlIHNlcmlhbGl6ZWQgZGF0YSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZURhdGEoZGF0YTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzICE9PSBJbmZpbml0eSkge1xuICAgICAgLy8gT2JzaWRpYW4ncyBgd3JpdGVKc29uYCB3b3VsZCBzd2FsbG93IGEgc2VyaWFsaXphdGlvbiBmYWlsdXJlIGFuZCB3cml0ZSBub3RoaW5nOyB0aHJvd2luZyBoZXJlIGluc3RlYWQga2VlcHNcbiAgICAgIC8vIHRoZSBkaXNrIHVuY2hhbmdlZCB0b28sIGFuZCB0ZWxscyB0aGUgY2FsbGVyLlxuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIHVuZGVmaW5lZCwgT0JTSURJQU5fSlNPTl9JTkRFTlQpO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzaXplSW5CeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzZXJpYWxpemVkKS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAoc2l6ZUluQnl0ZXMgPiB0aGlzLm1heFNpemVJbkJ5dGVzKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihQbHVnaW5EYXRhT3BlcmF0aW9uLlNhdmUsIHNpemVJbkJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgYXMgT2JzaWRpYW4ncyBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyBpdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBhdGgsIG9yIGBudWxsYCB3aGVuIHRoZSBtYW5pZmVzdCBoYXMgbm8gZm9sZGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERhdGFGaWxlUGF0aCgpOiBudWxsIHwgc3RyaW5nIHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLnBsdWdpbi5tYW5pZmVzdC5kaXI7XG4gICAgcmV0dXJuIGRpcmVjdG9yeSA/IG5vcm1hbGl6ZVBhdGgoYCR7ZGlyZWN0b3J5fS9kYXRhLmpzb25gKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yKG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbiwgc2l6ZUluQnl0ZXM6IG51bWJlcik6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yKHtcbiAgICAgIG1heFNpemVJbkJ5dGVzOiB0aGlzLm1heFNpemVJbkJ5dGVzLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgcGF0aDogdGhpcy5nZXREYXRhRmlsZVBhdGgoKSA/PyAnZGF0YS5qc29uJyxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBzaXplSW5CeXRlc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeGlzdGluZ0ZpbGVTaXplKCk6IFByb21pc2U8bnVsbCB8IG51bWJlcj4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldERhdGFGaWxlUGF0aCgpO1xuICAgIGlmIChwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXQ/LnNpemUgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzaXplIGlzIHVua25vd24sIG5vdCBvdmVyc2l6ZWQ6IE9ic2lkaWFuJ3Mgb3duIHJlYWQgZGVjaWRlcyB3aGF0IGhhcHBlbnMgbmV4dCwgYXMgYmVmb3JlIHRoaXMgZ3VhcmQuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGlzLCBvciB3b3VsZCBiZWNvbWUsIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0LlxuICpcbiAqIFRoZSBmaWxlIG9uIGRpc2sgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duOiBhbiBvdmVyc2l6ZWQgZXhpc3RpbmcgZmlsZSBpcyBsZWZ0IGludGFjdCBmb3IgdGhlIHVzZXIgdG9cbiAqIGluc3BlY3Qgb3IgdHJpbSwgYW5kIGFuIG92ZXJzaXplZCBzYXZlIGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSBsYXN0IGdvb2QgZmlsZSByZW1haW5zLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlZnVzZWQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZXhpc3RpbmcgZmlsZSAobG9hZCkgb3Igb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSAoc2F2ZSksIGluIGJ5dGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB3aGF0ID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/IGBSZWZ1c2luZyB0byBsb2FkIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGZpbGUgaXMgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgXG4gICAgICA6IGBSZWZ1c2luZyB0byBzYXZlIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGRhdGEgd291bGQgYmUgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgO1xuICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/ICdUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuJ1xuICAgICAgOiAnTm90aGluZyB3YXMgd3JpdHRlbiwgc28gdGhlIGxhc3Qgc2F2ZWQgZmlsZSByZW1haW5zLic7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogJHt3aGF0fSwgb3ZlciB0aGUgJHtTdHJpbmcocGFyYW1zLm1heFNpemVJbkJ5dGVzKX0tYnl0ZSBsaW1pdC4gJHtjb25zZXF1ZW5jZX0gYFxuICAgICAgICArICdLZWVwIGRhdGEuanNvbiBmb3Igc21hbGwgc2V0dGluZ3MsIGFuZCBtb3ZlIGxhcmdlIG9yIGdyb3dpbmcgc3RhdGUgdG8gTG9jYWxEYXRhU3RvcmUgb3IgU2hhcmVkRGF0YVN0b3JlLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcic7XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IHBhcmFtcy5tYXhTaXplSW5CeXRlcztcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHBhcmFtcy5vcGVyYXRpb247XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnNpemVJbkJ5dGVzID0gcGFyYW1zLnNpemVJbkJ5dGVzO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLFNBQVMscUJBQXFCO0FBSzlCLE1BQU0sdUJBQXVCO0FBUXRCLE1BQU0sd0NBQXdDO0FBSzlDLElBQUssc0JBQUwsa0JBQUtBLHlCQUFMO0FBSUwsRUFBQUEscUJBQUEsVUFBTztBQUtQLEVBQUFBLHFCQUFBLFVBQU87QUFURyxTQUFBQTtBQUFBLEdBQUE7QUFnRkwsTUFBTSxrQkFBeUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVk3QyxZQUErQixRQUFnQixVQUErQyxDQUFDLEdBQUc7QUFBbkU7QUFDcEMsVUFBTSxpQkFBaUIsUUFBUSxrQkFBa0I7QUFDakQsUUFBSSxPQUFPLE1BQU0sY0FBYyxLQUFLLGlCQUFpQixHQUFHO0FBQ3RELFlBQU0sSUFBSSxXQUFXLHFEQUFxRCxPQUFPLGNBQWMsQ0FBQyxHQUFHO0FBQUEsSUFDckc7QUFDQSxTQUFLLGlCQUFpQjtBQUFBLEVBQ3hCO0FBQUEsRUFOc0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVJuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBeUJuQixNQUFhLFdBQTZCO0FB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
|
|
294
|
+
//# 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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
|
|
@@ -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
|
}
|
|
@@ -77,25 +77,7 @@ class DataStoreLocations {
|
|
|
77
77
|
this.validateLocation(value.to);
|
|
78
78
|
transitions.push(value);
|
|
79
79
|
}
|
|
80
|
-
const locations =
|
|
81
|
-
let currentIdentity = identity(this.initial);
|
|
82
|
-
while (transitions.length > 0) {
|
|
83
|
-
const sourceIdentity = currentIdentity;
|
|
84
|
-
const next = transitions.filter((transition) => identity(transition.from) === sourceIdentity);
|
|
85
|
-
const targets = new Set(next.map((transition) => identity(transition.to)));
|
|
86
|
-
if (targets.size !== 1) {
|
|
87
|
-
throw new Error("Conflicting or incomplete data-store relocation chain");
|
|
88
|
-
}
|
|
89
|
-
const target = ensureNonNullable(next[0]);
|
|
90
|
-
if (locations.some((location) => identity(location) === identity(target.to)) || locations.length >= MAX_LOCATIONS) {
|
|
91
|
-
throw new Error("Data-store relocation loop or location limit");
|
|
92
|
-
}
|
|
93
|
-
locations.push(target.to);
|
|
94
|
-
currentIdentity = identity(target.to);
|
|
95
|
-
for (const transition of next) {
|
|
96
|
-
transitions.splice(transitions.indexOf(transition), 1);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
80
|
+
const locations = this.buildChain(await this.resolveMovedAnchor(transitions));
|
|
99
81
|
for (const location of locations) {
|
|
100
82
|
this.validateLocation(location, locations);
|
|
101
83
|
}
|
|
@@ -128,13 +110,73 @@ class DataStoreLocations {
|
|
|
128
110
|
if (this.locations.some((previous) => identity(previous) === identity(location)) || this.locations.length >= MAX_LOCATIONS) {
|
|
129
111
|
throw new Error("Data-store relocation loop or location limit");
|
|
130
112
|
}
|
|
131
|
-
const value = { format: 1, from, to: location };
|
|
113
|
+
const value = { anchor: this.initial, format: 1, from, to: location };
|
|
132
114
|
await this.anchor.write(`${this.anchor.root}/locations-v1/${window.crypto.randomUUID()}.json`, value);
|
|
133
115
|
await this.refresh();
|
|
134
116
|
}
|
|
117
|
+
buildChain(transitions) {
|
|
118
|
+
const remaining = [...transitions];
|
|
119
|
+
const locations = [this.initial];
|
|
120
|
+
let currentIdentity = identity(this.initial);
|
|
121
|
+
while (remaining.length > 0) {
|
|
122
|
+
const sourceIdentity = currentIdentity;
|
|
123
|
+
const next = remaining.filter((transition) => identity(transition.from) === sourceIdentity);
|
|
124
|
+
const targets = new Set(next.map((transition) => identity(transition.to)));
|
|
125
|
+
if (targets.size !== 1) {
|
|
126
|
+
throw new Error("Conflicting or incomplete data-store relocation chain");
|
|
127
|
+
}
|
|
128
|
+
const target = ensureNonNullable(next[0]);
|
|
129
|
+
if (locations.some((location) => identity(location) === identity(target.to)) || locations.length >= MAX_LOCATIONS) {
|
|
130
|
+
throw new Error("Data-store relocation loop or location limit");
|
|
131
|
+
}
|
|
132
|
+
locations.push(target.to);
|
|
133
|
+
currentIdentity = identity(target.to);
|
|
134
|
+
for (const transition of next) {
|
|
135
|
+
remaining.splice(remaining.indexOf(transition), 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return locations;
|
|
139
|
+
}
|
|
135
140
|
createTransport(location) {
|
|
136
141
|
return new DataStoreTransport({ ...this.params, folder: location.folder, format: location.format ?? "markdown" });
|
|
137
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Maps the records of an anchor folder that was moved (or sits under a moved folder) onto the folder the store is open
|
|
145
|
+
* at, because records name absolute folders.
|
|
146
|
+
*
|
|
147
|
+
* A transition that names its `anchor` is remapped from that folder exactly, so several successive moves resolve too.
|
|
148
|
+
* A transition written before that field existed names no anchor, and a moved anchor then looks the same as a chain whose
|
|
149
|
+
* first record has not arrived yet. So the former folder is inferred only when nothing starts at the initial identity,
|
|
150
|
+
* exactly one candidate folder (one the legacy records start from, in the initial format) yields a complete chain, and
|
|
151
|
+
* that folder no longer holds this store. Anything else is left for `buildChain` to reject.
|
|
152
|
+
*
|
|
153
|
+
* @param transitions - The transitions recorded at the anchor.
|
|
154
|
+
* @returns The transitions to build the chain from.
|
|
155
|
+
*/
|
|
156
|
+
async resolveMovedAnchor(transitions) {
|
|
157
|
+
const anchored = transitions.map((transition) => transition.anchor ? remapTransition(transition, transition.anchor.folder, this.initial.folder) : transition);
|
|
158
|
+
const initialIdentity = identity(this.initial);
|
|
159
|
+
if (anchored.some((transition) => identity(transition.from) === initialIdentity)) {
|
|
160
|
+
return anchored;
|
|
161
|
+
}
|
|
162
|
+
const candidates = new Set(anchored.filter((transition) => !transition.anchor).map((transition) => transition.from.folder));
|
|
163
|
+
const resolved = [];
|
|
164
|
+
for (const formerFolder of candidates) {
|
|
165
|
+
const remapped = anchored.map((transition) => transition.anchor ? transition : remapTransition(transition, formerFolder, this.initial.folder));
|
|
166
|
+
try {
|
|
167
|
+
this.buildChain(remapped);
|
|
168
|
+
} catch {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
resolved.push({ formerFolder, transitions: remapped });
|
|
172
|
+
}
|
|
173
|
+
const match = resolved.length === 1 ? ensureNonNullable(resolved[0]) : null;
|
|
174
|
+
if (!match) {
|
|
175
|
+
return anchored;
|
|
176
|
+
}
|
|
177
|
+
const formerFiles = await this.createTransport({ ...this.initial, folder: match.formerFolder }).list();
|
|
178
|
+
return formerFiles.length > 0 ? anchored : match.transitions;
|
|
179
|
+
}
|
|
138
180
|
validateLocation(location, locations = this.locations) {
|
|
139
181
|
const transport = this.createTransport(location);
|
|
140
182
|
for (const previous of locations) {
|
|
@@ -152,9 +194,25 @@ function isLocation(value) {
|
|
|
152
194
|
return typeof value === "object" && value !== null && "folder" in value && typeof value.folder === "string" && (!("format" in value) || value.format === "json" || value.format === "markdown");
|
|
153
195
|
}
|
|
154
196
|
function isTransition(value) {
|
|
155
|
-
return typeof value === "object" && value !== null && "format" in value && value.format === 1 && "from" in value && isLocation(value.from) && "to" in value && isLocation(value.to);
|
|
197
|
+
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));
|
|
198
|
+
}
|
|
199
|
+
function remapLocation(location, formerFolder, folder) {
|
|
200
|
+
if (location.folder === formerFolder) {
|
|
201
|
+
return { ...location, folder };
|
|
202
|
+
}
|
|
203
|
+
if (location.folder.startsWith(`${formerFolder}/`)) {
|
|
204
|
+
return { ...location, folder: `${folder}${location.folder.slice(formerFolder.length)}` };
|
|
205
|
+
}
|
|
206
|
+
return location;
|
|
207
|
+
}
|
|
208
|
+
function remapTransition(transition, formerFolder, folder) {
|
|
209
|
+
return {
|
|
210
|
+
...transition,
|
|
211
|
+
from: remapLocation(transition.from, formerFolder, folder),
|
|
212
|
+
to: remapLocation(transition.to, formerFolder, folder)
|
|
213
|
+
};
|
|
156
214
|
}
|
|
157
215
|
export {
|
|
158
216
|
DataStoreLocations
|
|
159
217
|
};
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqIEFwcGVuZC1vbmx5LCBhbmNob3JlZCBkaXNjb3Zlcnkgb2YgaGlzdG9yeS1wcmVzZXJ2aW5nIHRyYW5zcG9ydCB0cmFuc2l0aW9ucy5cbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuaW1wb3J0IHsgRGF0YVN0b3JlVHJhbnNwb3J0IH0gZnJvbSAnLi9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyc7XG5cbmNvbnN0IE1BWF9MT0NBVElPTlMgPSAzMjtcblxuLyoqXG5BIHRyYW5zcG9ydCBkZXN0aW5hdGlvbi4gS2VlcCB0aGUgb3JpZ2luYWwgb3BlbiBwYXJhbWV0ZXJzIGFzIHRoZSBkaXNjb3ZlcnkgYW5jaG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZUxvY2F0aW9uIHtcbiAgLyoqXG4gIFZhdWx0LXJlbGF0aXZlIHBhcmVudCBvZiB0aGUgcGx1Z2luL3N0b3JlIHN1YnRyZWUuXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIE5ldyBkb2N1bWVudCBlbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xufVxuXG5pbnRlcmZhY2UgVHJhbnNpdGlvbiB7XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkgZnJvbTogRGF0YVN0b3JlTG9jYXRpb247XG4gIHJlYWRvbmx5IHRvOiBEYXRhU3RvcmVMb2NhdGlvbjtcbn1cblxuLyoqXG5BbmNob3JlZCByZWxvY2F0aW9uIGNvb3JkaW5hdG9yOyBzb3VyY2UgaGlzdG9yaWVzIGFyZSBuZXZlciByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlTG9jYXRpb25zIHtcbiAgLyoqXG4gIEFsbCByZWFkZXJzLCBvbGRlc3QgZmlyc3Q7IHRoZSBsYXN0IHRyYW5zcG9ydCBpcyB0aGUgYWN0aXZlIHdyaXRlci5cbiAgICpcbiAgICogQHJldHVybnMgQWxsIHJldGFpbmVkIHJlYWRlciB0cmFuc3BvcnRzIGluIHRyYW5zaXRpb24gb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydHMoKTogRGF0YVN0b3JlVHJhbnNwb3J0W10ge1xuICAgIHJldHVybiB0aGlzLmxvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiB0aGlzLmNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbikpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhbmNob3I6IERhdGFTdG9yZVRyYW5zcG9ydDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsOiBEYXRhU3RvcmVMb2NhdGlvbjtcblxuICBwcml2YXRlIGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25bXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvb3JkaW5hdG9yIHdpdGhvdXQgYWRhcHRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcm1hbmVudCBkaXNjb3ZlcnkgYW5jaG9yIGFuZCBzdG9yZSBpZGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFuY2hvciA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQocGFyYW1zKTtcbiAgICB0aGlzLmluaXRpYWwgPSB7IGZvbGRlcjogcGFyYW1zLmZvbGRlciA/PyAnUGx1Z2luIGRhdGEnLCBmb3JtYXQ6IHBhcmFtcy5mb3JtYXQgPz8gJ21hcmtkb3duJyB9O1xuICAgIHRoaXMubG9jYXRpb25zID0gW3RoaXMuaW5pdGlhbF07XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGFuZCBmaW5pc2hlcyBwZW5kaW5nIGNvcGllcyBiZWZvcmUgYWxsb3dpbmcgYSB3cml0ZXIgdG8gc3dpdGNoIGRlc3RpbmF0aW9ucy5cbiAgICogQ29uZmxpY3RpbmcgYnJhbmNoZXMgYW5kIHJlb3JkZXJlZCBpbmNvbXBsZXRlIGNoYWlucyBmYWlsIGNsb3NlZCB1bnRpbCBkZWxpdmVyeSBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgZGlzY292ZXJ5IGFuZCB2ZXJpZmljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc2l0aW9uczogVHJhbnNpdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGF3YWl0IHRoaXMuYW5jaG9yLmxpc3QoKSkge1xuICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5hbmNob3Iucm9vdH0vbG9jYXRpb25zLXYxL2ApIHx8ICFwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmFuY2hvci5yZWFkKHBhdGgpO1xuICAgICAgaWYgKCFpc1RyYW5zaXRpb24odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb21wbGV0ZSBvciBpbnZhbGlkIGRhdGEtc3RvcmUgdHJhbnNpdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLmZyb20pO1xuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLnRvKTtcbiAgICAgIHRyYW5zaXRpb25zLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbnMgPSBbdGhpcy5pbml0aWFsXTtcbiAgICBsZXQgY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHkodGhpcy5pbml0aWFsKTtcbiAgICB3aGlsZSAodHJhbnNpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc291cmNlSWRlbnRpdHkgPSBjdXJyZW50SWRlbnRpdHk7XG4gICAgICBjb25zdCBuZXh0ID0gdHJhbnNpdGlvbnMuZmlsdGVyKCh0cmFuc2l0aW9uKSA9PiBpZGVudGl0eSh0cmFuc2l0aW9uLmZyb20pID09PSBzb3VyY2VJZGVudGl0eSk7XG4gICAgICBjb25zdCB0YXJnZXRzID0gbmV3IFNldChuZXh0Lm1hcCgodHJhbnNpdGlvbikgPT4gaWRlbnRpdHkodHJhbnNpdGlvbi50bykpKTtcbiAgICAgIGlmICh0YXJnZXRzLnNpemUgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBvciBpbmNvbXBsZXRlIGRhdGEtc3RvcmUgcmVsb2NhdGlvbiBjaGFpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUobmV4dFswXSk7XG4gICAgICBpZiAobG9jYXRpb25zLnNvbWUoKGxvY2F0aW9uKSA9PiBpZGVudGl0eShsb2NhdGlvbikgPT09IGlkZW50aXR5KHRhcmdldC50bykpIHx8IGxvY2F0aW9ucy5sZW5ndGggPj0gTUFYX0xPQ0FUSU9OUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgcmVsb2NhdGlvbiBsb29wIG9yIGxvY2F0aW9uIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBsb2NhdGlvbnMucHVzaCh0YXJnZXQudG8pO1xuICAgICAgY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHkodGFyZ2V0LnRvKTtcbiAgICAgIGZvciAoY29uc3QgdHJhbnNpdGlvbiBvZiBuZXh0KSB7XG4gICAgICAgIHRyYW5zaXRpb25zLnNwbGljZSh0cmFuc2l0aW9ucy5pbmRleE9mKHRyYW5zaXRpb24pLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgdGhlIGVudGlyZSBjaGFpbiBiZWZvcmUgbWFraW5nIGFueSBjb3BpZXMgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uLCBsb2NhdGlvbnMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobG9jYXRpb24pO1xuICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgbG9jYXRpb25zLnNsaWNlKDAsIGxvY2F0aW9ucy5pbmRleE9mKGxvY2F0aW9uKSkpIHtcbiAgICAgICAgY29uc3QgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQoc291cmNlKTtcbiAgICAgICAgaWYgKHRyYW5zcG9ydC5yb290ICE9PSB0YXJnZXQucm9vdCkge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC5jb3B5SGlzdG9yeVRvKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2NhdGlvbnMgPSBsb2NhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQW5ub3VuY2VzIGEgdHJhbnNpdGlvbiBkdXJhYmx5IGF0IHRoZSBhbmNob3IsIHRoZW4gY29waWVzIGFuZCB2ZXJpZmllcyBiZWZvcmUgYWN0aXZhdGlvbi5cbiAgICogUmV0cnlpbmcgdGhlIHNhbWUgZGVzdGluYXRpb24gZmluaXNoZXMgYW4gaW50ZXJydXB0ZWQgY29weS5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gUmVxdWVzdGVkIGRlc3RpbmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXcgd3JpdGVyIGlzIHJlYWR5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbG9jYXRlKGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICBjb25zdCBmcm9tID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5sb2NhdGlvbnMuYXQoLTEpKTtcbiAgICBpZiAoaWRlbnRpdHkoZnJvbSkgPT09IGlkZW50aXR5KGxvY2F0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2NhdGlvbnMuc29tZSgocHJldmlvdXMpID0+IGlkZW50aXR5KHByZXZpb3VzKSA9PT0gaWRlbnRpdHkobG9jYXRpb24pKSB8fCB0aGlzLmxvY2F0aW9ucy5sZW5ndGggPj0gTUFYX0xPQ0FUSU9OUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHJlbG9jYXRpb24gbG9vcCBvciBsb2NhdGlvbiBsaW1pdCcpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZTogVHJhbnNpdGlvbiA9IHsgZm9ybWF0OiAxLCBmcm9tLCB0bzogbG9jYXRpb24gfTtcbiAgICBhd2FpdCB0aGlzLmFuY2hvci53cml0ZShgJHt0aGlzLmFuY2hvci5yb290fS9sb2NhdGlvbnMtdjEvJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0uanNvbmAsIHZhbHVlKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVHJhbnNwb3J0KGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbik6IERhdGFTdG9yZVRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiBsb2NhdGlvbi5mb2xkZXIsIGZvcm1hdDogbG9jYXRpb24uZm9ybWF0ID8/ICdtYXJrZG93bicgfSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlTG9jYXRpb24obG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uLCBsb2NhdGlvbnM6IHJlYWRvbmx5IERhdGFTdG9yZUxvY2F0aW9uW10gPSB0aGlzLmxvY2F0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRoaXMuY3JlYXRlVHJhbnNwb3J0KGxvY2F0aW9uKTtcbiAgICBmb3IgKGNvbnN0IHByZXZpb3VzIG9mIGxvY2F0aW9ucykge1xuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuY3JlYXRlVHJhbnNwb3J0KHByZXZpb3VzKS5yb290O1xuICAgICAgaWYgKHRyYW5zcG9ydC5yb290ICE9PSByb290ICYmICh0cmFuc3BvcnQucm9vdC5zdGFydHNXaXRoKGAke3Jvb3R9L2ApIHx8IHJvb3Quc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vYCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZGF0YS1zdG9yZSByZWxvY2F0aW9uIHJvb3RzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIGVzbGludC1lbmFibGUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZXNlIGFyZSBPYnNpZGlhbiByZW5kZXJlciBXZWIgQVBJcywgbm90IE5vZGUgYnVpbHRpbnMuICovXG5cbmZ1bmN0aW9uIGlkZW50aXR5KGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtsb2NhdGlvbi5mb2xkZXJ9OiR7bG9jYXRpb24uZm9ybWF0ID8/ICdtYXJrZG93bid9YDtcbn1cblxuZnVuY3Rpb24gaXNMb2NhdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGFTdG9yZUxvY2F0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2ZvbGRlcicgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmZvbGRlciA9PT0gJ3N0cmluZydcbiAgICAmJiAoISgnZm9ybWF0JyBpbiB2YWx1ZSkgfHwgdmFsdWUuZm9ybWF0ID09PSAnanNvbicgfHwgdmFsdWUuZm9ybWF0ID09PSAnbWFya2Rvd24nKTtcbn1cblxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVHJhbnNpdGlvbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdmb3JtYXQnIGluIHZhbHVlICYmIHZhbHVlLmZvcm1hdCA9PT0gMVxuICAgICYmICdmcm9tJyBpbiB2YWx1ZSAmJiBpc0xvY2F0aW9uKHZhbHVlLmZyb20pICYmICd0bycgaW4gdmFsdWUgJiYgaXNMb2NhdGlvbih2YWx1ZS50byk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsU0FBUyx5QkFBeUI7QUFJbEMsU0FBUywwQkFBMEI7QUFFbkMsTUFBTSxnQkFBZ0I7QUEyQmYsTUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFvQnZCLFlBQTZCLFFBQTZDO0FBQTdDO0FBQ2xDLFNBQUssU0FBUyxJQUFJLG1CQUFtQixNQUFNO0FBQzNDLFNBQUssVUFBVSxFQUFFLFFBQVEsT0FBTyxVQUFVLGVBQWUsUUFBUSxPQUFPLFVBQVUsV0FBVztBQUM3RixTQUFLLFlBQVksQ0FBQyxLQUFLLE9BQU87QUFB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
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBBcHBlbmQtb25seSwgYW5jaG9yZWQgZGlzY292ZXJ5IG9mIGhpc3RvcnktcHJlc2VydmluZyB0cmFuc3BvcnQgdHJhbnNpdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZVRyYW5zcG9ydENvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyc7XG5cbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBNQVhfTE9DQVRJT05TID0gMzI7XG5cbi8qKlxuQSB0cmFuc3BvcnQgZGVzdGluYXRpb24uIEtlZXAgdGhlIG9yaWdpbmFsIG9wZW4gcGFyYW1ldGVycyBhcyB0aGUgZGlzY292ZXJ5IGFuY2hvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVMb2NhdGlvbiB7XG4gIC8qKlxuICBWYXVsdC1yZWxhdGl2ZSBwYXJlbnQgb2YgdGhlIHBsdWdpbi9zdG9yZSBzdWJ0cmVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOZXcgZG9jdW1lbnQgZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbWFya2Rvd24nYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0PzogJ2pzb24nIHwgJ21hcmtkb3duJztcbn1cblxuaW50ZXJmYWNlIEluZmVycmVkQ2hhaW4ge1xuICByZWFkb25seSBmb3JtZXJGb2xkZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgdHJhbnNpdGlvbnM6IHJlYWRvbmx5IFRyYW5zaXRpb25bXTtcbn1cblxuaW50ZXJmYWNlIFRyYW5zaXRpb24ge1xuICAvKipcbiAgICogVGhlIGFuY2hvciB0aGUgdHJhbnNpdGlvbiB3YXMgd3JpdHRlbiBhdC4gQWJzZW50IGZyb20gdHJhbnNpdGlvbnMgd3JpdHRlbiBiZWZvcmUgaXQgd2FzIGFkZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yPzogRGF0YVN0b3JlTG9jYXRpb247XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkgZnJvbTogRGF0YVN0b3JlTG9jYXRpb247XG4gIHJlYWRvbmx5IHRvOiBEYXRhU3RvcmVMb2NhdGlvbjtcbn1cblxuLyoqXG5BbmNob3JlZCByZWxvY2F0aW9uIGNvb3JkaW5hdG9yOyBzb3VyY2UgaGlzdG9yaWVzIGFyZSBuZXZlciByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlTG9jYXRpb25zIHtcbiAgLyoqXG4gIEFsbCByZWFkZXJzLCBvbGRlc3QgZmlyc3Q7IHRoZSBsYXN0IHRyYW5zcG9ydCBpcyB0aGUgYWN0aXZlIHdyaXRlci5cbiAgICpcbiAgICogQHJldHVybnMgQWxsIHJldGFpbmVkIHJlYWRlciB0cmFuc3BvcnRzIGluIHRyYW5zaXRpb24gb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydHMoKTogRGF0YVN0b3JlVHJhbnNwb3J0W10ge1xuICAgIHJldHVybiB0aGlzLmxvY2F0aW9ucy5tYXAoKGxvY2F0aW9uKSA9PiB0aGlzLmNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbikpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhbmNob3I6IERhdGFTdG9yZVRyYW5zcG9ydDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsOiBEYXRhU3RvcmVMb2NhdGlvbjtcblxuICBwcml2YXRlIGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25bXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvb3JkaW5hdG9yIHdpdGhvdXQgYWRhcHRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcm1hbmVudCBkaXNjb3ZlcnkgYW5jaG9yIGFuZCBzdG9yZSBpZGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFuY2hvciA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQocGFyYW1zKTtcbiAgICB0aGlzLmluaXRpYWwgPSB7IGZvbGRlcjogcGFyYW1zLmZvbGRlciA/PyAnUGx1Z2luIGRhdGEnLCBmb3JtYXQ6IHBhcmFtcy5mb3JtYXQgPz8gJ21hcmtkb3duJyB9O1xuICAgIHRoaXMubG9jYXRpb25zID0gW3RoaXMuaW5pdGlhbF07XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGFuZCBmaW5pc2hlcyBwZW5kaW5nIGNvcGllcyBiZWZvcmUgYWxsb3dpbmcgYSB3cml0ZXIgdG8gc3dpdGNoIGRlc3RpbmF0aW9ucy5cbiAgICogQ29uZmxpY3RpbmcgYnJhbmNoZXMgYW5kIHJlb3JkZXJlZCBpbmNvbXBsZXRlIGNoYWlucyBmYWlsIGNsb3NlZCB1bnRpbCBkZWxpdmVyeSBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgZGlzY292ZXJ5IGFuZCB2ZXJpZmljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc2l0aW9uczogVHJhbnNpdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGF3YWl0IHRoaXMuYW5jaG9yLmxpc3QoKSkge1xuICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5hbmNob3Iucm9vdH0vbG9jYXRpb25zLXYxL2ApIHx8ICFwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmFuY2hvci5yZWFkKHBhdGgpO1xuICAgICAgaWYgKCFpc1RyYW5zaXRpb24odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb21wbGV0ZSBvciBpbnZhbGlkIGRhdGEtc3RvcmUgdHJhbnNpdGlvbicpO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLmZyb20pO1xuICAgICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHZhbHVlLnRvKTtcbiAgICAgIHRyYW5zaXRpb25zLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBsb2NhdGlvbnMgPSB0aGlzLmJ1aWxkQ2hhaW4oYXdhaXQgdGhpcy5yZXNvbHZlTW92ZWRBbmNob3IodHJhbnNpdGlvbnMpKTtcbiAgICAvLyBWYWxpZGF0ZSB0aGUgZW50aXJlIGNoYWluIGJlZm9yZSBtYWtpbmcgYW55IGNvcGllcyBvciBhY3RpdmF0aW5nIGEgd3JpdGVyLlxuICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24sIGxvY2F0aW9ucyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zLnNsaWNlKDEpKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbik7XG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBsb2NhdGlvbnMuc2xpY2UoMCwgbG9jYXRpb25zLmluZGV4T2YobG9jYXRpb24pKSkge1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydChzb3VyY2UpO1xuICAgICAgICBpZiAodHJhbnNwb3J0LnJvb3QgIT09IHRhcmdldC5yb290KSB7XG4gICAgICAgICAgYXdhaXQgdHJhbnNwb3J0LmNvcHlIaXN0b3J5VG8odGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY2F0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbm5vdW5jZXMgYSB0cmFuc2l0aW9uIGR1cmFibHkgYXQgdGhlIGFuY2hvciwgdGhlbiBjb3BpZXMgYW5kIHZlcmlmaWVzIGJlZm9yZSBhY3RpdmF0aW9uLlxuICAgKiBSZXRyeWluZyB0aGUgc2FtZSBkZXN0aW5hdGlvbiBmaW5pc2hlcyBhbiBpbnRlcnJ1cHRlZCBjb3B5LlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYXRpb24gLSBSZXF1ZXN0ZWQgZGVzdGluYXRpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5ldyB3cml0ZXIgaXMgcmVhZHkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLnZhbGlkYXRlTG9jYXRpb24obG9jYXRpb24pO1xuICAgIGNvbnN0IGZyb20gPSBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy5hdCgtMSkpO1xuICAgIGlmIChpZGVudGl0eShmcm9tKSA9PT0gaWRlbnRpdHkobG9jYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2F0aW9ucy5zb21lKChwcmV2aW91cykgPT4gaWRlbnRpdHkocHJldmlvdXMpID09PSBpZGVudGl0eShsb2NhdGlvbikpIHx8IHRoaXMubG9jYXRpb25zLmxlbmd0aCA+PSBNQVhfTE9DQVRJT05TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgcmVsb2NhdGlvbiBsb29wIG9yIGxvY2F0aW9uIGxpbWl0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlOiBUcmFuc2l0aW9uID0geyBhbmNob3I6IHRoaXMuaW5pdGlhbCwgZm9ybWF0OiAxLCBmcm9tLCB0bzogbG9jYXRpb24gfTtcbiAgICBhd2FpdCB0aGlzLmFuY2hvci53cml0ZShgJHt0aGlzLmFuY2hvci5yb290fS9sb2NhdGlvbnMtdjEvJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0uanNvbmAsIHZhbHVlKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDaGFpbih0cmFuc2l0aW9uczogcmVhZG9ubHkgVHJhbnNpdGlvbltdKTogRGF0YVN0b3JlTG9jYXRpb25bXSB7XG4gICAgY29uc3QgcmVtYWluaW5nID0gWy4uLnRyYW5zaXRpb25zXTtcbiAgICBjb25zdCBsb2NhdGlvbnMgPSBbdGhpcy5pbml0aWFsXTtcbiAgICBsZXQgY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHkodGhpcy5pbml0aWFsKTtcbiAgICB3aGlsZSAocmVtYWluaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvdXJjZUlkZW50aXR5ID0gY3VycmVudElkZW50aXR5O1xuICAgICAgY29uc3QgbmV4dCA9IHJlbWFpbmluZy5maWx0ZXIoKHRyYW5zaXRpb24pID0+IGlkZW50aXR5KHRyYW5zaXRpb24uZnJvbSkgPT09IHNvdXJjZUlkZW50aXR5KTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBuZXcgU2V0KG5leHQubWFwKCh0cmFuc2l0aW9uKSA9PiBpZGVudGl0eSh0cmFuc2l0aW9uLnRvKSkpO1xuICAgICAgaWYgKHRhcmdldHMuc2l6ZSAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIG9yIGluY29tcGxldGUgZGF0YS1zdG9yZSByZWxvY2F0aW9uIGNoYWluJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZShuZXh0WzBdKTtcbiAgICAgIGlmIChsb2NhdGlvbnMuc29tZSgobG9jYXRpb24pID0+IGlkZW50aXR5KGxvY2F0aW9uKSA9PT0gaWRlbnRpdHkodGFyZ2V0LnRvKSkgfHwgbG9jYXRpb25zLmxlbmd0aCA+PSBNQVhfTE9DQVRJT05TKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSByZWxvY2F0aW9uIGxvb3Agb3IgbG9jYXRpb24gbGltaXQnKTtcbiAgICAgIH1cbiAgICAgIGxvY2F0aW9ucy5wdXNoKHRhcmdldC50byk7XG4gICAgICBjdXJyZW50SWRlbnRpdHkgPSBpZGVudGl0eSh0YXJnZXQudG8pO1xuICAgICAgZm9yIChjb25zdCB0cmFuc2l0aW9uIG9mIG5leHQpIHtcbiAgICAgICAgcmVtYWluaW5nLnNwbGljZShyZW1haW5pbmcuaW5kZXhPZih0cmFuc2l0aW9uKSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2NhdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYW5zcG9ydChsb2NhdGlvbjogRGF0YVN0b3JlTG9jYXRpb24pOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBuZXcgRGF0YVN0b3JlVHJhbnNwb3J0KHsgLi4udGhpcy5wYXJhbXMsIGZvbGRlcjogbG9jYXRpb24uZm9sZGVyLCBmb3JtYXQ6IGxvY2F0aW9uLmZvcm1hdCA/PyAnbWFya2Rvd24nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhlIHJlY29yZHMgb2YgYW4gYW5jaG9yIGZvbGRlciB0aGF0IHdhcyBtb3ZlZCAob3Igc2l0cyB1bmRlciBhIG1vdmVkIGZvbGRlcikgb250byB0aGUgZm9sZGVyIHRoZSBzdG9yZSBpcyBvcGVuXG4gICAqIGF0LCBiZWNhdXNlIHJlY29yZHMgbmFtZSBhYnNvbHV0ZSBmb2xkZXJzLlxuICAgKlxuICAgKiBBIHRyYW5zaXRpb24gdGhhdCBuYW1lcyBpdHMgYGFuY2hvcmAgaXMgcmVtYXBwZWQgZnJvbSB0aGF0IGZvbGRlciBleGFjdGx5LCBzbyBzZXZlcmFsIHN1Y2Nlc3NpdmUgbW92ZXMgcmVzb2x2ZSB0b28uXG4gICAqIEEgdHJhbnNpdGlvbiB3cml0dGVuIGJlZm9yZSB0aGF0IGZpZWxkIGV4aXN0ZWQgbmFtZXMgbm8gYW5jaG9yLCBhbmQgYSBtb3ZlZCBhbmNob3IgdGhlbiBsb29rcyB0aGUgc2FtZSBhcyBhIGNoYWluIHdob3NlXG4gICAqIGZpcnN0IHJlY29yZCBoYXMgbm90IGFycml2ZWQgeWV0LiBTbyB0aGUgZm9ybWVyIGZvbGRlciBpcyBpbmZlcnJlZCBvbmx5IHdoZW4gbm90aGluZyBzdGFydHMgYXQgdGhlIGluaXRpYWwgaWRlbnRpdHksXG4gICAqIGV4YWN0bHkgb25lIGNhbmRpZGF0ZSBmb2xkZXIgKG9uZSB0aGUgbGVnYWN5IHJlY29yZHMgc3RhcnQgZnJvbSwgaW4gdGhlIGluaXRpYWwgZm9ybWF0KSB5aWVsZHMgYSBjb21wbGV0ZSBjaGFpbiwgYW5kXG4gICAqIHRoYXQgZm9sZGVyIG5vIGxvbmdlciBob2xkcyB0aGlzIHN0b3JlLiBBbnl0aGluZyBlbHNlIGlzIGxlZnQgZm9yIGBidWlsZENoYWluYCB0byByZWplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2l0aW9ucyAtIFRoZSB0cmFuc2l0aW9ucyByZWNvcmRlZCBhdCB0aGUgYW5jaG9yLlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNpdGlvbnMgdG8gYnVpbGQgdGhlIGNoYWluIGZyb20uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNb3ZlZEFuY2hvcih0cmFuc2l0aW9uczogcmVhZG9ubHkgVHJhbnNpdGlvbltdKTogUHJvbWlzZTxyZWFkb25seSBUcmFuc2l0aW9uW10+IHtcbiAgICBjb25zdCBhbmNob3JlZCA9IHRyYW5zaXRpb25zLm1hcCgodHJhbnNpdGlvbikgPT4gdHJhbnNpdGlvbi5hbmNob3IgPyByZW1hcFRyYW5zaXRpb24odHJhbnNpdGlvbiwgdHJhbnNpdGlvbi5hbmNob3IuZm9sZGVyLCB0aGlzLmluaXRpYWwuZm9sZGVyKSA6IHRyYW5zaXRpb24pO1xuICAgIGNvbnN0IGluaXRpYWxJZGVudGl0eSA9IGlkZW50aXR5KHRoaXMuaW5pdGlhbCk7XG4gICAgaWYgKGFuY2hvcmVkLnNvbWUoKHRyYW5zaXRpb24pID0+IGlkZW50aXR5KHRyYW5zaXRpb24uZnJvbSkgPT09IGluaXRpYWxJZGVudGl0eSkpIHtcbiAgICAgIHJldHVybiBhbmNob3JlZDtcbiAgICB9XG4gICAgLy8gQSBjYW5kaWRhdGUgdGhhdCBjYW5ub3QgcHJvZHVjZSBhIHRyYW5zaXRpb24gZnJvbSB0aGUgaW5pdGlhbCBpZGVudGl0eSBmYWlscyBgYnVpbGRDaGFpbmAgYmVsb3cuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IG5ldyBTZXQoYW5jaG9yZWQuZmlsdGVyKCh0cmFuc2l0aW9uKSA9PiAhdHJhbnNpdGlvbi5hbmNob3IpLm1hcCgodHJhbnNpdGlvbikgPT4gdHJhbnNpdGlvbi5mcm9tLmZvbGRlcikpO1xuICAgIGNvbnN0IHJlc29sdmVkOiBJbmZlcnJlZENoYWluW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZvcm1lckZvbGRlciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICBjb25zdCByZW1hcHBlZCA9IGFuY2hvcmVkLm1hcCgodHJhbnNpdGlvbikgPT4gdHJhbnNpdGlvbi5hbmNob3IgPyB0cmFuc2l0aW9uIDogcmVtYXBUcmFuc2l0aW9uKHRyYW5zaXRpb24sIGZvcm1lckZvbGRlciwgdGhpcy5pbml0aWFsLmZvbGRlcikpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5idWlsZENoYWluKHJlbWFwcGVkKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmVkLnB1c2goeyBmb3JtZXJGb2xkZXIsIHRyYW5zaXRpb25zOiByZW1hcHBlZCB9KTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSByZXNvbHZlZC5sZW5ndGggPT09IDEgPyBlbnN1cmVOb25OdWxsYWJsZShyZXNvbHZlZFswXSkgOiBudWxsO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbmNob3JlZDtcbiAgICB9XG4gICAgY29uc3QgZm9ybWVyRmlsZXMgPSBhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh7IC4uLnRoaXMuaW5pdGlhbCwgZm9sZGVyOiBtYXRjaC5mb3JtZXJGb2xkZXIgfSkubGlzdCgpO1xuICAgIHJldHVybiBmb3JtZXJGaWxlcy5sZW5ndGggPiAwID8gYW5jaG9yZWQgOiBtYXRjaC50cmFuc2l0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVMb2NhdGlvbihsb2NhdGlvbjogRGF0YVN0b3JlTG9jYXRpb24sIGxvY2F0aW9uczogcmVhZG9ubHkgRGF0YVN0b3JlTG9jYXRpb25bXSA9IHRoaXMubG9jYXRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobG9jYXRpb24pO1xuICAgIGZvciAoY29uc3QgcHJldmlvdXMgb2YgbG9jYXRpb25zKSB7XG4gICAgICBjb25zdCByb290ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQocHJldmlvdXMpLnJvb3Q7XG4gICAgICBpZiAodHJhbnNwb3J0LnJvb3QgIT09IHJvb3QgJiYgKHRyYW5zcG9ydC5yb290LnN0YXJ0c1dpdGgoYCR7cm9vdH0vYCkgfHwgcm9vdC5zdGFydHNXaXRoKGAke3RyYW5zcG9ydC5yb290fS9gKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBkYXRhLXN0b3JlIHJlbG9jYXRpb24gcm9vdHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaWRlbnRpdHkobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2F0aW9uLmZvbGRlcn06JHtsb2NhdGlvbi5mb3JtYXQgPz8gJ21hcmtkb3duJ31gO1xufVxuXG5mdW5jdGlvbiBpc0xvY2F0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0YVN0b3JlTG9jYXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnZm9sZGVyJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuZm9sZGVyID09PSAnc3RyaW5nJ1xuICAgICYmICghKCdmb3JtYXQnIGluIHZhbHVlKSB8fCB2YWx1ZS5mb3JtYXQgPT09ICdqc29uJyB8fCB2YWx1ZS5mb3JtYXQgPT09ICdtYXJrZG93bicpO1xufVxuXG5mdW5jdGlvbiBpc1RyYW5zaXRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUcmFuc2l0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2Zvcm1hdCcgaW4gdmFsdWUgJiYgdmFsdWUuZm9ybWF0ID09PSAxXG4gICAgJiYgJ2Zyb20nIGluIHZhbHVlICYmIGlzTG9jYXRpb24odmFsdWUuZnJvbSkgJiYgJ3RvJyBpbiB2YWx1ZSAmJiBpc0xvY2F0aW9uKHZhbHVlLnRvKVxuICAgICYmICghKCdhbmNob3InIGluIHZhbHVlKSB8fCBpc0xvY2F0aW9uKHZhbHVlLmFuY2hvcikpO1xufVxuXG5mdW5jdGlvbiByZW1hcExvY2F0aW9uKGxvY2F0aW9uOiBEYXRhU3RvcmVMb2NhdGlvbiwgZm9ybWVyRm9sZGVyOiBzdHJpbmcsIGZvbGRlcjogc3RyaW5nKTogRGF0YVN0b3JlTG9jYXRpb24ge1xuICBpZiAobG9jYXRpb24uZm9sZGVyID09PSBmb3JtZXJGb2xkZXIpIHtcbiAgICByZXR1cm4geyAuLi5sb2NhdGlvbiwgZm9sZGVyIH07XG4gIH1cbiAgaWYgKGxvY2F0aW9uLmZvbGRlci5zdGFydHNXaXRoKGAke2Zvcm1lckZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4geyAuLi5sb2NhdGlvbiwgZm9sZGVyOiBgJHtmb2xkZXJ9JHtsb2NhdGlvbi5mb2xkZXIuc2xpY2UoZm9ybWVyRm9sZGVyLmxlbmd0aCl9YCB9O1xuICB9XG4gIHJldHVybiBsb2NhdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtYXBUcmFuc2l0aW9uKHRyYW5zaXRpb246IFRyYW5zaXRpb24sIGZvcm1lckZvbGRlcjogc3RyaW5nLCBmb2xkZXI6IHN0cmluZyk6IFRyYW5zaXRpb24ge1xuICByZXR1cm4ge1xuICAgIC4uLnRyYW5zaXRpb24sXG4gICAgZnJvbTogcmVtYXBMb2NhdGlvbih0cmFuc2l0aW9uLmZyb20sIGZvcm1lckZvbGRlciwgZm9sZGVyKSxcbiAgICB0bzogcmVtYXBMb2NhdGlvbih0cmFuc2l0aW9uLnRvLCBmb3JtZXJGb2xkZXIsIGZvbGRlcilcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLQSxTQUFTLHlCQUF5QjtBQUlsQyxTQUFTLDBCQUEwQjtBQUVuQyxNQUFNLGdCQUFnQjtBQW9DZixNQUFNLG1CQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW9CdkIsWUFBNkIsUUFBNkM7QUFBN0M7QUFDbEMsU0FBSyxTQUFTLElBQUksbUJBQW1CLE1BQU07QUFDM0MsU0FBSyxVQUFVLEVBQUUsUUFBUSxPQUFPLFVBQVUsZUFBZSxRQUFRLE9BQU8sVUFBVSxXQUFXO0FBQzdGLFNBQUssWUFBWSxDQUFDLEtBQUssT0FBTztBQUFBLEVBQ2hDO0FBQUEsRUFKb0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFkcEMsSUFBVyxhQUFtQztBQUM1QyxXQUFPLEtBQUssVUFBVSxJQUFJLENBQUMsYUFBYSxLQUFLLGdCQUFnQixRQUFRLENBQUM7QUFBQSxFQUN4RTtBQUFBLEVBRWlCO0FBQUEsRUFDQTtBQUFBLEVBRVQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW1CUixNQUFhLFVBQXlCO0FBQ3BDLFVBQU0sY0FBNEIsQ0FBQztBQUNuQyxlQUFXLFFBQVEsTUFBTSxLQUFLLE9BQU8sS0FBSyxHQUFHO0FBQzNDLFVBQUksQ0FBQyxLQUFLLFdBQVcsR0FB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
|