@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
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
require = Object.assign(
|
|
38
|
+
(id) => requirePatched(id),
|
|
39
|
+
originalRequire,
|
|
40
|
+
{
|
|
41
|
+
__isPatched: true
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
function extractDefault($module) {
|
|
45
|
+
return $module && $module.__esModule && "default" in $module ? $module.default : $module;
|
|
46
|
+
}
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
48
|
+
"@codemirror/autocomplete",
|
|
49
|
+
"@codemirror/collab",
|
|
50
|
+
"@codemirror/commands",
|
|
51
|
+
"@codemirror/language",
|
|
52
|
+
"@codemirror/lint",
|
|
53
|
+
"@codemirror/search",
|
|
54
|
+
"@codemirror/state",
|
|
55
|
+
"@codemirror/text",
|
|
56
|
+
"@codemirror/view",
|
|
57
|
+
"@lezer/common",
|
|
58
|
+
"@lezer/highlight",
|
|
59
|
+
"@lezer/lr",
|
|
60
|
+
"obsidian"
|
|
61
|
+
]);
|
|
62
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
63
|
+
"@codemirror/closebrackets",
|
|
64
|
+
"@codemirror/comment",
|
|
65
|
+
"@codemirror/fold",
|
|
66
|
+
"@codemirror/gutter",
|
|
67
|
+
"@codemirror/highlight",
|
|
68
|
+
"@codemirror/history",
|
|
69
|
+
"@codemirror/matchbrackets",
|
|
70
|
+
"@codemirror/panel",
|
|
71
|
+
"@codemirror/rangeset",
|
|
72
|
+
"@codemirror/rectangular-selection",
|
|
73
|
+
"@codemirror/stream-parser",
|
|
74
|
+
"@codemirror/tooltip"
|
|
75
|
+
]);
|
|
76
|
+
function requirePatched(id) {
|
|
77
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
78
|
+
return originalRequire?.(id);
|
|
79
|
+
}
|
|
80
|
+
const app = globalThis.app;
|
|
81
|
+
if (app?.isMobile) {
|
|
82
|
+
if (id === "process" || id === "node:process") {
|
|
83
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
84
|
+
return process;
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
const $module = originalRequire?.(id);
|
|
88
|
+
if ($module) {
|
|
89
|
+
return extractDefault($module);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
|
|
97
|
+
"use strict";
|
|
98
|
+
var __defProp = Object.defineProperty;
|
|
99
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
100
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
101
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
102
|
+
var __export = (target, all) => {
|
|
103
|
+
for (var name in all)
|
|
104
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
105
|
+
};
|
|
106
|
+
var __copyProps = (to, from, except, desc) => {
|
|
107
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
108
|
+
for (let key of __getOwnPropNames(from))
|
|
109
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
110
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
111
|
+
}
|
|
112
|
+
return to;
|
|
113
|
+
};
|
|
114
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
115
|
+
var path_compatibility_exports = {};
|
|
116
|
+
__export(path_compatibility_exports, {
|
|
117
|
+
PATH_COMPATIBILITY_PLATFORMS: () => PATH_COMPATIBILITY_PLATFORMS,
|
|
118
|
+
PATH_COMPATIBILITY_PLATFORM_LABELS: () => PATH_COMPATIBILITY_PLATFORM_LABELS,
|
|
119
|
+
PathCompatibilityPlatform: () => PathCompatibilityPlatform,
|
|
120
|
+
PathCompatibilityViolationType: () => PathCompatibilityViolationType,
|
|
121
|
+
findPathCompatibilityViolations: () => findPathCompatibilityViolations,
|
|
122
|
+
getCurrentPathCompatibilityPlatform: () => getCurrentPathCompatibilityPlatform,
|
|
123
|
+
getForbiddenCharacterReplacementValidationMessage: () => getForbiddenCharacterReplacementValidationMessage,
|
|
124
|
+
isUnicodeNormalized: () => isUnicodeNormalized,
|
|
125
|
+
measure: () => measure,
|
|
126
|
+
repairName: () => repairName
|
|
127
|
+
});
|
|
128
|
+
module.exports = __toCommonJS(path_compatibility_exports);
|
|
129
|
+
var import_obsidian = require("obsidian");
|
|
130
|
+
var import_validation = require("./validation.cjs");
|
|
131
|
+
var PathCompatibilityPlatform = /* @__PURE__ */ ((PathCompatibilityPlatform2) => {
|
|
132
|
+
PathCompatibilityPlatform2["Android"] = "Android";
|
|
133
|
+
PathCompatibilityPlatform2["Ios"] = "Ios";
|
|
134
|
+
PathCompatibilityPlatform2["Linux"] = "Linux";
|
|
135
|
+
PathCompatibilityPlatform2["MacOs"] = "MacOs";
|
|
136
|
+
PathCompatibilityPlatform2["Windows"] = "Windows";
|
|
137
|
+
return PathCompatibilityPlatform2;
|
|
138
|
+
})(PathCompatibilityPlatform || {});
|
|
139
|
+
var PathCompatibilityViolationType = /* @__PURE__ */ ((PathCompatibilityViolationType2) => {
|
|
140
|
+
PathCompatibilityViolationType2["ForbiddenCharacter"] = "ForbiddenCharacter";
|
|
141
|
+
PathCompatibilityViolationType2["NameTooLong"] = "NameTooLong";
|
|
142
|
+
PathCompatibilityViolationType2["ObsidianForbiddenCharacter"] = "ObsidianForbiddenCharacter";
|
|
143
|
+
PathCompatibilityViolationType2["PathTooLong"] = "PathTooLong";
|
|
144
|
+
PathCompatibilityViolationType2["ReservedName"] = "ReservedName";
|
|
145
|
+
PathCompatibilityViolationType2["TrailingCharacter"] = "TrailingCharacter";
|
|
146
|
+
PathCompatibilityViolationType2["UnicodeNotNormalized"] = "UnicodeNotNormalized";
|
|
147
|
+
return PathCompatibilityViolationType2;
|
|
148
|
+
})(PathCompatibilityViolationType || {});
|
|
149
|
+
const PATH_COMPATIBILITY_PLATFORMS = [
|
|
150
|
+
"Windows" /* Windows */,
|
|
151
|
+
"Android" /* Android */,
|
|
152
|
+
"Linux" /* Linux */,
|
|
153
|
+
"MacOs" /* MacOs */,
|
|
154
|
+
"Ios" /* Ios */
|
|
155
|
+
];
|
|
156
|
+
const PATH_COMPATIBILITY_PLATFORM_LABELS = {
|
|
157
|
+
["Android" /* Android */]: "Android",
|
|
158
|
+
["Ios" /* Ios */]: "iOS",
|
|
159
|
+
["Linux" /* Linux */]: "Linux",
|
|
160
|
+
["MacOs" /* MacOs */]: "macOS",
|
|
161
|
+
["Windows" /* Windows */]: "Windows"
|
|
162
|
+
};
|
|
163
|
+
const WINDOWS_MAX_FILE_PATH_LENGTH = 259;
|
|
164
|
+
const WINDOWS_MAX_FOLDER_PATH_LENGTH = 247;
|
|
165
|
+
const WINDOWS_MAX_NAME_LENGTH = 255;
|
|
166
|
+
const UNIX_MAX_NAME_BYTES = 255;
|
|
167
|
+
const LINUX_MAX_PATH_BYTES = 4096;
|
|
168
|
+
const DARWIN_MAX_PATH_BYTES = 1024;
|
|
169
|
+
const CONTROL_CHARS_REG_EXP = /[\u{0}-\u{1F}]/gu;
|
|
170
|
+
const PATH_COMPATIBILITY_PROFILES = {
|
|
171
|
+
["Android" /* Android */]: {
|
|
172
|
+
hasWindowsNamingRules: false,
|
|
173
|
+
maxFilePathLength: LINUX_MAX_PATH_BYTES,
|
|
174
|
+
maxFolderPathLength: LINUX_MAX_PATH_BYTES,
|
|
175
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
176
|
+
platform: "Android" /* Android */,
|
|
177
|
+
shouldMeasureInBytes: true
|
|
178
|
+
},
|
|
179
|
+
["Ios" /* Ios */]: {
|
|
180
|
+
hasWindowsNamingRules: false,
|
|
181
|
+
maxFilePathLength: DARWIN_MAX_PATH_BYTES,
|
|
182
|
+
maxFolderPathLength: DARWIN_MAX_PATH_BYTES,
|
|
183
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
184
|
+
platform: "Ios" /* Ios */,
|
|
185
|
+
shouldMeasureInBytes: true
|
|
186
|
+
},
|
|
187
|
+
["Linux" /* Linux */]: {
|
|
188
|
+
hasWindowsNamingRules: false,
|
|
189
|
+
maxFilePathLength: LINUX_MAX_PATH_BYTES,
|
|
190
|
+
maxFolderPathLength: LINUX_MAX_PATH_BYTES,
|
|
191
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
192
|
+
platform: "Linux" /* Linux */,
|
|
193
|
+
shouldMeasureInBytes: true
|
|
194
|
+
},
|
|
195
|
+
["MacOs" /* MacOs */]: {
|
|
196
|
+
hasWindowsNamingRules: false,
|
|
197
|
+
maxFilePathLength: DARWIN_MAX_PATH_BYTES,
|
|
198
|
+
maxFolderPathLength: DARWIN_MAX_PATH_BYTES,
|
|
199
|
+
maxNameLength: UNIX_MAX_NAME_BYTES,
|
|
200
|
+
platform: "MacOs" /* MacOs */,
|
|
201
|
+
shouldMeasureInBytes: true
|
|
202
|
+
},
|
|
203
|
+
["Windows" /* Windows */]: {
|
|
204
|
+
hasWindowsNamingRules: true,
|
|
205
|
+
maxFilePathLength: WINDOWS_MAX_FILE_PATH_LENGTH,
|
|
206
|
+
maxFolderPathLength: WINDOWS_MAX_FOLDER_PATH_LENGTH,
|
|
207
|
+
maxNameLength: WINDOWS_MAX_NAME_LENGTH,
|
|
208
|
+
platform: "Windows" /* Windows */,
|
|
209
|
+
shouldMeasureInBytes: false
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
function findPathCompatibilityViolations(params) {
|
|
213
|
+
const violations = [];
|
|
214
|
+
const name = getName(params.path);
|
|
215
|
+
const profiles = getProfiles(params.platforms);
|
|
216
|
+
const obsidianForbiddenCharacters = findCharacters(name, import_validation.OBSIDIAN_UNSAFE_FILENAME_CHARS);
|
|
217
|
+
if (profiles.length > 0 && obsidianForbiddenCharacters.length > 0) {
|
|
218
|
+
violations.push({ characters: obsidianForbiddenCharacters, platform: null, type: "ObsidianForbiddenCharacter" /* ObsidianForbiddenCharacter */ });
|
|
219
|
+
}
|
|
220
|
+
for (const profile of profiles) {
|
|
221
|
+
const maxPathLength = params.isFolder ? profile.maxFolderPathLength : profile.maxFilePathLength;
|
|
222
|
+
const fullPathLength = params.maxVaultRootPathLength + 1 + measure(params.path, profile.shouldMeasureInBytes);
|
|
223
|
+
if (fullPathLength > maxPathLength) {
|
|
224
|
+
violations.push({
|
|
225
|
+
measurement: {
|
|
226
|
+
isInBytes: profile.shouldMeasureInBytes,
|
|
227
|
+
length: fullPathLength,
|
|
228
|
+
limit: maxPathLength,
|
|
229
|
+
vaultRootLength: params.maxVaultRootPathLength
|
|
230
|
+
},
|
|
231
|
+
platform: profile.platform,
|
|
232
|
+
type: "PathTooLong" /* PathTooLong */
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
const nameLength = measure(name, profile.shouldMeasureInBytes);
|
|
236
|
+
if (nameLength > profile.maxNameLength) {
|
|
237
|
+
violations.push({
|
|
238
|
+
measurement: { isInBytes: profile.shouldMeasureInBytes, length: nameLength, limit: profile.maxNameLength, vaultRootLength: null },
|
|
239
|
+
platform: profile.platform,
|
|
240
|
+
type: "NameTooLong" /* NameTooLong */
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
const platformForbiddenCharacters = findCharacters(name, getPlatformForbiddenCharactersRegExp(profile));
|
|
244
|
+
if (platformForbiddenCharacters.length > 0) {
|
|
245
|
+
violations.push({ characters: platformForbiddenCharacters, platform: profile.platform, type: "ForbiddenCharacter" /* ForbiddenCharacter */ });
|
|
246
|
+
}
|
|
247
|
+
if (!profile.hasWindowsNamingRules) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if ((0, import_validation.isWindowsReservedName)(name)) {
|
|
251
|
+
violations.push({ platform: profile.platform, type: "ReservedName" /* ReservedName */ });
|
|
252
|
+
}
|
|
253
|
+
if ((0, import_validation.hasWindowsTrailingChars)(name)) {
|
|
254
|
+
violations.push({ platform: profile.platform, type: "TrailingCharacter" /* TrailingCharacter */ });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return violations;
|
|
258
|
+
}
|
|
259
|
+
function getCurrentPathCompatibilityPlatform() {
|
|
260
|
+
if (import_obsidian.Platform.isWin) {
|
|
261
|
+
return "Windows" /* Windows */;
|
|
262
|
+
}
|
|
263
|
+
if (import_obsidian.Platform.isAndroidApp) {
|
|
264
|
+
return "Android" /* Android */;
|
|
265
|
+
}
|
|
266
|
+
if (import_obsidian.Platform.isIosApp) {
|
|
267
|
+
return "Ios" /* Ios */;
|
|
268
|
+
}
|
|
269
|
+
if (import_obsidian.Platform.isMacOS) {
|
|
270
|
+
return "MacOs" /* MacOs */;
|
|
271
|
+
}
|
|
272
|
+
return import_obsidian.Platform.isLinux ? "Linux" /* Linux */ : null;
|
|
273
|
+
}
|
|
274
|
+
function getForbiddenCharacterReplacementValidationMessage(replacement) {
|
|
275
|
+
const regExps = [
|
|
276
|
+
(0, import_validation.getOsUnsafePathCharsRegExp)(true, false),
|
|
277
|
+
(0, import_validation.getOsUnsafePathCharsRegExp)(false, true),
|
|
278
|
+
(0, import_validation.getOsUnsafePathCharsRegExp)(false, false),
|
|
279
|
+
import_validation.OBSIDIAN_UNSAFE_FILENAME_CHARS,
|
|
280
|
+
CONTROL_CHARS_REG_EXP
|
|
281
|
+
];
|
|
282
|
+
for (const char of replacement) {
|
|
283
|
+
if (regExps.some((regExp) => char.replace(regExp, "") !== char)) {
|
|
284
|
+
return `The replacement must not contain "${char}": a file name cannot hold it on every platform.`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return "";
|
|
288
|
+
}
|
|
289
|
+
function isUnicodeNormalized(name) {
|
|
290
|
+
return name === name.normalize("NFC");
|
|
291
|
+
}
|
|
292
|
+
function measure($string, shouldMeasureInBytes) {
|
|
293
|
+
return shouldMeasureInBytes ? new Blob([$string]).size : $string.length;
|
|
294
|
+
}
|
|
295
|
+
function repairName(params) {
|
|
296
|
+
const profiles = getProfiles(params.platforms);
|
|
297
|
+
if (profiles.length === 0) {
|
|
298
|
+
return buildName(params.basename, params.extension);
|
|
299
|
+
}
|
|
300
|
+
let basename = params.basename;
|
|
301
|
+
let extension = params.extension;
|
|
302
|
+
for (const profile of profiles) {
|
|
303
|
+
basename = replaceForbiddenCharacters(basename, profile, params.forbiddenCharacterReplacement);
|
|
304
|
+
extension = replaceForbiddenCharacters(extension, profile, params.forbiddenCharacterReplacement);
|
|
305
|
+
}
|
|
306
|
+
extension = trimTrailingDotsAndSpaces(extension, profiles);
|
|
307
|
+
basename = trimTrailingDotsAndSpaces(basename, profiles);
|
|
308
|
+
if (profiles.some((profile) => profile.hasWindowsNamingRules) && (0, import_validation.isWindowsReservedName)(buildName(basename, extension))) {
|
|
309
|
+
basename += "_";
|
|
310
|
+
}
|
|
311
|
+
const codePoints = [...basename];
|
|
312
|
+
while (codePoints.length > 0) {
|
|
313
|
+
const candidate = trimTrailingDotsAndSpaces(codePoints.join(""), profiles);
|
|
314
|
+
if (candidate === "") {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
if (doesFitEveryProfile(candidate, extension, profiles, params)) {
|
|
318
|
+
return buildName(candidate, extension);
|
|
319
|
+
}
|
|
320
|
+
codePoints.pop();
|
|
321
|
+
}
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
function buildName(basename, extension) {
|
|
325
|
+
return extension === "" ? basename : `${basename}.${extension}`;
|
|
326
|
+
}
|
|
327
|
+
function doesFitEveryProfile(basename, extension, profiles, params) {
|
|
328
|
+
const name = buildName(basename, extension);
|
|
329
|
+
const path = params.parentPath === "" ? name : `${params.parentPath}/${name}`;
|
|
330
|
+
return profiles.every((profile) => {
|
|
331
|
+
const maxPathLength = params.isFolder ? profile.maxFolderPathLength : profile.maxFilePathLength;
|
|
332
|
+
const fullPathLength = params.maxVaultRootPathLength + 1 + measure(path, profile.shouldMeasureInBytes);
|
|
333
|
+
return measure(name, profile.shouldMeasureInBytes) <= profile.maxNameLength && fullPathLength <= maxPathLength;
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
function findCharacters(name, regExp) {
|
|
337
|
+
return [...new Set(name.match(regExp))];
|
|
338
|
+
}
|
|
339
|
+
function getName(path) {
|
|
340
|
+
const slashIndex = path.lastIndexOf("/");
|
|
341
|
+
return slashIndex === -1 ? path : path.slice(slashIndex + 1);
|
|
342
|
+
}
|
|
343
|
+
function getPlatformForbiddenCharactersRegExp(profile) {
|
|
344
|
+
return (0, import_validation.getOsUnsafePathCharsRegExp)(profile.hasWindowsNamingRules, profile.platform === "Android" /* Android */);
|
|
345
|
+
}
|
|
346
|
+
function getProfiles(platforms) {
|
|
347
|
+
return platforms.map((platform) => PATH_COMPATIBILITY_PROFILES[platform]);
|
|
348
|
+
}
|
|
349
|
+
function replaceForbiddenCharacters($string, profile, replacement) {
|
|
350
|
+
return $string.replace(getPlatformForbiddenCharactersRegExp(profile), () => replacement).replace(import_validation.OBSIDIAN_UNSAFE_FILENAME_CHARS, () => replacement);
|
|
351
|
+
}
|
|
352
|
+
function trimTrailingDotsAndSpaces($string, profiles) {
|
|
353
|
+
return profiles.some((profile) => profile.hasWindowsNamingRules) ? (0, import_validation.trimWindowsTrailingChars)($string) : $string;
|
|
354
|
+
}
|
|
355
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
356
|
+
0 && (module.exports = {
|
|
357
|
+
PATH_COMPATIBILITY_PLATFORMS,
|
|
358
|
+
PATH_COMPATIBILITY_PLATFORM_LABELS,
|
|
359
|
+
PathCompatibilityPlatform,
|
|
360
|
+
PathCompatibilityViolationType,
|
|
361
|
+
findPathCompatibilityViolations,
|
|
362
|
+
getCurrentPathCompatibilityPlatform,
|
|
363
|
+
getForbiddenCharacterReplacementValidationMessage,
|
|
364
|
+
isUnicodeNormalized,
|
|
365
|
+
measure,
|
|
366
|
+
repairName
|
|
367
|
+
});
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXRoLWNvbXBhdGliaWxpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFdoaWNoIG5hbWluZyBjb25zdHJhaW50cyBlYWNoIHBsYXRmb3JtIGltcG9zZXMsIHdoaWNoIG9mIHRoZW0gYSBnaXZlbiBwYXRoIHZpb2xhdGVzLCBhbmQgaG93IHRvIHJlcGFpciBhXG4gKiBuYW1lIHNvIGl0IHNhdGlzZmllcyBldmVyeSBlbmFibGVkIHBsYXRmb3JtIGF0IG9uY2UuXG4gKlxuICogUHVyZSBieSBkZXNpZ24g4oCUIG5vIGBBcHBgLCBubyB2YXVsdCwgbm8gSS9PIOKAlCBzbyB0aGUgd2hvbGUgY29ycmVjdG5lc3Mgc3VyZmFjZSAoYnl0ZSBjb3VudGluZywgZXh0ZW5zaW9uXG4gKiBwcmVzZXJ2YXRpb24sIHRydW5jYXRpb24gb3JkZXIsIHByb2ZpbGUgY29tcG9zaXRpb24pIGlzIHVuaXQtdGVzdGFibGUgd2l0aG91dCBhbiBPYnNpZGlhbiBpbnN0YW5jZS4gVGhlXG4gKiB2YXVsdCBwYXNzIHRoYXQgY29uc3VtZXMgaXQgbGl2ZXMgaW4gZWFjaCBwbHVnaW4gdGhhdCByZXBvcnRzIG9yIHJlcGFpcnMgcGF0aCBwcm9ibGVtcy5cbiAqXG4gKiBBIHZhdWx0IGlzIHN5bmNlZCwgc28gdGhlIHBsYXRmb3JtIHRoYXQgbWF0dGVycyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIG9uZSBydW5uaW5nOiBlbmFibGluZyBzZXZlcmFsXG4gKiBwbGF0Zm9ybXMgY29tcG9zZXMgdGhlaXIgY29uc3RyYWludHMgYnkgaW50ZXJzZWN0aW9uLCBhbmQgYSBuYW1lIGhhcyB0byBzYXRpc2Z5IGFsbCBvZiB0aGVtLlxuICovXG5cbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cCxcbiAgaGFzV2luZG93c1RyYWlsaW5nQ2hhcnMsXG4gIGlzV2luZG93c1Jlc2VydmVkTmFtZSxcbiAgT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTLFxuICB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnNcbn0gZnJvbSAnLi92YWxpZGF0aW9uLnRzJztcblxuLyoqXG4gKiBBIHBsYXRmb3JtIGEgdmF1bHQgbWF5IGJlIHN5bmNlZCB0bywgYW5kIHdob3NlIG5hbWluZyBydWxlcyBjYW4gdGhlcmVmb3JlIGJlIGVuZm9yY2VkLlxuICovXG5leHBvcnQgZW51bSBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtIHtcbiAgQW5kcm9pZCA9ICdBbmRyb2lkJyxcbiAgSW9zID0gJ0lvcycsXG4gIExpbnV4ID0gJ0xpbnV4JyxcbiAgTWFjT3MgPSAnTWFjT3MnLFxuICBXaW5kb3dzID0gJ1dpbmRvd3MnXG59XG5cbi8qKlxuICogV2hhdCBhIHNpbmdsZSBwYXRoIG9yIG5hbWUgaXMgd3JvbmcgYWJvdXQsIG9uIG9uZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGVudW0gUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlIHtcbiAgRm9yYmlkZGVuQ2hhcmFjdGVyID0gJ0ZvcmJpZGRlbkNoYXJhY3RlcicsXG4gIE5hbWVUb29Mb25nID0gJ05hbWVUb29Mb25nJyxcblxuICAvKipcbiAgICogVGhlIG5hbWUgaG9sZHMgYSBjaGFyYWN0ZXIgT2JzaWRpYW4gbGlua3MgZG8gbm90IHdvcmsgd2l0aCAoYCNgLCBgXmAsIGBbYCwgYF1gLCBgfGApLiBPYnNpZGlhbidzIHJ1bGUsIG5vdFxuICAgKiBhIHBsYXRmb3JtJ3M6IHRoZSBmaWxlc3lzdGVtIHN0b3JlcyBzdWNoIGEgbmFtZSBmaW5lLCBzbyBuYW1pbmcgYSBwbGF0Zm9ybSBmb3IgaXQgd291bGQgYmUgZmFsc2UuXG4gICAqL1xuICBPYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3RlciA9ICdPYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3RlcicsXG4gIFBhdGhUb29Mb25nID0gJ1BhdGhUb29Mb25nJyxcbiAgUmVzZXJ2ZWROYW1lID0gJ1Jlc2VydmVkTmFtZScsXG4gIFRyYWlsaW5nQ2hhcmFjdGVyID0gJ1RyYWlsaW5nQ2hhcmFjdGVyJyxcblxuICAvKipcbiAgICogVGhlIG5hbWUgaXMgc3RvcmVkIG9uIGRpc2sgaW4gYSBmb3JtIG90aGVyIHRoYW4gVW5pY29kZSBORkMsIGUuZy4gYNC5YCBhcyBg0LhgIGZvbGxvd2VkIGJ5IGEgY29tYmluaW5nXG4gICAqIGJyZXZlLiBOb3QgYSBwbGF0Zm9ybSdzIHJ1bGUgYnV0IGEgc3luYyBoYXphcmQ6IHRvb2xzIG91dHNpZGUgT2JzaWRpYW4gc2VlIHRoZSB0d28gZm9ybXMgYXMgdHdvIG5hbWVzLlxuICAgKi9cbiAgVW5pY29kZU5vdE5vcm1hbGl6ZWQgPSAnVW5pY29kZU5vdE5vcm1hbGl6ZWQnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbnNQYXJhbXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBuYW1lcyBhIGZvbGRlciwgd2hpY2ggaGFzIGl0cyBvd24gcGF0aCBidWRnZXQuXG4gICAqL1xuICByZWFkb25seSBpc0ZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCB2YXVsdCByb290IHBhdGggdGhlIHZhdWx0IGlzIGV4cGVjdGVkIHRvIGxpdmUgdW5kZXIsIGluIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIFRoZSB2YXVsdCByb290IG9mIGEgcGxhdGZvcm0gdGhlIGNoZWNrIGlzIG5vdCBydW5uaW5nIG9uIGlzIHVua25vd2FibGUsIHNvIGl0IGlzIHN0YXRlZCByYXRoZXIgdGhhblxuICAgKiBndWVzc2VkIOKAlCBzZWUgdGhlIGBtYXhWYXVsdFJvb3RQYXRoTGVuZ3RoYCBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VmF1bHRSb290UGF0aExlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgcGF0aCB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsYXRmb3JtcyB3aG9zZSBydWxlcyB0byBlbmZvcmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm1zOiByZWFkb25seSBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtW107XG59XG5cbi8qKlxuICogQSBsZW5ndGggYSBwYXRoIG9yIG5hbWUgd2FzIG1lYXN1cmVkIGF0LCBhbmQgdGhlIGxpbWl0IGl0IGV4Y2VlZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aENvbXBhdGliaWxpdHlNZWFzdXJlbWVudCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGJvdGggbnVtYmVycyBjb3VudCBVVEYtOCBieXRlcyByYXRoZXIgdGhhbiBVVEYtMTYgdW5pdHMuXG4gICAqL1xuICByZWFkb25seSBpc0luQnl0ZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtZWFzdXJlZCBsZW5ndGguXG4gICAqL1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxhcmdlc3QgbGVuZ3RoIHRoZSBwbGF0Zm9ybSBhY2NlcHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGltaXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHJvb3QgbGVuZ3RoIGNvdW50ZWQgaW50byB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlNZWFzdXJlbWVudC5sZW5ndGh9LCBiZWZvcmUgdGhlIHNlcGFyYXRvclxuICAgKiBhZnRlciBpdC4gYG51bGxgIGZvciBhIG5hbWUsIHdoaWNoIGNhcnJpZXMgbm8gcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0Um9vdExlbmd0aDogbnVsbCB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtaW5nIHJ1bGVzIG9mIG9uZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGUge1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIHBsYXRmb3JtIGFwcGxpZXMgV2luZG93cycgbmFtaW5nIHJ1bGVzOiBpdHMgZm9yYmlkZGVuIGNoYXJhY3RlcnMsIGl0cyByZXNlcnZlZCBkZXZpY2VcbiAgICogbmFtZXMsIGFuZCBpdHMgcmVqZWN0aW9uIG9mIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcy5cbiAgICpcbiAgICogT25lIGZsYWcgZm9yIHRocmVlIHJ1bGVzIGJlY2F1c2UgdGhleSBhcmUgb25lIGZpbGVzeXN0ZW0ncyBydWxlcywgYW5kIG5vIHBsYXRmb3JtIGFkb3B0cyBhIHN1YnNldC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1dpbmRvd3NOYW1pbmdSdWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxvbmdlc3QgYWJzb2x1dGUgcGF0aCBhIGZpbGUgbWF5IGhhdmUsIGluIHRoaXMgcHJvZmlsZSdzIHVuaXQuXG4gICAqL1xuICByZWFkb25seSBtYXhGaWxlUGF0aExlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9uZ2VzdCBhYnNvbHV0ZSBwYXRoIGEgZm9sZGVyIG1heSBoYXZlLCBpbiB0aGlzIHByb2ZpbGUncyB1bml0LlxuICAgKlxuICAgKiBCZWxvdyB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlQcm9maWxlLm1heEZpbGVQYXRoTGVuZ3RofSBvbiBXaW5kb3dzLCB3aGVyZSB0aGUgc2hvcnRlciBidWRnZXQgbGVhdmVzXG4gICAqIHJvb20gZm9yIGFuIGA4LjNgIG5hbWUgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBtYXhGb2xkZXJQYXRoTGVuZ3RoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb25nZXN0IHNpbmdsZSBuYW1lIOKAlCBvbmUgcGF0aCBzZWdtZW50IOKAlCBpbiB0aGlzIHByb2ZpbGUncyB1bml0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4TmFtZUxlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm0gdGhpcyBwcm9maWxlIGRlc2NyaWJlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGxlbmd0aHMgY291bnQgVVRGLTggYnl0ZXMgKGV4dDQsIEFQRlMpIHJhdGhlciB0aGFuIFVURi0xNiB1bml0cyAoTlRGUykuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHdob2xlIHJlYXNvbiB0aGUgMjU1IGxpbWl0IGlzIG5vdCBhIGNoYXJhY3RlciBjb3VudDogYSBuYW1lIG9mIDEyOCBDSksgY2hhcmFjdGVycyBpcyAzODRcbiAgICogYnl0ZXMgYW5kIGlzIHJlamVjdGVkIGJ5IGV4dDQgd2hpbGUgYmVpbmcgbm93aGVyZSBuZWFyIGFueSBsaW1pdCBXaW5kb3dzIGhhcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZE1lYXN1cmVJbkJ5dGVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9uZSB0aGluZyB3cm9uZyB3aXRoIG9uZSBwYXRoLCBhbmQgdGhlIHBsYXRmb3JtIHRoYXQgb2JqZWN0cyB0byBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgb2ZmZW5kaW5nIGNoYXJhY3RlcnMsIGVhY2ggb25jZSwgaW4gdGhlIG9yZGVyIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBuYW1lLlxuICAgKlxuICAgKiBTZXQgZm9yIHtAbGluayBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuRm9yYmlkZGVuQ2hhcmFjdGVyfSBhbmRcbiAgICoge0BsaW5rIFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5PYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3Rlcn0sIHNvIHRoZSByZXBvcnQgY2FuIG5hbWUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYXJhY3RlcnM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hhdCB3YXMgbWVhc3VyZWQgYW5kIHRoZSBsaW1pdCBpdCB3YXMgbWVhc3VyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogU2V0IGZvciB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLk5hbWVUb29Mb25nfSBhbmRcbiAgICoge0BsaW5rIFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5QYXRoVG9vTG9uZ30sIHNvIGEgcmVhZGVyIG9mIHRoZSByZXBvcnQgY2FuIHZlcmlmeSB0aGUgdmVyZGljdC5cbiAgICovXG4gIHJlYWRvbmx5IG1lYXN1cmVtZW50PzogUGF0aENvbXBhdGliaWxpdHlNZWFzdXJlbWVudDtcblxuICAvKipcbiAgICogVGhlIHBsYXRmb3JtIHdob3NlIHJ1bGVzIHRoZSBwYXRoIGJyZWFrcy4gQW5vdGhlciBlbmFibGVkIHBsYXRmb3JtIG1heSBhY2NlcHQgdGhlIHZlcnkgc2FtZSBwYXRoLlxuICAgKlxuICAgKiBgbnVsbGAgZm9yIGEgdmlvbGF0aW9uIG5vIHNpbmdsZSBwbGF0Zm9ybSBvd25zLCB3aGljaCBpc1xuICAgKiB7QGxpbmsgUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLk9ic2lkaWFuRm9yYmlkZGVuQ2hhcmFjdGVyfSBhbmRcbiAgICoge0BsaW5rIFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5Vbmljb2RlTm90Tm9ybWFsaXplZH0uXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogbnVsbCB8IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm07XG5cbiAgLyoqXG4gICAqIFdoYXQgaXMgd3JvbmcuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlcGFpck5hbWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcGFpck5hbWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLiBGb3IgYSBmb2xkZXIsIHRoZSB3aG9sZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZW5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUncyBleHRlbnNpb24sIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LiBFbXB0eSBmb3IgYSBmb2xkZXIgb3IgYW4gZXh0ZW5zaW9uLWxlc3MgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IGVhY2ggZm9yYmlkZGVuIGNoYXJhY3RlciBpcyByZXBsYWNlZCB3aXRoLiBFbXB0eSBkZWxldGVzIGl0LiBNdXN0IHBhc3NcbiAgICoge0BsaW5rIGdldEZvcmJpZGRlbkNoYXJhY3RlclJlcGxhY2VtZW50VmFsaWRhdGlvbk1lc3NhZ2V9LCBvciB0aGUgcmVwYWlyIHdvdWxkIHB1dCBiYWNrIHdoYXQgaXQgcmVtb3ZlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZvcmJpZGRlbkNoYXJhY3RlclJlcGxhY2VtZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5hbWUgYmVsb25ncyB0byBhIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlzRm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHZhdWx0IHJvb3QgcGF0aCB0aGUgdmF1bHQgaXMgZXhwZWN0ZWQgdG8gbGl2ZSB1bmRlciwgaW4gY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IG1heFZhdWx0Um9vdFBhdGhMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIuIEVtcHR5IGF0IHRoZSB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm1zIHdob3NlIHJ1bGVzIHRoZSByZXBhaXJlZCBuYW1lIG11c3Qgc2F0aXNmeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtczogcmVhZG9ubHkgUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybVtdO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHBsYXRmb3JtLCBpbiB0aGUgb3JkZXIgdGhlIHNldHRpbmdzIHRhYiBhbmQgdGhlIGNvbnNpc3RlbmN5IHJlcG9ydCBsaXN0IHRoZW06IHRoZSBvbmVzIHdob3NlIGxpbWl0c1xuICogYWN0dWFsbHkgYmluZCBpbiBwcmFjdGljZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBBVEhfQ09NUEFUSUJJTElUWV9QTEFURk9STVM6IHJlYWRvbmx5IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm1bXSA9IFtcbiAgUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5XaW5kb3dzLFxuICBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkFuZHJvaWQsXG4gIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTGludXgsXG4gIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTWFjT3MsXG4gIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uSW9zXG5dO1xuXG4vKipcbiAqIEhvdyBlYWNoIHBsYXRmb3JtIGlzIG5hbWVkIGluIHRoZSBzZXR0aW5ncyB0YWIgYW5kIHRoZSBjb25zaXN0ZW5jeSByZXBvcnQuXG4gKlxuICogTm90IHRyYW5zbGF0ZWQ6IHRoZXNlIGFyZSBwcm9kdWN0IG5hbWVzLCBhbmQgYG1hY09TYCBpcyBzcGVsbGVkIGBtYWNPU2AgaW4gZXZlcnkgbGFuZ3VhZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBQQVRIX0NPTVBBVElCSUxJVFlfUExBVEZPUk1fTEFCRUxTOiBSZWNvcmQ8UGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybSwgc3RyaW5nPiA9IHtcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uQW5kcm9pZF06ICdBbmRyb2lkJyxcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uSW9zXTogJ2lPUycsXG4gIFtQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkxpbnV4XTogJ0xpbnV4JyxcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTWFjT3NdOiAnbWFjT1MnLFxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5XaW5kb3dzXTogJ1dpbmRvd3MnXG59O1xuXG4vKipcbiAqIGBNQVhfUEFUSGAgaXMgMjYwIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLCBzbyAyNTkgdXNhYmxlIGNoYXJhY3RlcnMgZm9yIGEgZmlsZS5cbiAqL1xuY29uc3QgV0lORE9XU19NQVhfRklMRV9QQVRIX0xFTkdUSCA9IDI1OTtcblxuLyoqXG4gKiBBIGZvbGRlciBnZXRzIDEyIGZld2VyLCBsZWF2aW5nIHJvb20gZm9yIGEgYFxcYCBhbmQgYW4gOC4zIG5hbWUgaW5zaWRlIGl0LlxuICovXG5jb25zdCBXSU5ET1dTX01BWF9GT0xERVJfUEFUSF9MRU5HVEggPSAyNDc7XG5cbi8qKlxuICogTlRGUydzIHBlci1uYW1lIGNhcCwgaW4gVVRGLTE2IHVuaXRzLiBOZXZlciB0aGUgYmluZGluZyBjb25zdHJhaW50OiBhIHBhdGggdGhhdCBmaXRzIGluXG4gKiB7QGxpbmsgV0lORE9XU19NQVhfRklMRV9QQVRIX0xFTkdUSH0gY2hhcmFjdGVycyBjb250YWlucyBubyBsb25nZXIgbmFtZS5cbiAqL1xuY29uc3QgV0lORE9XU19NQVhfTkFNRV9MRU5HVEggPSAyNTU7XG5cbi8qKlxuICogRXh0NCAvIGYyZnMgLyBBUEZTIGFsbCBjYXAgYSBzaW5nbGUgbmFtZSBhdCAyNTUgQllURVMuIFRoaXMgaXMgdGhlIGxpbWl0IGEgY2hhcmFjdGVyIGNvdW50IGdldHMgd3JvbmcuXG4gKi9cbmNvbnN0IFVOSVhfTUFYX05BTUVfQllURVMgPSAyNTU7XG5cbi8qKlxuICogYFBBVEhfTUFYYCBvbiBMaW51eCBhbmQgQW5kcm9pZC4gU28gZmFyIGFib3ZlIGFueXRoaW5nIGEgdmF1bHQgcHJvZHVjZXMgdGhhdCBvbmx5IHRoZSBuYW1lIGxpbWl0IGJpbmRzLlxuICovXG5jb25zdCBMSU5VWF9NQVhfUEFUSF9CWVRFUyA9IDQwOTY7XG5cbi8qKlxuICogYFBBVEhfTUFYYCBvbiBtYWNPUyBhbmQgaU9TLlxuICovXG5jb25zdCBEQVJXSU5fTUFYX1BBVEhfQllURVMgPSAxMDI0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBDb250cm9sIGNoYXJhY3RlcnMgYXJlIGV4YWN0bHkgd2hhdCB0aGlzIG1hdGNoZXMuXG5jb25zdCBDT05UUk9MX0NIQVJTX1JFR19FWFAgPSAvW1xcdXswfS1cXHV7MUZ9XS9ndTtcblxuY29uc3QgUEFUSF9DT01QQVRJQklMSVRZX1BST0ZJTEVTOiBSZWNvcmQ8UGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybSwgUGF0aENvbXBhdGliaWxpdHlQcm9maWxlPiA9IHtcbiAgW1BhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uQW5kcm9pZF06IHtcbiAgICBoYXNXaW5kb3dzTmFtaW5nUnVsZXM6IGZhbHNlLFxuICAgIG1heEZpbGVQYXRoTGVuZ3RoOiBMSU5VWF9NQVhfUEFUSF9CWVRFUyxcbiAgICBtYXhGb2xkZXJQYXRoTGVuZ3RoOiBMSU5VWF9NQVhfUEFUSF9CWVRFUyxcbiAgICBtYXhOYW1lTGVuZ3RoOiBVTklYX01BWF9OQU1FX0JZVEVTLFxuICAgIHBsYXRmb3JtOiBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkFuZHJvaWQsXG4gICAgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IHRydWVcbiAgfSxcblxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5Jb3NdOiB7XG4gICAgaGFzV2luZG93c05hbWluZ1J1bGVzOiBmYWxzZSxcbiAgICBtYXhGaWxlUGF0aExlbmd0aDogREFSV0lOX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heEZvbGRlclBhdGhMZW5ndGg6IERBUldJTl9NQVhfUEFUSF9CWVRFUyxcbiAgICBtYXhOYW1lTGVuZ3RoOiBVTklYX01BWF9OQU1FX0JZVEVTLFxuICAgIHBsYXRmb3JtOiBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLklvcyxcbiAgICBzaG91bGRNZWFzdXJlSW5CeXRlczogdHJ1ZVxuICB9LFxuXG4gIFtQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtLkxpbnV4XToge1xuICAgIGhhc1dpbmRvd3NOYW1pbmdSdWxlczogZmFsc2UsXG4gICAgbWF4RmlsZVBhdGhMZW5ndGg6IExJTlVYX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heEZvbGRlclBhdGhMZW5ndGg6IExJTlVYX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heE5hbWVMZW5ndGg6IFVOSVhfTUFYX05BTUVfQllURVMsXG4gICAgcGxhdGZvcm06IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTGludXgsXG4gICAgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IHRydWVcbiAgfSxcblxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5NYWNPc106IHtcbiAgICBoYXNXaW5kb3dzTmFtaW5nUnVsZXM6IGZhbHNlLFxuICAgIG1heEZpbGVQYXRoTGVuZ3RoOiBEQVJXSU5fTUFYX1BBVEhfQllURVMsXG4gICAgbWF4Rm9sZGVyUGF0aExlbmd0aDogREFSV0lOX01BWF9QQVRIX0JZVEVTLFxuICAgIG1heE5hbWVMZW5ndGg6IFVOSVhfTUFYX05BTUVfQllURVMsXG4gICAgcGxhdGZvcm06IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uTWFjT3MsXG4gICAgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IHRydWVcbiAgfSxcblxuICBbUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5XaW5kb3dzXToge1xuICAgIGhhc1dpbmRvd3NOYW1pbmdSdWxlczogdHJ1ZSxcbiAgICBtYXhGaWxlUGF0aExlbmd0aDogV0lORE9XU19NQVhfRklMRV9QQVRIX0xFTkdUSCxcbiAgICBtYXhGb2xkZXJQYXRoTGVuZ3RoOiBXSU5ET1dTX01BWF9GT0xERVJfUEFUSF9MRU5HVEgsXG4gICAgbWF4TmFtZUxlbmd0aDogV0lORE9XU19NQVhfTkFNRV9MRU5HVEgsXG4gICAgcGxhdGZvcm06IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uV2luZG93cyxcbiAgICBzaG91bGRNZWFzdXJlSW5CeXRlczogZmFsc2VcbiAgfVxufTtcblxuLyoqXG4gKiBGaW5kcyBldmVyeXRoaW5nIHdyb25nIHdpdGggYSBwYXRoLCBhY3Jvc3MgZXZlcnkgZW5hYmxlZCBwbGF0Zm9ybS5cbiAqXG4gKiBSZWFkLW9ubHk6IHRoaXMgaXMgd2hhdCB0aGUgY29uc2lzdGVuY3kgcmVwb3J0IHJlbmRlcnMsIGFuZCBpdCBuZXZlciBwcm9wb3NlcyBhIHJlcGFpci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhdGggYW5kIHRoZSBwbGF0Zm9ybXMgdG8gY2hlY2sgaXQgYWdhaW5zdC5cbiAqIEByZXR1cm5zIFRoZSB2aW9sYXRpb25zLCBlbXB0eSB3aGVuIHRoZSBwYXRoIGlzIHZhbGlkIGV2ZXJ5d2hlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25zKHBhcmFtczogRmluZFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uc1BhcmFtcyk6IFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uW10ge1xuICBjb25zdCB2aW9sYXRpb25zOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvbltdID0gW107XG4gIGNvbnN0IG5hbWUgPSBnZXROYW1lKHBhcmFtcy5wYXRoKTtcbiAgY29uc3QgcHJvZmlsZXMgPSBnZXRQcm9maWxlcyhwYXJhbXMucGxhdGZvcm1zKTtcblxuICAvKlxuICAgKiBPbmNlLCB3aXRoIG5vIHBsYXRmb3JtOiBldmVyeSBwbGF0Zm9ybSBzdG9yZXMgc3VjaCBhIG5hbWUsIGFuZCBvbmx5IE9ic2lkaWFuJ3MgbGlua3MgcmVmdXNlIGl0LiBTdGlsbFxuICAgKiBnYXRlZCBvbiBhIHBsYXRmb3JtIGJlaW5nIGVuYWJsZWQsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHN3aXRjaGVzIHRoZSB3aG9sZSBjaGVjayBvbiwgYW5kIHRoZSByZXBhaXIgb25seVxuICAgKiByZXBsYWNlcyB0aGVzZSBjaGFyYWN0ZXJzIHVuZGVyIGEgcHJvZmlsZS5cbiAgICovXG4gIGNvbnN0IG9ic2lkaWFuRm9yYmlkZGVuQ2hhcmFjdGVycyA9IGZpbmRDaGFyYWN0ZXJzKG5hbWUsIE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyk7XG5cbiAgaWYgKHByb2ZpbGVzLmxlbmd0aCA+IDAgJiYgb2JzaWRpYW5Gb3JiaWRkZW5DaGFyYWN0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2aW9sYXRpb25zLnB1c2goeyBjaGFyYWN0ZXJzOiBvYnNpZGlhbkZvcmJpZGRlbkNoYXJhY3RlcnMsIHBsYXRmb3JtOiBudWxsLCB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuT2JzaWRpYW5Gb3JiaWRkZW5DaGFyYWN0ZXIgfSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgcHJvZmlsZXMpIHtcbiAgICBjb25zdCBtYXhQYXRoTGVuZ3RoID0gcGFyYW1zLmlzRm9sZGVyID8gcHJvZmlsZS5tYXhGb2xkZXJQYXRoTGVuZ3RoIDogcHJvZmlsZS5tYXhGaWxlUGF0aExlbmd0aDtcbiAgICBjb25zdCBmdWxsUGF0aExlbmd0aCA9IHBhcmFtcy5tYXhWYXVsdFJvb3RQYXRoTGVuZ3RoICsgMSArIG1lYXN1cmUocGFyYW1zLnBhdGgsIHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMpO1xuXG4gICAgaWYgKGZ1bGxQYXRoTGVuZ3RoID4gbWF4UGF0aExlbmd0aCkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgbWVhc3VyZW1lbnQ6IHtcbiAgICAgICAgICBpc0luQnl0ZXM6IHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMsXG4gICAgICAgICAgbGVuZ3RoOiBmdWxsUGF0aExlbmd0aCxcbiAgICAgICAgICBsaW1pdDogbWF4UGF0aExlbmd0aCxcbiAgICAgICAgICB2YXVsdFJvb3RMZW5ndGg6IHBhcmFtcy5tYXhWYXVsdFJvb3RQYXRoTGVuZ3RoXG4gICAgICAgIH0sXG4gICAgICAgIHBsYXRmb3JtOiBwcm9maWxlLnBsYXRmb3JtLFxuICAgICAgICB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuUGF0aFRvb0xvbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVMZW5ndGggPSBtZWFzdXJlKG5hbWUsIHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMpO1xuXG4gICAgaWYgKG5hbWVMZW5ndGggPiBwcm9maWxlLm1heE5hbWVMZW5ndGgpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgIG1lYXN1cmVtZW50OiB7IGlzSW5CeXRlczogcHJvZmlsZS5zaG91bGRNZWFzdXJlSW5CeXRlcywgbGVuZ3RoOiBuYW1lTGVuZ3RoLCBsaW1pdDogcHJvZmlsZS5tYXhOYW1lTGVuZ3RoLCB2YXVsdFJvb3RMZW5ndGg6IG51bGwgfSxcbiAgICAgICAgcGxhdGZvcm06IHByb2ZpbGUucGxhdGZvcm0sXG4gICAgICAgIHR5cGU6IFBhdGhDb21wYXRpYmlsaXR5VmlvbGF0aW9uVHlwZS5OYW1lVG9vTG9uZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGxhdGZvcm1Gb3JiaWRkZW5DaGFyYWN0ZXJzID0gZmluZENoYXJhY3RlcnMobmFtZSwgZ2V0UGxhdGZvcm1Gb3JiaWRkZW5DaGFyYWN0ZXJzUmVnRXhwKHByb2ZpbGUpKTtcblxuICAgIGlmIChwbGF0Zm9ybUZvcmJpZGRlbkNoYXJhY3RlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHsgY2hhcmFjdGVyczogcGxhdGZvcm1Gb3JiaWRkZW5DaGFyYWN0ZXJzLCBwbGF0Zm9ybTogcHJvZmlsZS5wbGF0Zm9ybSwgdHlwZTogUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLkZvcmJpZGRlbkNoYXJhY3RlciB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2ZpbGUuaGFzV2luZG93c05hbWluZ1J1bGVzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNXaW5kb3dzUmVzZXJ2ZWROYW1lKG5hbWUpKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2goeyBwbGF0Zm9ybTogcHJvZmlsZS5wbGF0Zm9ybSwgdHlwZTogUGF0aENvbXBhdGliaWxpdHlWaW9sYXRpb25UeXBlLlJlc2VydmVkTmFtZSB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGFzV2luZG93c1RyYWlsaW5nQ2hhcnMobmFtZSkpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaCh7IHBsYXRmb3JtOiBwcm9maWxlLnBsYXRmb3JtLCB0eXBlOiBQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUuVHJhaWxpbmdDaGFyYWN0ZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZpb2xhdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsYXRmb3JtIHRoZSBwbHVnaW4gaXMgcnVubmluZyBvbiwgb3IgYG51bGxgIG9uIGEgcGxhdGZvcm0gd2l0aCBubyBwcm9maWxlLlxuICpcbiAqIFVzZWQgb25seSB0byBzZWVkIHRoZSBzZXR0aW5ncyBkZWZhdWx0cywgc28gdGhhdCBhIGZyZXNoIGluc3RhbGwgcmVwb3J0cyBvbiB0aGUgdmF1bHQgaW4gZnJvbnQgb2YgaXRcbiAqIHdpdGhvdXQgdGhlIHVzZXIgY29uZmlndXJpbmcgYW55dGhpbmcgZmlyc3QuXG4gKlxuICogQHJldHVybnMgVGhlIGN1cnJlbnQgcGxhdGZvcm0sIG9yIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtKCk6IG51bGwgfCBQYXRoQ29tcGF0aWJpbGl0eVBsYXRmb3JtIHtcbiAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgcmV0dXJuIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uV2luZG93cztcbiAgfVxuXG4gIGlmIChQbGF0Zm9ybS5pc0FuZHJvaWRBcHApIHtcbiAgICByZXR1cm4gUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5BbmRyb2lkO1xuICB9XG5cbiAgaWYgKFBsYXRmb3JtLmlzSW9zQXBwKSB7XG4gICAgcmV0dXJuIFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uSW9zO1xuICB9XG5cbiAgaWYgKFBsYXRmb3JtLmlzTWFjT1MpIHtcbiAgICByZXR1cm4gUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5NYWNPcztcbiAgfVxuXG4gIHJldHVybiBQbGF0Zm9ybS5pc0xpbnV4ID8gUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybS5MaW51eCA6IG51bGw7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB0ZXh0IGEgZm9yYmlkZGVuIGNoYXJhY3RlciBpcyByZXBsYWNlZCB3aXRoLlxuICpcbiAqIEV2ZXJ5IHBsYXRmb3JtJ3Mgc2V0IGlzIGNoZWNrZWQsIG5vdCBvbmx5IHRoZSBlbmFibGVkIG9uZXM6IHRoZSB0b2dnbGVzIGNhbiBjaGFuZ2UgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50XG4gKiBpcyBjaG9zZW4sIGFuZCBhIHJlcGxhY2VtZW50IG9uZSBwbGF0Zm9ybSByZWZ1c2VzIHdvdWxkIG1ha2UgdGhlIHJlcGFpciBvZiB0aGF0IHBsYXRmb3JtIHByb2R1Y2UgYSBuYW1lXG4gKiB0aGF0IGlzIHN0aWxsIGludmFsaWQgdGhlcmUuXG4gKlxuICogQHBhcmFtIHJlcGxhY2VtZW50IC0gVGhlIHJlcGxhY2VtZW50IHRleHQuIEVtcHR5IGlzIHZhbGlkIGFuZCBkZWxldGVzIHRoZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBBIG1lc3NhZ2UgbmFtaW5nIHRoZSBmaXJzdCByZWZ1c2VkIGNoYXJhY3Rlciwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIHJlcGxhY2VtZW50IGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9yYmlkZGVuQ2hhcmFjdGVyUmVwbGFjZW1lbnRWYWxpZGF0aW9uTWVzc2FnZShyZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnRXhwcyA9IFtcbiAgICBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cCh0cnVlLCBmYWxzZSksXG4gICAgZ2V0T3NVbnNhZmVQYXRoQ2hhcnNSZWdFeHAoZmFsc2UsIHRydWUpLFxuICAgIGdldE9zVW5zYWZlUGF0aENoYXJzUmVnRXhwKGZhbHNlLCBmYWxzZSksXG4gICAgT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTLFxuICAgIENPTlRST0xfQ0hBUlNfUkVHX0VYUFxuICBdO1xuXG4gIC8vIEEgc3RyaW5nIGl0ZXJhdGVzIGJ5IGNvZGUgcG9pbnQsIHNvIGEgc3Vycm9nYXRlIHBhaXIgaXMgbmFtZWQgd2hvbGUsIGFzIHRoZSB1c2VyIHR5cGVkIGl0LlxuICBmb3IgKGNvbnN0IGNoYXIgb2YgcmVwbGFjZW1lbnQpIHtcbiAgICAvLyBgcmVwbGFjZWAgcmF0aGVyIHRoYW4gYHRlc3RgLCBmb3IgdGhlIHJlYXNvbiBnaXZlbiBhdCBgcmVwbGFjZUZvcmJpZGRlbkNoYXJhY3RlcnNgLlxuICAgIGlmIChyZWdFeHBzLnNvbWUoKHJlZ0V4cCkgPT4gY2hhci5yZXBsYWNlKHJlZ0V4cCwgJycpICE9PSBjaGFyKSkge1xuICAgICAgcmV0dXJuIGBUaGUgcmVwbGFjZW1lbnQgbXVzdCBub3QgY29udGFpbiBcIiR7Y2hhcn1cIjogYSBmaWxlIG5hbWUgY2Fubm90IGhvbGQgaXQgb24gZXZlcnkgcGxhdGZvcm0uYDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBhIG5hbWUgaXMgaW4gVW5pY29kZSBORkMsIHRoZSBmb3JtIE9ic2lkaWFuIGdpdmVzIGV2ZXJ5IG5hbWUgaXQgY3JlYXRlcy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIGFzIGl0IGlzIHN0b3JlZCBvbiBkaXNrLlxuICogQHJldHVybnMgV2hldGhlciBpdCBpcyBORkMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaWNvZGVOb3JtYWxpemVkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmFtZSA9PT0gbmFtZS5ub3JtYWxpemUoJ05GQycpO1xufVxuXG4vKipcbiAqIE1lYXN1cmVzIGEgc3RyaW5nIHRoZSB3YXkgYSBmaWxlc3lzdGVtIGRvZXMuXG4gKlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIG1lYXN1cmUuXG4gKiBAcGFyYW0gc2hvdWxkTWVhc3VyZUluQnl0ZXMgLSBXaGV0aGVyIHRvIGNvdW50IFVURi04IGJ5dGVzIHJhdGhlciB0aGFuIFVURi0xNiB1bml0cy5cbiAqIEByZXR1cm5zIFRoZSBsZW5ndGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWFzdXJlKCRzdHJpbmc6IHN0cmluZywgc2hvdWxkTWVhc3VyZUluQnl0ZXM6IGJvb2xlYW4pOiBudW1iZXIge1xuICByZXR1cm4gc2hvdWxkTWVhc3VyZUluQnl0ZXMgPyBuZXcgQmxvYihbJHN0cmluZ10pLnNpemUgOiAkc3RyaW5nLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXBhaXJzIGEgbmFtZSBzbyB0aGF0IGl0IHNhdGlzZmllcyBldmVyeSBlbmFibGVkIHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcmRlciBpcyBkZWxpYmVyYXRlOiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCBhbmQgYSByZXNlcnZlZCBuYW1lIGRlLXJlc2VydmVkIEJFRk9SRSBhbnl0aGluZyBpc1xuICogdHJ1bmNhdGVkLCBiZWNhdXNlIGJvdGggY2FuIGNoYW5nZSB0aGUgbGVuZ3RoLCBhbmQgdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIGFyZSB0cmltbWVkIEFGVEVSIGV2ZXJ5IGN1dCxcbiAqIGJlY2F1c2UgYSBjdXQgY2FuIGV4cG9zZSBuZXcgb25lcy5cbiAqXG4gKiBUcnVuY2F0aW9uIG9ubHkgZXZlciBzaG9ydGVucyB0aGUgYmFzZW5hbWUg4oCUIGFuIGV4dGVuc2lvbiBpcyB3aGF0IHRlbGxzIE9ic2lkaWFuIGFuZCB0aGUgT1Mgd2hhdCB0aGUgZmlsZVxuICogaXMsIHNvIGEgdHJ1bmNhdGVkIG9uZSB0dXJucyBhIHdvcmtpbmcgYC5wbmdgIGludG8gYSBicm9rZW4gYC5wbmAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBuYW1lIGFuZCB0aGUgcGxhdGZvcm1zIGl0IG11c3Qgc2F0aXNmeS5cbiAqIEByZXR1cm5zIFRoZSByZXBhaXJlZCBuYW1lLCB1bmNoYW5nZWQgd2hlbiBpdCB3YXMgYWxyZWFkeSB2YWxpZCwgb3IgYG51bGxgIHdoZW4gbm8gbmFtZSBzdXJ2aXZlcyB0aGVcbiAqIHJlcGFpciDigJQgd2hpY2ggaXMgd2hhdCB0aGUgcmVwb3J0IGNhbGxzIG91dCByYXRoZXIgdGhhbiBmYWlsaW5nIHNpbGVudGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyTmFtZShwYXJhbXM6IFJlcGFpck5hbWVQYXJhbXMpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgcHJvZmlsZXMgPSBnZXRQcm9maWxlcyhwYXJhbXMucGxhdGZvcm1zKTtcblxuICBpZiAocHJvZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGJ1aWxkTmFtZShwYXJhbXMuYmFzZW5hbWUsIHBhcmFtcy5leHRlbnNpb24pO1xuICB9XG5cbiAgbGV0IGJhc2VuYW1lID0gcGFyYW1zLmJhc2VuYW1lO1xuICBsZXQgZXh0ZW5zaW9uID0gcGFyYW1zLmV4dGVuc2lvbjtcblxuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgcHJvZmlsZXMpIHtcbiAgICBiYXNlbmFtZSA9IHJlcGxhY2VGb3JiaWRkZW5DaGFyYWN0ZXJzKGJhc2VuYW1lLCBwcm9maWxlLCBwYXJhbXMuZm9yYmlkZGVuQ2hhcmFjdGVyUmVwbGFjZW1lbnQpO1xuICAgIGV4dGVuc2lvbiA9IHJlcGxhY2VGb3JiaWRkZW5DaGFyYWN0ZXJzKGV4dGVuc2lvbiwgcHJvZmlsZSwgcGFyYW1zLmZvcmJpZGRlbkNoYXJhY3RlclJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIC8vIGBub3RlLm1kIGAgcGFyc2VzIGFzIGJhc2VuYW1lIGBub3RlYCArIGV4dGVuc2lvbiBgbWQgYCwgc28gdHJpbW1pbmcgb25seSB0aGUgYmFzZW5hbWUgd291bGQgbGVhdmUgdGhlXG4gIC8vIHRyYWlsaW5nIHNwYWNlIGV4YWN0bHkgd2hlcmUgV2luZG93cyByZWplY3RzIGl0IOKAlCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lLlxuICBleHRlbnNpb24gPSB0cmltVHJhaWxpbmdEb3RzQW5kU3BhY2VzKGV4dGVuc2lvbiwgcHJvZmlsZXMpO1xuXG4gIC8qXG4gICAqIFRyaW0gQkVGT1JFIHRoZSBkZS1yZXNlcnZpbmcgYmVsb3csIG5ldmVyIGFmdGVyLiBgaXNXaW5kb3dzUmVzZXJ2ZWROYW1lYCB0cmltcyBmb3IgaXRzIG93biBhbnN3ZXIsIHNvXG4gICAqIGBDT04gYCBpcyByZXBvcnRlZCByZXNlcnZlZCBlaXRoZXIgd2F5IOKAlCBidXQgdGhlIHVuZGVyc2NvcmUgaXMgYXBwZW5kZWQgdG8gd2hhdGV2ZXIgaXMgaGVyZSwgYW5kIGFuXG4gICAqIHVudHJpbW1lZCBgQ09OIGAgd291bGQgZGUtcmVzZXJ2ZSB0byBgQ09OIF9gIGluc3RlYWQgb2YgYENPTl9gLlxuICAgKi9cbiAgYmFzZW5hbWUgPSB0cmltVHJhaWxpbmdEb3RzQW5kU3BhY2VzKGJhc2VuYW1lLCBwcm9maWxlcyk7XG5cbiAgLypcbiAgICogVGhlIFJFQlVJTFQgbmFtZSwgbmV2ZXIgdGhlIGJhcmUgYmFzZW5hbWU6IGBwYXJhbXMuYmFzZW5hbWVgIGhhcyBhbHJlYWR5IGhhZCBpdHMgZXh0ZW5zaW9uIHNwbGl0IG9mZixcbiAgICogYW5kIHRoZSBsaWJyYXJ5IGRyb3BzIG9uZSBleHRlbnNpb24gb2YgaXRzIG93biwgc28gcGFzc2luZyB0aGUgYmFzZW5hbWUgd291bGQgc3RyaXAgYSBzZWNvbmQgc2VnbWVudFxuICAgKiBhbmQgY2FsbCBgQ09OLnhgICsgYG1kYCByZXNlcnZlZCDigJQgd2hpY2ggaXMgbm90IHdoYXQgdGhlIHJlcG9ydCBzYXlzIGFib3V0IGBDT04ueC5tZGAuXG4gICAqL1xuICBpZiAocHJvZmlsZXMuc29tZSgocHJvZmlsZSkgPT4gcHJvZmlsZS5oYXNXaW5kb3dzTmFtaW5nUnVsZXMpICYmIGlzV2luZG93c1Jlc2VydmVkTmFtZShidWlsZE5hbWUoYmFzZW5hbWUsIGV4dGVuc2lvbikpKSB7XG4gICAgLy8gQSB0cmFpbGluZyB1bmRlcnNjb3JlIHJhdGhlciB0aGFuIGEgcHJlZml4OiBpdCBrZWVwcyB0aGUgbmFtZSBzb3J0aW5nIHdoZXJlIHRoZSB1c2VyIGV4cGVjdHMgaXQuXG4gICAgYmFzZW5hbWUgKz0gJ18nO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXNwcmVhZCAtLSBDb2RlIHBvaW50cyBhcmUgZXhhY3RseSB0aGUgdW5pdCB3YW50ZWQ6IGN1dHRpbmcgYnkgVVRGLTE2IHVuaXQgd291bGQgc3BsaXQgYSBzdXJyb2dhdGUgcGFpciBhbmQgbGVhdmUgaGFsZiBhbiBlbW9qaS5cbiAgY29uc3QgY29kZVBvaW50cyA9IFsuLi5iYXNlbmFtZV07XG5cbiAgd2hpbGUgKGNvZGVQb2ludHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHRyaW1UcmFpbGluZ0RvdHNBbmRTcGFjZXMoY29kZVBvaW50cy5qb2luKCcnKSwgcHJvZmlsZXMpO1xuXG4gICAgaWYgKGNhbmRpZGF0ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkb2VzRml0RXZlcnlQcm9maWxlKGNhbmRpZGF0ZSwgZXh0ZW5zaW9uLCBwcm9maWxlcywgcGFyYW1zKSkge1xuICAgICAgcmV0dXJuIGJ1aWxkTmFtZShjYW5kaWRhdGUsIGV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgY29kZVBvaW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBidWlsZE5hbWUoYmFzZW5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9uID09PSAnJyA/IGJhc2VuYW1lIDogYCR7YmFzZW5hbWV9LiR7ZXh0ZW5zaW9ufWA7XG59XG5cbmZ1bmN0aW9uIGRvZXNGaXRFdmVyeVByb2ZpbGUoYmFzZW5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcsIHByb2ZpbGVzOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGVbXSwgcGFyYW1zOiBSZXBhaXJOYW1lUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5hbWUgPSBidWlsZE5hbWUoYmFzZW5hbWUsIGV4dGVuc2lvbik7XG4gIGNvbnN0IHBhdGggPSBwYXJhbXMucGFyZW50UGF0aCA9PT0gJycgPyBuYW1lIDogYCR7cGFyYW1zLnBhcmVudFBhdGh9LyR7bmFtZX1gO1xuXG4gIHJldHVybiBwcm9maWxlcy5ldmVyeSgocHJvZmlsZSkgPT4ge1xuICAgIGNvbnN0IG1heFBhdGhMZW5ndGggPSBwYXJhbXMuaXNGb2xkZXIgPyBwcm9maWxlLm1heEZvbGRlclBhdGhMZW5ndGggOiBwcm9maWxlLm1heEZpbGVQYXRoTGVuZ3RoO1xuICAgIGNvbnN0IGZ1bGxQYXRoTGVuZ3RoID0gcGFyYW1zLm1heFZhdWx0Um9vdFBhdGhMZW5ndGggKyAxICsgbWVhc3VyZShwYXRoLCBwcm9maWxlLnNob3VsZE1lYXN1cmVJbkJ5dGVzKTtcblxuICAgIHJldHVybiBtZWFzdXJlKG5hbWUsIHByb2ZpbGUuc2hvdWxkTWVhc3VyZUluQnl0ZXMpIDw9IHByb2ZpbGUubWF4TmFtZUxlbmd0aCAmJiBmdWxsUGF0aExlbmd0aCA8PSBtYXhQYXRoTGVuZ3RoO1xuICB9KTtcbn1cblxuLypcbiAqIEVhY2ggY2hhcmFjdGVyIG9uY2UsIGluIG9yZGVyIG9mIGZpcnN0IGFwcGVhcmFuY2UuIGBtYXRjaGAgb24gYSBgZ2AtZmxhZ2dlZCByZWdleHAgcmV0dXJucyBldmVyeSBtYXRjaCBhbmRcbiAqIGlnbm9yZXMgYGxhc3RJbmRleGAsIHNvIHRoZSBzaGFyZWQgY29uc3RhbnRzIGFyZSBzYWZlIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDaGFyYWN0ZXJzKG5hbWU6IHN0cmluZywgcmVnRXhwOiBSZWdFeHApOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChuYW1lLm1hdGNoKHJlZ0V4cCkpXTtcbn1cblxuZnVuY3Rpb24gZ2V0TmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICByZXR1cm4gc2xhc2hJbmRleCA9PT0gLTEgPyBwYXRoIDogcGF0aC5zbGljZShzbGFzaEluZGV4ICsgMSk7XG59XG5cbi8qXG4gKiBCb3RoIGZsYWdzIGV4cGxpY2l0bHk6IHRoZSBsaWJyYXJ5IGRlZmF1bHRzIGFuIG9taXR0ZWQgb25lIHRvIHRoZSBwbGF0Zm9ybSBSVU5OSU5HIHRoZSBjaGVjaywgd2hpY2ggd291bGQgbWFrZVxuICogdGhlIEFuZHJvaWQgcHJvZmlsZSdzIHZlcmRpY3QgZGVwZW5kIG9uIHdoZXJlIHRoZSBjaGVjayBydW5zIHJhdGhlciB0aGFuIG9uIHRoZSBwcm9maWxlLiBBbmRyb2lkJ3Mgc2hhcmVkXG4gKiBzdG9yYWdlIHJlZnVzZXMgYCogPyA8ID4gXCJgIHRvbzogT2JzaWRpYW4gU3luYyBpdHNlbGYgc2tpcHMgc3VjaCBhIHJlbW90ZSBuYW1lIG9uIEFuZHJvaWQuXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtRm9yYmlkZGVuQ2hhcmFjdGVyc1JlZ0V4cChwcm9maWxlOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGUpOiBSZWdFeHAge1xuICByZXR1cm4gZ2V0T3NVbnNhZmVQYXRoQ2hhcnNSZWdFeHAocHJvZmlsZS5oYXNXaW5kb3dzTmFtaW5nUnVsZXMsIHByb2ZpbGUucGxhdGZvcm0gPT09IFBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0uQW5kcm9pZCk7XG59XG5cbmZ1bmN0aW9uIGdldFByb2ZpbGVzKHBsYXRmb3JtczogcmVhZG9ubHkgUGF0aENvbXBhdGliaWxpdHlQbGF0Zm9ybVtdKTogUGF0aENvbXBhdGliaWxpdHlQcm9maWxlW10ge1xuICByZXR1cm4gcGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IFBBVEhfQ09NUEFUSUJJTElUWV9QUk9GSUxFU1twbGF0Zm9ybV0pO1xufVxuXG4vKlxuICogYHJlcGxhY2VgIHJhdGhlciB0aGFuIGB0ZXN0YDogdGhlIGxpYnJhcnkncyByZWdleHBzIGNhcnJ5IHRoZSBgZ2AgZmxhZywgYW5kIGB0ZXN0YCBvbiBhIGBnYC1mbGFnZ2VkIHJlZ2V4cFxuICogYWR2YW5jZXMgYGxhc3RJbmRleGAsIHNvIGNvbnNlY3V0aXZlIGNhbGxzIG9uIHRoZSBzYW1lIGNvbnN0YW50IGFuc3dlciBkaWZmZXJlbnRseS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUZvcmJpZGRlbkNoYXJhY3RlcnMoJHN0cmluZzogc3RyaW5nLCBwcm9maWxlOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvKlxuICAgKiBPbmUgcmVwbGFjZW1lbnQgcGVyIGZvcmJpZGRlbiBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gb25lIHBlciBydW46IGl0IGtlZXBzIHRoZSBuYW1lJ3MgdmlzdWFsIHN0cnVjdHVyZSxcbiAgICogd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgcmVwYWlyZWQgbmFtZSBzdGlsbCByZWNvZ25pemFibGUgdG8gd2hvZXZlciB3cm90ZSBpdC4gTm90aGluZyBpcyBsb3N0IGVpdGhlciB3YXkg4oCUXG4gICAqIHRoZSBvcmlnaW5hbCBuYW1lIGlzIHByZXNlcnZlZCBpbiB0aGUgbm90ZSdzIGZyb250bWF0dGVyLiBBIHJlcGxhY2VyIEZVTkNUSU9OLCBzbyBhIGAkJmAgaW4gdGhlXG4gICAqIHJlcGxhY2VtZW50IGlzIG5vdCBleHBhbmRlZCBhcyBhIGJhY2tyZWZlcmVuY2UuXG4gICAqL1xuICByZXR1cm4gJHN0cmluZ1xuICAgIC5yZXBsYWNlKGdldFBsYXRmb3JtRm9yYmlkZGVuQ2hhcmFjdGVyc1JlZ0V4cChwcm9maWxlKSwgKCkgPT4gcmVwbGFjZW1lbnQpXG4gICAgLnJlcGxhY2UoT0JTSURJQU5fVU5TQUZFX0ZJTEVOQU1FX0NIQVJTLCAoKSA9PiByZXBsYWNlbWVudCk7XG59XG5cbi8qXG4gKiBUaGUgcHJvZmlsZSBndWFyZCBpcyB0aGUgcGx1Z2luJ3MsIG5vdCB0aGUgbGlicmFyeSdzOiB0aGUgbGlicmFyeSBhbnN3ZXJzIGZvciBXaW5kb3dzIHVuY29uZGl0aW9uYWxseSwgYW5kXG4gKiB0aGlzIGRlY2lkZXMgd2hldGhlciBXaW5kb3dzIGlzIG9uZSBvZiB0aGUgcGxhdGZvcm1zIHRoZSB2YXVsdCBoYXMgdG8gc2F0aXNmeS5cbiAqL1xuZnVuY3Rpb24gdHJpbVRyYWlsaW5nRG90c0FuZFNwYWNlcygkc3RyaW5nOiBzdHJpbmcsIHByb2ZpbGVzOiBQYXRoQ29tcGF0aWJpbGl0eVByb2ZpbGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9maWxlcy5zb21lKChwcm9maWxlKSA9PiBwcm9maWxlLmhhc1dpbmRvd3NOYW1pbmdSdWxlcykgPyB0cmltV2luZG93c1RyYWlsaW5nQ2hhcnMoJHN0cmluZykgOiAkc3RyaW5nO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBY0Esc0JBQXlCO0FBRXpCLHdC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Q0FBQyxHQUFHLElBQUksSUFBSSxLQUFLLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFDeEM7QUFFQSxTQUFTLFFBQVEsTUFBc0I7QUFDckMsUUFBTSxhQUFhLEtBQUssWUFBWSxHQUFHO0FBQ3ZDLFNBQU8sZUFBZSxLQUFLLE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUM3RDtBQU9BLFNBQVMscUNBQXFDLFNBQTJDO0FBQ3ZGLGFBQU8sOENBQTJCLFFBQVEsdUJBQXVCLFFBQVEsYUFBYSx1QkFBaUM7QUFDekg7QUFFQSxTQUFTLFlBQVksV0FBNkU7QUFDaEcsU0FBTyxVQUFVLElBQUksQ0FBQyxhQUFhLDRCQUE0QixRQUFRLENBQUM7QUFDMUU7QUFNQSxTQUFTLDJCQUEyQixTQUFpQixTQUFtQyxhQUE2QjtBQU9uSCxTQUFPLFFBQ0osUUFBUSxxQ0FBcUMsT0FBTyxHQUFHLE1BQU0sV0FBVyxFQUN4RSxRQUFRLGtEQUFnQyxNQUFNLFdBQVc7QUFDOUQ7QUFNQSxTQUFTLDBCQUEwQixTQUFpQixVQUE4QztBQUNoRyxTQUFPLFNBQVMsS0FBSyxDQUFDLFlBQVksUUFBUSxxQkFBcUIsUUFBSSw0Q0FBeUIsT0FBTyxJQUFJO0FBQ3pHOyIsIm5hbWVzIjpbIlBhdGhDb21wYXRpYmlsaXR5UGxhdGZvcm0iLCJQYXRoQ29tcGF0aWJpbGl0eVZpb2xhdGlvblR5cGUiXX0=
|