@worktile/theia 3.0.8 → 3.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/bundles/worktile-theia.umd.js +14357 -14343
- package/bundles/worktile-theia.umd.js.map +1 -1
- package/components/color-select/color-select.component.d.ts +32 -32
- package/components/color-select/color-select.component.scss +107 -107
- package/components/column-resize/column-resize-notifier.d.ts +35 -35
- package/components/column-resize/column-resize.directive.d.ts +26 -26
- package/components/column-resize/column-resize.module.d.ts +14 -14
- package/components/column-resize/event-dispatcher.d.ts +31 -31
- package/components/column-resize/overlay-handle.component.d.ts +33 -33
- package/components/column-resize/resize-ref.d.ts +25 -25
- package/components/column-resize/resizing.store.d.ts +28 -28
- package/components/column-resize/selectors.d.ts +3 -3
- package/components/contextmenu/contextmenu.component.d.ts +22 -22
- package/components/conversion-hint/conversion-hint.component.d.ts +18 -18
- package/components/conversion-hint/conversion-hint.component.scss +11 -11
- package/components/element/element.component.d.ts +7 -7
- package/components/inline-toolbar/inline-toolbar.component.d.ts +26 -26
- package/components/nav-split-line/nav-split-line.component.d.ts +13 -13
- package/components/table-select/table-select.component.d.ts +20 -20
- package/components/table-select/table-select.component.scss +35 -35
- package/components/template/template.component.d.ts +15 -15
- package/components/text/text.component.d.ts +14 -14
- package/components/toolbar/toolbar.component.d.ts +65 -65
- package/components/toolbar-dropdown/toolbar-dropdown.component.d.ts +33 -33
- package/components/toolbar-dropdown/toolbar-dropdown.component.scss +0 -1
- package/components/toolbar-group/toolbar-group.component.d.ts +33 -33
- package/components/toolbar-group/toolbar-group.component.scss +17 -17
- package/components/toolbar-item/toolbar-item.component.d.ts +18 -18
- package/constants/auto-format-rules.d.ts +2 -2
- package/constants/code.d.ts +9 -9
- package/constants/color-select.d.ts +14 -14
- package/constants/default.d.ts +9 -9
- package/constants/error.d.ts +5 -5
- package/constants/index.d.ts +5 -5
- package/constants/node-types.d.ts +99 -99
- package/constants/selector.d.ts +2 -2
- package/constants/toolbar.d.ts +17 -17
- package/core/create-plugin.d.ts +2 -2
- package/core/create-toolbar.d.ts +5 -5
- package/core/index.d.ts +4 -4
- package/core/toolbar-item/base-toolbar-item.d.ts +29 -29
- package/core/utils/combine-plugins.d.ts +2 -2
- package/core/utils/flatten-deep-plugins.d.ts +6 -6
- package/core/utils/get-plugin-options.d.ts +2 -2
- package/core/utils/get-plugin.d.ts +2 -2
- package/core/utils/get-plugins.d.ts +2 -2
- package/core/utils/index.d.ts +10 -10
- package/core/utils/merge-array.d.ts +1 -1
- package/core/utils/merge-deep-plugins.d.ts +2 -2
- package/core/utils/merge-options.d.ts +2 -2
- package/core/utils/nested-structure-by-key.d.ts +2 -2
- package/core/utils/plugins-by-key.d.ts +2 -2
- package/core/with-theia.d.ts +4 -4
- package/custom-types.d.ts +131 -131
- package/editor.component.d.ts +92 -92
- package/editor.module.d.ts +98 -98
- package/esm2015/components/color-select/color-select.component.js +112 -112
- package/esm2015/components/column-resize/column-resize-notifier.js +31 -31
- package/esm2015/components/column-resize/column-resize.directive.js +98 -98
- package/esm2015/components/column-resize/column-resize.module.js +34 -34
- package/esm2015/components/column-resize/event-dispatcher.js +55 -55
- package/esm2015/components/column-resize/overlay-handle.component.js +139 -139
- package/esm2015/components/column-resize/resize-ref.js +25 -25
- package/esm2015/components/column-resize/resizing.store.js +154 -154
- package/esm2015/components/column-resize/selectors.js +4 -4
- package/esm2015/components/contextmenu/contextmenu.component.js +64 -64
- package/esm2015/components/conversion-hint/conversion-hint.component.js +59 -59
- package/esm2015/components/element/element.component.js +23 -23
- package/esm2015/components/inline-toolbar/inline-toolbar.component.js +126 -126
- package/esm2015/components/nav-split-line/nav-split-line.component.js +36 -36
- package/esm2015/components/table-select/table-select.component.js +53 -53
- package/esm2015/components/template/template.component.js +66 -66
- package/esm2015/components/text/text.component.js +57 -57
- package/esm2015/components/toolbar/toolbar.component.js +250 -250
- package/esm2015/components/toolbar-dropdown/toolbar-dropdown.component.js +132 -132
- package/esm2015/components/toolbar-group/toolbar-group.component.js +116 -116
- package/esm2015/components/toolbar-item/toolbar-item.component.js +64 -64
- package/esm2015/constants/auto-format-rules.js +166 -166
- package/esm2015/constants/code.js +88 -88
- package/esm2015/constants/color-select.js +61 -61
- package/esm2015/constants/default.js +9 -9
- package/esm2015/constants/error.js +7 -7
- package/esm2015/constants/index.js +5 -5
- package/esm2015/constants/node-types.js +132 -132
- package/esm2015/constants/selector.js +3 -3
- package/esm2015/constants/toolbar.js +69 -69
- package/esm2015/core/create-plugin.js +4 -4
- package/esm2015/core/create-toolbar.js +56 -56
- package/esm2015/core/index.js +4 -4
- package/esm2015/core/toolbar-item/base-toolbar-item.js +91 -91
- package/esm2015/core/utils/combine-plugins.js +9 -9
- package/esm2015/core/utils/flatten-deep-plugins.js +18 -18
- package/esm2015/core/utils/get-plugin-options.js +2 -2
- package/esm2015/core/utils/get-plugin.js +1 -1
- package/esm2015/core/utils/get-plugins.js +4 -4
- package/esm2015/core/utils/index.js +10 -10
- package/esm2015/core/utils/merge-array.js +17 -17
- package/esm2015/core/utils/merge-deep-plugins.js +13 -13
- package/esm2015/core/utils/merge-options.js +19 -19
- package/esm2015/core/utils/nested-structure-by-key.js +10 -10
- package/esm2015/core/utils/plugins-by-key.js +9 -9
- package/esm2015/core/with-theia.js +22 -22
- package/esm2015/custom-types.js +1 -1
- package/esm2015/editor.component.js +439 -439
- package/esm2015/editor.module.js +201 -201
- package/esm2015/interfaces/auto-format.js +1 -1
- package/esm2015/interfaces/editor.js +22 -22
- package/esm2015/interfaces/element.js +1 -1
- package/esm2015/interfaces/image.js +2 -2
- package/esm2015/interfaces/index.js +8 -8
- package/esm2015/interfaces/plugins/index.js +4 -4
- package/esm2015/interfaces/plugins/no-infer.js +1 -1
- package/esm2015/interfaces/plugins/plugin-key.js +39 -39
- package/esm2015/interfaces/plugins/plugins.js +1 -1
- package/esm2015/interfaces/plugins/with-override.js +1 -1
- package/esm2015/interfaces/reset-block-type-plugin-options.js +2 -2
- package/esm2015/interfaces/toolbar.js +11 -11
- package/esm2015/interfaces/upload.js +2 -2
- package/esm2015/interfaces/utility/index.js +3 -3
- package/esm2015/interfaces/utility/nested-structure-by-key.js +1 -1
- package/esm2015/interfaces/utility/override-by-key.js +1 -1
- package/esm2015/interfaces/utility/types.js +1 -1
- package/esm2015/interfaces/valid-children-types.js +35 -35
- package/esm2015/interfaces/view-base.js +21 -21
- package/esm2015/pipes.js +42 -42
- package/esm2015/plugins/align/align.editor.js +47 -47
- package/esm2015/plugins/align/align.plugin.js +63 -63
- package/esm2015/plugins/autoformat/autoformat.plugin.js +109 -109
- package/esm2015/plugins/autoformat/transforms/auto-format-block.js +14 -14
- package/esm2015/plugins/autoformat/transforms/auto-format-inline.js +77 -77
- package/esm2015/plugins/blockquote/blockquote.component.js +21 -21
- package/esm2015/plugins/blockquote/blockquote.editor.js +20 -20
- package/esm2015/plugins/blockquote/blockquote.plugin.js +70 -70
- package/esm2015/plugins/code/code.component.js +244 -244
- package/esm2015/plugins/code/code.editor.js +47 -47
- package/esm2015/plugins/code/code.plugin.js +41 -41
- package/esm2015/plugins/color/color.editor.js +44 -44
- package/esm2015/plugins/color/color.plugin.js +27 -27
- package/esm2015/plugins/color/toolbar-item.component.js +79 -79
- package/esm2015/plugins/common/auto-insert-data..js +77 -77
- package/esm2015/plugins/common/block-card.plugin.js +286 -286
- package/esm2015/plugins/common/get-fragment.plugin.js +24 -24
- package/esm2015/plugins/common/history.plugin.js +30 -30
- package/esm2015/plugins/common/move-selection.plugin.js +89 -89
- package/esm2015/plugins/common/remove-empty.plugin.js +59 -59
- package/esm2015/plugins/common/remove-void.plugin.js +56 -56
- package/esm2015/plugins/common/reset-type.plugin.js +34 -34
- package/esm2015/plugins/common/transforms.plugin.js +17 -17
- package/esm2015/plugins/deserializers/deserialize-html.plugin.js +38 -38
- package/esm2015/plugins/deserializers/deserialize-md.plugin.js +121 -121
- package/esm2015/plugins/font-size/font-size.editor.js +97 -97
- package/esm2015/plugins/heading/heading.editor.js +53 -53
- package/esm2015/plugins/heading/heading.plugin.js +84 -84
- package/esm2015/plugins/hr/hr.component.js +40 -40
- package/esm2015/plugins/hr/hr.editor.js +7 -7
- package/esm2015/plugins/hr/hr.plugin.js +41 -41
- package/esm2015/plugins/image/image.component.js +369 -369
- package/esm2015/plugins/image/image.editor.js +57 -57
- package/esm2015/plugins/image/image.plugin.js +57 -57
- package/esm2015/plugins/indent/indent.editor.js +72 -72
- package/esm2015/plugins/indent/indent.plugin.js +59 -59
- package/esm2015/plugins/indent/on-keydown-indent.js +53 -53
- package/esm2015/plugins/index.js +70 -70
- package/esm2015/plugins/inline-code/inline-code.component.js +21 -21
- package/esm2015/plugins/inline-code/inline-code.editor.js +48 -48
- package/esm2015/plugins/inline-code/inline-code.plugin.js +65 -65
- package/esm2015/plugins/link/edit/link-edit.component.js +108 -108
- package/esm2015/plugins/link/hover/link-hover.component.js +39 -39
- package/esm2015/plugins/link/link.component.js +162 -162
- package/esm2015/plugins/link/link.editor.js +66 -66
- package/esm2015/plugins/link/link.plugin.js +58 -58
- package/esm2015/plugins/link/link.types.js +12 -12
- package/esm2015/plugins/list/components/bulleted-list.component.js +33 -33
- package/esm2015/plugins/list/components/list-item.component.js +94 -94
- package/esm2015/plugins/list/components/numbered-list.component.js +39 -39
- package/esm2015/plugins/list/list.editor.js +125 -125
- package/esm2015/plugins/list/list.plugin.js +280 -280
- package/esm2015/plugins/list/normalizers/get-list-normalizer.js +39 -39
- package/esm2015/plugins/list/normalizers/normalize-list-item.js +19 -19
- package/esm2015/plugins/list/normalizers/normalize-no.js +42 -42
- package/esm2015/plugins/list/on-key-down-list.js +32 -32
- package/esm2015/plugins/list/queries/get-list-item-entry.js +27 -27
- package/esm2015/plugins/list/queries/get-list-item-sublist.js +12 -12
- package/esm2015/plugins/list/queries/get-list-types.js +5 -5
- package/esm2015/plugins/list/queries/get-start-list-item.js +26 -26
- package/esm2015/plugins/list/queries/has-list-in-list-item.js +27 -27
- package/esm2015/plugins/list/queries/is-in-list.js +5 -5
- package/esm2015/plugins/list/queries/is-list-nested.js +10 -10
- package/esm2015/plugins/list/queries/is-list.js +5 -5
- package/esm2015/plugins/list/queries/is-node-type-list.js +4 -4
- package/esm2015/plugins/list/queries/is-selection-at-list-item-start.js +12 -12
- package/esm2015/plugins/list/queries/is-selection-in-same-list-item.js +16 -16
- package/esm2015/plugins/list/queries/is-single-list-item.js +9 -9
- package/esm2015/plugins/list/transforms/insert-list-data.js +71 -71
- package/esm2015/plugins/list/transforms/insert-list-item.js +72 -72
- package/esm2015/plugins/list/transforms/move-list-item-down.js +41 -41
- package/esm2015/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.js +42 -42
- package/esm2015/plugins/list/transforms/move-list-item-sublist-items-to-list.js +29 -29
- package/esm2015/plugins/list/transforms/move-list-item-up.js +77 -77
- package/esm2015/plugins/list/transforms/unwrap-list.js +9 -9
- package/esm2015/plugins/list/types.js +2 -2
- package/esm2015/plugins/mark/mark.editor.js +28 -28
- package/esm2015/plugins/mark/mark.plugin.js +101 -101
- package/esm2015/plugins/node-id/node-id.plugin.js +68 -68
- package/esm2015/plugins/normalizers/insert-paragraph-nodes.js +28 -28
- package/esm2015/plugins/normalizers/remove-empty-nodes.js +17 -17
- package/esm2015/plugins/normalizers/trailing-node.plugin.js +33 -33
- package/esm2015/plugins/paint-format/paint-format.editor.js +122 -122
- package/esm2015/plugins/public-api.js +15 -15
- package/esm2015/plugins/quick-insert/components/quick-insert.component.js +101 -101
- package/esm2015/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.js +83 -83
- package/esm2015/plugins/quick-insert/quick-insert.editor.js +52 -52
- package/esm2015/plugins/quick-insert/quick-insert.plugin.js +74 -74
- package/esm2015/plugins/soft-break/soft-break.plugin.js +36 -36
- package/esm2015/plugins/soft-break/soft-break.types.js +1 -1
- package/esm2015/plugins/table/components/insert-mark/insert-mark.component.js +102 -102
- package/esm2015/plugins/table/components/row/row.component.js +46 -46
- package/esm2015/plugins/table/components/table.component.js +469 -469
- package/esm2015/plugins/table/components/td/td.component.js +698 -698
- package/esm2015/plugins/table/components/toolbar/table-options.component.js +67 -67
- package/esm2015/plugins/table/components/toolbar/table-toolbar.component.js +161 -161
- package/esm2015/plugins/table/table.editor.js +182 -182
- package/esm2015/plugins/table/table.plugin.js +423 -423
- package/esm2015/plugins/table/table.service.js +102 -102
- package/esm2015/plugins/table/table.store.js +479 -479
- package/esm2015/plugins/table/table.types.js +33 -33
- package/esm2015/plugins/table/toolbar-item.component.js +61 -61
- package/esm2015/plugins/table/transforms/clear-cell.js +11 -11
- package/esm2015/plugins/table/transforms/clear-table-node.js +27 -27
- package/esm2015/plugins/table/transforms/insert-column.js +57 -57
- package/esm2015/plugins/table/transforms/insert-row.js +42 -42
- package/esm2015/plugins/table/transforms/insert-table.js +14 -14
- package/esm2015/plugins/table/transforms/remove-column.js +51 -51
- package/esm2015/plugins/table/transforms/remove-row.js +50 -50
- package/esm2015/plugins/table/transforms/remove-table.js +49 -49
- package/esm2015/plugins/table/utils/add-columns.js +28 -28
- package/esm2015/plugins/table/utils/calc-anchor-position.js +24 -24
- package/esm2015/plugins/table/utils/calc-span.js +72 -72
- package/esm2015/plugins/table/utils/create-cell.js +19 -19
- package/esm2015/plugins/table/utils/create-row.js +12 -12
- package/esm2015/plugins/table/utils/create-table.js +13 -13
- package/esm2015/plugins/table/utils/get-base-height.js +22 -22
- package/esm2015/plugins/table/utils/get-select-cell-node.js +16 -16
- package/esm2015/plugins/table/utils/index.js +8 -8
- package/esm2015/plugins/table/utils/is-range-in-table.js +16 -16
- package/esm2015/plugins/table/utils/is-selection-in-table.js +11 -11
- package/esm2015/plugins/table/utils/is-virtual-key.js +13 -13
- package/esm2015/plugins/table/utils/merge-cell.js +90 -90
- package/esm2015/plugins/table/utils/next-path.js +5 -5
- package/esm2015/plugins/table/utils/normalize-table.js +30 -30
- package/esm2015/plugins/table/utils/remove-columns.js +23 -23
- package/esm2015/plugins/table/utils/set-menu-cell-invisibility.js +15 -15
- package/esm2015/plugins/table/utils/split-cell.js +31 -31
- package/esm2015/plugins/table/utils/table-position.js +242 -242
- package/esm2015/plugins/todo-item/todo-item.component.js +55 -55
- package/esm2015/plugins/todo-item/todo-item.editor.js +31 -31
- package/esm2015/plugins/todo-item/todo-item.plugin.js +78 -78
- package/esm2015/plugins/vertical-align/toolbar-item.component.js +89 -89
- package/esm2015/plugins/vertical-align/vertical-align.editor.js +54 -54
- package/esm2015/public-api.js +23 -23
- package/esm2015/queries/anchor-block-entry.js +13 -13
- package/esm2015/queries/anchor-block.js +6 -6
- package/esm2015/queries/anchor-inline-entry.js +10 -10
- package/esm2015/queries/find-descendant.js +47 -47
- package/esm2015/queries/find-node.js +45 -45
- package/esm2015/queries/find-path.js +28 -28
- package/esm2015/queries/get-above-by-type.js +10 -10
- package/esm2015/queries/get-above.js +9 -9
- package/esm2015/queries/get-anchor-block-entry.js +8 -8
- package/esm2015/queries/get-block-above.js +7 -7
- package/esm2015/queries/get-block-card-above.js +7 -7
- package/esm2015/queries/get-block-card-cursor.js +5 -5
- package/esm2015/queries/get-container-blocks.js +11 -11
- package/esm2015/queries/get-directly-parent.js +11 -11
- package/esm2015/queries/get-insert-elements-path.js +43 -43
- package/esm2015/queries/get-last-child-path.js +9 -9
- package/esm2015/queries/get-last-node.js +17 -17
- package/esm2015/queries/get-next-sibling-nodes.js +17 -17
- package/esm2015/queries/get-node.js +10 -10
- package/esm2015/queries/get-nodes-by-type.js +12 -12
- package/esm2015/queries/get-nodes.js +7 -7
- package/esm2015/queries/get-parent.js +12 -12
- package/esm2015/queries/get-plain-text.js +16 -16
- package/esm2015/queries/get-plugin-by-toolbar.js +12 -12
- package/esm2015/queries/get-point-before.js +62 -62
- package/esm2015/queries/get-point-from-location.js +15 -15
- package/esm2015/queries/get-previous-path.js +9 -9
- package/esm2015/queries/get-rang-from-block-start.js +16 -16
- package/esm2015/queries/get-range-before.js +17 -17
- package/esm2015/queries/get-selection-marks.js +19 -19
- package/esm2015/queries/get-selection-nodes-by-type.js +29 -29
- package/esm2015/queries/get-text.js +9 -9
- package/esm2015/queries/get-toolbar-disabled.js +13 -13
- package/esm2015/queries/index.js +59 -58
- package/esm2015/queries/is-across-blocks.js +7 -7
- package/esm2015/queries/is-ancestor-empty.js +6 -6
- package/esm2015/queries/is-ancestor.js +3 -3
- package/esm2015/queries/is-block-above-empty.js +11 -11
- package/esm2015/queries/is-block-active.js +7 -7
- package/esm2015/queries/is-block-card-cursor.js +4 -4
- package/esm2015/queries/is-block-text-empty-after-selection.js +31 -31
- package/esm2015/queries/is-collapsed.js +7 -7
- package/esm2015/queries/is-contain-nested-type.js +28 -28
- package/esm2015/queries/is-container-type.js +2 -2
- package/esm2015/queries/is-descendant.js +3 -3
- package/esm2015/queries/is-empty-content.js +15 -0
- package/esm2015/queries/is-empty-paragraph-by-path.js +7 -7
- package/esm2015/queries/is-empty-paragraph.js +11 -11
- package/esm2015/queries/is-first-child.js +5 -5
- package/esm2015/queries/is-include-types.js +11 -11
- package/esm2015/queries/is-node-type-in.js +9 -9
- package/esm2015/queries/is-node-type.js +15 -15
- package/esm2015/queries/is-paragraph.js +9 -9
- package/esm2015/queries/is-point-at-root.js +2 -2
- package/esm2015/queries/is-range-across-blocks.js +18 -18
- package/esm2015/queries/is-range-at-root.js +3 -3
- package/esm2015/queries/is-start.js +6 -6
- package/esm2015/queries/some-node.js +9 -9
- package/esm2015/services/color-select.service.js +49 -49
- package/esm2015/services/context.service.js +59 -59
- package/esm2015/services/table-contextmenu.service.js +189 -189
- package/esm2015/services/toolbar.service.js +47 -47
- package/esm2015/shortcuts/index.js +5 -5
- package/esm2015/shortcuts/mark.js +24 -24
- package/esm2015/transforms/apply-deep-to-nodes.js +21 -21
- package/esm2015/transforms/clear-marks.js +23 -23
- package/esm2015/transforms/close-conversion-hint.js +8 -8
- package/esm2015/transforms/delete-element.js +11 -11
- package/esm2015/transforms/handle-continual-delete-backward.js +17 -17
- package/esm2015/transforms/handle-continual-insert-break.js +19 -19
- package/esm2015/transforms/index.js +18 -18
- package/esm2015/transforms/insert-elements.js +34 -34
- package/esm2015/transforms/insert-paragraph.js +6 -6
- package/esm2015/transforms/merge-deep-to-nodes.js +8 -8
- package/esm2015/transforms/move-children.js +21 -21
- package/esm2015/transforms/on-keydown-reset-block-type.js +22 -22
- package/esm2015/transforms/set-end-selection.js +10 -10
- package/esm2015/transforms/set-marks.js +9 -9
- package/esm2015/transforms/set-node.js +5 -5
- package/esm2015/transforms/split-node.js +31 -31
- package/esm2015/transforms/un-hang-range.js +11 -11
- package/esm2015/transforms/un-wrap.js +11 -11
- package/esm2015/transforms/unwrap-nodes-by-type.js +11 -11
- package/esm2015/utils/auto-focus.js +13 -13
- package/esm2015/utils/auto-scroll-view.js +24 -24
- package/esm2015/utils/cast-array.js +7 -7
- package/esm2015/utils/common.js +2 -2
- package/esm2015/utils/create-empty-paragraph.js +14 -14
- package/esm2015/utils/data-transform.js +48 -48
- package/esm2015/utils/dom.js +46 -46
- package/esm2015/utils/editor-uuid.js +8 -8
- package/esm2015/utils/fragment.js +65 -65
- package/esm2015/utils/get-editable-element-height.js +6 -6
- package/esm2015/utils/get-toolbar-class.js +6 -6
- package/esm2015/utils/id-creator.js +11 -11
- package/esm2015/utils/index.js +13 -13
- package/esm2015/utils/is-clean-empty-paragraph.js +36 -36
- package/esm2015/utils/is-inline.js +9 -9
- package/esm2015/utils/lodash.js +3 -3
- package/esm2015/utils/match.js +29 -29
- package/esm2015/utils/merge-element-options.js +19 -19
- package/esm2015/utils/weak-maps.js +3 -3
- package/esm2015/worktile-theia.js +4 -4
- package/fesm2015/worktile-theia.js +13156 -13142
- package/fesm2015/worktile-theia.js.map +1 -1
- package/interfaces/auto-format.d.ts +64 -64
- package/interfaces/editor.d.ts +146 -146
- package/interfaces/element.d.ts +9 -9
- package/interfaces/image.d.ts +25 -25
- package/interfaces/index.d.ts +8 -8
- package/interfaces/plugins/index.d.ts +4 -4
- package/interfaces/plugins/no-infer.d.ts +1 -1
- package/interfaces/plugins/plugin-key.d.ts +48 -48
- package/interfaces/plugins/plugins.d.ts +45 -45
- package/interfaces/plugins/with-override.d.ts +7 -7
- package/interfaces/reset-block-type-plugin-options.d.ts +23 -23
- package/interfaces/toolbar.d.ts +64 -64
- package/interfaces/upload.d.ts +11 -11
- package/interfaces/utility/index.d.ts +3 -3
- package/interfaces/utility/nested-structure-by-key.d.ts +3 -3
- package/interfaces/utility/override-by-key.d.ts +3 -3
- package/interfaces/utility/types.d.ts +1 -1
- package/interfaces/valid-children-types.d.ts +9 -9
- package/interfaces/view-base.d.ts +9 -9
- package/package.json +1 -1
- package/pipes.d.ts +16 -16
- package/plugins/align/align.editor.d.ts +7 -7
- package/plugins/align/align.plugin.d.ts +2 -2
- package/plugins/autoformat/autoformat.plugin.d.ts +6 -6
- package/plugins/autoformat/transforms/auto-format-block.d.ts +5 -5
- package/plugins/autoformat/transforms/auto-format-inline.d.ts +9 -9
- package/plugins/blockquote/blockquote.component.d.ts +11 -11
- package/plugins/blockquote/blockquote.editor.d.ts +4 -4
- package/plugins/blockquote/blockquote.plugin.d.ts +2 -2
- package/plugins/code/code.component.d.ts +65 -65
- package/plugins/code/code.editor.d.ts +8 -8
- package/plugins/code/code.plugin.d.ts +2 -2
- package/plugins/color/color.editor.d.ts +8 -8
- package/plugins/color/color.plugin.d.ts +1 -1
- package/plugins/color/toolbar-item.component.d.ts +16 -16
- package/plugins/common/auto-insert-data..d.ts +2 -2
- package/plugins/common/block-card.plugin.d.ts +2 -2
- package/plugins/common/get-fragment.plugin.d.ts +6 -6
- package/plugins/common/history.plugin.d.ts +9 -9
- package/plugins/common/move-selection.plugin.d.ts +2 -2
- package/plugins/common/remove-empty.plugin.d.ts +2 -2
- package/plugins/common/remove-void.plugin.d.ts +2 -2
- package/plugins/common/reset-type.plugin.d.ts +2 -2
- package/plugins/common/transforms.plugin.d.ts +8 -8
- package/plugins/deserializers/deserialize-html.plugin.d.ts +2 -2
- package/plugins/deserializers/deserialize-md.plugin.d.ts +2 -2
- package/plugins/font-size/font-size.editor.d.ts +10 -10
- package/plugins/heading/heading.editor.d.ts +9 -9
- package/plugins/heading/heading.plugin.d.ts +7 -7
- package/plugins/hr/hr.component.d.ts +12 -12
- package/plugins/hr/hr.editor.d.ts +4 -4
- package/plugins/hr/hr.plugin.d.ts +2 -2
- package/plugins/image/image.component.d.ts +74 -74
- package/plugins/image/image.editor.d.ts +12 -12
- package/plugins/image/image.plugin.d.ts +7 -7
- package/plugins/indent/indent.editor.d.ts +10 -10
- package/plugins/indent/indent.plugin.d.ts +8 -8
- package/plugins/indent/on-keydown-indent.d.ts +3 -3
- package/plugins/index.d.ts +1 -1
- package/plugins/inline-code/inline-code.component.d.ts +9 -9
- package/plugins/inline-code/inline-code.editor.d.ts +7 -7
- package/plugins/inline-code/inline-code.plugin.d.ts +2 -2
- package/plugins/link/edit/link-edit.component.d.ts +36 -36
- package/plugins/link/hover/link-hover.component.d.ts +15 -15
- package/plugins/link/link.component.d.ts +39 -39
- package/plugins/link/link.editor.d.ts +7 -7
- package/plugins/link/link.plugin.d.ts +2 -2
- package/plugins/link/link.types.d.ts +9 -9
- package/plugins/list/components/bulleted-list.component.d.ts +15 -15
- package/plugins/list/components/list-item.component.d.ts +20 -20
- package/plugins/list/components/numbered-list.component.d.ts +16 -16
- package/plugins/list/list.editor.d.ts +12 -12
- package/plugins/list/list.plugin.d.ts +3 -3
- package/plugins/list/normalizers/get-list-normalizer.d.ts +6 -6
- package/plugins/list/normalizers/normalize-list-item.d.ts +5 -5
- package/plugins/list/normalizers/normalize-no.d.ts +2 -2
- package/plugins/list/on-key-down-list.d.ts +2 -2
- package/plugins/list/queries/get-list-item-entry.d.ts +10 -10
- package/plugins/list/queries/get-list-item-sublist.d.ts +6 -6
- package/plugins/list/queries/get-list-types.d.ts +2 -2
- package/plugins/list/queries/get-start-list-item.d.ts +8 -8
- package/plugins/list/queries/has-list-in-list-item.d.ts +15 -15
- package/plugins/list/queries/is-in-list.d.ts +2 -2
- package/plugins/list/queries/is-list-nested.d.ts +5 -5
- package/plugins/list/queries/is-list.d.ts +2 -2
- package/plugins/list/queries/is-node-type-list.d.ts +2 -2
- package/plugins/list/queries/is-selection-at-list-item-start.d.ts +5 -5
- package/plugins/list/queries/is-selection-in-same-list-item.d.ts +5 -5
- package/plugins/list/queries/is-single-list-item.d.ts +5 -5
- package/plugins/list/transforms/insert-list-data.d.ts +12 -12
- package/plugins/list/transforms/insert-list-item.d.ts +5 -5
- package/plugins/list/transforms/move-list-item-down.d.ts +6 -6
- package/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.d.ts +20 -20
- package/plugins/list/transforms/move-list-item-sublist-items-to-list.d.ts +19 -19
- package/plugins/list/transforms/move-list-item-up.d.ts +10 -10
- package/plugins/list/transforms/unwrap-list.d.ts +2 -2
- package/plugins/list/types.d.ts +7 -7
- package/plugins/mark/mark.editor.d.ts +8 -8
- package/plugins/mark/mark.plugin.d.ts +3 -3
- package/plugins/node-id/node-id.plugin.d.ts +8 -8
- package/plugins/normalizers/insert-paragraph-nodes.d.ts +7 -7
- package/plugins/normalizers/remove-empty-nodes.d.ts +7 -7
- package/plugins/normalizers/trailing-node.plugin.d.ts +9 -9
- package/plugins/paint-format/paint-format.editor.d.ts +8 -8
- package/plugins/public-api.d.ts +15 -15
- package/plugins/quick-insert/components/quick-insert.component.d.ts +28 -28
- package/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.d.ts +28 -28
- package/plugins/quick-insert/quick-insert.editor.d.ts +7 -7
- package/plugins/quick-insert/quick-insert.plugin.d.ts +10 -10
- package/plugins/soft-break/soft-break.plugin.d.ts +5 -5
- package/plugins/soft-break/soft-break.types.d.ts +8 -8
- package/plugins/table/components/insert-mark/insert-mark.component.d.ts +24 -24
- package/plugins/table/components/row/row.component.d.ts +14 -14
- package/plugins/table/components/table.component.d.ts +79 -79
- package/plugins/table/components/td/td.component.d.ts +95 -95
- package/plugins/table/components/toolbar/table-options.component.d.ts +20 -20
- package/plugins/table/components/toolbar/table-toolbar.component.d.ts +38 -38
- package/plugins/table/table.editor.d.ts +25 -25
- package/plugins/table/table.plugin.d.ts +3 -3
- package/plugins/table/table.service.d.ts +30 -30
- package/plugins/table/table.store.d.ts +71 -71
- package/plugins/table/table.types.d.ts +67 -67
- package/plugins/table/toolbar-item.component.d.ts +17 -17
- package/plugins/table/transforms/clear-cell.d.ts +6 -6
- package/plugins/table/transforms/clear-table-node.d.ts +6 -6
- package/plugins/table/transforms/insert-column.d.ts +12 -12
- package/plugins/table/transforms/insert-row.d.ts +6 -6
- package/plugins/table/transforms/insert-table.d.ts +6 -6
- package/plugins/table/transforms/remove-column.d.ts +3 -3
- package/plugins/table/transforms/remove-row.d.ts +3 -3
- package/plugins/table/transforms/remove-table.d.ts +3 -3
- package/plugins/table/utils/add-columns.d.ts +2 -2
- package/plugins/table/utils/calc-anchor-position.d.ts +6 -6
- package/plugins/table/utils/calc-span.d.ts +11 -11
- package/plugins/table/utils/create-cell.d.ts +16 -16
- package/plugins/table/utils/create-row.d.ts +7 -7
- package/plugins/table/utils/create-table.d.ts +7 -7
- package/plugins/table/utils/get-base-height.d.ts +9 -9
- package/plugins/table/utils/get-select-cell-node.d.ts +7 -7
- package/plugins/table/utils/index.d.ts +7 -7
- package/plugins/table/utils/is-range-in-table.d.ts +6 -6
- package/plugins/table/utils/is-selection-in-table.d.ts +6 -6
- package/plugins/table/utils/is-virtual-key.d.ts +1 -1
- package/plugins/table/utils/merge-cell.d.ts +21 -21
- package/plugins/table/utils/next-path.d.ts +2 -2
- package/plugins/table/utils/normalize-table.d.ts +2 -2
- package/plugins/table/utils/remove-columns.d.ts +2 -2
- package/plugins/table/utils/set-menu-cell-invisibility.d.ts +3 -3
- package/plugins/table/utils/split-cell.d.ts +4 -4
- package/plugins/table/utils/table-position.d.ts +97 -97
- package/plugins/todo-item/todo-item.component.d.ts +21 -21
- package/plugins/todo-item/todo-item.editor.d.ts +5 -5
- package/plugins/todo-item/todo-item.plugin.d.ts +5 -5
- package/plugins/vertical-align/toolbar-item.component.d.ts +25 -25
- package/plugins/vertical-align/vertical-align.editor.d.ts +7 -7
- package/public-api.d.ts +20 -20
- package/queries/anchor-block-entry.d.ts +2 -2
- package/queries/anchor-block.d.ts +2 -2
- package/queries/anchor-inline-entry.d.ts +2 -2
- package/queries/find-descendant.d.ts +10 -10
- package/queries/find-node.d.ts +15 -15
- package/queries/find-path.d.ts +6 -6
- package/queries/get-above-by-type.d.ts +6 -6
- package/queries/get-above.d.ts +6 -6
- package/queries/get-anchor-block-entry.d.ts +2 -2
- package/queries/get-block-above.d.ts +7 -7
- package/queries/get-block-card-above.d.ts +7 -7
- package/queries/get-block-card-cursor.d.ts +2 -2
- package/queries/get-container-blocks.d.ts +2 -2
- package/queries/get-directly-parent.d.ts +2 -2
- package/queries/get-insert-elements-path.d.ts +7 -7
- package/queries/get-last-child-path.d.ts +6 -6
- package/queries/get-last-node.d.ts +2 -2
- package/queries/get-next-sibling-nodes.d.ts +7 -7
- package/queries/get-node.d.ts +2 -2
- package/queries/get-nodes-by-type.d.ts +6 -6
- package/queries/get-nodes.d.ts +4 -4
- package/queries/get-parent.d.ts +7 -7
- package/queries/get-plain-text.d.ts +6 -6
- package/queries/get-plugin-by-toolbar.d.ts +3 -3
- package/queries/get-point-before.d.ts +38 -38
- package/queries/get-point-from-location.d.ts +5 -5
- package/queries/get-previous-path.d.ts +2 -2
- package/queries/get-rang-from-block-start.d.ts +9 -9
- package/queries/get-range-before.d.ts +7 -7
- package/queries/get-selection-marks.d.ts +12 -12
- package/queries/get-selection-nodes-by-type.d.ts +3 -3
- package/queries/get-text.d.ts +6 -6
- package/queries/get-toolbar-disabled.d.ts +4 -4
- package/queries/index.d.ts +58 -57
- package/queries/is-across-blocks.d.ts +2 -2
- package/queries/is-ancestor-empty.d.ts +5 -5
- package/queries/is-ancestor.d.ts +2 -2
- package/queries/is-block-above-empty.d.ts +5 -5
- package/queries/is-block-active.d.ts +3 -3
- package/queries/is-block-card-cursor.d.ts +2 -2
- package/queries/is-block-text-empty-after-selection.d.ts +7 -7
- package/queries/is-collapsed.d.ts +6 -6
- package/queries/is-contain-nested-type.d.ts +2 -2
- package/queries/is-container-type.d.ts +2 -2
- package/queries/is-descendant.d.ts +2 -2
- package/queries/is-empty-content.d.ts +2 -0
- package/queries/is-empty-paragraph-by-path.d.ts +2 -2
- package/queries/is-empty-paragraph.d.ts +2 -2
- package/queries/is-first-child.d.ts +5 -5
- package/queries/is-include-types.d.ts +3 -3
- package/queries/is-node-type-in.d.ts +6 -6
- package/queries/is-node-type.d.ts +6 -6
- package/queries/is-paragraph.d.ts +2 -2
- package/queries/is-point-at-root.d.ts +2 -2
- package/queries/is-range-across-blocks.d.ts +8 -8
- package/queries/is-range-at-root.d.ts +2 -2
- package/queries/is-start.d.ts +5 -5
- package/queries/some-node.d.ts +7 -7
- package/services/color-select.service.d.ts +20 -20
- package/services/context.service.d.ts +49 -49
- package/services/table-contextmenu.service.d.ts +25 -25
- package/services/toolbar.service.d.ts +9 -9
- package/shortcuts/index.d.ts +2 -2
- package/shortcuts/mark.d.ts +2 -2
- package/transforms/apply-deep-to-nodes.d.ts +12 -12
- package/transforms/clear-marks.d.ts +2 -2
- package/transforms/close-conversion-hint.d.ts +2 -2
- package/transforms/delete-element.d.ts +2 -2
- package/transforms/handle-continual-delete-backward.d.ts +3 -3
- package/transforms/handle-continual-insert-break.d.ts +3 -3
- package/transforms/index.d.ts +18 -18
- package/transforms/insert-elements.d.ts +2 -2
- package/transforms/insert-paragraph.d.ts +2 -2
- package/transforms/merge-deep-to-nodes.d.ts +5 -5
- package/transforms/move-children.d.ts +24 -24
- package/transforms/on-keydown-reset-block-type.d.ts +3 -3
- package/transforms/set-end-selection.d.ts +2 -2
- package/transforms/set-marks.d.ts +12 -12
- package/transforms/set-node.d.ts +2 -2
- package/transforms/split-node.d.ts +3 -3
- package/transforms/un-hang-range.d.ts +10 -10
- package/transforms/un-wrap.d.ts +3 -3
- package/transforms/unwrap-nodes-by-type.d.ts +6 -6
- package/utils/auto-focus.d.ts +2 -2
- package/utils/auto-scroll-view.d.ts +6 -6
- package/utils/cast-array.d.ts +1 -1
- package/utils/common.d.ts +2 -2
- package/utils/create-empty-paragraph.d.ts +2 -2
- package/utils/data-transform.d.ts +6 -6
- package/utils/dom.d.ts +10 -10
- package/utils/editor-uuid.d.ts +3 -3
- package/utils/fragment.d.ts +10 -10
- package/utils/get-editable-element-height.d.ts +2 -2
- package/utils/get-toolbar-class.d.ts +2 -2
- package/utils/id-creator.d.ts +1 -1
- package/utils/index.d.ts +13 -13
- package/utils/is-clean-empty-paragraph.d.ts +9 -9
- package/utils/is-inline.d.ts +2 -2
- package/utils/lodash.d.ts +1 -1
- package/utils/match.d.ts +18 -18
- package/utils/merge-element-options.d.ts +2 -2
- package/utils/weak-maps.d.ts +5 -5
- package/worktile-theia.d.ts +5 -5
|
@@ -1,470 +1,470 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Component, ElementRef, ViewChild, HostListener } from '@angular/core';
|
|
3
|
-
import { fromEvent, Subject } from 'rxjs';
|
|
4
|
-
import { take, takeUntil, debounceTime } from 'rxjs/operators';
|
|
5
|
-
import { Transforms } from 'slate';
|
|
6
|
-
import { AngularEditor } from 'slate-angular';
|
|
7
|
-
import { TablePosition } from '../utils';
|
|
8
|
-
import { ColumnResizeNotifierSource } from '../../../components/column-resize/column-resize-notifier';
|
|
9
|
-
import { TableCellEventDispatcher } from '../../../components/column-resize/event-dispatcher';
|
|
10
|
-
import { TableStore } from '../table.store';
|
|
11
|
-
import { getElementHeight, getElementWidth } from '../../../utils/dom';
|
|
12
|
-
import { TableService } from '../table.service';
|
|
13
|
-
import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
|
|
14
|
-
import { TheBaseElementComponent } from '../../../interfaces/view-base';
|
|
15
|
-
import { TableOptions, TheTableToken } from '../table.types';
|
|
16
|
-
import { TheEditor } from '../../../interfaces/editor';
|
|
17
|
-
import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
|
|
18
|
-
import * as TheTransforms from '../../../transforms';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "../../../components/column-resize/event-dispatcher";
|
|
21
|
-
import * as i2 from "../../../components/column-resize/column-resize-notifier";
|
|
22
|
-
import * as i3 from "../table.store";
|
|
23
|
-
import * as i4 from "../table.service";
|
|
24
|
-
import * as i5 from "../../../services/context.service";
|
|
25
|
-
import * as i6 from "../../../services/table-contextmenu.service";
|
|
26
|
-
import * as i7 from "./insert-mark/insert-mark.component";
|
|
27
|
-
import * as i8 from "slate-angular";
|
|
28
|
-
import * as i9 from "../../../components/column-resize/column-resize.directive";
|
|
29
|
-
import * as i10 from "@angular/common";
|
|
30
|
-
export class TheTableComponent extends TheBaseElementComponent {
|
|
31
|
-
constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theContextService, theTableContextMenuService) {
|
|
32
|
-
super(elementRef, cdr);
|
|
33
|
-
this.eventDispatcher = eventDispatcher;
|
|
34
|
-
this.resizeNotifier = resizeNotifier;
|
|
35
|
-
this.tableStore = tableStore;
|
|
36
|
-
this.cdr = cdr;
|
|
37
|
-
this.ngZone = ngZone;
|
|
38
|
-
this.tableService = tableService;
|
|
39
|
-
this.theContextService = theContextService;
|
|
40
|
-
this.theTableContextMenuService = theTableContextMenuService;
|
|
41
|
-
this.destroy$ = new Subject();
|
|
42
|
-
this.rowControls = [];
|
|
43
|
-
this.colControls = [];
|
|
44
|
-
}
|
|
45
|
-
get columns() {
|
|
46
|
-
return this.normalizedColumns || (this.element && this.element.columns);
|
|
47
|
-
}
|
|
48
|
-
get nativeElement() {
|
|
49
|
-
return this.elementRef.nativeElement;
|
|
50
|
-
}
|
|
51
|
-
get tbodyNativeElement() {
|
|
52
|
-
var _a;
|
|
53
|
-
return (_a = this.tbodyElement) === null || _a === void 0 ? void 0 : _a.nativeElement;
|
|
54
|
-
}
|
|
55
|
-
get isSelectedAllCell() {
|
|
56
|
-
return (this.tableStore.selectedRowsIndex.length === this.rowControls.length &&
|
|
57
|
-
this.tableStore.selectedColumnsIndex.length === this.colControls.length);
|
|
58
|
-
}
|
|
59
|
-
handleMousedown(event) {
|
|
60
|
-
if (event.target instanceof Element && this.tbodyNativeElement.contains(event.target)) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
if (!TheEditor.isFocused(this.editor)) {
|
|
64
|
-
TheEditor.focus(this.editor);
|
|
65
|
-
}
|
|
66
|
-
AngularEditor.moveBlockCard(this.editor, this.element, { direction: 'left' });
|
|
67
|
-
event.preventDefault();
|
|
68
|
-
}
|
|
69
|
-
onContextChange() {
|
|
70
|
-
super.onContextChange();
|
|
71
|
-
if (this.initialized) {
|
|
72
|
-
Promise.resolve().then(() => {
|
|
73
|
-
this.tableStore.emitTableChange();
|
|
74
|
-
this.useRowControls();
|
|
75
|
-
this.cdr.markForCheck();
|
|
76
|
-
});
|
|
77
|
-
this.getIsInTable();
|
|
78
|
-
this.getColControls();
|
|
79
|
-
if (this.normalizedColumns) {
|
|
80
|
-
this.normalizeShowColumns();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
ngOnInit() {
|
|
85
|
-
super.ngOnInit();
|
|
86
|
-
this.getColControls();
|
|
87
|
-
this.getIsInTable();
|
|
88
|
-
}
|
|
89
|
-
ngAfterViewInit() {
|
|
90
|
-
this.ngZone.onStable.pipe(take(1)).subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
91
|
-
var _a;
|
|
92
|
-
const blockCardElement = this.nativeElement.closest('slate-block-card');
|
|
93
|
-
if (blockCardElement) {
|
|
94
|
-
blockCardElement.classList.add(`slate-block-card-${this.element.type}`);
|
|
95
|
-
}
|
|
96
|
-
this.tableStore.initEditor(this.editor);
|
|
97
|
-
this.subscribeCellsChange();
|
|
98
|
-
this.subscribeCellPositionChange();
|
|
99
|
-
this.listenTableContextMenuEvent();
|
|
100
|
-
this.useTableWrapperWidth();
|
|
101
|
-
if ((_a = this.element.options) === null || _a === void 0 ? void 0 : _a.numberedColumn) {
|
|
102
|
-
const loadImageDone = yield this.resolveImage();
|
|
103
|
-
// 等待序号列表格内图片加载完成后再去渲染表格行高度
|
|
104
|
-
if (loadImageDone) {
|
|
105
|
-
this.useRowControls();
|
|
106
|
-
this.cdr.detectChanges();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
this.useRowControls();
|
|
111
|
-
this.cdr.markForCheck();
|
|
112
|
-
}
|
|
113
|
-
}));
|
|
114
|
-
}
|
|
115
|
-
subscribeCellPositionChange() {
|
|
116
|
-
this.tableStore
|
|
117
|
-
.cellsPositionChange()
|
|
118
|
-
.pipe(debounceTime(100), takeUntil(this.destroy$))
|
|
119
|
-
.subscribe(x => {
|
|
120
|
-
this.cdr.detectChanges();
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
useTableWrapperWidth() {
|
|
124
|
-
const rootWidth = this.theContextService.getOptions().width;
|
|
125
|
-
const tablePath = TheEditor.findPath(this.editor, this.element);
|
|
126
|
-
if (tablePath.length > 1) {
|
|
127
|
-
// 解决table不在顶层时,拖动单元格宽度计算问题
|
|
128
|
-
this.theTableWrapperWidth = this.tableWrapper.nativeElement.offsetWidth;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
this.theTableWrapperWidth = rootWidth;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
subscribeCellsChange() {
|
|
135
|
-
this.tableStore
|
|
136
|
-
.dangerousOrSelectedCellsChange()
|
|
137
|
-
.pipe(takeUntil(this.destroy$))
|
|
138
|
-
.subscribe(() => {
|
|
139
|
-
this.cdr.detectChanges();
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
useRowControls() {
|
|
143
|
-
var _a;
|
|
144
|
-
if (this.selection || ((_a = this.element.options) === null || _a === void 0 ? void 0 : _a.numberedColumn)) {
|
|
145
|
-
this.rowControls = this.calculateRowControls();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
detectChanges() {
|
|
149
|
-
this.cdr.detectChanges();
|
|
150
|
-
}
|
|
151
|
-
calculateMinRowSpanCellForRows() {
|
|
152
|
-
const table = this.element;
|
|
153
|
-
const cells = table.children.map((row, index) => {
|
|
154
|
-
const noHiddenCells = row.children.filter(cell => !cell.hidden);
|
|
155
|
-
if (noHiddenCells.length > 0) {
|
|
156
|
-
const minRowspan = Math.min.apply(Math, noHiddenCells.map(cell => {
|
|
157
|
-
return cell.rowspan || 1;
|
|
158
|
-
}));
|
|
159
|
-
const cell = row.children.find(item => !item.hidden && (item.rowspan || 1) === minRowspan);
|
|
160
|
-
return {
|
|
161
|
-
cell,
|
|
162
|
-
rowIndex: index
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
return {
|
|
167
|
-
rowIndex: index
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
return cells;
|
|
172
|
-
}
|
|
173
|
-
calculateRowControls() {
|
|
174
|
-
const minRowSpanCellForRows = this.calculateMinRowSpanCellForRows();
|
|
175
|
-
const rowControls = [];
|
|
176
|
-
let previousRowIndex = 0;
|
|
177
|
-
let previousCombineRowIndex = 0;
|
|
178
|
-
minRowSpanCellForRows.forEach((cellInfo, index) => {
|
|
179
|
-
if (!cellInfo.cell) {
|
|
180
|
-
rowControls.push({
|
|
181
|
-
height: 0,
|
|
182
|
-
rowIndex: index
|
|
183
|
-
});
|
|
184
|
-
previousCombineRowIndex = index;
|
|
185
|
-
if (index === minRowSpanCellForRows.length - 1) {
|
|
186
|
-
this.calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls);
|
|
187
|
-
}
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
// calculate combine row height
|
|
191
|
-
if (previousCombineRowIndex > previousRowIndex) {
|
|
192
|
-
this.calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls);
|
|
193
|
-
previousCombineRowIndex = 0;
|
|
194
|
-
}
|
|
195
|
-
const cellDom = AngularEditor.toDOMNode(this.editor, cellInfo.cell);
|
|
196
|
-
let height = getElementHeight(cellDom);
|
|
197
|
-
// 当cell为合并的单元格(rowspan > 1),计算其实际高度(当前单元格的高度 - 下方合并单元格的高度)
|
|
198
|
-
if (cellInfo.cell.rowspan > 1) {
|
|
199
|
-
const calcHeight = height - this.getBelowRowHeight(minRowSpanCellForRows, index, cellInfo.rowIndex, cellInfo.cell.rowspan);
|
|
200
|
-
rowControls.push({
|
|
201
|
-
height: calcHeight,
|
|
202
|
-
rowIndex: cellInfo.rowIndex
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
rowControls.push({
|
|
207
|
-
height,
|
|
208
|
-
rowIndex: cellInfo.rowIndex
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
previousRowIndex = index;
|
|
212
|
-
});
|
|
213
|
-
return rowControls;
|
|
214
|
-
}
|
|
215
|
-
calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls) {
|
|
216
|
-
const rowControl = rowControls[previousRowIndex];
|
|
217
|
-
const count = previousCombineRowIndex - previousRowIndex;
|
|
218
|
-
const avgHeight = Math.floor(rowControl.height / (count + 1));
|
|
219
|
-
const firstHeight = rowControl.height - avgHeight * count;
|
|
220
|
-
rowControl.height = firstHeight;
|
|
221
|
-
rowControls
|
|
222
|
-
.filter((item, _index) => _index > previousRowIndex && _index <= previousCombineRowIndex)
|
|
223
|
-
.forEach(rowControl => {
|
|
224
|
-
rowControl.height = avgHeight;
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
getBelowRowHeight(cells, index, rowIndex, rowspan) {
|
|
228
|
-
let belowRowlHeight = 0;
|
|
229
|
-
cells.slice(index + 1, cells.length).map(item => {
|
|
230
|
-
if (!item.cell) {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
if (rowIndex + rowspan > item.rowIndex) {
|
|
234
|
-
const cellDom = AngularEditor.toDOMNode(this.editor, item.cell);
|
|
235
|
-
if (item.cell.rowspan > 1) {
|
|
236
|
-
// 如果下方单元格的rowspan > 1,递归计算
|
|
237
|
-
const height = this.getBelowRowHeight(cells, cells.findIndex(cell => cell.rowIndex === item.rowIndex), item.rowIndex, item.cell.rowspan);
|
|
238
|
-
belowRowlHeight += getElementHeight(cellDom) - height;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
belowRowlHeight += getElementHeight(cellDom);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
return belowRowlHeight;
|
|
246
|
-
}
|
|
247
|
-
resolveImage() {
|
|
248
|
-
const imageElements = this.nativeElement.querySelectorAll('img');
|
|
249
|
-
if (imageElements.length) {
|
|
250
|
-
const imageResolves = [];
|
|
251
|
-
imageElements.forEach(item => {
|
|
252
|
-
const image = new Image();
|
|
253
|
-
const imageLoad = new Promise(resolve => {
|
|
254
|
-
image.onload = () => {
|
|
255
|
-
resolve(true);
|
|
256
|
-
};
|
|
257
|
-
image.onerror = () => {
|
|
258
|
-
resolve(true);
|
|
259
|
-
};
|
|
260
|
-
image.src = item.getAttribute('src');
|
|
261
|
-
});
|
|
262
|
-
imageResolves.push(imageLoad);
|
|
263
|
-
});
|
|
264
|
-
return Promise.all(imageResolves);
|
|
265
|
-
}
|
|
266
|
-
return Promise.resolve(true);
|
|
267
|
-
}
|
|
268
|
-
getColControls() {
|
|
269
|
-
var _a, _b;
|
|
270
|
-
this.colControls = ((_b = (_a = this.element) === null || _a === void 0 ? void 0 : _a.children[0]) === null || _b === void 0 ? void 0 : _b.children) || [];
|
|
271
|
-
}
|
|
272
|
-
onColMouseDown(event, index) {
|
|
273
|
-
event.stopPropagation();
|
|
274
|
-
event.preventDefault();
|
|
275
|
-
if (!!this.selection && this.isInTable) {
|
|
276
|
-
this.tableStore.clearDangerousCells();
|
|
277
|
-
this.tableStore.selectColumn(this.editor, index);
|
|
278
|
-
this.tableService.openToolbar(event.target, true);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
getIsInTable() {
|
|
282
|
-
if (this.selection) {
|
|
283
|
-
const opts = new TableOptions();
|
|
284
|
-
const selection = this.editor.selection;
|
|
285
|
-
const startPosition = TablePosition.create(opts, this.editor, selection.anchor.path);
|
|
286
|
-
const endPosition = TablePosition.create(opts, this.editor, selection.focus.path);
|
|
287
|
-
this.isInTable = startPosition.isInTable() && endPosition.isInTable();
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
this.isInTable = false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
normalizeShowColumns() {
|
|
294
|
-
const table = this.element;
|
|
295
|
-
const tr = table.children[0];
|
|
296
|
-
if (this.element.columns) {
|
|
297
|
-
let isGood = true;
|
|
298
|
-
this.normalizedColumns = table.columns.map(item => {
|
|
299
|
-
return Object.assign({}, item);
|
|
300
|
-
});
|
|
301
|
-
if (this.element.columns.length !== tr.children.length) {
|
|
302
|
-
this.normalizedColumns = tr.children.map((item, i) => this.columns[i] || { width: 200 });
|
|
303
|
-
isGood = false;
|
|
304
|
-
}
|
|
305
|
-
const totalWidth = this.normalizedColumns.reduce((pre, cur) => {
|
|
306
|
-
return pre + cur.width;
|
|
307
|
-
}, 0);
|
|
308
|
-
if (totalWidth < this.theTableWrapperWidth) {
|
|
309
|
-
const lastColumnWidth = this.theTableWrapperWidth - totalWidth + this.normalizedColumns[this.normalizedColumns.length - 1].width;
|
|
310
|
-
this.normalizedColumns[this.normalizedColumns.length - 1] = { width: lastColumnWidth };
|
|
311
|
-
isGood = false;
|
|
312
|
-
}
|
|
313
|
-
if (isGood) {
|
|
314
|
-
this.normalizedColumns = null;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
initializeColumns() {
|
|
319
|
-
if (!this.element.columns) {
|
|
320
|
-
const tr = this.element.children[0];
|
|
321
|
-
const tableWidth = AngularEditor.toDOMNode(this.editor, tr).offsetWidth;
|
|
322
|
-
const columns = tr.children.map(cell => {
|
|
323
|
-
return { width: Math.round(tableWidth / tr.children.length) - tr.children.length };
|
|
324
|
-
});
|
|
325
|
-
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
initializeRows() {
|
|
329
|
-
this.element.children.map(row => {
|
|
330
|
-
if (!row.height) {
|
|
331
|
-
const element = TheEditor.toDOMNode(this.editor, row);
|
|
332
|
-
TheTransforms.setNode(this.editor, { height: getElementHeight(element) }, row);
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
transformRowHeight() {
|
|
337
|
-
const rowElements = this.nativeElement.querySelector('tbody').children;
|
|
338
|
-
if (rowElements) {
|
|
339
|
-
[...rowElements].map((row, index) => {
|
|
340
|
-
const height = getElementHeight(row);
|
|
341
|
-
TheTransforms.setNode(this.editor, { height }, this.element.children[index]);
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
transformColumnsWidth() {
|
|
346
|
-
const cols = [...this.nativeElement.querySelector('colgroup').children];
|
|
347
|
-
const columns = cols.map(col => {
|
|
348
|
-
return { width: getElementWidth(col) };
|
|
349
|
-
});
|
|
350
|
-
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
351
|
-
}
|
|
352
|
-
onRowMouseDown(event, index) {
|
|
353
|
-
if (this.readonly)
|
|
354
|
-
return;
|
|
355
|
-
event.stopPropagation();
|
|
356
|
-
event.preventDefault();
|
|
357
|
-
if (!this.isInTable) {
|
|
358
|
-
const path = TheEditor.findPath(this.editor, this.element);
|
|
359
|
-
Transforms.select(this.editor, path);
|
|
360
|
-
}
|
|
361
|
-
this.tableStore.selectRow(this.editor, index);
|
|
362
|
-
this.tableService.openToolbar(event.target, true);
|
|
363
|
-
}
|
|
364
|
-
onSelectTable(event) {
|
|
365
|
-
event.stopPropagation();
|
|
366
|
-
event.preventDefault();
|
|
367
|
-
this.tableStore.selectTable(this.editor);
|
|
368
|
-
this.tableService.openToolbar(event.target);
|
|
369
|
-
}
|
|
370
|
-
listenTableContextMenuEvent() {
|
|
371
|
-
this.ngZone.runOutsideAngular(() => {
|
|
372
|
-
fromEvent(this.theTableElement.nativeElement, 'contextmenu')
|
|
373
|
-
.pipe(takeUntil(this.destroy$))
|
|
374
|
-
.subscribe(event => {
|
|
375
|
-
if (this.readonly) {
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
event.preventDefault();
|
|
379
|
-
this.tableStore.isRightClicking = true;
|
|
380
|
-
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
381
|
-
if (!cell) {
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
if (!cell.classList.contains('selected-cell')) {
|
|
386
|
-
this.tableStore.selectCell(cell, this.editor);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
if (this.theTableContextMenuService.isOpened) {
|
|
390
|
-
this.theTableContextMenuService
|
|
391
|
-
.closeContextMenu()
|
|
392
|
-
.pipe(take(1))
|
|
393
|
-
.subscribe(() => {
|
|
394
|
-
this.theTableContextMenuService.openMenuList(event);
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
else if (this.tableService.isOpened) {
|
|
398
|
-
this.tableService
|
|
399
|
-
.closeToolbar()
|
|
400
|
-
.pipe(take(1))
|
|
401
|
-
.subscribe(() => {
|
|
402
|
-
this.theTableContextMenuService.openMenuList(event);
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
else {
|
|
406
|
-
this.cdr.markForCheck();
|
|
407
|
-
this.theTableContextMenuService.openMenuList(event);
|
|
408
|
-
}
|
|
409
|
-
// patch for right click select next cell
|
|
410
|
-
setTimeout(() => {
|
|
411
|
-
Transforms.select(this.editor, this.editor.selection.anchor.path);
|
|
412
|
-
});
|
|
413
|
-
});
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
trackByFnRowControls(index) {
|
|
417
|
-
return index;
|
|
418
|
-
}
|
|
419
|
-
trackByFnColControls(index) {
|
|
420
|
-
return index;
|
|
421
|
-
}
|
|
422
|
-
ngOnDestroy() {
|
|
423
|
-
super.ngOnDestroy();
|
|
424
|
-
this.destroy$.next();
|
|
425
|
-
this.destroy$.complete();
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i2.ColumnResizeNotifierSource }, { token: i3.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i4.TableService }, { token: i5.TheContextService }, { token: i6.TheTableContextMenuService }], target: i0.ɵɵFactoryTarget.Component });
|
|
429
|
-
TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" } }, providers: [
|
|
430
|
-
TableStore,
|
|
431
|
-
TableService,
|
|
432
|
-
TheTableContextMenuService,
|
|
433
|
-
TableCellEventDispatcher,
|
|
434
|
-
ColumnResizeNotifierSource,
|
|
435
|
-
{
|
|
436
|
-
provide: TheTableToken,
|
|
437
|
-
useExisting: TheTableComponent
|
|
438
|
-
}
|
|
439
|
-
], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, ngImport: i0, template: "<!-- \u7C7B\u540D the-temp-*: \u4E34\u65F6\u89E3\u51B3\u56E0\u53D7portal\u5F71\u54CD\u8868\u683C\u6837\u5F0F\u95EE\u9898\uFF0C\u540E\u671F\u6539\u56DEthe-* -->\n<div\n class=\"the-temp-table-container\"\n theColumnResize\n [ngClass]=\"{\n 'the-temp-table-with-controls': isInTable,\n 'the-temp-numbered-column-container': element?.options?.numberedColumn,\n 'the-temp-table-selection-hide': tableStore.isCellSelecting || tableStore.isRightClicking\n }\"\n>\n <div\n class=\"the-temp-table-row-controls-wrapper\"\n [ngClass]=\"{\n 'the-temp-table-focus': isInTable\n }\"\n >\n <div\n class=\"the-temp-table-corner-controls\"\n [ngClass]=\"{\n visible: !readonly && isInTable,\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-temp-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-temp-table-corner-controls-insert-row-marker\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-temp-table-corner-controls-insert-column-marker\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-temp-table-row-controls\">\n <div class=\"the-temp-table-row-controls-inner\">\n <div\n class=\"the-temp-table-row-controls-button-wrap\"\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && isInTable && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-temp-table-row-controls-button the-temp-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n class=\"the-temp-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-temp-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-temp-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-temp-table\" #theTable [ngClass]=\"{ 'the-temp-table-with-controls': isInTable }\">\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-temp-table-col-controls-wrapper\">\n <th\n class=\"the-temp-table-col-controls\"\n [ngClass]=\"{\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMouseDown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark *ngIf=\"isInTable\" type=\"column\" [at]=\"i + 1\" [tableStore]=\"tableStore\">\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n", components: [{ type: i7.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore"] }, { type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }], directives: [{ type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
440
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TheTableComponent, decorators: [{
|
|
441
|
-
type: Component,
|
|
442
|
-
args: [{
|
|
443
|
-
selector: 'the-table, [theTable]',
|
|
444
|
-
templateUrl: './table.component.html',
|
|
445
|
-
providers: [
|
|
446
|
-
TableStore,
|
|
447
|
-
TableService,
|
|
448
|
-
TheTableContextMenuService,
|
|
449
|
-
TableCellEventDispatcher,
|
|
450
|
-
ColumnResizeNotifierSource,
|
|
451
|
-
{
|
|
452
|
-
provide: TheTableToken,
|
|
453
|
-
useExisting: TheTableComponent
|
|
454
|
-
}
|
|
455
|
-
]
|
|
456
|
-
}]
|
|
457
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i2.ColumnResizeNotifierSource }, { type: i3.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i4.TableService }, { type: i5.TheContextService }, { type: i6.TheTableContextMenuService }]; }, propDecorators: { tableWrapper: [{
|
|
458
|
-
type: ViewChild,
|
|
459
|
-
args: ['tableWrapper', { read: ElementRef, static: true }]
|
|
460
|
-
}], theTableElement: [{
|
|
461
|
-
type: ViewChild,
|
|
462
|
-
args: ['theTable', { read: ElementRef, static: true }]
|
|
463
|
-
}], tbodyElement: [{
|
|
464
|
-
type: ViewChild,
|
|
465
|
-
args: ['tbody', { read: ElementRef, static: true }]
|
|
466
|
-
}], handleMousedown: [{
|
|
467
|
-
type: HostListener,
|
|
468
|
-
args: ['mousedown', ['$event']]
|
|
469
|
-
}] } });
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component, ElementRef, ViewChild, HostListener } from '@angular/core';
|
|
3
|
+
import { fromEvent, Subject } from 'rxjs';
|
|
4
|
+
import { take, takeUntil, debounceTime } from 'rxjs/operators';
|
|
5
|
+
import { Transforms } from 'slate';
|
|
6
|
+
import { AngularEditor } from 'slate-angular';
|
|
7
|
+
import { TablePosition } from '../utils';
|
|
8
|
+
import { ColumnResizeNotifierSource } from '../../../components/column-resize/column-resize-notifier';
|
|
9
|
+
import { TableCellEventDispatcher } from '../../../components/column-resize/event-dispatcher';
|
|
10
|
+
import { TableStore } from '../table.store';
|
|
11
|
+
import { getElementHeight, getElementWidth } from '../../../utils/dom';
|
|
12
|
+
import { TableService } from '../table.service';
|
|
13
|
+
import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
|
|
14
|
+
import { TheBaseElementComponent } from '../../../interfaces/view-base';
|
|
15
|
+
import { TableOptions, TheTableToken } from '../table.types';
|
|
16
|
+
import { TheEditor } from '../../../interfaces/editor';
|
|
17
|
+
import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
|
|
18
|
+
import * as TheTransforms from '../../../transforms';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "../../../components/column-resize/event-dispatcher";
|
|
21
|
+
import * as i2 from "../../../components/column-resize/column-resize-notifier";
|
|
22
|
+
import * as i3 from "../table.store";
|
|
23
|
+
import * as i4 from "../table.service";
|
|
24
|
+
import * as i5 from "../../../services/context.service";
|
|
25
|
+
import * as i6 from "../../../services/table-contextmenu.service";
|
|
26
|
+
import * as i7 from "./insert-mark/insert-mark.component";
|
|
27
|
+
import * as i8 from "slate-angular";
|
|
28
|
+
import * as i9 from "../../../components/column-resize/column-resize.directive";
|
|
29
|
+
import * as i10 from "@angular/common";
|
|
30
|
+
export class TheTableComponent extends TheBaseElementComponent {
|
|
31
|
+
constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theContextService, theTableContextMenuService) {
|
|
32
|
+
super(elementRef, cdr);
|
|
33
|
+
this.eventDispatcher = eventDispatcher;
|
|
34
|
+
this.resizeNotifier = resizeNotifier;
|
|
35
|
+
this.tableStore = tableStore;
|
|
36
|
+
this.cdr = cdr;
|
|
37
|
+
this.ngZone = ngZone;
|
|
38
|
+
this.tableService = tableService;
|
|
39
|
+
this.theContextService = theContextService;
|
|
40
|
+
this.theTableContextMenuService = theTableContextMenuService;
|
|
41
|
+
this.destroy$ = new Subject();
|
|
42
|
+
this.rowControls = [];
|
|
43
|
+
this.colControls = [];
|
|
44
|
+
}
|
|
45
|
+
get columns() {
|
|
46
|
+
return this.normalizedColumns || (this.element && this.element.columns);
|
|
47
|
+
}
|
|
48
|
+
get nativeElement() {
|
|
49
|
+
return this.elementRef.nativeElement;
|
|
50
|
+
}
|
|
51
|
+
get tbodyNativeElement() {
|
|
52
|
+
var _a;
|
|
53
|
+
return (_a = this.tbodyElement) === null || _a === void 0 ? void 0 : _a.nativeElement;
|
|
54
|
+
}
|
|
55
|
+
get isSelectedAllCell() {
|
|
56
|
+
return (this.tableStore.selectedRowsIndex.length === this.rowControls.length &&
|
|
57
|
+
this.tableStore.selectedColumnsIndex.length === this.colControls.length);
|
|
58
|
+
}
|
|
59
|
+
handleMousedown(event) {
|
|
60
|
+
if (event.target instanceof Element && this.tbodyNativeElement.contains(event.target)) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (!TheEditor.isFocused(this.editor)) {
|
|
64
|
+
TheEditor.focus(this.editor);
|
|
65
|
+
}
|
|
66
|
+
AngularEditor.moveBlockCard(this.editor, this.element, { direction: 'left' });
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
}
|
|
69
|
+
onContextChange() {
|
|
70
|
+
super.onContextChange();
|
|
71
|
+
if (this.initialized) {
|
|
72
|
+
Promise.resolve().then(() => {
|
|
73
|
+
this.tableStore.emitTableChange();
|
|
74
|
+
this.useRowControls();
|
|
75
|
+
this.cdr.markForCheck();
|
|
76
|
+
});
|
|
77
|
+
this.getIsInTable();
|
|
78
|
+
this.getColControls();
|
|
79
|
+
if (this.normalizedColumns) {
|
|
80
|
+
this.normalizeShowColumns();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
ngOnInit() {
|
|
85
|
+
super.ngOnInit();
|
|
86
|
+
this.getColControls();
|
|
87
|
+
this.getIsInTable();
|
|
88
|
+
}
|
|
89
|
+
ngAfterViewInit() {
|
|
90
|
+
this.ngZone.onStable.pipe(take(1)).subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
var _a;
|
|
92
|
+
const blockCardElement = this.nativeElement.closest('slate-block-card');
|
|
93
|
+
if (blockCardElement) {
|
|
94
|
+
blockCardElement.classList.add(`slate-block-card-${this.element.type}`);
|
|
95
|
+
}
|
|
96
|
+
this.tableStore.initEditor(this.editor);
|
|
97
|
+
this.subscribeCellsChange();
|
|
98
|
+
this.subscribeCellPositionChange();
|
|
99
|
+
this.listenTableContextMenuEvent();
|
|
100
|
+
this.useTableWrapperWidth();
|
|
101
|
+
if ((_a = this.element.options) === null || _a === void 0 ? void 0 : _a.numberedColumn) {
|
|
102
|
+
const loadImageDone = yield this.resolveImage();
|
|
103
|
+
// 等待序号列表格内图片加载完成后再去渲染表格行高度
|
|
104
|
+
if (loadImageDone) {
|
|
105
|
+
this.useRowControls();
|
|
106
|
+
this.cdr.detectChanges();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.useRowControls();
|
|
111
|
+
this.cdr.markForCheck();
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
subscribeCellPositionChange() {
|
|
116
|
+
this.tableStore
|
|
117
|
+
.cellsPositionChange()
|
|
118
|
+
.pipe(debounceTime(100), takeUntil(this.destroy$))
|
|
119
|
+
.subscribe(x => {
|
|
120
|
+
this.cdr.detectChanges();
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
useTableWrapperWidth() {
|
|
124
|
+
const rootWidth = this.theContextService.getOptions().width;
|
|
125
|
+
const tablePath = TheEditor.findPath(this.editor, this.element);
|
|
126
|
+
if (tablePath.length > 1) {
|
|
127
|
+
// 解决table不在顶层时,拖动单元格宽度计算问题
|
|
128
|
+
this.theTableWrapperWidth = this.tableWrapper.nativeElement.offsetWidth;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.theTableWrapperWidth = rootWidth;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
subscribeCellsChange() {
|
|
135
|
+
this.tableStore
|
|
136
|
+
.dangerousOrSelectedCellsChange()
|
|
137
|
+
.pipe(takeUntil(this.destroy$))
|
|
138
|
+
.subscribe(() => {
|
|
139
|
+
this.cdr.detectChanges();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
useRowControls() {
|
|
143
|
+
var _a;
|
|
144
|
+
if (this.selection || ((_a = this.element.options) === null || _a === void 0 ? void 0 : _a.numberedColumn)) {
|
|
145
|
+
this.rowControls = this.calculateRowControls();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
detectChanges() {
|
|
149
|
+
this.cdr.detectChanges();
|
|
150
|
+
}
|
|
151
|
+
calculateMinRowSpanCellForRows() {
|
|
152
|
+
const table = this.element;
|
|
153
|
+
const cells = table.children.map((row, index) => {
|
|
154
|
+
const noHiddenCells = row.children.filter(cell => !cell.hidden);
|
|
155
|
+
if (noHiddenCells.length > 0) {
|
|
156
|
+
const minRowspan = Math.min.apply(Math, noHiddenCells.map(cell => {
|
|
157
|
+
return cell.rowspan || 1;
|
|
158
|
+
}));
|
|
159
|
+
const cell = row.children.find(item => !item.hidden && (item.rowspan || 1) === minRowspan);
|
|
160
|
+
return {
|
|
161
|
+
cell,
|
|
162
|
+
rowIndex: index
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
return {
|
|
167
|
+
rowIndex: index
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
return cells;
|
|
172
|
+
}
|
|
173
|
+
calculateRowControls() {
|
|
174
|
+
const minRowSpanCellForRows = this.calculateMinRowSpanCellForRows();
|
|
175
|
+
const rowControls = [];
|
|
176
|
+
let previousRowIndex = 0;
|
|
177
|
+
let previousCombineRowIndex = 0;
|
|
178
|
+
minRowSpanCellForRows.forEach((cellInfo, index) => {
|
|
179
|
+
if (!cellInfo.cell) {
|
|
180
|
+
rowControls.push({
|
|
181
|
+
height: 0,
|
|
182
|
+
rowIndex: index
|
|
183
|
+
});
|
|
184
|
+
previousCombineRowIndex = index;
|
|
185
|
+
if (index === minRowSpanCellForRows.length - 1) {
|
|
186
|
+
this.calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls);
|
|
187
|
+
}
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// calculate combine row height
|
|
191
|
+
if (previousCombineRowIndex > previousRowIndex) {
|
|
192
|
+
this.calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls);
|
|
193
|
+
previousCombineRowIndex = 0;
|
|
194
|
+
}
|
|
195
|
+
const cellDom = AngularEditor.toDOMNode(this.editor, cellInfo.cell);
|
|
196
|
+
let height = getElementHeight(cellDom);
|
|
197
|
+
// 当cell为合并的单元格(rowspan > 1),计算其实际高度(当前单元格的高度 - 下方合并单元格的高度)
|
|
198
|
+
if (cellInfo.cell.rowspan > 1) {
|
|
199
|
+
const calcHeight = height - this.getBelowRowHeight(minRowSpanCellForRows, index, cellInfo.rowIndex, cellInfo.cell.rowspan);
|
|
200
|
+
rowControls.push({
|
|
201
|
+
height: calcHeight,
|
|
202
|
+
rowIndex: cellInfo.rowIndex
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
rowControls.push({
|
|
207
|
+
height,
|
|
208
|
+
rowIndex: cellInfo.rowIndex
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
previousRowIndex = index;
|
|
212
|
+
});
|
|
213
|
+
return rowControls;
|
|
214
|
+
}
|
|
215
|
+
calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls) {
|
|
216
|
+
const rowControl = rowControls[previousRowIndex];
|
|
217
|
+
const count = previousCombineRowIndex - previousRowIndex;
|
|
218
|
+
const avgHeight = Math.floor(rowControl.height / (count + 1));
|
|
219
|
+
const firstHeight = rowControl.height - avgHeight * count;
|
|
220
|
+
rowControl.height = firstHeight;
|
|
221
|
+
rowControls
|
|
222
|
+
.filter((item, _index) => _index > previousRowIndex && _index <= previousCombineRowIndex)
|
|
223
|
+
.forEach(rowControl => {
|
|
224
|
+
rowControl.height = avgHeight;
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
getBelowRowHeight(cells, index, rowIndex, rowspan) {
|
|
228
|
+
let belowRowlHeight = 0;
|
|
229
|
+
cells.slice(index + 1, cells.length).map(item => {
|
|
230
|
+
if (!item.cell) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (rowIndex + rowspan > item.rowIndex) {
|
|
234
|
+
const cellDom = AngularEditor.toDOMNode(this.editor, item.cell);
|
|
235
|
+
if (item.cell.rowspan > 1) {
|
|
236
|
+
// 如果下方单元格的rowspan > 1,递归计算
|
|
237
|
+
const height = this.getBelowRowHeight(cells, cells.findIndex(cell => cell.rowIndex === item.rowIndex), item.rowIndex, item.cell.rowspan);
|
|
238
|
+
belowRowlHeight += getElementHeight(cellDom) - height;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
belowRowlHeight += getElementHeight(cellDom);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
return belowRowlHeight;
|
|
246
|
+
}
|
|
247
|
+
resolveImage() {
|
|
248
|
+
const imageElements = this.nativeElement.querySelectorAll('img');
|
|
249
|
+
if (imageElements.length) {
|
|
250
|
+
const imageResolves = [];
|
|
251
|
+
imageElements.forEach(item => {
|
|
252
|
+
const image = new Image();
|
|
253
|
+
const imageLoad = new Promise(resolve => {
|
|
254
|
+
image.onload = () => {
|
|
255
|
+
resolve(true);
|
|
256
|
+
};
|
|
257
|
+
image.onerror = () => {
|
|
258
|
+
resolve(true);
|
|
259
|
+
};
|
|
260
|
+
image.src = item.getAttribute('src');
|
|
261
|
+
});
|
|
262
|
+
imageResolves.push(imageLoad);
|
|
263
|
+
});
|
|
264
|
+
return Promise.all(imageResolves);
|
|
265
|
+
}
|
|
266
|
+
return Promise.resolve(true);
|
|
267
|
+
}
|
|
268
|
+
getColControls() {
|
|
269
|
+
var _a, _b;
|
|
270
|
+
this.colControls = ((_b = (_a = this.element) === null || _a === void 0 ? void 0 : _a.children[0]) === null || _b === void 0 ? void 0 : _b.children) || [];
|
|
271
|
+
}
|
|
272
|
+
onColMouseDown(event, index) {
|
|
273
|
+
event.stopPropagation();
|
|
274
|
+
event.preventDefault();
|
|
275
|
+
if (!!this.selection && this.isInTable) {
|
|
276
|
+
this.tableStore.clearDangerousCells();
|
|
277
|
+
this.tableStore.selectColumn(this.editor, index);
|
|
278
|
+
this.tableService.openToolbar(event.target, true);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
getIsInTable() {
|
|
282
|
+
if (this.selection) {
|
|
283
|
+
const opts = new TableOptions();
|
|
284
|
+
const selection = this.editor.selection;
|
|
285
|
+
const startPosition = TablePosition.create(opts, this.editor, selection.anchor.path);
|
|
286
|
+
const endPosition = TablePosition.create(opts, this.editor, selection.focus.path);
|
|
287
|
+
this.isInTable = startPosition.isInTable() && endPosition.isInTable();
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
this.isInTable = false;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
normalizeShowColumns() {
|
|
294
|
+
const table = this.element;
|
|
295
|
+
const tr = table.children[0];
|
|
296
|
+
if (this.element.columns) {
|
|
297
|
+
let isGood = true;
|
|
298
|
+
this.normalizedColumns = table.columns.map(item => {
|
|
299
|
+
return Object.assign({}, item);
|
|
300
|
+
});
|
|
301
|
+
if (this.element.columns.length !== tr.children.length) {
|
|
302
|
+
this.normalizedColumns = tr.children.map((item, i) => this.columns[i] || { width: 200 });
|
|
303
|
+
isGood = false;
|
|
304
|
+
}
|
|
305
|
+
const totalWidth = this.normalizedColumns.reduce((pre, cur) => {
|
|
306
|
+
return pre + cur.width;
|
|
307
|
+
}, 0);
|
|
308
|
+
if (totalWidth < this.theTableWrapperWidth) {
|
|
309
|
+
const lastColumnWidth = this.theTableWrapperWidth - totalWidth + this.normalizedColumns[this.normalizedColumns.length - 1].width;
|
|
310
|
+
this.normalizedColumns[this.normalizedColumns.length - 1] = { width: lastColumnWidth };
|
|
311
|
+
isGood = false;
|
|
312
|
+
}
|
|
313
|
+
if (isGood) {
|
|
314
|
+
this.normalizedColumns = null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
initializeColumns() {
|
|
319
|
+
if (!this.element.columns) {
|
|
320
|
+
const tr = this.element.children[0];
|
|
321
|
+
const tableWidth = AngularEditor.toDOMNode(this.editor, tr).offsetWidth;
|
|
322
|
+
const columns = tr.children.map(cell => {
|
|
323
|
+
return { width: Math.round(tableWidth / tr.children.length) - tr.children.length };
|
|
324
|
+
});
|
|
325
|
+
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
initializeRows() {
|
|
329
|
+
this.element.children.map(row => {
|
|
330
|
+
if (!row.height) {
|
|
331
|
+
const element = TheEditor.toDOMNode(this.editor, row);
|
|
332
|
+
TheTransforms.setNode(this.editor, { height: getElementHeight(element) }, row);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
transformRowHeight() {
|
|
337
|
+
const rowElements = this.nativeElement.querySelector('tbody').children;
|
|
338
|
+
if (rowElements) {
|
|
339
|
+
[...rowElements].map((row, index) => {
|
|
340
|
+
const height = getElementHeight(row);
|
|
341
|
+
TheTransforms.setNode(this.editor, { height }, this.element.children[index]);
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
transformColumnsWidth() {
|
|
346
|
+
const cols = [...this.nativeElement.querySelector('colgroup').children];
|
|
347
|
+
const columns = cols.map(col => {
|
|
348
|
+
return { width: getElementWidth(col) };
|
|
349
|
+
});
|
|
350
|
+
TheTransforms.setNode(this.editor, { columns }, this.element);
|
|
351
|
+
}
|
|
352
|
+
onRowMouseDown(event, index) {
|
|
353
|
+
if (this.readonly)
|
|
354
|
+
return;
|
|
355
|
+
event.stopPropagation();
|
|
356
|
+
event.preventDefault();
|
|
357
|
+
if (!this.isInTable) {
|
|
358
|
+
const path = TheEditor.findPath(this.editor, this.element);
|
|
359
|
+
Transforms.select(this.editor, path);
|
|
360
|
+
}
|
|
361
|
+
this.tableStore.selectRow(this.editor, index);
|
|
362
|
+
this.tableService.openToolbar(event.target, true);
|
|
363
|
+
}
|
|
364
|
+
onSelectTable(event) {
|
|
365
|
+
event.stopPropagation();
|
|
366
|
+
event.preventDefault();
|
|
367
|
+
this.tableStore.selectTable(this.editor);
|
|
368
|
+
this.tableService.openToolbar(event.target);
|
|
369
|
+
}
|
|
370
|
+
listenTableContextMenuEvent() {
|
|
371
|
+
this.ngZone.runOutsideAngular(() => {
|
|
372
|
+
fromEvent(this.theTableElement.nativeElement, 'contextmenu')
|
|
373
|
+
.pipe(takeUntil(this.destroy$))
|
|
374
|
+
.subscribe(event => {
|
|
375
|
+
if (this.readonly) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
event.preventDefault();
|
|
379
|
+
this.tableStore.isRightClicking = true;
|
|
380
|
+
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
381
|
+
if (!cell) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
if (!cell.classList.contains('selected-cell')) {
|
|
386
|
+
this.tableStore.selectCell(cell, this.editor);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (this.theTableContextMenuService.isOpened) {
|
|
390
|
+
this.theTableContextMenuService
|
|
391
|
+
.closeContextMenu()
|
|
392
|
+
.pipe(take(1))
|
|
393
|
+
.subscribe(() => {
|
|
394
|
+
this.theTableContextMenuService.openMenuList(event);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
else if (this.tableService.isOpened) {
|
|
398
|
+
this.tableService
|
|
399
|
+
.closeToolbar()
|
|
400
|
+
.pipe(take(1))
|
|
401
|
+
.subscribe(() => {
|
|
402
|
+
this.theTableContextMenuService.openMenuList(event);
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
this.cdr.markForCheck();
|
|
407
|
+
this.theTableContextMenuService.openMenuList(event);
|
|
408
|
+
}
|
|
409
|
+
// patch for right click select next cell
|
|
410
|
+
setTimeout(() => {
|
|
411
|
+
Transforms.select(this.editor, this.editor.selection.anchor.path);
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
trackByFnRowControls(index) {
|
|
417
|
+
return index;
|
|
418
|
+
}
|
|
419
|
+
trackByFnColControls(index) {
|
|
420
|
+
return index;
|
|
421
|
+
}
|
|
422
|
+
ngOnDestroy() {
|
|
423
|
+
super.ngOnDestroy();
|
|
424
|
+
this.destroy$.next();
|
|
425
|
+
this.destroy$.complete();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i2.ColumnResizeNotifierSource }, { token: i3.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i4.TableService }, { token: i5.TheContextService }, { token: i6.TheTableContextMenuService }], target: i0.ɵɵFactoryTarget.Component });
|
|
429
|
+
TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" } }, providers: [
|
|
430
|
+
TableStore,
|
|
431
|
+
TableService,
|
|
432
|
+
TheTableContextMenuService,
|
|
433
|
+
TableCellEventDispatcher,
|
|
434
|
+
ColumnResizeNotifierSource,
|
|
435
|
+
{
|
|
436
|
+
provide: TheTableToken,
|
|
437
|
+
useExisting: TheTableComponent
|
|
438
|
+
}
|
|
439
|
+
], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, ngImport: i0, template: "<!-- \u7C7B\u540D the-temp-*: \u4E34\u65F6\u89E3\u51B3\u56E0\u53D7portal\u5F71\u54CD\u8868\u683C\u6837\u5F0F\u95EE\u9898\uFF0C\u540E\u671F\u6539\u56DEthe-* -->\n<div\n class=\"the-temp-table-container\"\n theColumnResize\n [ngClass]=\"{\n 'the-temp-table-with-controls': isInTable,\n 'the-temp-numbered-column-container': element?.options?.numberedColumn,\n 'the-temp-table-selection-hide': tableStore.isCellSelecting || tableStore.isRightClicking\n }\"\n>\n <div\n class=\"the-temp-table-row-controls-wrapper\"\n [ngClass]=\"{\n 'the-temp-table-focus': isInTable\n }\"\n >\n <div\n class=\"the-temp-table-corner-controls\"\n [ngClass]=\"{\n visible: !readonly && isInTable,\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-temp-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-temp-table-corner-controls-insert-row-marker\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-temp-table-corner-controls-insert-column-marker\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-temp-table-row-controls\">\n <div class=\"the-temp-table-row-controls-inner\">\n <div\n class=\"the-temp-table-row-controls-button-wrap\"\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && isInTable && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-temp-table-row-controls-button the-temp-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n class=\"the-temp-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-temp-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-temp-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-temp-table\" #theTable [ngClass]=\"{ 'the-temp-table-with-controls': isInTable }\">\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-temp-table-col-controls-wrapper\">\n <th\n class=\"the-temp-table-col-controls\"\n [ngClass]=\"{\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMouseDown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark *ngIf=\"isInTable\" type=\"column\" [at]=\"i + 1\" [tableStore]=\"tableStore\">\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n", components: [{ type: i7.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore"] }, { type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }], directives: [{ type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: TheTableComponent, decorators: [{
|
|
441
|
+
type: Component,
|
|
442
|
+
args: [{
|
|
443
|
+
selector: 'the-table, [theTable]',
|
|
444
|
+
templateUrl: './table.component.html',
|
|
445
|
+
providers: [
|
|
446
|
+
TableStore,
|
|
447
|
+
TableService,
|
|
448
|
+
TheTableContextMenuService,
|
|
449
|
+
TableCellEventDispatcher,
|
|
450
|
+
ColumnResizeNotifierSource,
|
|
451
|
+
{
|
|
452
|
+
provide: TheTableToken,
|
|
453
|
+
useExisting: TheTableComponent
|
|
454
|
+
}
|
|
455
|
+
]
|
|
456
|
+
}]
|
|
457
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i2.ColumnResizeNotifierSource }, { type: i3.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i4.TableService }, { type: i5.TheContextService }, { type: i6.TheTableContextMenuService }]; }, propDecorators: { tableWrapper: [{
|
|
458
|
+
type: ViewChild,
|
|
459
|
+
args: ['tableWrapper', { read: ElementRef, static: true }]
|
|
460
|
+
}], theTableElement: [{
|
|
461
|
+
type: ViewChild,
|
|
462
|
+
args: ['theTable', { read: ElementRef, static: true }]
|
|
463
|
+
}], tbodyElement: [{
|
|
464
|
+
type: ViewChild,
|
|
465
|
+
args: ['tbody', { read: ElementRef, static: true }]
|
|
466
|
+
}], handleMousedown: [{
|
|
467
|
+
type: HostListener,
|
|
468
|
+
args: ['mousedown', ['$event']]
|
|
469
|
+
}] } });
|
|
470
470
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBdUQsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUV6RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUsWUFBWSxF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QUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTdELGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXpELFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXRELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiwgTmdab25lLCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwsIGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVkaXRvciwgVHJhbnNmb3JtcyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFRhYmxlUG9zaXRpb24gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXJlc2l6ZS9jb2x1bW4tcmVzaXplLW5vdGlmaWVyJztcbmltcG9ydCB7IFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXJlc2l6ZS9ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi90YWJsZS5zdG9yZSc7XG5pbXBvcnQgeyBnZXRFbGVtZW50SGVpZ2h0LCBnZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi8uLi8uLi91dGlscy9kb20nO1xuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGhlQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3ZpZXctYmFzZSc7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBUYWJsZU9wdGlvbnMsIFRoZVRhYmxlQ29sdW1uLCBUaGVUYWJsZVRva2VuIH0gZnJvbSAnLi4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgVGhlRWRpdG9yIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9lZGl0b3InO1xuaW1wb3J0IHsgU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvc2VsZWN0b3InO1xuaW1wb3J0ICogYXMgVGhlVHJhbnNmb3JtcyBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtdGFibGUsIFt0aGVUYWJsZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFRhYmxlU3RvcmUsXG4gICAgICAgIFRhYmxlU2VydmljZSxcbiAgICAgICAgVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRoZVRhYmxlVG9rZW4sXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGhlVGFibGVDb21wb25lbnRcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUaGVCYXNlRWxlbWVudENvbXBvbmVudDxUYWJsZUVsZW1lbnQsIEVkaXRvcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgZGVzdHJveSQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhlVGFibGVXcmFwcGVyV2lkdGg6IG51bWJlcjtcblxuICAgIHJvd0NvbnRyb2xzOiB7IGhlaWdodDogbnVtYmVyOyByb3dJbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgY29sQ29udHJvbHMgPSBbXTtcblxuICAgIG5vcm1hbGl6ZWRDb2x1bW5zOiBUaGVUYWJsZUNvbHVtbltdO1xuXG4gICAgaXNJblRhYmxlOiBib29sZWFuO1xuXG4gICAgZ2V0IGNvbHVtbnMoKTogVGhlVGFibGVDb2x1bW5bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zIHx8ICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50LmNvbHVtbnMpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRBbGxDZWxsKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4Lmxlbmd0aCA9PT0gdGhpcy5yb3dDb250cm9scy5sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RlZENvbHVtbnNJbmRleC5sZW5ndGggPT09IHRoaXMuY29sQ29udHJvbHMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0aGVUYWJsZScsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGhlVGFibGVFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgndGJvZHknLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRib2R5RWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdldElzSW5UYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5nZXRDb2xDb250cm9scygpO1xuICAgICAgICAgICAgaWYgKHRoaXMubm9ybWFsaXplZENvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVNob3dDb2x1bW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHVibGljIGV2ZW50RGlzcGF0Y2hlcjogVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwdWJsaWMgcmVzaXplTm90aWZpZXI6IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLFxuICAgICAgICBwdWJsaWMgdGFibGVTdG9yZTogVGFibGVTdG9yZSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHVibGljIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRoZUNvbnRleHRTZXJ2aWNlOiBUaGVDb250ZXh0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aGVUYWJsZUNvbnRleHRNZW51U2VydmljZTogVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2RyKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5nZXRDb2xDb250cm9scygpO1xuICAgICAgICB0aGlzLmdldElzSW5UYWJsZSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdzbGF0ZS1ibG9jay1jYXJkJyk7XG4gICAgICAgICAgICBpZiAoYmxvY2tDYXJkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJsb2NrQ2FyZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChgc2xhdGUtYmxvY2stY2FyZC0ke3RoaXMuZWxlbWVudC50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmluaXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVDZWxsc0NoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuVGFibGVDb250ZXh0TWVudUV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLnVzZVRhYmxlV3JhcHBlcldpZHRoKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZEltYWdlRG9uZSA9IGF3YWl0IHRoaXMucmVzb2x2ZUltYWdlKCk7XG4gICAgICAgICAgICAgICAgLy8g562J5b6F5bqP5Y+35YiX6KGo5qC85YaF5Zu+54mH5Yqg6L295a6M5oiQ5ZCO5YaN5Y675riy5p+T6KGo5qC86KGM6auY5bqmXG4gICAgICAgICAgICAgICAgaWYgKGxvYWRJbWFnZURvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuY2VsbHNQb3NpdGlvbkNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VUYWJsZVdyYXBwZXJXaWR0aCgpIHtcbiAgICAgICAgY29uc3Qgcm9vdFdpZHRoID0gdGhpcy50aGVDb250ZXh0U2VydmljZS5nZXRPcHRpb25zKCkud2lkdGg7XG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgaWYgKHRhYmxlUGF0aC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyDop6PlhrN0YWJsZeS4jeWcqOmhtuWxguaXtu+8jOaLluWKqOWNleWFg+agvOWuveW6puiuoeeul+mXrumimFxuICAgICAgICAgICAgdGhpcy50aGVUYWJsZVdyYXBwZXJXaWR0aCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRoZVRhYmxlV3JhcHBlcldpZHRoID0gcm9vdFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlQ2VsbHNDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmRhbmdlcm91c09yU2VsZWN0ZWRDZWxsc0NoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VSb3dDb250cm9scygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yb3dDb250cm9scyA9IHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVNaW5Sb3dTcGFuQ2VsbEZvclJvd3MoKTogeyBjZWxsPzogVGFibGVDZWxsRWxlbWVudDsgcm93SW5kZXg6IG51bWJlciB9W10ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0YWJsZS5jaGlsZHJlbi5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vSGlkZGVuQ2VsbHMgPSByb3cuY2hpbGRyZW4uZmlsdGVyKGNlbGwgPT4gIWNlbGwuaGlkZGVuKTtcbiAgICAgICAgICAgIGlmIChub0hpZGRlbkNlbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW5Sb3dzcGFuID0gTWF0aC5taW4uYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgIE1hdGgsXG4gICAgICAgICAgICAgICAgICAgIG5vSGlkZGVuQ2VsbHMubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwucm93c3BhbiB8fCAxO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNoaWxkcmVuLmZpbmQoaXRlbSA9PiAhaXRlbS5oaWRkZW4gJiYgKGl0ZW0ucm93c3BhbiB8fCAxKSA9PT0gbWluUm93c3Bhbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVSb3dDb250cm9scygpIHtcbiAgICAgICAgY29uc3QgbWluUm93U3BhbkNlbGxGb3JSb3dzID0gdGhpcy5jYWxjdWxhdGVNaW5Sb3dTcGFuQ2VsbEZvclJvd3MoKTtcblxuICAgICAgICBjb25zdCByb3dDb250cm9scyA9IFtdO1xuICAgICAgICBsZXQgcHJldmlvdXNSb3dJbmRleCA9IDA7XG4gICAgICAgIGxldCBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IDA7XG4gICAgICAgIG1pblJvd1NwYW5DZWxsRm9yUm93cy5mb3JFYWNoKChjZWxsSW5mbywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghY2VsbEluZm8uY2VsbCkge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBtaW5Sb3dTcGFuQ2VsbEZvclJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJvd0NvbnRyb2xzQXZnSGVpZ2h0KHByZXZpb3VzQ29tYmluZVJvd0luZGV4LCBwcmV2aW91c1Jvd0luZGV4LCByb3dDb250cm9scyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGNvbWJpbmUgcm93IGhlaWdodFxuICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID4gcHJldmlvdXNSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHNBdmdIZWlnaHQocHJldmlvdXNDb21iaW5lUm93SW5kZXgsIHByZXZpb3VzUm93SW5kZXgsIHJvd0NvbnRyb2xzKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NvbWJpbmVSb3dJbmRleCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGxEb20gPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgY2VsbEluZm8uY2VsbCk7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChjZWxsRG9tKTtcbiAgICAgICAgICAgIC8vIOW9k2NlbGzkuLrlkIjlubbnmoTljZXlhYPmoLwocm93c3BhbiA+IDEp77yM6K6h566X5YW25a6e6ZmF6auY5bqm77yI5b2T5YmN5Y2V5YWD5qC855qE6auY5bqmIC0g5LiL5pa55ZCI5bm25Y2V5YWD5qC855qE6auY5bqm77yJXG4gICAgICAgICAgICBpZiAoY2VsbEluZm8uY2VsbC5yb3dzcGFuID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGNIZWlnaHQgPSBoZWlnaHQgLSB0aGlzLmdldEJlbG93Um93SGVpZ2h0KG1pblJvd1NwYW5DZWxsRm9yUm93cywgaW5kZXgsIGNlbGxJbmZvLnJvd0luZGV4LCBjZWxsSW5mby5jZWxsLnJvd3NwYW4pO1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNhbGNIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBjZWxsSW5mby5yb3dJbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb3dDb250cm9scy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogY2VsbEluZm8ucm93SW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByb3dDb250cm9scztcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVSb3dDb250cm9sc0F2Z0hlaWdodChcbiAgICAgICAgcHJldmlvdXNDb21iaW5lUm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcHJldmlvdXNSb3dJbmRleDogbnVtYmVyLFxuICAgICAgICByb3dDb250cm9sczogeyBoZWlnaHQ6IG51bWJlcjsgcm93SW5kZXg6IG51bWJlciB9W11cbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHJvd0NvbnRyb2xzW3ByZXZpb3VzUm93SW5kZXhdO1xuICAgICAgICBjb25zdCBjb3VudCA9IHByZXZpb3VzQ29tYmluZVJvd0luZGV4IC0gcHJldmlvdXNSb3dJbmRleDtcbiAgICAgICAgY29uc3QgYXZnSGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dDb250cm9sLmhlaWdodCAvIChjb3VudCArIDEpKTtcbiAgICAgICAgY29uc3QgZmlyc3RIZWlnaHQgPSByb3dDb250cm9sLmhlaWdodCAtIGF2Z0hlaWdodCAqIGNvdW50O1xuICAgICAgICByb3dDb250cm9sLmhlaWdodCA9IGZpcnN0SGVpZ2h0O1xuICAgICAgICByb3dDb250cm9sc1xuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSwgX2luZGV4KSA9PiBfaW5kZXggPiBwcmV2aW91c1Jvd0luZGV4ICYmIF9pbmRleCA8PSBwcmV2aW91c0NvbWJpbmVSb3dJbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKHJvd0NvbnRyb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2wuaGVpZ2h0ID0gYXZnSGVpZ2h0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QmVsb3dSb3dIZWlnaHQoXG4gICAgICAgIGNlbGxzOiB7XG4gICAgICAgICAgICBjZWxsPzogVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgIHJvd0luZGV4OiBudW1iZXI7XG4gICAgICAgIH1bXSxcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93SW5kZXg6IG51bWJlcixcbiAgICAgICAgcm93c3BhbjogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGxldCBiZWxvd1Jvd2xIZWlnaHQgPSAwO1xuICAgICAgICBjZWxscy5zbGljZShpbmRleCArIDEsIGNlbGxzLmxlbmd0aCkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm93SW5kZXggKyByb3dzcGFuID4gaXRlbS5yb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxEb20gPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbS5jZWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOS4i+aWueWNleWFg+agvOeahHJvd3NwYW4gPiAx77yM6YCS5b2S6K6h566XXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0QmVsb3dSb3dIZWlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxscyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLmZpbmRJbmRleChjZWxsID0+IGNlbGwucm93SW5kZXggPT09IGl0ZW0ucm93SW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2VsbC5yb3dzcGFuXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93Um93bEhlaWdodCArPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pIC0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93Um93bEhlaWdodCArPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiZWxvd1Jvd2xIZWlnaHQ7XG4gICAgfVxuXG4gICAgcmVzb2x2ZUltYWdlKCkge1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnRzID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzb2x2ZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUxvYWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlc29sdmVzLnB1c2goaW1hZ2VMb2FkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGltYWdlUmVzb2x2ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q29sQ29udHJvbHMoKSB7XG4gICAgICAgIHRoaXMuY29sQ29udHJvbHMgPSB0aGlzLmVsZW1lbnQ/LmNoaWxkcmVuWzBdPy5jaGlsZHJlbiB8fCBbXTtcbiAgICB9XG5cbiAgICBvbkNvbE1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCEhdGhpcy5zZWxlY3Rpb24gJiYgdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhckRhbmdlcm91c0NlbGxzKCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q29sdW1uKHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vcGVuVG9vbGJhcihldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SXNJblRhYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvci5zZWxlY3Rpb247XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIHRoaXMuZWRpdG9yLCBzZWxlY3Rpb24uZm9jdXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IHN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgZW5kUG9zaXRpb24uaXNJblRhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU2hvd0NvbHVtbnMoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5lbGVtZW50O1xuICAgICAgICBjb25zdCB0ciA9IHRhYmxlLmNoaWxkcmVuWzBdO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGxldCBpc0dvb2QgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29sdW1ucyA9IHRhYmxlLmNvbHVtbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLml0ZW0gfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jb2x1bW5zLmxlbmd0aCAhPT0gdHIuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29sdW1ucyA9IHRyLmNoaWxkcmVuLm1hcCgoaXRlbSwgaSkgPT4gdGhpcy5jb2x1bW5zW2ldIHx8IHsgd2lkdGg6IDIwMCB9KTtcbiAgICAgICAgICAgICAgICBpc0dvb2QgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRvdGFsV2lkdGggPSB0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zLnJlZHVjZSgocHJlLCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlICsgY3VyLndpZHRoO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICBpZiAodG90YWxXaWR0aCA8IHRoaXMudGhlVGFibGVXcmFwcGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q29sdW1uV2lkdGggPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlV3JhcHBlcldpZHRoIC0gdG90YWxXaWR0aCArIHRoaXMubm9ybWFsaXplZENvbHVtbnNbdGhpcy5ub3JtYWxpemVkQ29sdW1ucy5sZW5ndGggLSAxXS53aWR0aDtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zW3RoaXMubm9ybWFsaXplZENvbHVtbnMubGVuZ3RoIC0gMV0gPSB7IHdpZHRoOiBsYXN0Q29sdW1uV2lkdGggfTtcbiAgICAgICAgICAgICAgICBpc0dvb2QgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0dvb2QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVDb2x1bW5zKCkge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXSBhcyBUYWJsZVJvd0VsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRyKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IE1hdGgucm91bmQodGFibGVXaWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCkgLSB0ci5jaGlsZHJlbi5sZW5ndGggfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVSb3dzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKHJvdyA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgcm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0OiBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQpIH0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybVJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3Qgcm93RWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHJvd0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAoWy4uLnJvd0VsZW1lbnRzXSBhcyBIVE1MVGFibGVSb3dFbGVtZW50W10pLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGdldEVsZW1lbnRIZWlnaHQocm93KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHRoaXMuZWxlbWVudC5jaGlsZHJlbltpbmRleF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Db2x1bW5zV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBbLi4udGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgY29uc3QgY29sdW1uczogVGhlVGFibGVDb2x1bW5bXSA9IGNvbHMubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogZ2V0RWxlbWVudFdpZHRoKGNvbCkgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25Sb3dNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghdGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBUaGVFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFJvdyh0aGlzLmVkaXRvciwgaW5kZXgpO1xuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5vcGVuVG9vbGJhcihldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRydWUpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0VGFibGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RUYWJsZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9wZW5Ub29sYmFyKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgfVxuXG4gICAgbGlzdGVuVGFibGVDb250ZXh0TWVudUV2ZW50KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NvbnRleHRtZW51JylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFNMQV9UQUJMRV9DRUxMX1NFTEVDVE9SKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZC1jZWxsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbChjZWxsLCB0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VDb250ZXh0TWVudSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFibGVTZXJ2aWNlLmlzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZVRvb2xiYXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2Uub3Blbk1lbnVMaXN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2ggZm9yIHJpZ2h0IGNsaWNrIHNlbGVjdCBuZXh0IGNlbGxcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdCh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYWNrQnlGblJvd0NvbnRyb2xzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIHRyYWNrQnlGbkNvbENvbnRyb2xzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjwhLS0g57G75ZCNIHRoZS10ZW1wLSo6IOS4tOaXtuino+WGs+WboOWPl3BvcnRhbOW9seWTjeihqOagvOagt+W8j+mXrumimO+8jOWQjuacn+aUueWbnnRoZS0qIC0tPlxuPGRpdlxuICAgIGNsYXNzPVwidGhlLXRlbXAtdGFibGUtY29udGFpbmVyXCJcbiAgICB0aGVDb2x1bW5SZXNpemVcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICd0aGUtdGVtcC10YWJsZS13aXRoLWNvbnRyb2xzJzogaXNJblRhYmxlLFxuICAgICAgICAndGhlLXRlbXAtbnVtYmVyZWQtY29sdW1uLWNvbnRhaW5lcic6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uLFxuICAgICAgICAndGhlLXRlbXAtdGFibGUtc2VsZWN0aW9uLWhpZGUnOiB0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZyB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZ1xuICAgIH1cIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1yb3ctY29udHJvbHMtd3JhcHBlclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICd0aGUtdGVtcC10YWJsZS1mb2N1cyc6IGlzSW5UYWJsZVxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRlbXAtdGFibGUtY29ybmVyLWNvbnRyb2xzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAhcmVhZG9ubHkgJiYgaXNJblRhYmxlLFxuICAgICAgICAgICAgICAgIGFjdGl2ZTogaXNTZWxlY3RlZEFsbENlbGwsXG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmlzU2VsZWN0ZWRUYWJsZSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRlbXAtdGFibGUtY29ybmVyLWJ1dHRvblwiIChtb3VzZWRvd24pPVwib25TZWxlY3RUYWJsZSgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRlbXAtdGFibGUtY29ybmVyLWNvbnRyb2xzLWluc2VydC1yb3ctbWFya2VyXCI+XG4gICAgICAgICAgICAgICAgPHRoZS10YWJsZS1pbnNlcnQtbWFyayB0eXBlPVwicm93XCIgW2F0XT1cIjBcIiBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCI+PC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LWNvbHVtbi1tYXJrZXJcIj5cbiAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLXJvdy1jb250cm9sc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1yb3ctY29udHJvbHMtYnV0dG9uLXdyYXBcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiByb3dDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuUm93Q29udHJvbHNcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXguaW5jbHVkZXMoY29udHJvbC5yb3dJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHkgJiYgaXNJblRhYmxlICYmICFlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZURvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1yb3ctY29udHJvbHMtYnV0dG9uIHRoZS10ZW1wLXRhYmxlLWNvbnRyb2xzLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudEVkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlRG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLW51bWJlcmVkLWNvbnRyb2xzLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJyb3ctbnVtYmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj57eyBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRoZS10YWJsZS1pbnNlcnQtbWFyayB0eXBlPVwicm93XCIgW2F0XT1cImNvbnRyb2wucm93SW5kZXggKyAxXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPiA8L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGhlLXRlbXAtdGFibGUtd3JhcHBlclwiICN0YWJsZVdyYXBwZXIgW25nQ2xhc3NdPVwieyAndGhlLXRlbXAtdGFibGUtbnVtYmVyZWQnOiBlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbiB9XCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRoZS10ZW1wLXRhYmxlXCIgI3RoZVRhYmxlIFtuZ0NsYXNzXT1cInsgJ3RoZS10ZW1wLXRhYmxlLXdpdGgtY29udHJvbHMnOiBpc0luVGFibGUgfVwiPlxuICAgICAgICAgICAgPGNvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICAgICAgICAgIDxjb2wgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW25nU3R5bGVdPVwieyB3aWR0aDogY29sLndpZHRoICsgJ3B4JyB9XCIgLz5cbiAgICAgICAgICAgIDwvY29sZ3JvdXA+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGhlLXRlbXAtdGFibGUtY29sLWNvbnRyb2xzLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLWNvbC1jb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiB0YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcm91czogdGFibGVTdG9yZS5kYW5nZXJvdXNDb2x1bW5zSW5kZXguaW5jbHVkZXMoaSkgJiYgdGFibGVTdG9yZS5kYW5nZXJvdXNDZWxscy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Db2xNb3VzZURvd24oJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiBjb2xDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuQ29sQ29udHJvbHNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrICpuZ0lmPVwiaXNJblRhYmxlXCIgdHlwZT1cImNvbHVtblwiIFthdF09XCJpICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5ICN0Ym9keT5cbiAgICAgICAgICAgICAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+IDwvc2xhdGUtY2hpbGRyZW4+XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|