@worktile/theia 13.0.0-next.1 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- 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 +64 -64
- package/components/toolbar-dropdown/toolbar-dropdown.component.d.ts +33 -33
- 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 +17 -17
- 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 +100 -98
- package/esm2020/components/color-select/color-select.component.mjs +108 -108
- package/esm2020/components/column-resize/column-resize-notifier.mjs +31 -31
- package/esm2020/components/column-resize/column-resize.directive.mjs +98 -98
- package/esm2020/components/column-resize/column-resize.module.mjs +32 -32
- package/esm2020/components/column-resize/event-dispatcher.mjs +55 -55
- package/esm2020/components/column-resize/overlay-handle.component.mjs +139 -139
- package/esm2020/components/column-resize/resize-ref.mjs +25 -25
- package/esm2020/components/column-resize/resizing.store.mjs +154 -154
- package/esm2020/components/column-resize/selectors.mjs +4 -4
- package/esm2020/components/contextmenu/contextmenu.component.mjs +61 -61
- package/esm2020/components/conversion-hint/conversion-hint.component.mjs +54 -54
- package/esm2020/components/element/element.component.mjs +22 -22
- package/esm2020/components/inline-toolbar/inline-toolbar.component.mjs +125 -125
- package/esm2020/components/nav-split-line/nav-split-line.component.mjs +36 -36
- package/esm2020/components/table-select/table-select.component.mjs +49 -49
- package/esm2020/components/template/template.component.mjs +62 -62
- package/esm2020/components/text/text.component.mjs +57 -57
- package/esm2020/components/toolbar/toolbar.component.mjs +241 -241
- package/esm2020/components/toolbar-dropdown/toolbar-dropdown.component.mjs +128 -128
- package/esm2020/components/toolbar-group/toolbar-group.component.mjs +110 -110
- package/esm2020/components/toolbar-item/toolbar-item.component.mjs +60 -60
- package/esm2020/constants/auto-format-rules.mjs +166 -166
- package/esm2020/constants/code.mjs +88 -88
- package/esm2020/constants/color-select.mjs +61 -61
- package/esm2020/constants/default.mjs +9 -9
- package/esm2020/constants/error.mjs +7 -7
- package/esm2020/constants/index.mjs +5 -5
- package/esm2020/constants/node-types.mjs +132 -132
- package/esm2020/constants/selector.mjs +3 -3
- package/esm2020/constants/toolbar.mjs +69 -69
- package/esm2020/core/create-plugin.mjs +4 -4
- package/esm2020/core/create-toolbar.mjs +55 -55
- package/esm2020/core/index.mjs +4 -4
- package/esm2020/core/toolbar-item/base-toolbar-item.mjs +89 -89
- package/esm2020/core/utils/combine-plugins.mjs +9 -9
- package/esm2020/core/utils/flatten-deep-plugins.mjs +18 -18
- package/esm2020/core/utils/get-plugin-options.mjs +2 -2
- package/esm2020/core/utils/get-plugin.mjs +1 -1
- package/esm2020/core/utils/get-plugins.mjs +3 -3
- package/esm2020/core/utils/index.mjs +10 -10
- package/esm2020/core/utils/merge-array.mjs +17 -17
- package/esm2020/core/utils/merge-deep-plugins.mjs +13 -13
- package/esm2020/core/utils/merge-options.mjs +19 -19
- package/esm2020/core/utils/nested-structure-by-key.mjs +10 -10
- package/esm2020/core/utils/plugins-by-key.mjs +9 -9
- package/esm2020/core/with-theia.mjs +22 -22
- package/esm2020/custom-types.mjs +1 -1
- package/esm2020/editor.component.mjs +430 -430
- package/esm2020/editor.module.mjs +207 -201
- package/esm2020/interfaces/auto-format.mjs +1 -1
- package/esm2020/interfaces/editor.mjs +24 -24
- package/esm2020/interfaces/element.mjs +1 -1
- package/esm2020/interfaces/image.mjs +2 -2
- package/esm2020/interfaces/index.mjs +8 -8
- package/esm2020/interfaces/plugins/index.mjs +4 -4
- package/esm2020/interfaces/plugins/no-infer.mjs +1 -1
- package/esm2020/interfaces/plugins/plugin-key.mjs +39 -39
- package/esm2020/interfaces/plugins/plugins.mjs +1 -1
- package/esm2020/interfaces/plugins/with-override.mjs +1 -1
- package/esm2020/interfaces/reset-block-type-plugin-options.mjs +2 -2
- package/esm2020/interfaces/toolbar.mjs +11 -11
- package/esm2020/interfaces/upload.mjs +1 -1
- package/esm2020/interfaces/utility/index.mjs +3 -3
- package/esm2020/interfaces/utility/nested-structure-by-key.mjs +1 -1
- package/esm2020/interfaces/utility/override-by-key.mjs +1 -1
- package/esm2020/interfaces/utility/types.mjs +1 -1
- package/esm2020/interfaces/valid-children-types.mjs +35 -35
- package/esm2020/interfaces/view-base.mjs +21 -21
- package/esm2020/pipes.mjs +42 -42
- package/esm2020/plugins/align/align.editor.mjs +46 -46
- package/esm2020/plugins/align/align.plugin.mjs +63 -63
- package/esm2020/plugins/autoformat/autoformat.plugin.mjs +108 -108
- package/esm2020/plugins/autoformat/transforms/auto-format-block.mjs +14 -14
- package/esm2020/plugins/autoformat/transforms/auto-format-inline.mjs +77 -77
- package/esm2020/plugins/blockquote/blockquote.component.mjs +21 -21
- package/esm2020/plugins/blockquote/blockquote.editor.mjs +19 -19
- package/esm2020/plugins/blockquote/blockquote.plugin.mjs +70 -70
- package/esm2020/plugins/code/code.component.mjs +240 -240
- package/esm2020/plugins/code/code.editor.mjs +47 -47
- package/esm2020/plugins/code/code.plugin.mjs +41 -41
- package/esm2020/plugins/color/color.editor.mjs +43 -43
- package/esm2020/plugins/color/color.plugin.mjs +27 -27
- package/esm2020/plugins/color/toolbar-item.component.mjs +78 -78
- package/esm2020/plugins/common/auto-insert-data..mjs +76 -76
- package/esm2020/plugins/common/block-card.plugin.mjs +286 -286
- package/esm2020/plugins/common/get-fragment.plugin.mjs +23 -23
- package/esm2020/plugins/common/history.plugin.mjs +30 -30
- package/esm2020/plugins/common/move-selection.plugin.mjs +89 -89
- package/esm2020/plugins/common/remove-empty.plugin.mjs +59 -59
- package/esm2020/plugins/common/remove-void.plugin.mjs +56 -56
- package/esm2020/plugins/common/reset-type.plugin.mjs +34 -34
- package/esm2020/plugins/common/transforms.plugin.mjs +17 -17
- package/esm2020/plugins/deserializers/deserialize-html.plugin.mjs +38 -38
- package/esm2020/plugins/deserializers/deserialize-md.plugin.mjs +121 -121
- package/esm2020/plugins/font-size/font-size.editor.mjs +97 -97
- package/esm2020/plugins/heading/heading.editor.mjs +53 -53
- package/esm2020/plugins/heading/heading.plugin.mjs +84 -84
- package/esm2020/plugins/hr/hr.component.mjs +40 -40
- package/esm2020/plugins/hr/hr.editor.mjs +7 -7
- package/esm2020/plugins/hr/hr.plugin.mjs +41 -41
- package/esm2020/plugins/image/image.component.mjs +385 -365
- package/esm2020/plugins/image/image.editor.mjs +57 -57
- package/esm2020/plugins/image/image.plugin.mjs +56 -56
- package/esm2020/plugins/indent/indent.editor.mjs +70 -70
- package/esm2020/plugins/indent/indent.plugin.mjs +57 -57
- package/esm2020/plugins/indent/on-keydown-indent.mjs +53 -53
- package/esm2020/plugins/index.mjs +70 -70
- package/esm2020/plugins/inline-code/inline-code.component.mjs +21 -21
- package/esm2020/plugins/inline-code/inline-code.editor.mjs +47 -47
- package/esm2020/plugins/inline-code/inline-code.plugin.mjs +65 -65
- package/esm2020/plugins/link/edit/link-edit.component.mjs +105 -105
- package/esm2020/plugins/link/hover/link-hover.component.mjs +36 -36
- package/esm2020/plugins/link/link.component.mjs +162 -162
- package/esm2020/plugins/link/link.editor.mjs +66 -66
- package/esm2020/plugins/link/link.plugin.mjs +58 -58
- package/esm2020/plugins/link/link.types.mjs +12 -12
- package/esm2020/plugins/list/components/bulleted-list.component.mjs +32 -32
- package/esm2020/plugins/list/components/list-item.component.mjs +92 -92
- package/esm2020/plugins/list/components/numbered-list.component.mjs +38 -38
- package/esm2020/plugins/list/list.editor.mjs +125 -125
- package/esm2020/plugins/list/list.plugin.mjs +285 -285
- package/esm2020/plugins/list/normalizers/get-list-normalizer.mjs +39 -39
- package/esm2020/plugins/list/normalizers/normalize-list-item.mjs +18 -18
- package/esm2020/plugins/list/normalizers/normalize-no.mjs +42 -42
- package/esm2020/plugins/list/on-key-down-list.mjs +32 -32
- package/esm2020/plugins/list/queries/get-list-item-entry.mjs +27 -27
- package/esm2020/plugins/list/queries/get-list-item-sublist.mjs +12 -12
- package/esm2020/plugins/list/queries/get-list-types.mjs +5 -5
- package/esm2020/plugins/list/queries/get-start-list-item.mjs +26 -26
- package/esm2020/plugins/list/queries/has-list-in-list-item.mjs +27 -27
- package/esm2020/plugins/list/queries/is-in-list.mjs +5 -5
- package/esm2020/plugins/list/queries/is-list-nested.mjs +10 -10
- package/esm2020/plugins/list/queries/is-list.mjs +5 -5
- package/esm2020/plugins/list/queries/is-node-type-list.mjs +4 -4
- package/esm2020/plugins/list/queries/is-selection-at-list-item-start.mjs +12 -12
- package/esm2020/plugins/list/queries/is-selection-in-same-list-item.mjs +16 -16
- package/esm2020/plugins/list/queries/is-single-list-item.mjs +9 -9
- package/esm2020/plugins/list/transforms/insert-list-data.mjs +71 -71
- package/esm2020/plugins/list/transforms/insert-list-item.mjs +72 -72
- package/esm2020/plugins/list/transforms/move-list-item-down.mjs +41 -41
- package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +42 -42
- package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +29 -29
- package/esm2020/plugins/list/transforms/move-list-item-up.mjs +77 -77
- package/esm2020/plugins/list/transforms/unwrap-list.mjs +9 -9
- package/esm2020/plugins/list/types.mjs +2 -2
- package/esm2020/plugins/mark/mark.editor.mjs +27 -27
- package/esm2020/plugins/mark/mark.plugin.mjs +104 -104
- package/esm2020/plugins/node-id/node-id.plugin.mjs +77 -77
- package/esm2020/plugins/normalizers/insert-paragraph-nodes.mjs +27 -27
- package/esm2020/plugins/normalizers/remove-empty-nodes.mjs +17 -17
- package/esm2020/plugins/normalizers/trailing-node.plugin.mjs +32 -32
- package/esm2020/plugins/paint-format/paint-format.editor.mjs +122 -122
- package/esm2020/plugins/public-api.mjs +15 -15
- package/esm2020/plugins/quick-insert/components/quick-insert.component.mjs +95 -95
- package/esm2020/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.mjs +79 -79
- package/esm2020/plugins/quick-insert/quick-insert.editor.mjs +52 -52
- package/esm2020/plugins/quick-insert/quick-insert.plugin.mjs +73 -73
- package/esm2020/plugins/soft-break/soft-break.plugin.mjs +35 -35
- package/esm2020/plugins/soft-break/soft-break.types.mjs +1 -1
- package/esm2020/plugins/table/components/insert-mark/insert-mark.component.mjs +99 -99
- package/esm2020/plugins/table/components/row/row.component.mjs +46 -46
- package/esm2020/plugins/table/components/table.component.mjs +460 -460
- package/esm2020/plugins/table/components/td/td.component.mjs +696 -696
- package/esm2020/plugins/table/components/toolbar/table-options.component.mjs +70 -70
- package/esm2020/plugins/table/components/toolbar/table-toolbar.component.mjs +158 -158
- package/esm2020/plugins/table/table.editor.mjs +182 -182
- package/esm2020/plugins/table/table.plugin.mjs +426 -426
- package/esm2020/plugins/table/table.service.mjs +102 -102
- package/esm2020/plugins/table/table.store.mjs +483 -483
- package/esm2020/plugins/table/table.types.mjs +33 -33
- package/esm2020/plugins/table/toolbar-item.component.mjs +60 -60
- package/esm2020/plugins/table/transforms/clear-cell.mjs +14 -14
- package/esm2020/plugins/table/transforms/clear-table-node.mjs +27 -27
- package/esm2020/plugins/table/transforms/insert-column.mjs +57 -57
- package/esm2020/plugins/table/transforms/insert-row.mjs +42 -42
- package/esm2020/plugins/table/transforms/insert-table.mjs +14 -14
- package/esm2020/plugins/table/transforms/remove-column.mjs +51 -51
- package/esm2020/plugins/table/transforms/remove-row.mjs +50 -50
- package/esm2020/plugins/table/transforms/remove-table.mjs +49 -49
- package/esm2020/plugins/table/utils/add-columns.mjs +28 -28
- package/esm2020/plugins/table/utils/calc-anchor-position.mjs +24 -24
- package/esm2020/plugins/table/utils/calc-span.mjs +72 -72
- package/esm2020/plugins/table/utils/create-cell.mjs +19 -19
- package/esm2020/plugins/table/utils/create-row.mjs +12 -12
- package/esm2020/plugins/table/utils/create-table.mjs +13 -13
- package/esm2020/plugins/table/utils/get-base-height.mjs +22 -22
- package/esm2020/plugins/table/utils/get-select-cell-node.mjs +19 -19
- package/esm2020/plugins/table/utils/index.mjs +8 -8
- package/esm2020/plugins/table/utils/is-range-in-table.mjs +16 -16
- package/esm2020/plugins/table/utils/is-selection-in-table.mjs +11 -11
- package/esm2020/plugins/table/utils/is-virtual-key.mjs +12 -12
- package/esm2020/plugins/table/utils/merge-cell.mjs +90 -90
- package/esm2020/plugins/table/utils/next-path.mjs +5 -5
- package/esm2020/plugins/table/utils/normalize-table.mjs +30 -30
- package/esm2020/plugins/table/utils/remove-columns.mjs +23 -23
- package/esm2020/plugins/table/utils/set-menu-cell-invisibility.mjs +15 -15
- package/esm2020/plugins/table/utils/split-cell.mjs +31 -31
- package/esm2020/plugins/table/utils/table-position.mjs +242 -242
- package/esm2020/plugins/todo-item/todo-item.component.mjs +53 -53
- package/esm2020/plugins/todo-item/todo-item.editor.mjs +31 -31
- package/esm2020/plugins/todo-item/todo-item.plugin.mjs +78 -78
- package/esm2020/plugins/vertical-align/toolbar-item.component.mjs +82 -82
- package/esm2020/plugins/vertical-align/vertical-align.editor.mjs +54 -54
- package/esm2020/public-api.mjs +23 -23
- package/esm2020/queries/anchor-block-entry.mjs +13 -13
- package/esm2020/queries/anchor-block.mjs +6 -6
- package/esm2020/queries/anchor-inline-entry.mjs +10 -10
- package/esm2020/queries/find-descendant.mjs +47 -47
- package/esm2020/queries/find-node.mjs +45 -45
- package/esm2020/queries/find-path.mjs +28 -28
- package/esm2020/queries/get-above-by-type.mjs +13 -13
- package/esm2020/queries/get-above.mjs +9 -9
- package/esm2020/queries/get-anchor-block-entry.mjs +8 -8
- package/esm2020/queries/get-block-above.mjs +10 -10
- package/esm2020/queries/get-block-card-above.mjs +10 -10
- package/esm2020/queries/get-block-card-cursor.mjs +5 -5
- package/esm2020/queries/get-container-blocks.mjs +11 -11
- package/esm2020/queries/get-directly-parent.mjs +11 -11
- package/esm2020/queries/get-insert-elements-path.mjs +43 -43
- package/esm2020/queries/get-last-child-path.mjs +9 -9
- package/esm2020/queries/get-last-node.mjs +17 -17
- package/esm2020/queries/get-next-sibling-nodes.mjs +17 -17
- package/esm2020/queries/get-node.mjs +10 -10
- package/esm2020/queries/get-nodes-by-type.mjs +15 -15
- package/esm2020/queries/get-nodes.mjs +7 -7
- package/esm2020/queries/get-parent.mjs +12 -12
- package/esm2020/queries/get-plain-text.mjs +16 -16
- package/esm2020/queries/get-plugin-by-toolbar.mjs +12 -12
- package/esm2020/queries/get-point-before.mjs +61 -61
- package/esm2020/queries/get-point-from-location.mjs +15 -15
- package/esm2020/queries/get-previous-path.mjs +9 -9
- package/esm2020/queries/get-rang-from-block-start.mjs +16 -16
- package/esm2020/queries/get-range-before.mjs +17 -17
- package/esm2020/queries/get-selection-marks.mjs +18 -18
- package/esm2020/queries/get-selection-nodes-by-type.mjs +29 -29
- package/esm2020/queries/get-text.mjs +9 -9
- package/esm2020/queries/get-toolbar-disabled.mjs +12 -12
- package/esm2020/queries/index.mjs +58 -58
- package/esm2020/queries/is-across-blocks.mjs +7 -7
- package/esm2020/queries/is-ancestor-empty.mjs +6 -6
- package/esm2020/queries/is-ancestor.mjs +3 -3
- package/esm2020/queries/is-block-above-empty.mjs +11 -11
- package/esm2020/queries/is-block-active.mjs +7 -7
- package/esm2020/queries/is-block-card-cursor.mjs +4 -4
- package/esm2020/queries/is-block-text-empty-after-selection.mjs +31 -31
- package/esm2020/queries/is-collapsed.mjs +7 -7
- package/esm2020/queries/is-contain-nested-type.mjs +28 -28
- package/esm2020/queries/is-container-type.mjs +2 -2
- package/esm2020/queries/is-descendant.mjs +3 -3
- package/esm2020/queries/is-empty-content.mjs +14 -14
- package/esm2020/queries/is-empty-paragraph-by-path.mjs +7 -7
- package/esm2020/queries/is-empty-paragraph.mjs +11 -11
- package/esm2020/queries/is-first-child.mjs +5 -5
- package/esm2020/queries/is-include-types.mjs +11 -11
- package/esm2020/queries/is-node-type-in.mjs +9 -9
- package/esm2020/queries/is-node-type.mjs +15 -15
- package/esm2020/queries/is-paragraph.mjs +9 -9
- package/esm2020/queries/is-point-at-root.mjs +2 -2
- package/esm2020/queries/is-range-across-blocks.mjs +22 -22
- package/esm2020/queries/is-range-at-root.mjs +3 -3
- package/esm2020/queries/is-start.mjs +6 -6
- package/esm2020/queries/some-node.mjs +9 -9
- package/esm2020/services/color-select.service.mjs +49 -49
- package/esm2020/services/context.service.mjs +58 -58
- package/esm2020/services/table-contextmenu.service.mjs +189 -189
- package/esm2020/services/toolbar.service.mjs +47 -47
- package/esm2020/shortcuts/index.mjs +5 -5
- package/esm2020/shortcuts/mark.mjs +24 -24
- package/esm2020/transforms/apply-deep-to-nodes.mjs +21 -21
- package/esm2020/transforms/clear-marks.mjs +23 -23
- package/esm2020/transforms/close-conversion-hint.mjs +8 -8
- package/esm2020/transforms/delete-element.mjs +11 -11
- package/esm2020/transforms/handle-continual-delete-backward.mjs +17 -17
- package/esm2020/transforms/handle-continual-insert-break.mjs +19 -19
- package/esm2020/transforms/index.mjs +18 -18
- package/esm2020/transforms/insert-elements.mjs +33 -33
- package/esm2020/transforms/insert-paragraph.mjs +6 -6
- package/esm2020/transforms/merge-deep-to-nodes.mjs +8 -8
- package/esm2020/transforms/move-children.mjs +21 -21
- package/esm2020/transforms/on-keydown-reset-block-type.mjs +22 -22
- package/esm2020/transforms/set-end-selection.mjs +10 -10
- package/esm2020/transforms/set-marks.mjs +9 -9
- package/esm2020/transforms/set-node.mjs +5 -5
- package/esm2020/transforms/split-node.mjs +31 -31
- package/esm2020/transforms/un-hang-range.mjs +11 -11
- package/esm2020/transforms/un-wrap.mjs +11 -11
- package/esm2020/transforms/unwrap-nodes-by-type.mjs +14 -14
- package/esm2020/utils/auto-focus.mjs +13 -13
- package/esm2020/utils/auto-scroll-view.mjs +24 -24
- package/esm2020/utils/cast-array.mjs +7 -7
- package/esm2020/utils/common.mjs +2 -2
- package/esm2020/utils/create-empty-paragraph.mjs +14 -14
- package/esm2020/utils/data-transform.mjs +48 -48
- package/esm2020/utils/dom.mjs +46 -46
- package/esm2020/utils/editor-uuid.mjs +8 -8
- package/esm2020/utils/fragment.mjs +65 -65
- package/esm2020/utils/get-all-nodes-by-type.mjs +5 -0
- package/esm2020/utils/get-editable-element-height.mjs +6 -6
- package/esm2020/utils/get-toolbar-class.mjs +6 -6
- package/esm2020/utils/id-creator.mjs +11 -11
- package/esm2020/utils/index.mjs +13 -13
- package/esm2020/utils/is-clean-empty-paragraph.mjs +36 -36
- package/esm2020/utils/is-inline.mjs +8 -8
- package/esm2020/utils/lodash.mjs +2 -2
- package/esm2020/utils/match.mjs +32 -32
- package/esm2020/utils/merge-element-options.mjs +19 -19
- package/esm2020/utils/weak-maps.mjs +3 -3
- package/esm2020/worktile-theia.mjs +4 -4
- package/fesm2015/worktile-theia.mjs +13131 -13097
- package/fesm2015/worktile-theia.mjs.map +1 -1
- package/fesm2020/worktile-theia.mjs +13150 -13120
- package/fesm2020/worktile-theia.mjs.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 +5 -4
- 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 +77 -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 -58
- 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 -2
- 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-all-nodes-by-type.d.ts +3 -0
- 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 +2 -2
- 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,696 +1,696 @@
|
|
|
1
|
-
import { Component, HostBinding, ViewChild } from '@angular/core';
|
|
2
|
-
import { filter, map, take, takeUntil } from 'rxjs/operators';
|
|
3
|
-
import { ELEMENT_TO_COMPONENT } from 'slate-angular';
|
|
4
|
-
import { SLA_TABLE_CELL_SELECTOR } from '../../../../constants/selector';
|
|
5
|
-
import { TablePosition } from '../../utils/table-position';
|
|
6
|
-
import { fromEvent, merge, Subject } from 'rxjs';
|
|
7
|
-
import { ColumnResizingStore } from '../../../../components/column-resize/resizing.store';
|
|
8
|
-
import { Position, TableCellEventDispatcher } from '../../../../components/column-resize/event-dispatcher';
|
|
9
|
-
import { ColumnResizeNotifierSource } from '../../../../components/column-resize/column-resize-notifier';
|
|
10
|
-
import { ComponentPortal, PortalInjector } from '@angular/cdk/portal';
|
|
11
|
-
import { TheColumnResizeOverlayHandleComponent } from '../../../../components/column-resize/overlay-handle.component';
|
|
12
|
-
import { ResizeRef } from '../../../../components/column-resize/resize-ref';
|
|
13
|
-
import { coerceCssPixelValue } from '@angular/cdk/coercion';
|
|
14
|
-
import { coercePixelsFromCssValue, getElementHeight, getElementWidth, useElementStyle } from '../../../../utils/dom';
|
|
15
|
-
import { TheBaseElementComponent } from '../../../../interfaces/view-base';
|
|
16
|
-
import { BASE_FILL_HEIGHT, TableOptions } from '../../table.types';
|
|
17
|
-
import { TheEditor } from '../../../../interfaces/editor';
|
|
18
|
-
import { getBaseHeightForRows } from '../../utils/get-base-height';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "@angular/cdk/overlay";
|
|
21
|
-
import * as i2 from "../../../../components/column-resize/resizing.store";
|
|
22
|
-
import * as i3 from "slate-angular";
|
|
23
|
-
const OVERLAY_ACTIVE_CLASS = 'the-resizable-overlay-thumb-active';
|
|
24
|
-
const OVERLAY_INIT_SIZE = 16;
|
|
25
|
-
export const POSITION_MAP = {
|
|
26
|
-
top: {
|
|
27
|
-
originX: 'start',
|
|
28
|
-
originY: 'top',
|
|
29
|
-
overlayX: 'start',
|
|
30
|
-
overlayY: 'center'
|
|
31
|
-
},
|
|
32
|
-
bottom: {
|
|
33
|
-
originX: 'start',
|
|
34
|
-
originY: 'bottom',
|
|
35
|
-
overlayX: 'start',
|
|
36
|
-
overlayY: 'center'
|
|
37
|
-
},
|
|
38
|
-
right: {
|
|
39
|
-
originX: 'end',
|
|
40
|
-
originY: 'top',
|
|
41
|
-
overlayX: 'center',
|
|
42
|
-
overlayY: 'top'
|
|
43
|
-
},
|
|
44
|
-
left: {
|
|
45
|
-
originX: 'start',
|
|
46
|
-
originY: 'top',
|
|
47
|
-
overlayX: 'center',
|
|
48
|
-
overlayY: 'top'
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
export class TheTdComponent extends TheBaseElementComponent {
|
|
52
|
-
constructor(elementRef, cdr, renderer, viewContainerRef, ngZone, injector, overlay, resizingStore, scrollDispatcher) {
|
|
53
|
-
super(elementRef, cdr);
|
|
54
|
-
this.elementRef = elementRef;
|
|
55
|
-
this.cdr = cdr;
|
|
56
|
-
this.renderer = renderer;
|
|
57
|
-
this.viewContainerRef = viewContainerRef;
|
|
58
|
-
this.ngZone = ngZone;
|
|
59
|
-
this.injector = injector;
|
|
60
|
-
this.overlay = overlay;
|
|
61
|
-
this.resizingStore = resizingStore;
|
|
62
|
-
this.scrollDispatcher = scrollDispatcher;
|
|
63
|
-
this.destroy$ = new Subject();
|
|
64
|
-
this.tableOptions = new TableOptions();
|
|
65
|
-
this.cellInnerMinHeight = null;
|
|
66
|
-
}
|
|
67
|
-
get tableStore() {
|
|
68
|
-
return this.tableComponent.tableStore;
|
|
69
|
-
}
|
|
70
|
-
get tableService() {
|
|
71
|
-
return this.tableComponent.tableService;
|
|
72
|
-
}
|
|
73
|
-
get eventDispatcher() {
|
|
74
|
-
return this.tableComponent.eventDispatcher;
|
|
75
|
-
}
|
|
76
|
-
get resizeNotifier() {
|
|
77
|
-
return this.tableComponent.resizeNotifier;
|
|
78
|
-
}
|
|
79
|
-
get theTableWrapperWidth() {
|
|
80
|
-
const tableContainer = this.tableComponent.nativeElement.firstChild;
|
|
81
|
-
const paddingLeft = coercePixelsFromCssValue(window.getComputedStyle(tableContainer)['paddingLeft']);
|
|
82
|
-
return this.tableComponent.theTableWrapperWidth - paddingLeft;
|
|
83
|
-
}
|
|
84
|
-
get tableElement() {
|
|
85
|
-
return this.tableComponent.theTableElement.nativeElement;
|
|
86
|
-
}
|
|
87
|
-
get scrollableElementTop() {
|
|
88
|
-
const cdkscrollable = this.elementRef.nativeElement.closest('[cdkscrollable]');
|
|
89
|
-
if (cdkscrollable) {
|
|
90
|
-
return cdkscrollable.getBoundingClientRect().top;
|
|
91
|
-
}
|
|
92
|
-
return -window.scrollY;
|
|
93
|
-
}
|
|
94
|
-
get scrollableElementLeft() {
|
|
95
|
-
return this.tableComponent.tableWrapper.nativeElement.scrollLeft;
|
|
96
|
-
}
|
|
97
|
-
get isXAxisHover() {
|
|
98
|
-
return [Position.left, Position.right].includes(this.hoverdDirection);
|
|
99
|
-
}
|
|
100
|
-
get rowResizeClass() {
|
|
101
|
-
return [
|
|
102
|
-
'the-row-resize-handle-panel',
|
|
103
|
-
this.tablePosition.table && this.tablePosition.table.options?.numberedColumn ? 'the-numbered-resize-handle-panel' : ''
|
|
104
|
-
];
|
|
105
|
-
}
|
|
106
|
-
get cellInnerNativeElement() {
|
|
107
|
-
return this.cellInner.nativeElement;
|
|
108
|
-
}
|
|
109
|
-
onContextChange() {
|
|
110
|
-
super.onContextChange();
|
|
111
|
-
if (this.initialized) {
|
|
112
|
-
this.useState();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
ngOnInit() {
|
|
116
|
-
super.ngOnInit();
|
|
117
|
-
this.useBackground();
|
|
118
|
-
this.useSpan();
|
|
119
|
-
this.useDisplay();
|
|
120
|
-
this.useFocus();
|
|
121
|
-
useElementStyle(this.elementRef.nativeElement, this.element);
|
|
122
|
-
}
|
|
123
|
-
ngAfterViewInit() {
|
|
124
|
-
this.ngZone.onStable.pipe(take(1)).subscribe(() => {
|
|
125
|
-
this.useTablePosition();
|
|
126
|
-
this.getInjectionService();
|
|
127
|
-
this.subscribeSelectedCellsChange();
|
|
128
|
-
this.subscribeDangerousCellsChange();
|
|
129
|
-
this.subscribeTableChange();
|
|
130
|
-
this.listenCellSelectEvents();
|
|
131
|
-
this.listenForCellHoverEvents();
|
|
132
|
-
this.listenForResizeEvents();
|
|
133
|
-
// const height = this.calculateCellInnerMinHeight();
|
|
134
|
-
// this.useMinHeight(height);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
getInjectionService() {
|
|
138
|
-
this.tableComponent = ELEMENT_TO_COMPONENT.get(this.tablePosition.table);
|
|
139
|
-
}
|
|
140
|
-
subscribeSelectedCellsChange() {
|
|
141
|
-
this.tableStore
|
|
142
|
-
.selectedCellsChange()
|
|
143
|
-
.pipe(takeUntil(this.destroy$))
|
|
144
|
-
.subscribe(x => {
|
|
145
|
-
if (x.length === 0) {
|
|
146
|
-
this.renderer.removeClass(this.elementRef.nativeElement, 'selected-cell');
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
const isSelectedCell = x.some(({ row, col }) => row === this.tablePosition.getRowIndex() && col === this.tablePosition.getColumnIndex());
|
|
150
|
-
if (isSelectedCell) {
|
|
151
|
-
this.renderer.addClass(this.elementRef.nativeElement, 'selected-cell');
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
this.renderer.removeClass(this.elementRef.nativeElement, 'selected-cell');
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
this.cdr.detectChanges();
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
subscribeDangerousCellsChange() {
|
|
161
|
-
this.tableStore
|
|
162
|
-
.dangerousCellsChange()
|
|
163
|
-
.pipe(takeUntil(this.destroy$))
|
|
164
|
-
.subscribe(x => {
|
|
165
|
-
if (x.length === 0) {
|
|
166
|
-
this.renderer.removeClass(this.elementRef.nativeElement, 'dangerous-cell');
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
const isSelectedCell = x.some(({ row, col }) => row === this.tablePosition.getRowIndex() && col === this.tablePosition.getColumnIndex());
|
|
170
|
-
if (isSelectedCell) {
|
|
171
|
-
this.renderer.addClass(this.elementRef.nativeElement, 'dangerous-cell');
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
this.renderer.removeClass(this.elementRef.nativeElement, 'dangerous-cell');
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
this.cdr.detectChanges();
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
subscribeTableChange() {
|
|
181
|
-
this.tableStore
|
|
182
|
-
.tableChange()
|
|
183
|
-
.pipe(takeUntil(this.destroy$))
|
|
184
|
-
.subscribe(() => {
|
|
185
|
-
this.useTablePosition();
|
|
186
|
-
// const height = this.calculateCellInnerMinHeight();
|
|
187
|
-
// this.useMinHeight(height);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
useState() {
|
|
191
|
-
this.useBackground();
|
|
192
|
-
this.useSpan();
|
|
193
|
-
this.useDisplay();
|
|
194
|
-
this.useFocus();
|
|
195
|
-
useElementStyle(this.elementRef.nativeElement, this.element);
|
|
196
|
-
}
|
|
197
|
-
useTablePosition() {
|
|
198
|
-
const opts = new TableOptions();
|
|
199
|
-
const path = TheEditor.findPath(this.editor, this.element);
|
|
200
|
-
// must be path of cell's children
|
|
201
|
-
this.tablePosition = TablePosition.create(opts, this.editor, path.concat(0));
|
|
202
|
-
}
|
|
203
|
-
useBackground() {
|
|
204
|
-
if (this.element.backgroundColor !== this.backgroundColor) {
|
|
205
|
-
this.backgroundColor = this.element.backgroundColor;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
useSpan() {
|
|
209
|
-
this.colspan = undefined;
|
|
210
|
-
this.rowspan = undefined;
|
|
211
|
-
if (this.element.colspan) {
|
|
212
|
-
this.colspan = this.element.colspan;
|
|
213
|
-
}
|
|
214
|
-
if (this.element.rowspan) {
|
|
215
|
-
this.rowspan = this.element.rowspan;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
calculateCellInnerMinHeight() {
|
|
219
|
-
if (this.element.colspan) {
|
|
220
|
-
const rowIndex = this.tablePosition.getRowIndex();
|
|
221
|
-
if (this.calculateCombinedRows().length > 0) {
|
|
222
|
-
let height = 0;
|
|
223
|
-
const heights = getBaseHeightForRows(this.editor, this.tableComponent.element);
|
|
224
|
-
for (let index = rowIndex; index < this.element.rowspan + rowIndex; index++) {
|
|
225
|
-
height += heights[index];
|
|
226
|
-
}
|
|
227
|
-
height = height - BASE_FILL_HEIGHT;
|
|
228
|
-
return height;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return undefined;
|
|
232
|
-
}
|
|
233
|
-
calculateCombinedRows() {
|
|
234
|
-
const rowIndex = this.tablePosition.getRowIndex();
|
|
235
|
-
const combinedRows = [];
|
|
236
|
-
const table = this.tablePosition.table;
|
|
237
|
-
table.children.forEach((row, _rowIndex) => {
|
|
238
|
-
if (_rowIndex > rowIndex && _rowIndex <= rowIndex + this.element.rowspan) {
|
|
239
|
-
const isCombined = row.children.every(cell => cell.hidden || cell.rowspan > 1);
|
|
240
|
-
if (isCombined) {
|
|
241
|
-
combinedRows.push(_rowIndex);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
return combinedRows;
|
|
246
|
-
}
|
|
247
|
-
useDisplay() {
|
|
248
|
-
this.display = this.element.hidden ? 'none' : '';
|
|
249
|
-
}
|
|
250
|
-
useFocus() {
|
|
251
|
-
if (this.isCollapsed) {
|
|
252
|
-
this.renderer.addClass(this.elementRef.nativeElement, 'focused-cell');
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
this.renderer.removeClass(this.elementRef.nativeElement, 'focused-cell');
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
useMinHeight(minHeight) {
|
|
259
|
-
if (this.cellInnerMinHeight === minHeight) {
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
this.cellInnerMinHeight = minHeight;
|
|
263
|
-
// if (this.cellInnerMinHeight) {
|
|
264
|
-
// this.cellInnerNativeElement.style.minHeight = `${this.cellInnerMinHeight}px`;
|
|
265
|
-
// } else {
|
|
266
|
-
// this.cellInnerNativeElement.style.removeProperty('min-height');
|
|
267
|
-
// }
|
|
268
|
-
}
|
|
269
|
-
//#region cell-select
|
|
270
|
-
listenCellSelectEvents() {
|
|
271
|
-
this.ngZone.runOutsideAngular(() => {
|
|
272
|
-
const element = this.elementRef.nativeElement;
|
|
273
|
-
fromEvent(element, 'mousedown')
|
|
274
|
-
.pipe(takeUntil(this.destroy$), filter((e) => e.button !== 2), map(event => {
|
|
275
|
-
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
276
|
-
return cell;
|
|
277
|
-
}), filter(cell => !!cell))
|
|
278
|
-
.subscribe((cell) => {
|
|
279
|
-
this.tableStore.selectCellStart(cell, this.editor);
|
|
280
|
-
if (this.overlayRef) {
|
|
281
|
-
this.overlayRef.detach();
|
|
282
|
-
}
|
|
283
|
-
this.listenCellMouseEvents();
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
listenCellMouseEvents() {
|
|
288
|
-
const mouseoverObservable = fromEvent(document, 'mouseover')
|
|
289
|
-
.pipe(takeUntil(this.destroy$), map(event => {
|
|
290
|
-
event.preventDefault();
|
|
291
|
-
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
292
|
-
return cell;
|
|
293
|
-
}), filter((cell) => !!cell))
|
|
294
|
-
.subscribe((cell) => {
|
|
295
|
-
this.tableStore.selectCellOngoing(cell, this.editor);
|
|
296
|
-
});
|
|
297
|
-
fromEvent(document, 'mouseup')
|
|
298
|
-
.pipe(take(1))
|
|
299
|
-
.subscribe(() => {
|
|
300
|
-
this.tableStore.selectCellEnd(this.editor);
|
|
301
|
-
if (this.tableStore.isCellSelecting) {
|
|
302
|
-
this.ngZone.run(() => {
|
|
303
|
-
this.tableComponent.tableService.openToolbar(this.tableStore.focusCellElement);
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
mouseoverObservable.unsubscribe();
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
//#region resizable
|
|
310
|
-
listenForCellHoverEvents() {
|
|
311
|
-
const element = this.elementRef.nativeElement;
|
|
312
|
-
this.eventDispatcher
|
|
313
|
-
.resizeOverlayVisibleForTableCell(element)
|
|
314
|
-
.pipe(takeUntil(this.destroy$), map(value => {
|
|
315
|
-
// 禁止第一列左侧
|
|
316
|
-
if (value && value.position === Position.left && this.tablePosition.getColumnIndex() === 0) {
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
// 禁止第一行顶部
|
|
320
|
-
if (value && value.position === Position.top && this.tablePosition.getRowIndex() === 0) {
|
|
321
|
-
return null;
|
|
322
|
-
}
|
|
323
|
-
return value;
|
|
324
|
-
}))
|
|
325
|
-
.subscribe(hoveredCellInfo => {
|
|
326
|
-
if (hoveredCellInfo && hoveredCellInfo.position) {
|
|
327
|
-
this.hoverdDirection = hoveredCellInfo.position;
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
this.hoverdDirection = null;
|
|
331
|
-
}
|
|
332
|
-
if (hoveredCellInfo) {
|
|
333
|
-
this.hoverdDirection = hoveredCellInfo.position;
|
|
334
|
-
if (!this.overlayRef || !this.overlayRef.hasAttached()) {
|
|
335
|
-
this.overlayRef = this._createOverlayForHandle();
|
|
336
|
-
this._showHandleOverlay();
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
this.resizeRef.setDirection(this.isXAxisHover ? 'X' : 'Y');
|
|
340
|
-
this.updateOverlayHandleSizeAndOffset();
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
else if (this.overlayRef) {
|
|
344
|
-
this.overlayRef.detach();
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
listenForResizeEvents() {
|
|
349
|
-
const takeUntilDestroyed = takeUntil(this.destroy$);
|
|
350
|
-
merge(this.resizeNotifier.resizeCanceled, this.resizeNotifier.triggerResize)
|
|
351
|
-
.pipe(takeUntilDestroyed, filter(columnSize => columnSize.tableCell === this.elementRef.nativeElement))
|
|
352
|
-
.subscribe(({ deltaSize, previousSize, completeImmediately }) => {
|
|
353
|
-
const { top, left, height, width } = this.elementRef.nativeElement.getBoundingClientRect();
|
|
354
|
-
const { clientY, clientX } = event;
|
|
355
|
-
let isPreventApplySize = false;
|
|
356
|
-
// 向下,或者向右移动(deltaSize > 0),鼠标位置不在当前单元格拖拽线上,阻止应用拖拽尺寸
|
|
357
|
-
if (this.isXAxisHover) {
|
|
358
|
-
const cellWidth = this.hoverdDirection === Position.left ? 0 : width;
|
|
359
|
-
isPreventApplySize = deltaSize > 0 && left + cellWidth - clientX > 0;
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
const cellHeight = this.hoverdDirection === Position.top ? 0 : height;
|
|
363
|
-
isPreventApplySize = deltaSize > 0 && top + cellHeight - clientY > 0;
|
|
364
|
-
}
|
|
365
|
-
if (isPreventApplySize) {
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
this.elementRef.nativeElement.classList.add(OVERLAY_ACTIVE_CLASS);
|
|
369
|
-
this.applySize(deltaSize, previousSize);
|
|
370
|
-
if (completeImmediately) {
|
|
371
|
-
this._completeResizeOperation();
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
merge(this.resizeNotifier.resizeCanceled, this.resizeNotifier.resizeCompleted)
|
|
375
|
-
.pipe(takeUntilDestroyed)
|
|
376
|
-
.subscribe(columnSize => {
|
|
377
|
-
this._cleanUpAfterResize(columnSize);
|
|
378
|
-
this.resizingStore.cleanResizing();
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
_completeResizeOperation() {
|
|
382
|
-
this.ngZone.run(() => {
|
|
383
|
-
this.resizeNotifier.resizeCompleted.next({
|
|
384
|
-
tableCell: this.elementRef.nativeElement
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
_cleanUpAfterResize(columnSize) {
|
|
389
|
-
this.elementRef.nativeElement.classList.remove(OVERLAY_ACTIVE_CLASS);
|
|
390
|
-
}
|
|
391
|
-
_createHandlePortal() {
|
|
392
|
-
const customTokens = new WeakMap();
|
|
393
|
-
this.resizeRef = new ResizeRef(this.elementRef, this.overlayRef, this.tableOptions.minWidthPx, this.tableOptions.maxWidthPx, this.tableOptions.minHeightPx, this.tableOptions.maxHeightPx, () => {
|
|
394
|
-
this.updateOverlayHandleSizeAndOffset();
|
|
395
|
-
});
|
|
396
|
-
customTokens.set(ResizeRef, this.resizeRef);
|
|
397
|
-
customTokens.set(TableCellEventDispatcher, this.eventDispatcher);
|
|
398
|
-
customTokens.set(ColumnResizeNotifierSource, this.resizeNotifier);
|
|
399
|
-
const injector = new PortalInjector(this.injector, customTokens);
|
|
400
|
-
return new ComponentPortal(TheColumnResizeOverlayHandleComponent, this.viewContainerRef, injector);
|
|
401
|
-
}
|
|
402
|
-
_showHandleOverlay() {
|
|
403
|
-
this.overlayRef.attach(this._createHandlePortal()).changeDetectorRef.markForCheck();
|
|
404
|
-
this.updateOverlayHandleSizeAndOffset();
|
|
405
|
-
}
|
|
406
|
-
updateOverlayHandleSizeAndOffset() {
|
|
407
|
-
this.overlayRef?.removePanelClass(['the-column-resize-handle-panel', ...this.rowResizeClass]);
|
|
408
|
-
this.isXAxisHover ? this.updateOverlayHandleColumnSize() : this.updateOverlayHandleRowSize();
|
|
409
|
-
this.overlayRef?.updatePositionStrategy(this.createPositionStrategy());
|
|
410
|
-
this.resizeRef.setDirection(this.isXAxisHover ? 'X' : 'Y');
|
|
411
|
-
this.resizeRef.setPosition(this.hoverdDirection);
|
|
412
|
-
}
|
|
413
|
-
updateOverlayHandleColumnSize() {
|
|
414
|
-
let height = 0;
|
|
415
|
-
const tableElementTop = this.tableElement.getBoundingClientRect().top;
|
|
416
|
-
if (tableElementTop < this.scrollableElementTop) {
|
|
417
|
-
height = this.tableElement.offsetHeight - (this.scrollableElementTop - tableElementTop);
|
|
418
|
-
}
|
|
419
|
-
else {
|
|
420
|
-
height = this.tableElement.offsetHeight;
|
|
421
|
-
}
|
|
422
|
-
this.overlayRef.addPanelClass('the-column-resize-handle-panel');
|
|
423
|
-
this.overlayRef.updateSize({ height, width: OVERLAY_INIT_SIZE });
|
|
424
|
-
}
|
|
425
|
-
updateOverlayHandleRowSize() {
|
|
426
|
-
const tableElement = this.tableComponent.nativeElement;
|
|
427
|
-
const rowControl = tableElement.querySelector('.the-temp-table-row-controls');
|
|
428
|
-
let rowControlWidth = 11;
|
|
429
|
-
if (rowControl) {
|
|
430
|
-
rowControlWidth = rowControl.getBoundingClientRect().width;
|
|
431
|
-
}
|
|
432
|
-
const width = this.tableComponent.tableWrapper.nativeElement.offsetWidth + rowControlWidth - 2;
|
|
433
|
-
this.overlayRef.addPanelClass(this.rowResizeClass);
|
|
434
|
-
this.overlayRef.updateSize({ width, height: OVERLAY_INIT_SIZE });
|
|
435
|
-
}
|
|
436
|
-
applySize(deltaSize, previousSize) {
|
|
437
|
-
// update col width and table width
|
|
438
|
-
if (this.isXAxisHover) {
|
|
439
|
-
this.applyColumnSize(deltaSize);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
this.applyRowSize(deltaSize);
|
|
443
|
-
}
|
|
444
|
-
this.tableComponent.useRowControls();
|
|
445
|
-
this.tableComponent.detectChanges();
|
|
446
|
-
this.updateOverlayHandleSizeAndOffset();
|
|
447
|
-
}
|
|
448
|
-
_createOverlayForHandle() {
|
|
449
|
-
// Use of overlays allows us to properly capture click events spanning parts
|
|
450
|
-
// of two table cells and is also useful for displaying a resize thumb
|
|
451
|
-
// over both cells and extending it down the table as needed.
|
|
452
|
-
const overlayOption = this.isXAxisHover
|
|
453
|
-
? {
|
|
454
|
-
width: OVERLAY_INIT_SIZE + 'px',
|
|
455
|
-
panelClass: 'the-column-resize-handle-panel'
|
|
456
|
-
}
|
|
457
|
-
: {
|
|
458
|
-
height: OVERLAY_INIT_SIZE + 'px',
|
|
459
|
-
panelClass: this.rowResizeClass
|
|
460
|
-
};
|
|
461
|
-
return this.overlay.create({
|
|
462
|
-
// Always position the overlay based on left-indexed coordinates.
|
|
463
|
-
disposeOnNavigation: true,
|
|
464
|
-
positionStrategy: this.createPositionStrategy(),
|
|
465
|
-
...overlayOption
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
createPositionStrategy() {
|
|
469
|
-
let offsetY = this.calculateOverlayHandleOffsetY();
|
|
470
|
-
let offsetX = this.calculateOverlayHandleOffsetX();
|
|
471
|
-
const position = this.isXAxisHover
|
|
472
|
-
? { ...POSITION_MAP[this.hoverdDirection], offsetY }
|
|
473
|
-
: { ...POSITION_MAP[this.hoverdDirection], offsetX };
|
|
474
|
-
return this.overlay
|
|
475
|
-
.position()
|
|
476
|
-
.flexibleConnectedTo(this.elementRef.nativeElement)
|
|
477
|
-
.withFlexibleDimensions(false)
|
|
478
|
-
.withGrowAfterOpen(false)
|
|
479
|
-
.withPush(false)
|
|
480
|
-
.withPositions([position]);
|
|
481
|
-
}
|
|
482
|
-
calculateOverlayHandleOffsetY() {
|
|
483
|
-
const tableElementTop = this.tableElement.getBoundingClientRect().top;
|
|
484
|
-
if (tableElementTop < this.scrollableElementTop) {
|
|
485
|
-
return this.scrollableElementTop - this.elementRef.nativeElement.getBoundingClientRect().top;
|
|
486
|
-
}
|
|
487
|
-
else {
|
|
488
|
-
return tableElementTop - this.elementRef.nativeElement.getBoundingClientRect().top;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
calculateOverlayHandleOffsetX() {
|
|
492
|
-
const cellElementLeft = this.elementRef.nativeElement.getBoundingClientRect().left;
|
|
493
|
-
const tableElementLeft = this.tableElement.getBoundingClientRect().left;
|
|
494
|
-
return tableElementLeft - cellElementLeft + this.scrollableElementLeft;
|
|
495
|
-
}
|
|
496
|
-
applyColumnSize(deltaX) {
|
|
497
|
-
const cols = [...this.tableElement.querySelector('colgroup').children];
|
|
498
|
-
this.resizingStore.storeTableWidth(cols);
|
|
499
|
-
this.resizingStore.initDirection(deltaX);
|
|
500
|
-
let cellIndex = this.elementRef.nativeElement.cellIndex;
|
|
501
|
-
if (this.hoverdDirection === 'left') {
|
|
502
|
-
cellIndex = cellIndex - 1;
|
|
503
|
-
}
|
|
504
|
-
const colspan = this.elementRef.nativeElement.getAttribute('colspan') || 1;
|
|
505
|
-
cellIndex = cellIndex + colspan / 1 - 1;
|
|
506
|
-
if (deltaX > 0) {
|
|
507
|
-
this.applyRightCols(cols, deltaX, cellIndex + 1);
|
|
508
|
-
if (this.resizingStore.isRestoring(deltaX)) {
|
|
509
|
-
deltaX = this.resizingStore.restoreLeftCols(deltaX);
|
|
510
|
-
}
|
|
511
|
-
if (deltaX > 0) {
|
|
512
|
-
cols[cellIndex].style.width = coerceCssPixelValue(coercePixelsFromCssValue(cols[cellIndex].style.width) + deltaX);
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
else {
|
|
516
|
-
const nextCol = cols[cellIndex + 1];
|
|
517
|
-
if (nextCol) {
|
|
518
|
-
let leftDeltaX = this.resizingStore.getScrollWidth(deltaX);
|
|
519
|
-
const _delta = this.applyLeftCols(cols, deltaX, cellIndex);
|
|
520
|
-
if (_delta === deltaX) {
|
|
521
|
-
// can not resize
|
|
522
|
-
return;
|
|
523
|
-
}
|
|
524
|
-
deltaX = deltaX - _delta;
|
|
525
|
-
if (this.resizingStore.isRestoring(deltaX)) {
|
|
526
|
-
if (leftDeltaX < 0) {
|
|
527
|
-
leftDeltaX = this.resizingStore.restoreRightCols(leftDeltaX);
|
|
528
|
-
}
|
|
529
|
-
if (leftDeltaX < 0) {
|
|
530
|
-
nextCol.style.width = coerceCssPixelValue(getElementWidth(nextCol) + Math.abs(leftDeltaX));
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
else {
|
|
534
|
-
nextCol.style.width = coerceCssPixelValue(getElementWidth(nextCol) + Math.abs(deltaX));
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
else {
|
|
538
|
-
const scrollWidth = getElementWidth(this.tableElement) - this.theTableWrapperWidth;
|
|
539
|
-
if (scrollWidth > 0) {
|
|
540
|
-
if (scrollWidth > Math.abs(deltaX)) {
|
|
541
|
-
this.applyLeftCols(cols, deltaX, cellIndex);
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
this.applyLeftCols(cols, -scrollWidth, cellIndex);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
applyLeftCols(cols, deltaX, colIndex) {
|
|
551
|
-
while (deltaX < 0 && cols[colIndex]) {
|
|
552
|
-
const currentWidth = getElementWidth(cols[colIndex]);
|
|
553
|
-
if (currentWidth > this.tableOptions.minWidthPx) {
|
|
554
|
-
if (this.resizingStore.isResizing(deltaX)) {
|
|
555
|
-
this.resizingStore.storeResizingCol(cols[colIndex]);
|
|
556
|
-
}
|
|
557
|
-
if (currentWidth > this.tableOptions.minWidthPx + Math.abs(deltaX)) {
|
|
558
|
-
cols[colIndex].style.width = coerceCssPixelValue(currentWidth - Math.abs(deltaX));
|
|
559
|
-
deltaX = 0;
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
562
|
-
deltaX += currentWidth - this.tableOptions.minWidthPx;
|
|
563
|
-
cols[colIndex].style.width = coerceCssPixelValue(this.tableOptions.minWidthPx);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
colIndex--;
|
|
567
|
-
}
|
|
568
|
-
return deltaX;
|
|
569
|
-
}
|
|
570
|
-
applyRightCols(cols, deltaX, colIndex) {
|
|
571
|
-
while (deltaX > 0 && cols[colIndex]) {
|
|
572
|
-
const currentWidth = getElementWidth(cols[colIndex]);
|
|
573
|
-
if (currentWidth > this.tableOptions.minWidthPx) {
|
|
574
|
-
if (this.resizingStore.isResizing(deltaX)) {
|
|
575
|
-
this.resizingStore.storeResizingCol(cols[colIndex]);
|
|
576
|
-
}
|
|
577
|
-
if (currentWidth > deltaX + this.tableOptions.minWidthPx) {
|
|
578
|
-
cols[colIndex].style.width = coerceCssPixelValue(currentWidth - deltaX);
|
|
579
|
-
deltaX = 0;
|
|
580
|
-
}
|
|
581
|
-
else {
|
|
582
|
-
deltaX -= currentWidth - this.tableOptions.minWidthPx;
|
|
583
|
-
cols[colIndex].style.width = coerceCssPixelValue(this.tableOptions.minWidthPx);
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
colIndex++;
|
|
587
|
-
}
|
|
588
|
-
return deltaX;
|
|
589
|
-
}
|
|
590
|
-
applyRowSize(deltaY) {
|
|
591
|
-
const rows = [...this.tableElement.querySelector('tbody').children];
|
|
592
|
-
this.resizingStore.storeTableHeight(rows);
|
|
593
|
-
this.resizingStore.initDirection(deltaY, this.isXAxisHover);
|
|
594
|
-
let rowIndex = this.elementRef.nativeElement.parentElement.rowIndex - 1; // subtract thead's tr
|
|
595
|
-
if (this.hoverdDirection === Position.top) {
|
|
596
|
-
rowIndex = rowIndex - 1;
|
|
597
|
-
}
|
|
598
|
-
const rowSpan = this.elementRef.nativeElement.rowSpan;
|
|
599
|
-
const bottomRowIndex = rowIndex + (rowSpan - 1) + 1;
|
|
600
|
-
if (deltaY > 0) {
|
|
601
|
-
this.applyBottomRows(rows, deltaY, bottomRowIndex);
|
|
602
|
-
if (this.resizingStore.isRestoring(deltaY, this.isXAxisHover)) {
|
|
603
|
-
deltaY = this.resizingStore.restoreTopRows(deltaY);
|
|
604
|
-
}
|
|
605
|
-
if (deltaY > 0) {
|
|
606
|
-
let initHeight = getElementHeight(rows[rowIndex]);
|
|
607
|
-
rows[rowIndex].style.height = coerceCssPixelValue(initHeight + deltaY);
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
else {
|
|
611
|
-
let addDeltaY = this.resizingStore.getAddTableHeight(deltaY);
|
|
612
|
-
const _delta = this.applyTopRows(rows, deltaY, rowIndex);
|
|
613
|
-
if (_delta === deltaY) {
|
|
614
|
-
// can not resize
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
deltaY = deltaY - _delta;
|
|
618
|
-
if (this.resizingStore.isRestoring(deltaY, this.isXAxisHover)) {
|
|
619
|
-
if (addDeltaY < 0) {
|
|
620
|
-
deltaY = this.resizingStore.restoreBottomRows(deltaY);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
applyTopRows(rows, deltaY, rowIndex) {
|
|
626
|
-
while (deltaY < 0 && rows[rowIndex]) {
|
|
627
|
-
const rowOffsetHeight = getElementHeight(rows[rowIndex]);
|
|
628
|
-
if (rowOffsetHeight > this.tableOptions.minHeightPx) {
|
|
629
|
-
if (this.resizingStore.isResizing(deltaY, this.isXAxisHover)) {
|
|
630
|
-
this.resizingStore.storeResizingRow(rows[rowIndex]);
|
|
631
|
-
}
|
|
632
|
-
if (rowOffsetHeight > this.tableOptions.minHeightPx + Math.abs(deltaY)) {
|
|
633
|
-
rows[rowIndex].style.height = coerceCssPixelValue(rowOffsetHeight - Math.abs(deltaY));
|
|
634
|
-
deltaY = 0;
|
|
635
|
-
}
|
|
636
|
-
else {
|
|
637
|
-
deltaY += rowOffsetHeight - this.tableOptions.minHeightPx;
|
|
638
|
-
rows[rowIndex].style.height = coerceCssPixelValue(this.tableOptions.minHeightPx);
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
rowIndex--;
|
|
642
|
-
}
|
|
643
|
-
return deltaY;
|
|
644
|
-
}
|
|
645
|
-
applyBottomRows(rows, deltaY, rowIndex) {
|
|
646
|
-
while (rows[rowIndex] && deltaY > 0) {
|
|
647
|
-
const rowOffsetHeight = getElementHeight(rows[rowIndex]);
|
|
648
|
-
if (rowOffsetHeight > this.tableOptions.minHeightPx) {
|
|
649
|
-
if (this.resizingStore.isResizing(deltaY, this.isXAxisHover)) {
|
|
650
|
-
this.resizingStore.storeResizingRow(rows[rowIndex]);
|
|
651
|
-
}
|
|
652
|
-
if (rowOffsetHeight > deltaY + this.tableOptions.minHeightPx) {
|
|
653
|
-
rows[rowIndex].style.height = coerceCssPixelValue(rowOffsetHeight - deltaY);
|
|
654
|
-
deltaY = 0;
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
deltaY -= rowOffsetHeight - this.tableOptions.minHeightPx;
|
|
658
|
-
rows[rowIndex].style.height = coerceCssPixelValue(this.tableOptions.minHeightPx);
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
rowIndex++;
|
|
662
|
-
}
|
|
663
|
-
return deltaY;
|
|
664
|
-
}
|
|
665
|
-
//#region
|
|
666
|
-
ngOnDestroy() {
|
|
667
|
-
super.ngOnDestroy();
|
|
668
|
-
if (this.overlayRef) {
|
|
669
|
-
this.overlayRef.detach();
|
|
670
|
-
}
|
|
671
|
-
this.destroy$.next();
|
|
672
|
-
this.destroy$.complete();
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
TheTdComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheTdComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.Injector }, { token: i1.Overlay }, { token: i2.ColumnResizingStore }, { token: i1.ScrollDispatcher }], target: i0.ɵɵFactoryTarget.Component });
|
|
676
|
-
TheTdComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: TheTdComponent, selector: "td[theTd]", host: { properties: { "style.backgroundColor": "this.backgroundColor", "attr.colspan": "this.colspan", "attr.rowspan": "this.rowspan", "style.display": "this.display" } }, providers: [ColumnResizingStore], viewQueries: [{ propertyName: "cellInner", first: true, predicate: ["cellInner"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div #cellInner>\
|
|
677
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheTdComponent, decorators: [{
|
|
678
|
-
type: Component,
|
|
679
|
-
args: [{ selector: 'td[theTd]', providers: [ColumnResizingStore], template: "<div #cellInner>\
|
|
680
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.Injector }, { type: i1.Overlay }, { type: i2.ColumnResizingStore }, { type: i1.ScrollDispatcher }]; }, propDecorators: { backgroundColor: [{
|
|
681
|
-
type: HostBinding,
|
|
682
|
-
args: ['style.backgroundColor']
|
|
683
|
-
}], colspan: [{
|
|
684
|
-
type: HostBinding,
|
|
685
|
-
args: ['attr.colspan']
|
|
686
|
-
}], rowspan: [{
|
|
687
|
-
type: HostBinding,
|
|
688
|
-
args: ['attr.rowspan']
|
|
689
|
-
}], display: [{
|
|
690
|
-
type: HostBinding,
|
|
691
|
-
args: ['style.display']
|
|
692
|
-
}], cellInner: [{
|
|
693
|
-
type: ViewChild,
|
|
694
|
-
args: ['cellInner', { static: true }]
|
|
695
|
-
}] } });
|
|
696
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90ZC90ZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RkL3RkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBTVQsV0FBVyxFQUtYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSw2REFBNkQsQ0FBQztBQUUzSCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3RILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFB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QUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIE5nWm9uZSxcbiAgICBIb3N0QmluZGluZyxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEluamVjdG9yLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBFTEVNRU5UX1RPX0NPTVBPTkVOVCB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IgfSBmcm9tICcuLi8uLi8uLi8uLi9jb25zdGFudHMvc2VsZWN0b3InO1xuaW1wb3J0IHsgVGhlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3RhYmxlLXBvc2l0aW9uJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbHVtblJlc2l6aW5nU3RvcmUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXppbmcuc3RvcmUnO1xuaW1wb3J0IHsgUG9zaXRpb24sIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXJlc2l6ZS9ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCBDb2x1bW5TaXplQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUtbm90aWZpZXInO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlSZWYsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL292ZXJsYXktaGFuZGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXNpemVSZWYgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXplLXJlZic7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCB1c2VFbGVtZW50U3R5bGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9kb20nO1xuaW1wb3J0IHsgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3ZpZXctYmFzZSc7XG5pbXBvcnQgeyBCQVNFX0ZJTExfSEVJR0hULCBUYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2VkaXRvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY3VzdG9tLXR5cGVzJztcbmltcG9ydCB7IGdldEJhc2VIZWlnaHRGb3JSb3dzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LWJhc2UtaGVpZ2h0JztcblxuY29uc3QgT1ZFUkxBWV9BQ1RJVkVfQ0xBU1MgPSAndGhlLXJlc2l6YWJsZS1vdmVybGF5LXRodW1iLWFjdGl2ZSc7XG5jb25zdCBPVkVSTEFZX0lOSVRfU0laRSA9IDE2O1xuZXhwb3J0IGNvbnN0IFBPU0lUSU9OX01BUDogeyBba2V5OiBzdHJpbmddOiBDb25uZWN0ZWRQb3NpdGlvbiB9ID0ge1xuICAgIHRvcDoge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGRbdGhlVGRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0NvbHVtblJlc2l6aW5nU3RvcmVdXG59KVxuZXhwb3J0IGNsYXNzIFRoZVRkQ29tcG9uZW50IGV4dGVuZHMgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQ8VGFibGVDZWxsRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBkZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBwdWJsaWMgdGFibGVQb3NpdGlvbjogVGFibGVQb3NpdGlvbjtcbiAgICBwdWJsaWMgdGFibGVDb21wb25lbnQ6IFRoZVRhYmxlQ29tcG9uZW50O1xuICAgIHByb3RlY3RlZCBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgICBwdWJsaWMgaG92ZXJkRGlyZWN0aW9uOiBQb3NpdGlvbiB8IG51bGw7XG4gICAgcHVibGljIHRhYmxlT3B0aW9uczogVGFibGVPcHRpb25zID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgIHB1YmxpYyBjZWxsSW5uZXJNaW5IZWlnaHQ6IG51bWJlciA9IG51bGw7XG5cbiAgICBnZXQgdGFibGVTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQudGFibGVTdG9yZTtcbiAgICB9XG5cbiAgICBnZXQgdGFibGVTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVNlcnZpY2U7XG4gICAgfVxuXG4gICAgZ2V0IGV2ZW50RGlzcGF0Y2hlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQuZXZlbnREaXNwYXRjaGVyO1xuICAgIH1cblxuICAgIGdldCByZXNpemVOb3RpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQucmVzaXplTm90aWZpZXI7XG4gICAgfVxuXG4gICAgZ2V0IHRoZVRhYmxlV3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMudGFibGVDb21wb25lbnQubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZVdyYXBwZXJXaWR0aCAtIHBhZGRpbmdMZWZ0O1xuICAgIH1cblxuICAgIGdldCB0YWJsZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRUb3AoKSB7XG4gICAgICAgIGNvbnN0IGNka3Njcm9sbGFibGU6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnW2Nka3Njcm9sbGFibGVdJyk7XG4gICAgICAgIGlmIChjZGtzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2Rrc2Nyb2xsYWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC13aW5kb3cuc2Nyb2xsWTtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIGdldCBpc1hBeGlzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiBbUG9zaXRpb24ubGVmdCwgUG9zaXRpb24ucmlnaHRdLmluY2x1ZGVzKHRoaXMuaG92ZXJkRGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBnZXQgcm93UmVzaXplQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAndGhlLXJvdy1yZXNpemUtaGFuZGxlLXBhbmVsJyxcbiAgICAgICAgICAgIHRoaXMudGFibGVQb3NpdGlvbi50YWJsZSAmJiB0aGlzLnRhYmxlUG9zaXRpb24udGFibGUub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyAndGhlLW51bWJlcmVkLXJlc2l6ZS1oYW5kbGUtcGFuZWwnIDogJydcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZG90V3JhcHBlckhvdmVyZWQ6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgcmVzaXplUmVmOiBSZXNpemVSZWY7XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNvbHNwYW4nKSBjb2xzcGFuOiBudW1iZXI7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm93c3BhbicpIHJvd3NwYW46IG51bWJlcjtcblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIGRpc3BsYXk6IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ2NlbGxJbm5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgY2VsbElubmVyOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGNlbGxJbm5lck5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2UoKSB7XG4gICAgICAgIHN1cGVyLm9uQ29udGV4dENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy51c2VTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwdWJsaWMgcmVzaXppbmdTdG9yZTogQ29sdW1uUmVzaXppbmdTdG9yZSxcbiAgICAgICAgcHVibGljIHNjcm9sbERpc3BhdGNoZXI6IFNjcm9sbERpc3BhdGNoZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2RyKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy51c2VCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMudXNlU3BhbigpO1xuICAgICAgICB0aGlzLnVzZURpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51c2VGb2N1cygpO1xuICAgICAgICB1c2VFbGVtZW50U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZVRhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5qZWN0aW9uU2VydmljZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVTZWxlY3RlZENlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZURhbmdlcm91c0NlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkNlbGxTZWxlY3RFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuRm9yQ2VsbEhvdmVyRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkZvclJlc2l6ZUV2ZW50cygpO1xuICAgICAgICAgICAgLy8gY29uc3QgaGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMudXNlTWluSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEluamVjdGlvblNlcnZpY2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQodGhpcy50YWJsZVBvc2l0aW9uLnRhYmxlKSBhcyBUaGVUYWJsZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTZWxlY3RlZENlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5zZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZC1jZWxsJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSB4LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByb3csIGNvbCB9KSA9PiByb3cgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpICYmIGNvbCA9PT0gdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQtY2VsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGVkLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVEYW5nZXJvdXNDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rhbmdlcm91cy1jZWxsJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSB4LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByb3csIGNvbCB9KSA9PiByb3cgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpICYmIGNvbCA9PT0gdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGFuZ2Vyb3VzLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkYW5nZXJvdXMtY2VsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZVRhYmxlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC50YWJsZUNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVRhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBoZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZUNlbGxJbm5lck1pbkhlaWdodCgpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMudXNlTWluSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy51c2VCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMudXNlU3BhbigpO1xuICAgICAgICB0aGlzLnVzZURpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51c2VGb2N1cygpO1xuICAgICAgICB1c2VFbGVtZW50U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgdXNlVGFibGVQb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgLy8gbXVzdCBiZSBwYXRoIG9mIGNlbGwncyBjaGlsZHJlblxuICAgICAgICB0aGlzLnRhYmxlUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCB0aGlzLmVkaXRvciwgcGF0aC5jb25jYXQoMCkpO1xuICAgIH1cblxuICAgIHVzZUJhY2tncm91bmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSB0aGlzLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZVNwYW4oKSB7XG4gICAgICAgIHRoaXMuY29sc3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yb3dzcGFuID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29sc3BhbiA9IHRoaXMuZWxlbWVudC5jb2xzcGFuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQucm93c3Bhbikge1xuICAgICAgICAgICAgdGhpcy5yb3dzcGFuID0gdGhpcy5lbGVtZW50LnJvd3NwYW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sc3Bhbikge1xuICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZUNvbWJpbmVkUm93cygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHRzID0gZ2V0QmFzZUhlaWdodEZvclJvd3ModGhpcy5lZGl0b3IsIHRoaXMudGFibGVDb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSByb3dJbmRleDsgaW5kZXggPCB0aGlzLmVsZW1lbnQucm93c3BhbiArIHJvd0luZGV4OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArPSBoZWlnaHRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gQkFTRV9GSUxMX0hFSUdIVDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQ29tYmluZWRSb3dzKCkge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpO1xuICAgICAgICBjb25zdCBjb21iaW5lZFJvd3M6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZVBvc2l0aW9uLnRhYmxlO1xuICAgICAgICB0YWJsZS5jaGlsZHJlbi5mb3JFYWNoKChyb3csIF9yb3dJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9yb3dJbmRleCA+IHJvd0luZGV4ICYmIF9yb3dJbmRleCA8PSByb3dJbmRleCArIHRoaXMuZWxlbWVudC5yb3dzcGFuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb21iaW5lZCA9IHJvdy5jaGlsZHJlbi5ldmVyeShjZWxsID0+IGNlbGwuaGlkZGVuIHx8IGNlbGwucm93c3BhbiA+IDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc0NvbWJpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkUm93cy5wdXNoKF9yb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkUm93cztcbiAgICB9XG5cbiAgICB1c2VEaXNwbGF5KCkge1xuICAgICAgICB0aGlzLmRpc3BsYXkgPSB0aGlzLmVsZW1lbnQuaGlkZGVuID8gJ25vbmUnIDogJyc7XG4gICAgfVxuXG4gICAgdXNlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNlZC1jZWxsJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNlZC1jZWxsJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VNaW5IZWlnaHQobWluSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbElubmVyTWluSGVpZ2h0ID09PSBtaW5IZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNlbGxJbm5lck1pbkhlaWdodCA9IG1pbkhlaWdodDtcbiAgICAgICAgLy8gaWYgKHRoaXMuY2VsbElubmVyTWluSGVpZ2h0KSB7XG4gICAgICAgIC8vICAgICB0aGlzLmNlbGxJbm5lck5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gYCR7dGhpcy5jZWxsSW5uZXJNaW5IZWlnaHR9cHhgO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgdGhpcy5jZWxsSW5uZXJOYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtaW4taGVpZ2h0Jyk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvLyNyZWdpb24gY2VsbC1zZWxlY3RcbiAgICBsaXN0ZW5DZWxsU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhO1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsZW1lbnQsICdtb3VzZWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogTW91c2VFdmVudCkgPT4gZS5idXR0b24gIT09IDIpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY2VsbCA9PiAhIWNlbGwpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsU3RhcnQoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5DZWxsTW91c2VFdmVudHMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuQ2VsbE1vdXNlRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBtb3VzZW92ZXJPYnNlcnZhYmxlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2VvdmVyJylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpID0+ICEhY2VsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGxPbmdvaW5nKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbEVuZCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVDb21wb25lbnQudGFibGVTZXJ2aWNlLm9wZW5Ub29sYmFyKHRoaXMudGFibGVTdG9yZS5mb2N1c0NlbGxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vdXNlb3Zlck9ic2VydmFibGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvbiByZXNpemFibGVcbiAgICBwcml2YXRlIGxpc3RlbkZvckNlbGxIb3ZlckV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ITtcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJcbiAgICAgICAgICAgIC5yZXNpemVPdmVybGF5VmlzaWJsZUZvclRhYmxlQ2VsbChlbGVtZW50KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOemgeatouesrOS4gOWIl+W3puS+p1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUucG9zaXRpb24gPT09IFBvc2l0aW9uLmxlZnQgJiYgdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIOemgeatouesrOS4gOihjOmhtumDqFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUucG9zaXRpb24gPT09IFBvc2l0aW9uLnRvcCAmJiB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhvdmVyZWRDZWxsSW5mbyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhvdmVyZWRDZWxsSW5mbyAmJiBob3ZlcmVkQ2VsbEluZm8ucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPSBob3ZlcmVkQ2VsbEluZm8ucG9zaXRpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaG92ZXJlZENlbGxJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJkRGlyZWN0aW9uID0gaG92ZXJlZENlbGxJbmZvLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZiB8fCAhdGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXlGb3JIYW5kbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dIYW5kbGVPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVJlZi5zZXREaXJlY3Rpb24odGhpcy5pc1hBeGlzSG92ZXIgPyAnWCcgOiAnWScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGlzdGVuRm9yUmVzaXplRXZlbnRzKCkge1xuICAgICAgICBjb25zdCB0YWtlVW50aWxEZXN0cm95ZWQgPSB0YWtlVW50aWw8Q29sdW1uU2l6ZUFjdGlvbj4odGhpcy5kZXN0cm95JCk7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5yZXNpemVOb3RpZmllci5yZXNpemVDYW5jZWxlZCwgdGhpcy5yZXNpemVOb3RpZmllci50cmlnZ2VyUmVzaXplKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkLFxuICAgICAgICAgICAgICAgIGZpbHRlcihjb2x1bW5TaXplID0+IGNvbHVtblNpemUudGFibGVDZWxsID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgZGVsdGFTaXplLCBwcmV2aW91c1NpemUsIGNvbXBsZXRlSW1tZWRpYXRlbHkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdG9wLCBsZWZ0LCBoZWlnaHQsIHdpZHRoIH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNsaWVudFksIGNsaWVudFggfSA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgICAgICAgICAgICAgbGV0IGlzUHJldmVudEFwcGx5U2l6ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIOWQkeS4i++8jOaIluiAheWQkeWPs+enu+WKqChkZWx0YVNpemUgPiAwKe+8jOm8oOagh+S9jee9ruS4jeWcqOW9k+WJjeWNleWFg+agvOaLluaLvee6v+S4iu+8jOmYu+atouW6lOeUqOaLluaLveWwuuWvuFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzWEF4aXNIb3Zlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsV2lkdGggPSB0aGlzLmhvdmVyZERpcmVjdGlvbiA9PT0gUG9zaXRpb24ubGVmdCA/IDAgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmV2ZW50QXBwbHlTaXplID0gZGVsdGFTaXplID4gMCAmJiBsZWZ0ICsgY2VsbFdpZHRoIC0gY2xpZW50WCA+IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSBQb3NpdGlvbi50b3AgPyAwIDogaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBpc1ByZXZlbnRBcHBseVNpemUgPSBkZWx0YVNpemUgPiAwICYmIHRvcCArIGNlbGxIZWlnaHQgLSBjbGllbnRZID4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJldmVudEFwcGx5U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IS5jbGFzc0xpc3QuYWRkKE9WRVJMQVlfQUNUSVZFX0NMQVNTKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2l6ZShkZWx0YVNpemUsIHByZXZpb3VzU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcGxldGVSZXNpemVPcGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBtZXJnZSh0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNhbmNlbGVkLCB0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNvbXBsZXRlZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoY29sdW1uU2l6ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYW5VcEFmdGVyUmVzaXplKGNvbHVtblNpemUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5jbGVhblJlc2l6aW5nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wbGV0ZVJlc2l6ZU9wZXJhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIucmVzaXplQ29tcGxldGVkLm5leHQoe1xuICAgICAgICAgICAgICAgIHRhYmxlQ2VsbDogdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhblVwQWZ0ZXJSZXNpemUoY29sdW1uU2l6ZTogQ29sdW1uU2l6ZUFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZShPVkVSTEFZX0FDVElWRV9DTEFTUyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlSGFuZGxlUG9ydGFsKCk6IENvbXBvbmVudFBvcnRhbDxUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbVRva2VucyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmID0gbmV3IFJlc2l6ZVJlZihcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZixcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiEsXG4gICAgICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4V2lkdGhQeCxcbiAgICAgICAgICAgIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4SGVpZ2h0UHgsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFJlc2l6ZVJlZiwgdGhpcy5yZXNpemVSZWYpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciwgdGhpcy5ldmVudERpc3BhdGNoZXIpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCB0aGlzLnJlc2l6ZU5vdGlmaWVyKTtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBuZXcgUG9ydGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY3VzdG9tVG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRQb3J0YWwoVGhlQ29sdW1uUmVzaXplT3ZlcmxheUhhbmRsZUNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3Rvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0hhbmRsZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYXR0YWNoKHRoaXMuX2NyZWF0ZUhhbmRsZVBvcnRhbCgpKS5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVNpemVBbmRPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8ucmVtb3ZlUGFuZWxDbGFzcyhbJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCcsIC4uLnRoaXMucm93UmVzaXplQ2xhc3NdKTtcbiAgICAgICAgdGhpcy5pc1hBeGlzSG92ZXIgPyB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVDb2x1bW5TaXplKCkgOiB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVSb3dTaXplKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmLnNldERpcmVjdGlvbih0aGlzLmlzWEF4aXNIb3ZlciA/ICdYJyA6ICdZJyk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmLnNldFBvc2l0aW9uKHRoaXMuaG92ZXJkRGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU92ZXJsYXlIYW5kbGVDb2x1bW5TaXplKCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgY29uc3QgdGFibGVFbGVtZW50VG9wID0gdGhpcy50YWJsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICBpZiAodGFibGVFbGVtZW50VG9wIDwgdGhpcy5zY3JvbGxhYmxlRWxlbWVudFRvcCkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy50YWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gKHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3AgLSB0YWJsZUVsZW1lbnRUb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy50YWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYWRkUGFuZWxDbGFzcygndGhlLWNvbHVtbi1yZXNpemUtaGFuZGxlLXBhbmVsJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEudXBkYXRlU2l6ZSh7IGhlaWdodCwgd2lkdGg6IE9WRVJMQVlfSU5JVF9TSVpFIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVJvd1NpemUoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHRoaXMudGFibGVDb21wb25lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHRhYmxlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGhlLXRlbXAtdGFibGUtcm93LWNvbnRyb2xzJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCByb3dDb250cm9sV2lkdGggPSAxMTtcbiAgICAgICAgaWYgKHJvd0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHJvd0NvbnRyb2xXaWR0aCA9IHJvd0NvbnRyb2wuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnRhYmxlQ29tcG9uZW50LnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgcm93Q29udHJvbFdpZHRoIC0gMjtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS5hZGRQYW5lbENsYXNzKHRoaXMucm93UmVzaXplQ2xhc3MpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYhLnVwZGF0ZVNpemUoeyB3aWR0aCwgaGVpZ2h0OiBPVkVSTEFZX0lOSVRfU0laRSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5U2l6ZShkZWx0YVNpemU6IG51bWJlciwgcHJldmlvdXNTaXplPzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIHVwZGF0ZSBjb2wgd2lkdGggYW5kIHRhYmxlIHdpZHRoXG4gICAgICAgIGlmICh0aGlzLmlzWEF4aXNIb3Zlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBseUNvbHVtblNpemUoZGVsdGFTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSb3dTaXplKGRlbHRhU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZUNvbXBvbmVudC51c2VSb3dDb250cm9scygpO1xuICAgICAgICB0aGlzLnRhYmxlQ29tcG9uZW50LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXlGb3JIYW5kbGUoKTogT3ZlcmxheVJlZiB7XG4gICAgICAgIC8vIFVzZSBvZiBvdmVybGF5cyBhbGxvd3MgdXMgdG8gcHJvcGVybHkgY2FwdHVyZSBjbGljayBldmVudHMgc3Bhbm5pbmcgcGFydHNcbiAgICAgICAgLy8gb2YgdHdvIHRhYmxlIGNlbGxzIGFuZCBpcyBhbHNvIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBhIHJlc2l6ZSB0aHVtYlxuICAgICAgICAvLyBvdmVyIGJvdGggY2VsbHMgYW5kIGV4dGVuZGluZyBpdCBkb3duIHRoZSB0YWJsZSBhcyBuZWVkZWQuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlPcHRpb24gPSB0aGlzLmlzWEF4aXNIb3ZlclxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogT1ZFUkxBWV9JTklUX1NJWkUgKyAncHgnLFxuICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IE9WRVJMQVlfSU5JVF9TSVpFICsgJ3B4JyxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IHRoaXMucm93UmVzaXplQ2xhc3NcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICAgICAgLy8gQWx3YXlzIHBvc2l0aW9uIHRoZSBvdmVybGF5IGJhc2VkIG9uIGxlZnQtaW5kZXhlZCBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIC4uLm92ZXJsYXlPcHRpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkge1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKTtcbiAgICAgICAgbGV0IG9mZnNldFggPSB0aGlzLmNhbGN1bGF0ZU92ZXJsYXlIYW5kbGVPZmZzZXRYKCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHRoaXMuaXNYQXhpc0hvdmVyXG4gICAgICAgICAgICA/IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WSB9XG4gICAgICAgICAgICA6IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgICAgICAgIC53aXRoR3Jvd0FmdGVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUHVzaChmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtwb3NpdGlvbl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudFRvcCA9IHRoaXMudGFibGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgaWYgKHRhYmxlRWxlbWVudFRvcCA8IHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3ApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGFibGVFbGVtZW50VG9wIC0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRWxlbWVudFRvcCAtIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFgoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxFbGVtZW50TGVmdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudExlZnQgPSB0aGlzLnRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICByZXR1cm4gdGFibGVFbGVtZW50TGVmdCAtIGNlbGxFbGVtZW50TGVmdCArIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0O1xuICAgIH1cblxuICAgIGFwcGx5Q29sdW1uU2l6ZShkZWx0YVg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVXaWR0aChjb2xzKTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLmluaXREaXJlY3Rpb24oZGVsdGFYKTtcbiAgICAgICAgbGV0IGNlbGxJbmRleCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNlbGxJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNlbGxJbmRleCA9IGNlbGxJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sc3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJykgfHwgMTtcbiAgICAgICAgY2VsbEluZGV4ID0gY2VsbEluZGV4ICsgKGNvbHNwYW4gYXMgbnVtYmVyKSAvIDEgLSAxO1xuICAgICAgICBpZiAoZGVsdGFYID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseVJpZ2h0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCArIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXppbmdTdG9yZS5pc1Jlc3RvcmluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVMZWZ0Q29scyhkZWx0YVgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhWCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGgpICsgZGVsdGFYKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDb2wgPSBjb2xzW2NlbGxJbmRleCArIDFdO1xuICAgICAgICAgICAgaWYgKG5leHRDb2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdERlbHRhWCA9IHRoaXMucmVzaXppbmdTdG9yZS5nZXRTY3JvbGxXaWR0aChkZWx0YVgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFYKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBub3QgcmVzaXplXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gZGVsdGFYIC0gX2RlbHRhO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXN0b3JpbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnREZWx0YVggPSB0aGlzLnJlc2l6aW5nU3RvcmUucmVzdG9yZVJpZ2h0Q29scyhsZWZ0RGVsdGFYKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGxlZnREZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGRlbHRhWCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgodGhpcy50YWJsZUVsZW1lbnQpIC0gdGhpcy50aGVUYWJsZVdyYXBwZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsV2lkdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGxXaWR0aCA+IE1hdGguYWJzKGRlbHRhWCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TGVmdENvbHMoY29scywgLXNjcm9sbFdpZHRoLCBjZWxsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlMZWZ0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgd2hpbGUgKGRlbHRhWCA8IDAgJiYgY29sc1tjb2xJbmRleF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGdldEVsZW1lbnRXaWR0aChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoID4gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXNpemluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5zdG9yZVJlc2l6aW5nQ29sKGNvbHNbY29sSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHggKyBNYXRoLmFicyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBNYXRoLmFicyhkZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggKz0gY3VycmVudFdpZHRoIC0gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeDtcbiAgICAgICAgICAgICAgICAgICAgY29sc1tjb2xJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbHRhWDtcbiAgICB9XG5cbiAgICBhcHBseVJpZ2h0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHdoaWxlIChkZWx0YVggPiAwICYmIGNvbHNbY29sSW5kZXhdKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sc1tjb2xJbmRleF0pO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6aW5nU3RvcmUuc3RvcmVSZXNpemluZ0NvbChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50V2lkdGggPiBkZWx0YVggKyB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBkZWx0YVgpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWCAtPSBjdXJyZW50V2lkdGggLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4O1xuICAgICAgICAgICAgICAgICAgICBjb2xzW2NvbEluZGV4XS5zdHlsZS53aWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFYO1xuICAgIH1cblxuICAgIGFwcGx5Um93U2l6ZShkZWx0YVk6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVIZWlnaHQocm93cyk7XG4gICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5pbml0RGlyZWN0aW9uKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpO1xuICAgICAgICBsZXQgcm93SW5kZXggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJvd0luZGV4IC0gMTsgLy8gc3VidHJhY3QgdGhlYWQncyB0clxuICAgICAgICBpZiAodGhpcy5ob3ZlcmREaXJlY3Rpb24gPT09IFBvc2l0aW9uLnRvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93U3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCkucm93U3BhbjtcbiAgICAgICAgY29uc3QgYm90dG9tUm93SW5kZXggPSByb3dJbmRleCArIChyb3dTcGFuIC0gMSkgKyAxO1xuICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUJvdHRvbVJvd3Mocm93cywgZGVsdGFZLCBib3R0b21Sb3dJbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVUb3BSb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBpbml0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShpbml0SGVpZ2h0ICsgZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhZGREZWx0YVkgPSB0aGlzLnJlc2l6aW5nU3RvcmUuZ2V0QWRkVGFibGVIZWlnaHQoZGVsdGFZKTtcbiAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlUb3BSb3dzKHJvd3MsIGRlbHRhWSwgcm93SW5kZXgpO1xuICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFZKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCByZXNpemVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWx0YVkgPSBkZWx0YVkgLSBfZGVsdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZERlbHRhWSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVCb3R0b21Sb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUb3BSb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAoZGVsdGFZIDwgMCAmJiByb3dzW3Jvd0luZGV4XSkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHggKyBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3Nbcm93SW5kZXhdLnN0eWxlLmhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUocm93T2Zmc2V0SGVpZ2h0IC0gTWF0aC5hYnMoZGVsdGFZKSk7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZICs9IHJvd09mZnNldEhlaWdodCAtIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4O1xuICAgICAgICAgICAgICAgICAgICByb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dJbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWx0YVk7XG4gICAgfVxuXG4gICAgYXBwbHlCb3R0b21Sb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAocm93c1tyb3dJbmRleF0gJiYgZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gZGVsdGFZICsgdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShyb3dPZmZzZXRIZWlnaHQgLSBkZWx0YVkpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSByb3dPZmZzZXRIZWlnaHQgLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeDtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFZO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvblxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgI2NlbGxJbm5lcj5cclxuICAgIDxzbGF0ZS1jaGlsZHJlbiBbY2hpbGRyZW5dPVwiY2hpbGRyZW5cIiBbY29udGV4dF09XCJjaGlsZHJlbkNvbnRleHRcIiBbdmlld0NvbnRleHRdPVwidmlld0NvbnRleHRcIj48L3NsYXRlLWNoaWxkcmVuPlxyXG48L2Rpdj5cclxuIl19
|
|
1
|
+
import { Component, HostBinding, ViewChild } from '@angular/core';
|
|
2
|
+
import { filter, map, take, takeUntil } from 'rxjs/operators';
|
|
3
|
+
import { ELEMENT_TO_COMPONENT } from 'slate-angular';
|
|
4
|
+
import { SLA_TABLE_CELL_SELECTOR } from '../../../../constants/selector';
|
|
5
|
+
import { TablePosition } from '../../utils/table-position';
|
|
6
|
+
import { fromEvent, merge, Subject } from 'rxjs';
|
|
7
|
+
import { ColumnResizingStore } from '../../../../components/column-resize/resizing.store';
|
|
8
|
+
import { Position, TableCellEventDispatcher } from '../../../../components/column-resize/event-dispatcher';
|
|
9
|
+
import { ColumnResizeNotifierSource } from '../../../../components/column-resize/column-resize-notifier';
|
|
10
|
+
import { ComponentPortal, PortalInjector } from '@angular/cdk/portal';
|
|
11
|
+
import { TheColumnResizeOverlayHandleComponent } from '../../../../components/column-resize/overlay-handle.component';
|
|
12
|
+
import { ResizeRef } from '../../../../components/column-resize/resize-ref';
|
|
13
|
+
import { coerceCssPixelValue } from '@angular/cdk/coercion';
|
|
14
|
+
import { coercePixelsFromCssValue, getElementHeight, getElementWidth, useElementStyle } from '../../../../utils/dom';
|
|
15
|
+
import { TheBaseElementComponent } from '../../../../interfaces/view-base';
|
|
16
|
+
import { BASE_FILL_HEIGHT, TableOptions } from '../../table.types';
|
|
17
|
+
import { TheEditor } from '../../../../interfaces/editor';
|
|
18
|
+
import { getBaseHeightForRows } from '../../utils/get-base-height';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "@angular/cdk/overlay";
|
|
21
|
+
import * as i2 from "../../../../components/column-resize/resizing.store";
|
|
22
|
+
import * as i3 from "slate-angular";
|
|
23
|
+
const OVERLAY_ACTIVE_CLASS = 'the-resizable-overlay-thumb-active';
|
|
24
|
+
const OVERLAY_INIT_SIZE = 16;
|
|
25
|
+
export const POSITION_MAP = {
|
|
26
|
+
top: {
|
|
27
|
+
originX: 'start',
|
|
28
|
+
originY: 'top',
|
|
29
|
+
overlayX: 'start',
|
|
30
|
+
overlayY: 'center'
|
|
31
|
+
},
|
|
32
|
+
bottom: {
|
|
33
|
+
originX: 'start',
|
|
34
|
+
originY: 'bottom',
|
|
35
|
+
overlayX: 'start',
|
|
36
|
+
overlayY: 'center'
|
|
37
|
+
},
|
|
38
|
+
right: {
|
|
39
|
+
originX: 'end',
|
|
40
|
+
originY: 'top',
|
|
41
|
+
overlayX: 'center',
|
|
42
|
+
overlayY: 'top'
|
|
43
|
+
},
|
|
44
|
+
left: {
|
|
45
|
+
originX: 'start',
|
|
46
|
+
originY: 'top',
|
|
47
|
+
overlayX: 'center',
|
|
48
|
+
overlayY: 'top'
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export class TheTdComponent extends TheBaseElementComponent {
|
|
52
|
+
constructor(elementRef, cdr, renderer, viewContainerRef, ngZone, injector, overlay, resizingStore, scrollDispatcher) {
|
|
53
|
+
super(elementRef, cdr);
|
|
54
|
+
this.elementRef = elementRef;
|
|
55
|
+
this.cdr = cdr;
|
|
56
|
+
this.renderer = renderer;
|
|
57
|
+
this.viewContainerRef = viewContainerRef;
|
|
58
|
+
this.ngZone = ngZone;
|
|
59
|
+
this.injector = injector;
|
|
60
|
+
this.overlay = overlay;
|
|
61
|
+
this.resizingStore = resizingStore;
|
|
62
|
+
this.scrollDispatcher = scrollDispatcher;
|
|
63
|
+
this.destroy$ = new Subject();
|
|
64
|
+
this.tableOptions = new TableOptions();
|
|
65
|
+
this.cellInnerMinHeight = null;
|
|
66
|
+
}
|
|
67
|
+
get tableStore() {
|
|
68
|
+
return this.tableComponent.tableStore;
|
|
69
|
+
}
|
|
70
|
+
get tableService() {
|
|
71
|
+
return this.tableComponent.tableService;
|
|
72
|
+
}
|
|
73
|
+
get eventDispatcher() {
|
|
74
|
+
return this.tableComponent.eventDispatcher;
|
|
75
|
+
}
|
|
76
|
+
get resizeNotifier() {
|
|
77
|
+
return this.tableComponent.resizeNotifier;
|
|
78
|
+
}
|
|
79
|
+
get theTableWrapperWidth() {
|
|
80
|
+
const tableContainer = this.tableComponent.nativeElement.firstChild;
|
|
81
|
+
const paddingLeft = coercePixelsFromCssValue(window.getComputedStyle(tableContainer)['paddingLeft']);
|
|
82
|
+
return this.tableComponent.theTableWrapperWidth - paddingLeft;
|
|
83
|
+
}
|
|
84
|
+
get tableElement() {
|
|
85
|
+
return this.tableComponent.theTableElement.nativeElement;
|
|
86
|
+
}
|
|
87
|
+
get scrollableElementTop() {
|
|
88
|
+
const cdkscrollable = this.elementRef.nativeElement.closest('[cdkscrollable]');
|
|
89
|
+
if (cdkscrollable) {
|
|
90
|
+
return cdkscrollable.getBoundingClientRect().top;
|
|
91
|
+
}
|
|
92
|
+
return -window.scrollY;
|
|
93
|
+
}
|
|
94
|
+
get scrollableElementLeft() {
|
|
95
|
+
return this.tableComponent.tableWrapper.nativeElement.scrollLeft;
|
|
96
|
+
}
|
|
97
|
+
get isXAxisHover() {
|
|
98
|
+
return [Position.left, Position.right].includes(this.hoverdDirection);
|
|
99
|
+
}
|
|
100
|
+
get rowResizeClass() {
|
|
101
|
+
return [
|
|
102
|
+
'the-row-resize-handle-panel',
|
|
103
|
+
this.tablePosition.table && this.tablePosition.table.options?.numberedColumn ? 'the-numbered-resize-handle-panel' : ''
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
get cellInnerNativeElement() {
|
|
107
|
+
return this.cellInner.nativeElement;
|
|
108
|
+
}
|
|
109
|
+
onContextChange() {
|
|
110
|
+
super.onContextChange();
|
|
111
|
+
if (this.initialized) {
|
|
112
|
+
this.useState();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
ngOnInit() {
|
|
116
|
+
super.ngOnInit();
|
|
117
|
+
this.useBackground();
|
|
118
|
+
this.useSpan();
|
|
119
|
+
this.useDisplay();
|
|
120
|
+
this.useFocus();
|
|
121
|
+
useElementStyle(this.elementRef.nativeElement, this.element);
|
|
122
|
+
}
|
|
123
|
+
ngAfterViewInit() {
|
|
124
|
+
this.ngZone.onStable.pipe(take(1)).subscribe(() => {
|
|
125
|
+
this.useTablePosition();
|
|
126
|
+
this.getInjectionService();
|
|
127
|
+
this.subscribeSelectedCellsChange();
|
|
128
|
+
this.subscribeDangerousCellsChange();
|
|
129
|
+
this.subscribeTableChange();
|
|
130
|
+
this.listenCellSelectEvents();
|
|
131
|
+
this.listenForCellHoverEvents();
|
|
132
|
+
this.listenForResizeEvents();
|
|
133
|
+
// const height = this.calculateCellInnerMinHeight();
|
|
134
|
+
// this.useMinHeight(height);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
getInjectionService() {
|
|
138
|
+
this.tableComponent = ELEMENT_TO_COMPONENT.get(this.tablePosition.table);
|
|
139
|
+
}
|
|
140
|
+
subscribeSelectedCellsChange() {
|
|
141
|
+
this.tableStore
|
|
142
|
+
.selectedCellsChange()
|
|
143
|
+
.pipe(takeUntil(this.destroy$))
|
|
144
|
+
.subscribe(x => {
|
|
145
|
+
if (x.length === 0) {
|
|
146
|
+
this.renderer.removeClass(this.elementRef.nativeElement, 'selected-cell');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const isSelectedCell = x.some(({ row, col }) => row === this.tablePosition.getRowIndex() && col === this.tablePosition.getColumnIndex());
|
|
150
|
+
if (isSelectedCell) {
|
|
151
|
+
this.renderer.addClass(this.elementRef.nativeElement, 'selected-cell');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.renderer.removeClass(this.elementRef.nativeElement, 'selected-cell');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
this.cdr.detectChanges();
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
subscribeDangerousCellsChange() {
|
|
161
|
+
this.tableStore
|
|
162
|
+
.dangerousCellsChange()
|
|
163
|
+
.pipe(takeUntil(this.destroy$))
|
|
164
|
+
.subscribe(x => {
|
|
165
|
+
if (x.length === 0) {
|
|
166
|
+
this.renderer.removeClass(this.elementRef.nativeElement, 'dangerous-cell');
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const isSelectedCell = x.some(({ row, col }) => row === this.tablePosition.getRowIndex() && col === this.tablePosition.getColumnIndex());
|
|
170
|
+
if (isSelectedCell) {
|
|
171
|
+
this.renderer.addClass(this.elementRef.nativeElement, 'dangerous-cell');
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
this.renderer.removeClass(this.elementRef.nativeElement, 'dangerous-cell');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
this.cdr.detectChanges();
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
subscribeTableChange() {
|
|
181
|
+
this.tableStore
|
|
182
|
+
.tableChange()
|
|
183
|
+
.pipe(takeUntil(this.destroy$))
|
|
184
|
+
.subscribe(() => {
|
|
185
|
+
this.useTablePosition();
|
|
186
|
+
// const height = this.calculateCellInnerMinHeight();
|
|
187
|
+
// this.useMinHeight(height);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
useState() {
|
|
191
|
+
this.useBackground();
|
|
192
|
+
this.useSpan();
|
|
193
|
+
this.useDisplay();
|
|
194
|
+
this.useFocus();
|
|
195
|
+
useElementStyle(this.elementRef.nativeElement, this.element);
|
|
196
|
+
}
|
|
197
|
+
useTablePosition() {
|
|
198
|
+
const opts = new TableOptions();
|
|
199
|
+
const path = TheEditor.findPath(this.editor, this.element);
|
|
200
|
+
// must be path of cell's children
|
|
201
|
+
this.tablePosition = TablePosition.create(opts, this.editor, path.concat(0));
|
|
202
|
+
}
|
|
203
|
+
useBackground() {
|
|
204
|
+
if (this.element.backgroundColor !== this.backgroundColor) {
|
|
205
|
+
this.backgroundColor = this.element.backgroundColor;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
useSpan() {
|
|
209
|
+
this.colspan = undefined;
|
|
210
|
+
this.rowspan = undefined;
|
|
211
|
+
if (this.element.colspan) {
|
|
212
|
+
this.colspan = this.element.colspan;
|
|
213
|
+
}
|
|
214
|
+
if (this.element.rowspan) {
|
|
215
|
+
this.rowspan = this.element.rowspan;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
calculateCellInnerMinHeight() {
|
|
219
|
+
if (this.element.colspan) {
|
|
220
|
+
const rowIndex = this.tablePosition.getRowIndex();
|
|
221
|
+
if (this.calculateCombinedRows().length > 0) {
|
|
222
|
+
let height = 0;
|
|
223
|
+
const heights = getBaseHeightForRows(this.editor, this.tableComponent.element);
|
|
224
|
+
for (let index = rowIndex; index < this.element.rowspan + rowIndex; index++) {
|
|
225
|
+
height += heights[index];
|
|
226
|
+
}
|
|
227
|
+
height = height - BASE_FILL_HEIGHT;
|
|
228
|
+
return height;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
calculateCombinedRows() {
|
|
234
|
+
const rowIndex = this.tablePosition.getRowIndex();
|
|
235
|
+
const combinedRows = [];
|
|
236
|
+
const table = this.tablePosition.table;
|
|
237
|
+
table.children.forEach((row, _rowIndex) => {
|
|
238
|
+
if (_rowIndex > rowIndex && _rowIndex <= rowIndex + this.element.rowspan) {
|
|
239
|
+
const isCombined = row.children.every(cell => cell.hidden || cell.rowspan > 1);
|
|
240
|
+
if (isCombined) {
|
|
241
|
+
combinedRows.push(_rowIndex);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
return combinedRows;
|
|
246
|
+
}
|
|
247
|
+
useDisplay() {
|
|
248
|
+
this.display = this.element.hidden ? 'none' : '';
|
|
249
|
+
}
|
|
250
|
+
useFocus() {
|
|
251
|
+
if (this.isCollapsed) {
|
|
252
|
+
this.renderer.addClass(this.elementRef.nativeElement, 'focused-cell');
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
this.renderer.removeClass(this.elementRef.nativeElement, 'focused-cell');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
useMinHeight(minHeight) {
|
|
259
|
+
if (this.cellInnerMinHeight === minHeight) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
this.cellInnerMinHeight = minHeight;
|
|
263
|
+
// if (this.cellInnerMinHeight) {
|
|
264
|
+
// this.cellInnerNativeElement.style.minHeight = `${this.cellInnerMinHeight}px`;
|
|
265
|
+
// } else {
|
|
266
|
+
// this.cellInnerNativeElement.style.removeProperty('min-height');
|
|
267
|
+
// }
|
|
268
|
+
}
|
|
269
|
+
//#region cell-select
|
|
270
|
+
listenCellSelectEvents() {
|
|
271
|
+
this.ngZone.runOutsideAngular(() => {
|
|
272
|
+
const element = this.elementRef.nativeElement;
|
|
273
|
+
fromEvent(element, 'mousedown')
|
|
274
|
+
.pipe(takeUntil(this.destroy$), filter((e) => e.button !== 2), map(event => {
|
|
275
|
+
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
276
|
+
return cell;
|
|
277
|
+
}), filter(cell => !!cell))
|
|
278
|
+
.subscribe((cell) => {
|
|
279
|
+
this.tableStore.selectCellStart(cell, this.editor);
|
|
280
|
+
if (this.overlayRef) {
|
|
281
|
+
this.overlayRef.detach();
|
|
282
|
+
}
|
|
283
|
+
this.listenCellMouseEvents();
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
listenCellMouseEvents() {
|
|
288
|
+
const mouseoverObservable = fromEvent(document, 'mouseover')
|
|
289
|
+
.pipe(takeUntil(this.destroy$), map(event => {
|
|
290
|
+
event.preventDefault();
|
|
291
|
+
const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
|
|
292
|
+
return cell;
|
|
293
|
+
}), filter((cell) => !!cell))
|
|
294
|
+
.subscribe((cell) => {
|
|
295
|
+
this.tableStore.selectCellOngoing(cell, this.editor);
|
|
296
|
+
});
|
|
297
|
+
fromEvent(document, 'mouseup')
|
|
298
|
+
.pipe(take(1))
|
|
299
|
+
.subscribe(() => {
|
|
300
|
+
this.tableStore.selectCellEnd(this.editor);
|
|
301
|
+
if (this.tableStore.isCellSelecting) {
|
|
302
|
+
this.ngZone.run(() => {
|
|
303
|
+
this.tableComponent.tableService.openToolbar(this.tableStore.focusCellElement);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
mouseoverObservable.unsubscribe();
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
//#region resizable
|
|
310
|
+
listenForCellHoverEvents() {
|
|
311
|
+
const element = this.elementRef.nativeElement;
|
|
312
|
+
this.eventDispatcher
|
|
313
|
+
.resizeOverlayVisibleForTableCell(element)
|
|
314
|
+
.pipe(takeUntil(this.destroy$), map(value => {
|
|
315
|
+
// 禁止第一列左侧
|
|
316
|
+
if (value && value.position === Position.left && this.tablePosition.getColumnIndex() === 0) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
// 禁止第一行顶部
|
|
320
|
+
if (value && value.position === Position.top && this.tablePosition.getRowIndex() === 0) {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
return value;
|
|
324
|
+
}))
|
|
325
|
+
.subscribe(hoveredCellInfo => {
|
|
326
|
+
if (hoveredCellInfo && hoveredCellInfo.position) {
|
|
327
|
+
this.hoverdDirection = hoveredCellInfo.position;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
this.hoverdDirection = null;
|
|
331
|
+
}
|
|
332
|
+
if (hoveredCellInfo) {
|
|
333
|
+
this.hoverdDirection = hoveredCellInfo.position;
|
|
334
|
+
if (!this.overlayRef || !this.overlayRef.hasAttached()) {
|
|
335
|
+
this.overlayRef = this._createOverlayForHandle();
|
|
336
|
+
this._showHandleOverlay();
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
this.resizeRef.setDirection(this.isXAxisHover ? 'X' : 'Y');
|
|
340
|
+
this.updateOverlayHandleSizeAndOffset();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else if (this.overlayRef) {
|
|
344
|
+
this.overlayRef.detach();
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
listenForResizeEvents() {
|
|
349
|
+
const takeUntilDestroyed = takeUntil(this.destroy$);
|
|
350
|
+
merge(this.resizeNotifier.resizeCanceled, this.resizeNotifier.triggerResize)
|
|
351
|
+
.pipe(takeUntilDestroyed, filter(columnSize => columnSize.tableCell === this.elementRef.nativeElement))
|
|
352
|
+
.subscribe(({ deltaSize, previousSize, completeImmediately }) => {
|
|
353
|
+
const { top, left, height, width } = this.elementRef.nativeElement.getBoundingClientRect();
|
|
354
|
+
const { clientY, clientX } = event;
|
|
355
|
+
let isPreventApplySize = false;
|
|
356
|
+
// 向下,或者向右移动(deltaSize > 0),鼠标位置不在当前单元格拖拽线上,阻止应用拖拽尺寸
|
|
357
|
+
if (this.isXAxisHover) {
|
|
358
|
+
const cellWidth = this.hoverdDirection === Position.left ? 0 : width;
|
|
359
|
+
isPreventApplySize = deltaSize > 0 && left + cellWidth - clientX > 0;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const cellHeight = this.hoverdDirection === Position.top ? 0 : height;
|
|
363
|
+
isPreventApplySize = deltaSize > 0 && top + cellHeight - clientY > 0;
|
|
364
|
+
}
|
|
365
|
+
if (isPreventApplySize) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
this.elementRef.nativeElement.classList.add(OVERLAY_ACTIVE_CLASS);
|
|
369
|
+
this.applySize(deltaSize, previousSize);
|
|
370
|
+
if (completeImmediately) {
|
|
371
|
+
this._completeResizeOperation();
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
merge(this.resizeNotifier.resizeCanceled, this.resizeNotifier.resizeCompleted)
|
|
375
|
+
.pipe(takeUntilDestroyed)
|
|
376
|
+
.subscribe(columnSize => {
|
|
377
|
+
this._cleanUpAfterResize(columnSize);
|
|
378
|
+
this.resizingStore.cleanResizing();
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
_completeResizeOperation() {
|
|
382
|
+
this.ngZone.run(() => {
|
|
383
|
+
this.resizeNotifier.resizeCompleted.next({
|
|
384
|
+
tableCell: this.elementRef.nativeElement
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
_cleanUpAfterResize(columnSize) {
|
|
389
|
+
this.elementRef.nativeElement.classList.remove(OVERLAY_ACTIVE_CLASS);
|
|
390
|
+
}
|
|
391
|
+
_createHandlePortal() {
|
|
392
|
+
const customTokens = new WeakMap();
|
|
393
|
+
this.resizeRef = new ResizeRef(this.elementRef, this.overlayRef, this.tableOptions.minWidthPx, this.tableOptions.maxWidthPx, this.tableOptions.minHeightPx, this.tableOptions.maxHeightPx, () => {
|
|
394
|
+
this.updateOverlayHandleSizeAndOffset();
|
|
395
|
+
});
|
|
396
|
+
customTokens.set(ResizeRef, this.resizeRef);
|
|
397
|
+
customTokens.set(TableCellEventDispatcher, this.eventDispatcher);
|
|
398
|
+
customTokens.set(ColumnResizeNotifierSource, this.resizeNotifier);
|
|
399
|
+
const injector = new PortalInjector(this.injector, customTokens);
|
|
400
|
+
return new ComponentPortal(TheColumnResizeOverlayHandleComponent, this.viewContainerRef, injector);
|
|
401
|
+
}
|
|
402
|
+
_showHandleOverlay() {
|
|
403
|
+
this.overlayRef.attach(this._createHandlePortal()).changeDetectorRef.markForCheck();
|
|
404
|
+
this.updateOverlayHandleSizeAndOffset();
|
|
405
|
+
}
|
|
406
|
+
updateOverlayHandleSizeAndOffset() {
|
|
407
|
+
this.overlayRef?.removePanelClass(['the-column-resize-handle-panel', ...this.rowResizeClass]);
|
|
408
|
+
this.isXAxisHover ? this.updateOverlayHandleColumnSize() : this.updateOverlayHandleRowSize();
|
|
409
|
+
this.overlayRef?.updatePositionStrategy(this.createPositionStrategy());
|
|
410
|
+
this.resizeRef.setDirection(this.isXAxisHover ? 'X' : 'Y');
|
|
411
|
+
this.resizeRef.setPosition(this.hoverdDirection);
|
|
412
|
+
}
|
|
413
|
+
updateOverlayHandleColumnSize() {
|
|
414
|
+
let height = 0;
|
|
415
|
+
const tableElementTop = this.tableElement.getBoundingClientRect().top;
|
|
416
|
+
if (tableElementTop < this.scrollableElementTop) {
|
|
417
|
+
height = this.tableElement.offsetHeight - (this.scrollableElementTop - tableElementTop);
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
height = this.tableElement.offsetHeight;
|
|
421
|
+
}
|
|
422
|
+
this.overlayRef.addPanelClass('the-column-resize-handle-panel');
|
|
423
|
+
this.overlayRef.updateSize({ height, width: OVERLAY_INIT_SIZE });
|
|
424
|
+
}
|
|
425
|
+
updateOverlayHandleRowSize() {
|
|
426
|
+
const tableElement = this.tableComponent.nativeElement;
|
|
427
|
+
const rowControl = tableElement.querySelector('.the-temp-table-row-controls');
|
|
428
|
+
let rowControlWidth = 11;
|
|
429
|
+
if (rowControl) {
|
|
430
|
+
rowControlWidth = rowControl.getBoundingClientRect().width;
|
|
431
|
+
}
|
|
432
|
+
const width = this.tableComponent.tableWrapper.nativeElement.offsetWidth + rowControlWidth - 2;
|
|
433
|
+
this.overlayRef.addPanelClass(this.rowResizeClass);
|
|
434
|
+
this.overlayRef.updateSize({ width, height: OVERLAY_INIT_SIZE });
|
|
435
|
+
}
|
|
436
|
+
applySize(deltaSize, previousSize) {
|
|
437
|
+
// update col width and table width
|
|
438
|
+
if (this.isXAxisHover) {
|
|
439
|
+
this.applyColumnSize(deltaSize);
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
this.applyRowSize(deltaSize);
|
|
443
|
+
}
|
|
444
|
+
this.tableComponent.useRowControls();
|
|
445
|
+
this.tableComponent.detectChanges();
|
|
446
|
+
this.updateOverlayHandleSizeAndOffset();
|
|
447
|
+
}
|
|
448
|
+
_createOverlayForHandle() {
|
|
449
|
+
// Use of overlays allows us to properly capture click events spanning parts
|
|
450
|
+
// of two table cells and is also useful for displaying a resize thumb
|
|
451
|
+
// over both cells and extending it down the table as needed.
|
|
452
|
+
const overlayOption = this.isXAxisHover
|
|
453
|
+
? {
|
|
454
|
+
width: OVERLAY_INIT_SIZE + 'px',
|
|
455
|
+
panelClass: 'the-column-resize-handle-panel'
|
|
456
|
+
}
|
|
457
|
+
: {
|
|
458
|
+
height: OVERLAY_INIT_SIZE + 'px',
|
|
459
|
+
panelClass: this.rowResizeClass
|
|
460
|
+
};
|
|
461
|
+
return this.overlay.create({
|
|
462
|
+
// Always position the overlay based on left-indexed coordinates.
|
|
463
|
+
disposeOnNavigation: true,
|
|
464
|
+
positionStrategy: this.createPositionStrategy(),
|
|
465
|
+
...overlayOption
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
createPositionStrategy() {
|
|
469
|
+
let offsetY = this.calculateOverlayHandleOffsetY();
|
|
470
|
+
let offsetX = this.calculateOverlayHandleOffsetX();
|
|
471
|
+
const position = this.isXAxisHover
|
|
472
|
+
? { ...POSITION_MAP[this.hoverdDirection], offsetY }
|
|
473
|
+
: { ...POSITION_MAP[this.hoverdDirection], offsetX };
|
|
474
|
+
return this.overlay
|
|
475
|
+
.position()
|
|
476
|
+
.flexibleConnectedTo(this.elementRef.nativeElement)
|
|
477
|
+
.withFlexibleDimensions(false)
|
|
478
|
+
.withGrowAfterOpen(false)
|
|
479
|
+
.withPush(false)
|
|
480
|
+
.withPositions([position]);
|
|
481
|
+
}
|
|
482
|
+
calculateOverlayHandleOffsetY() {
|
|
483
|
+
const tableElementTop = this.tableElement.getBoundingClientRect().top;
|
|
484
|
+
if (tableElementTop < this.scrollableElementTop) {
|
|
485
|
+
return this.scrollableElementTop - this.elementRef.nativeElement.getBoundingClientRect().top;
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
return tableElementTop - this.elementRef.nativeElement.getBoundingClientRect().top;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
calculateOverlayHandleOffsetX() {
|
|
492
|
+
const cellElementLeft = this.elementRef.nativeElement.getBoundingClientRect().left;
|
|
493
|
+
const tableElementLeft = this.tableElement.getBoundingClientRect().left;
|
|
494
|
+
return tableElementLeft - cellElementLeft + this.scrollableElementLeft;
|
|
495
|
+
}
|
|
496
|
+
applyColumnSize(deltaX) {
|
|
497
|
+
const cols = [...this.tableElement.querySelector('colgroup').children];
|
|
498
|
+
this.resizingStore.storeTableWidth(cols);
|
|
499
|
+
this.resizingStore.initDirection(deltaX);
|
|
500
|
+
let cellIndex = this.elementRef.nativeElement.cellIndex;
|
|
501
|
+
if (this.hoverdDirection === 'left') {
|
|
502
|
+
cellIndex = cellIndex - 1;
|
|
503
|
+
}
|
|
504
|
+
const colspan = this.elementRef.nativeElement.getAttribute('colspan') || 1;
|
|
505
|
+
cellIndex = cellIndex + colspan / 1 - 1;
|
|
506
|
+
if (deltaX > 0) {
|
|
507
|
+
this.applyRightCols(cols, deltaX, cellIndex + 1);
|
|
508
|
+
if (this.resizingStore.isRestoring(deltaX)) {
|
|
509
|
+
deltaX = this.resizingStore.restoreLeftCols(deltaX);
|
|
510
|
+
}
|
|
511
|
+
if (deltaX > 0) {
|
|
512
|
+
cols[cellIndex].style.width = coerceCssPixelValue(coercePixelsFromCssValue(cols[cellIndex].style.width) + deltaX);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
const nextCol = cols[cellIndex + 1];
|
|
517
|
+
if (nextCol) {
|
|
518
|
+
let leftDeltaX = this.resizingStore.getScrollWidth(deltaX);
|
|
519
|
+
const _delta = this.applyLeftCols(cols, deltaX, cellIndex);
|
|
520
|
+
if (_delta === deltaX) {
|
|
521
|
+
// can not resize
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
deltaX = deltaX - _delta;
|
|
525
|
+
if (this.resizingStore.isRestoring(deltaX)) {
|
|
526
|
+
if (leftDeltaX < 0) {
|
|
527
|
+
leftDeltaX = this.resizingStore.restoreRightCols(leftDeltaX);
|
|
528
|
+
}
|
|
529
|
+
if (leftDeltaX < 0) {
|
|
530
|
+
nextCol.style.width = coerceCssPixelValue(getElementWidth(nextCol) + Math.abs(leftDeltaX));
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
nextCol.style.width = coerceCssPixelValue(getElementWidth(nextCol) + Math.abs(deltaX));
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
const scrollWidth = getElementWidth(this.tableElement) - this.theTableWrapperWidth;
|
|
539
|
+
if (scrollWidth > 0) {
|
|
540
|
+
if (scrollWidth > Math.abs(deltaX)) {
|
|
541
|
+
this.applyLeftCols(cols, deltaX, cellIndex);
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
this.applyLeftCols(cols, -scrollWidth, cellIndex);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
applyLeftCols(cols, deltaX, colIndex) {
|
|
551
|
+
while (deltaX < 0 && cols[colIndex]) {
|
|
552
|
+
const currentWidth = getElementWidth(cols[colIndex]);
|
|
553
|
+
if (currentWidth > this.tableOptions.minWidthPx) {
|
|
554
|
+
if (this.resizingStore.isResizing(deltaX)) {
|
|
555
|
+
this.resizingStore.storeResizingCol(cols[colIndex]);
|
|
556
|
+
}
|
|
557
|
+
if (currentWidth > this.tableOptions.minWidthPx + Math.abs(deltaX)) {
|
|
558
|
+
cols[colIndex].style.width = coerceCssPixelValue(currentWidth - Math.abs(deltaX));
|
|
559
|
+
deltaX = 0;
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
deltaX += currentWidth - this.tableOptions.minWidthPx;
|
|
563
|
+
cols[colIndex].style.width = coerceCssPixelValue(this.tableOptions.minWidthPx);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
colIndex--;
|
|
567
|
+
}
|
|
568
|
+
return deltaX;
|
|
569
|
+
}
|
|
570
|
+
applyRightCols(cols, deltaX, colIndex) {
|
|
571
|
+
while (deltaX > 0 && cols[colIndex]) {
|
|
572
|
+
const currentWidth = getElementWidth(cols[colIndex]);
|
|
573
|
+
if (currentWidth > this.tableOptions.minWidthPx) {
|
|
574
|
+
if (this.resizingStore.isResizing(deltaX)) {
|
|
575
|
+
this.resizingStore.storeResizingCol(cols[colIndex]);
|
|
576
|
+
}
|
|
577
|
+
if (currentWidth > deltaX + this.tableOptions.minWidthPx) {
|
|
578
|
+
cols[colIndex].style.width = coerceCssPixelValue(currentWidth - deltaX);
|
|
579
|
+
deltaX = 0;
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
deltaX -= currentWidth - this.tableOptions.minWidthPx;
|
|
583
|
+
cols[colIndex].style.width = coerceCssPixelValue(this.tableOptions.minWidthPx);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
colIndex++;
|
|
587
|
+
}
|
|
588
|
+
return deltaX;
|
|
589
|
+
}
|
|
590
|
+
applyRowSize(deltaY) {
|
|
591
|
+
const rows = [...this.tableElement.querySelector('tbody').children];
|
|
592
|
+
this.resizingStore.storeTableHeight(rows);
|
|
593
|
+
this.resizingStore.initDirection(deltaY, this.isXAxisHover);
|
|
594
|
+
let rowIndex = this.elementRef.nativeElement.parentElement.rowIndex - 1; // subtract thead's tr
|
|
595
|
+
if (this.hoverdDirection === Position.top) {
|
|
596
|
+
rowIndex = rowIndex - 1;
|
|
597
|
+
}
|
|
598
|
+
const rowSpan = this.elementRef.nativeElement.rowSpan;
|
|
599
|
+
const bottomRowIndex = rowIndex + (rowSpan - 1) + 1;
|
|
600
|
+
if (deltaY > 0) {
|
|
601
|
+
this.applyBottomRows(rows, deltaY, bottomRowIndex);
|
|
602
|
+
if (this.resizingStore.isRestoring(deltaY, this.isXAxisHover)) {
|
|
603
|
+
deltaY = this.resizingStore.restoreTopRows(deltaY);
|
|
604
|
+
}
|
|
605
|
+
if (deltaY > 0) {
|
|
606
|
+
let initHeight = getElementHeight(rows[rowIndex]);
|
|
607
|
+
rows[rowIndex].style.height = coerceCssPixelValue(initHeight + deltaY);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
let addDeltaY = this.resizingStore.getAddTableHeight(deltaY);
|
|
612
|
+
const _delta = this.applyTopRows(rows, deltaY, rowIndex);
|
|
613
|
+
if (_delta === deltaY) {
|
|
614
|
+
// can not resize
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
deltaY = deltaY - _delta;
|
|
618
|
+
if (this.resizingStore.isRestoring(deltaY, this.isXAxisHover)) {
|
|
619
|
+
if (addDeltaY < 0) {
|
|
620
|
+
deltaY = this.resizingStore.restoreBottomRows(deltaY);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
applyTopRows(rows, deltaY, rowIndex) {
|
|
626
|
+
while (deltaY < 0 && rows[rowIndex]) {
|
|
627
|
+
const rowOffsetHeight = getElementHeight(rows[rowIndex]);
|
|
628
|
+
if (rowOffsetHeight > this.tableOptions.minHeightPx) {
|
|
629
|
+
if (this.resizingStore.isResizing(deltaY, this.isXAxisHover)) {
|
|
630
|
+
this.resizingStore.storeResizingRow(rows[rowIndex]);
|
|
631
|
+
}
|
|
632
|
+
if (rowOffsetHeight > this.tableOptions.minHeightPx + Math.abs(deltaY)) {
|
|
633
|
+
rows[rowIndex].style.height = coerceCssPixelValue(rowOffsetHeight - Math.abs(deltaY));
|
|
634
|
+
deltaY = 0;
|
|
635
|
+
}
|
|
636
|
+
else {
|
|
637
|
+
deltaY += rowOffsetHeight - this.tableOptions.minHeightPx;
|
|
638
|
+
rows[rowIndex].style.height = coerceCssPixelValue(this.tableOptions.minHeightPx);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
rowIndex--;
|
|
642
|
+
}
|
|
643
|
+
return deltaY;
|
|
644
|
+
}
|
|
645
|
+
applyBottomRows(rows, deltaY, rowIndex) {
|
|
646
|
+
while (rows[rowIndex] && deltaY > 0) {
|
|
647
|
+
const rowOffsetHeight = getElementHeight(rows[rowIndex]);
|
|
648
|
+
if (rowOffsetHeight > this.tableOptions.minHeightPx) {
|
|
649
|
+
if (this.resizingStore.isResizing(deltaY, this.isXAxisHover)) {
|
|
650
|
+
this.resizingStore.storeResizingRow(rows[rowIndex]);
|
|
651
|
+
}
|
|
652
|
+
if (rowOffsetHeight > deltaY + this.tableOptions.minHeightPx) {
|
|
653
|
+
rows[rowIndex].style.height = coerceCssPixelValue(rowOffsetHeight - deltaY);
|
|
654
|
+
deltaY = 0;
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
deltaY -= rowOffsetHeight - this.tableOptions.minHeightPx;
|
|
658
|
+
rows[rowIndex].style.height = coerceCssPixelValue(this.tableOptions.minHeightPx);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
rowIndex++;
|
|
662
|
+
}
|
|
663
|
+
return deltaY;
|
|
664
|
+
}
|
|
665
|
+
//#region
|
|
666
|
+
ngOnDestroy() {
|
|
667
|
+
super.ngOnDestroy();
|
|
668
|
+
if (this.overlayRef) {
|
|
669
|
+
this.overlayRef.detach();
|
|
670
|
+
}
|
|
671
|
+
this.destroy$.next();
|
|
672
|
+
this.destroy$.complete();
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
TheTdComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheTdComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.Injector }, { token: i1.Overlay }, { token: i2.ColumnResizingStore }, { token: i1.ScrollDispatcher }], target: i0.ɵɵFactoryTarget.Component });
|
|
676
|
+
TheTdComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: TheTdComponent, selector: "td[theTd]", host: { properties: { "style.backgroundColor": "this.backgroundColor", "attr.colspan": "this.colspan", "attr.rowspan": "this.rowspan", "style.display": "this.display" } }, providers: [ColumnResizingStore], viewQueries: [{ propertyName: "cellInner", first: true, predicate: ["cellInner"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div #cellInner>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"></slate-children>\n</div>\n", components: [{ type: i3.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }] });
|
|
677
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheTdComponent, decorators: [{
|
|
678
|
+
type: Component,
|
|
679
|
+
args: [{ selector: 'td[theTd]', providers: [ColumnResizingStore], template: "<div #cellInner>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"></slate-children>\n</div>\n" }]
|
|
680
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.Injector }, { type: i1.Overlay }, { type: i2.ColumnResizingStore }, { type: i1.ScrollDispatcher }]; }, propDecorators: { backgroundColor: [{
|
|
681
|
+
type: HostBinding,
|
|
682
|
+
args: ['style.backgroundColor']
|
|
683
|
+
}], colspan: [{
|
|
684
|
+
type: HostBinding,
|
|
685
|
+
args: ['attr.colspan']
|
|
686
|
+
}], rowspan: [{
|
|
687
|
+
type: HostBinding,
|
|
688
|
+
args: ['attr.rowspan']
|
|
689
|
+
}], display: [{
|
|
690
|
+
type: HostBinding,
|
|
691
|
+
args: ['style.display']
|
|
692
|
+
}], cellInner: [{
|
|
693
|
+
type: ViewChild,
|
|
694
|
+
args: ['cellInner', { static: true }]
|
|
695
|
+
}] } });
|
|
696
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90ZC90ZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RkL3RkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBTVQsV0FBVyxFQUtYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSwwQkFBMEIsRUFBb0IsTUFBTSw2REFBNkQsQ0FBQztBQUUzSCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3RILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFB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QUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIE5nWm9uZSxcbiAgICBIb3N0QmluZGluZyxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEluamVjdG9yLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBFTEVNRU5UX1RPX0NPTVBPTkVOVCB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IgfSBmcm9tICcuLi8uLi8uLi8uLi9jb25zdGFudHMvc2VsZWN0b3InO1xuaW1wb3J0IHsgVGhlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3RhYmxlLXBvc2l0aW9uJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbHVtblJlc2l6aW5nU3RvcmUgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXppbmcuc3RvcmUnO1xuaW1wb3J0IHsgUG9zaXRpb24sIFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sdW1uLXJlc2l6ZS9ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCBDb2x1bW5TaXplQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUtbm90aWZpZXInO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlSZWYsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL292ZXJsYXktaGFuZGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXNpemVSZWYgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL2NvbHVtbi1yZXNpemUvcmVzaXplLXJlZic7XG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCB1c2VFbGVtZW50U3R5bGUgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9kb20nO1xuaW1wb3J0IHsgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3ZpZXctYmFzZSc7XG5pbXBvcnQgeyBCQVNFX0ZJTExfSEVJR0hULCBUYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2VkaXRvcic7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY3VzdG9tLXR5cGVzJztcbmltcG9ydCB7IGdldEJhc2VIZWlnaHRGb3JSb3dzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LWJhc2UtaGVpZ2h0JztcblxuY29uc3QgT1ZFUkxBWV9BQ1RJVkVfQ0xBU1MgPSAndGhlLXJlc2l6YWJsZS1vdmVybGF5LXRodW1iLWFjdGl2ZSc7XG5jb25zdCBPVkVSTEFZX0lOSVRfU0laRSA9IDE2O1xuZXhwb3J0IGNvbnN0IFBPU0lUSU9OX01BUDogeyBba2V5OiBzdHJpbmddOiBDb25uZWN0ZWRQb3NpdGlvbiB9ID0ge1xuICAgIHRvcDoge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgIH0sXG4gICAgYm90dG9tOiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgfSxcbiAgICBsZWZ0OiB7XG4gICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGRbdGhlVGRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0NvbHVtblJlc2l6aW5nU3RvcmVdXG59KVxuZXhwb3J0IGNsYXNzIFRoZVRkQ29tcG9uZW50IGV4dGVuZHMgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQ8VGFibGVDZWxsRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBkZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBwdWJsaWMgdGFibGVQb3NpdGlvbjogVGFibGVQb3NpdGlvbjtcbiAgICBwdWJsaWMgdGFibGVDb21wb25lbnQ6IFRoZVRhYmxlQ29tcG9uZW50O1xuICAgIHByb3RlY3RlZCBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcbiAgICBwdWJsaWMgaG92ZXJkRGlyZWN0aW9uOiBQb3NpdGlvbiB8IG51bGw7XG4gICAgcHVibGljIHRhYmxlT3B0aW9uczogVGFibGVPcHRpb25zID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgIHB1YmxpYyBjZWxsSW5uZXJNaW5IZWlnaHQ6IG51bWJlciA9IG51bGw7XG5cbiAgICBnZXQgdGFibGVTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQudGFibGVTdG9yZTtcbiAgICB9XG5cbiAgICBnZXQgdGFibGVTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVNlcnZpY2U7XG4gICAgfVxuXG4gICAgZ2V0IGV2ZW50RGlzcGF0Y2hlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQuZXZlbnREaXNwYXRjaGVyO1xuICAgIH1cblxuICAgIGdldCByZXNpemVOb3RpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVDb21wb25lbnQucmVzaXplTm90aWZpZXI7XG4gICAgfVxuXG4gICAgZ2V0IHRoZVRhYmxlV3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMudGFibGVDb21wb25lbnQubmF0aXZlRWxlbWVudC5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWJsZUNvbnRhaW5lcilbJ3BhZGRpbmdMZWZ0J10pO1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZVdyYXBwZXJXaWR0aCAtIHBhZGRpbmdMZWZ0O1xuICAgIH1cblxuICAgIGdldCB0YWJsZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRUb3AoKSB7XG4gICAgICAgIGNvbnN0IGNka3Njcm9sbGFibGU6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnW2Nka3Njcm9sbGFibGVdJyk7XG4gICAgICAgIGlmIChjZGtzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2Rrc2Nyb2xsYWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC13aW5kb3cuc2Nyb2xsWTtcbiAgICB9XG5cbiAgICBnZXQgc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbXBvbmVudC50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIGdldCBpc1hBeGlzSG92ZXIoKSB7XG4gICAgICAgIHJldHVybiBbUG9zaXRpb24ubGVmdCwgUG9zaXRpb24ucmlnaHRdLmluY2x1ZGVzKHRoaXMuaG92ZXJkRGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBnZXQgcm93UmVzaXplQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAndGhlLXJvdy1yZXNpemUtaGFuZGxlLXBhbmVsJyxcbiAgICAgICAgICAgIHRoaXMudGFibGVQb3NpdGlvbi50YWJsZSAmJiB0aGlzLnRhYmxlUG9zaXRpb24udGFibGUub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyAndGhlLW51bWJlcmVkLXJlc2l6ZS1oYW5kbGUtcGFuZWwnIDogJydcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZG90V3JhcHBlckhvdmVyZWQ6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgcmVzaXplUmVmOiBSZXNpemVSZWY7XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNvbHNwYW4nKSBjb2xzcGFuOiBudW1iZXI7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm93c3BhbicpIHJvd3NwYW46IG51bWJlcjtcblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIGRpc3BsYXk6IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ2NlbGxJbm5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgY2VsbElubmVyOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGNlbGxJbm5lck5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsSW5uZXIubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2UoKSB7XG4gICAgICAgIHN1cGVyLm9uQ29udGV4dENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy51c2VTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwdWJsaWMgcmVzaXppbmdTdG9yZTogQ29sdW1uUmVzaXppbmdTdG9yZSxcbiAgICAgICAgcHVibGljIHNjcm9sbERpc3BhdGNoZXI6IFNjcm9sbERpc3BhdGNoZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2RyKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy51c2VCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMudXNlU3BhbigpO1xuICAgICAgICB0aGlzLnVzZURpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51c2VGb2N1cygpO1xuICAgICAgICB1c2VFbGVtZW50U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZVRhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5qZWN0aW9uU2VydmljZSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVTZWxlY3RlZENlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZURhbmdlcm91c0NlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkNlbGxTZWxlY3RFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuRm9yQ2VsbEhvdmVyRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkZvclJlc2l6ZUV2ZW50cygpO1xuICAgICAgICAgICAgLy8gY29uc3QgaGVpZ2h0ID0gdGhpcy5jYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKTtcbiAgICAgICAgICAgIC8vIHRoaXMudXNlTWluSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEluamVjdGlvblNlcnZpY2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQodGhpcy50YWJsZVBvc2l0aW9uLnRhYmxlKSBhcyBUaGVUYWJsZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTZWxlY3RlZENlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5zZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZC1jZWxsJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSB4LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByb3csIGNvbCB9KSA9PiByb3cgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpICYmIGNvbCA9PT0gdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQtY2VsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NlbGVjdGVkLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVEYW5nZXJvdXNDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rhbmdlcm91cy1jZWxsJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZENlbGwgPSB4LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByb3csIGNvbCB9KSA9PiByb3cgPT09IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpICYmIGNvbCA9PT0gdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGFuZ2Vyb3VzLWNlbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkYW5nZXJvdXMtY2VsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZVRhYmxlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC50YWJsZUNoYW5nZSgpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVRhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBoZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZUNlbGxJbm5lck1pbkhlaWdodCgpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMudXNlTWluSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1c2VTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy51c2VCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMudXNlU3BhbigpO1xuICAgICAgICB0aGlzLnVzZURpc3BsYXkoKTtcbiAgICAgICAgdGhpcy51c2VGb2N1cygpO1xuICAgICAgICB1c2VFbGVtZW50U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgdXNlVGFibGVQb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgLy8gbXVzdCBiZSBwYXRoIG9mIGNlbGwncyBjaGlsZHJlblxuICAgICAgICB0aGlzLnRhYmxlUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCB0aGlzLmVkaXRvciwgcGF0aC5jb25jYXQoMCkpO1xuICAgIH1cblxuICAgIHVzZUJhY2tncm91bmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSB0aGlzLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yIGFzIHN0cmluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZVNwYW4oKSB7XG4gICAgICAgIHRoaXMuY29sc3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yb3dzcGFuID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29sc3BhbiA9IHRoaXMuZWxlbWVudC5jb2xzcGFuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQucm93c3Bhbikge1xuICAgICAgICAgICAgdGhpcy5yb3dzcGFuID0gdGhpcy5lbGVtZW50LnJvd3NwYW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDZWxsSW5uZXJNaW5IZWlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sc3Bhbikge1xuICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZUNvbWJpbmVkUm93cygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHRzID0gZ2V0QmFzZUhlaWdodEZvclJvd3ModGhpcy5lZGl0b3IsIHRoaXMudGFibGVDb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSByb3dJbmRleDsgaW5kZXggPCB0aGlzLmVsZW1lbnQucm93c3BhbiArIHJvd0luZGV4OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArPSBoZWlnaHRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gQkFTRV9GSUxMX0hFSUdIVDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQ29tYmluZWRSb3dzKCkge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMudGFibGVQb3NpdGlvbi5nZXRSb3dJbmRleCgpO1xuICAgICAgICBjb25zdCBjb21iaW5lZFJvd3M6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZVBvc2l0aW9uLnRhYmxlO1xuICAgICAgICB0YWJsZS5jaGlsZHJlbi5mb3JFYWNoKChyb3csIF9yb3dJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9yb3dJbmRleCA+IHJvd0luZGV4ICYmIF9yb3dJbmRleCA8PSByb3dJbmRleCArIHRoaXMuZWxlbWVudC5yb3dzcGFuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb21iaW5lZCA9IHJvdy5jaGlsZHJlbi5ldmVyeShjZWxsID0+IGNlbGwuaGlkZGVuIHx8IGNlbGwucm93c3BhbiA+IDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc0NvbWJpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkUm93cy5wdXNoKF9yb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkUm93cztcbiAgICB9XG5cbiAgICB1c2VEaXNwbGF5KCkge1xuICAgICAgICB0aGlzLmRpc3BsYXkgPSB0aGlzLmVsZW1lbnQuaGlkZGVuID8gJ25vbmUnIDogJyc7XG4gICAgfVxuXG4gICAgdXNlRm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNlZC1jZWxsJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXNlZC1jZWxsJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VNaW5IZWlnaHQobWluSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbElubmVyTWluSGVpZ2h0ID09PSBtaW5IZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNlbGxJbm5lck1pbkhlaWdodCA9IG1pbkhlaWdodDtcbiAgICAgICAgLy8gaWYgKHRoaXMuY2VsbElubmVyTWluSGVpZ2h0KSB7XG4gICAgICAgIC8vICAgICB0aGlzLmNlbGxJbm5lck5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gYCR7dGhpcy5jZWxsSW5uZXJNaW5IZWlnaHR9cHhgO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgdGhpcy5jZWxsSW5uZXJOYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtaW4taGVpZ2h0Jyk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvLyNyZWdpb24gY2VsbC1zZWxlY3RcbiAgICBsaXN0ZW5DZWxsU2VsZWN0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhO1xuICAgICAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsZW1lbnQsICdtb3VzZWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogTW91c2VFdmVudCkgPT4gZS5idXR0b24gIT09IDIpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY2VsbCA9PiAhIWNlbGwpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsU3RhcnQoY2VsbCwgdGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5DZWxsTW91c2VFdmVudHMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuQ2VsbE1vdXNlRXZlbnRzKCkge1xuICAgICAgICBjb25zdCBtb3VzZW92ZXJPYnNlcnZhYmxlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2VvdmVyJylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpID0+ICEhY2VsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdENlbGxPbmdvaW5nKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJylcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Q2VsbEVuZCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVTdG9yZS5pc0NlbGxTZWxlY3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVDb21wb25lbnQudGFibGVTZXJ2aWNlLm9wZW5Ub29sYmFyKHRoaXMudGFibGVTdG9yZS5mb2N1c0NlbGxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vdXNlb3Zlck9ic2VydmFibGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvbiByZXNpemFibGVcbiAgICBwcml2YXRlIGxpc3RlbkZvckNlbGxIb3ZlckV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ITtcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXJcbiAgICAgICAgICAgIC5yZXNpemVPdmVybGF5VmlzaWJsZUZvclRhYmxlQ2VsbChlbGVtZW50KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOemgeatouesrOS4gOWIl+W3puS+p1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUucG9zaXRpb24gPT09IFBvc2l0aW9uLmxlZnQgJiYgdGhpcy50YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIOemgeatouesrOS4gOihjOmhtumDqFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUucG9zaXRpb24gPT09IFBvc2l0aW9uLnRvcCAmJiB0aGlzLnRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhvdmVyZWRDZWxsSW5mbyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhvdmVyZWRDZWxsSW5mbyAmJiBob3ZlcmVkQ2VsbEluZm8ucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPSBob3ZlcmVkQ2VsbEluZm8ucG9zaXRpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaG92ZXJlZENlbGxJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJkRGlyZWN0aW9uID0gaG92ZXJlZENlbGxJbmZvLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZiB8fCAhdGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXlGb3JIYW5kbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dIYW5kbGVPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVJlZi5zZXREaXJlY3Rpb24odGhpcy5pc1hBeGlzSG92ZXIgPyAnWCcgOiAnWScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGlzdGVuRm9yUmVzaXplRXZlbnRzKCkge1xuICAgICAgICBjb25zdCB0YWtlVW50aWxEZXN0cm95ZWQgPSB0YWtlVW50aWw8Q29sdW1uU2l6ZUFjdGlvbj4odGhpcy5kZXN0cm95JCk7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5yZXNpemVOb3RpZmllci5yZXNpemVDYW5jZWxlZCwgdGhpcy5yZXNpemVOb3RpZmllci50cmlnZ2VyUmVzaXplKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkLFxuICAgICAgICAgICAgICAgIGZpbHRlcihjb2x1bW5TaXplID0+IGNvbHVtblNpemUudGFibGVDZWxsID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgZGVsdGFTaXplLCBwcmV2aW91c1NpemUsIGNvbXBsZXRlSW1tZWRpYXRlbHkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdG9wLCBsZWZ0LCBoZWlnaHQsIHdpZHRoIH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNsaWVudFksIGNsaWVudFggfSA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG4gICAgICAgICAgICAgICAgbGV0IGlzUHJldmVudEFwcGx5U2l6ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIOWQkeS4i++8jOaIluiAheWQkeWPs+enu+WKqChkZWx0YVNpemUgPiAwKe+8jOm8oOagh+S9jee9ruS4jeWcqOW9k+WJjeWNleWFg+agvOaLluaLvee6v+S4iu+8jOmYu+atouW6lOeUqOaLluaLveWwuuWvuFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzWEF4aXNIb3Zlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsV2lkdGggPSB0aGlzLmhvdmVyZERpcmVjdGlvbiA9PT0gUG9zaXRpb24ubGVmdCA/IDAgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmV2ZW50QXBwbHlTaXplID0gZGVsdGFTaXplID4gMCAmJiBsZWZ0ICsgY2VsbFdpZHRoIC0gY2xpZW50WCA+IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSBQb3NpdGlvbi50b3AgPyAwIDogaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBpc1ByZXZlbnRBcHBseVNpemUgPSBkZWx0YVNpemUgPiAwICYmIHRvcCArIGNlbGxIZWlnaHQgLSBjbGllbnRZID4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJldmVudEFwcGx5U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IS5jbGFzc0xpc3QuYWRkKE9WRVJMQVlfQUNUSVZFX0NMQVNTKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2l6ZShkZWx0YVNpemUsIHByZXZpb3VzU2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlSW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcGxldGVSZXNpemVPcGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBtZXJnZSh0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNhbmNlbGVkLCB0aGlzLnJlc2l6ZU5vdGlmaWVyLnJlc2l6ZUNvbXBsZXRlZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoY29sdW1uU2l6ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYW5VcEFmdGVyUmVzaXplKGNvbHVtblNpemUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5jbGVhblJlc2l6aW5nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb21wbGV0ZVJlc2l6ZU9wZXJhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIucmVzaXplQ29tcGxldGVkLm5leHQoe1xuICAgICAgICAgICAgICAgIHRhYmxlQ2VsbDogdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jbGVhblVwQWZ0ZXJSZXNpemUoY29sdW1uU2l6ZTogQ29sdW1uU2l6ZUFjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZShPVkVSTEFZX0FDVElWRV9DTEFTUyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlSGFuZGxlUG9ydGFsKCk6IENvbXBvbmVudFBvcnRhbDxUaGVDb2x1bW5SZXNpemVPdmVybGF5SGFuZGxlQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbVRva2VucyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmID0gbmV3IFJlc2l6ZVJlZihcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZixcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiEsXG4gICAgICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4V2lkdGhQeCxcbiAgICAgICAgICAgIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4LFxuICAgICAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMubWF4SGVpZ2h0UHgsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFJlc2l6ZVJlZiwgdGhpcy5yZXNpemVSZWYpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlciwgdGhpcy5ldmVudERpc3BhdGNoZXIpO1xuICAgICAgICBjdXN0b21Ub2tlbnMuc2V0KENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlLCB0aGlzLnJlc2l6ZU5vdGlmaWVyKTtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBuZXcgUG9ydGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY3VzdG9tVG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRQb3J0YWwoVGhlQ29sdW1uUmVzaXplT3ZlcmxheUhhbmRsZUNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3Rvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0hhbmRsZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYXR0YWNoKHRoaXMuX2NyZWF0ZUhhbmRsZVBvcnRhbCgpKS5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVNpemVBbmRPZmZzZXQoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8ucmVtb3ZlUGFuZWxDbGFzcyhbJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCcsIC4uLnRoaXMucm93UmVzaXplQ2xhc3NdKTtcbiAgICAgICAgdGhpcy5pc1hBeGlzSG92ZXIgPyB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVDb2x1bW5TaXplKCkgOiB0aGlzLnVwZGF0ZU92ZXJsYXlIYW5kbGVSb3dTaXplKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmLnNldERpcmVjdGlvbih0aGlzLmlzWEF4aXNIb3ZlciA/ICdYJyA6ICdZJyk7XG4gICAgICAgIHRoaXMucmVzaXplUmVmLnNldFBvc2l0aW9uKHRoaXMuaG92ZXJkRGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU92ZXJsYXlIYW5kbGVDb2x1bW5TaXplKCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgY29uc3QgdGFibGVFbGVtZW50VG9wID0gdGhpcy50YWJsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICBpZiAodGFibGVFbGVtZW50VG9wIDwgdGhpcy5zY3JvbGxhYmxlRWxlbWVudFRvcCkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy50YWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gKHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3AgLSB0YWJsZUVsZW1lbnRUb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy50YWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEuYWRkUGFuZWxDbGFzcygndGhlLWNvbHVtbi1yZXNpemUtaGFuZGxlLXBhbmVsJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZiEudXBkYXRlU2l6ZSh7IGhlaWdodCwgd2lkdGg6IE9WRVJMQVlfSU5JVF9TSVpFIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3ZlcmxheUhhbmRsZVJvd1NpemUoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHRoaXMudGFibGVDb21wb25lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbCA9IHRhYmxlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGhlLXRlbXAtdGFibGUtcm93LWNvbnRyb2xzJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCByb3dDb250cm9sV2lkdGggPSAxMTtcbiAgICAgICAgaWYgKHJvd0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHJvd0NvbnRyb2xXaWR0aCA9IHJvd0NvbnRyb2wuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnRhYmxlQ29tcG9uZW50LnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgcm93Q29udHJvbFdpZHRoIC0gMjtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmIS5hZGRQYW5lbENsYXNzKHRoaXMucm93UmVzaXplQ2xhc3MpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYhLnVwZGF0ZVNpemUoeyB3aWR0aCwgaGVpZ2h0OiBPVkVSTEFZX0lOSVRfU0laRSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5U2l6ZShkZWx0YVNpemU6IG51bWJlciwgcHJldmlvdXNTaXplPzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIHVwZGF0ZSBjb2wgd2lkdGggYW5kIHRhYmxlIHdpZHRoXG4gICAgICAgIGlmICh0aGlzLmlzWEF4aXNIb3Zlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBseUNvbHVtblNpemUoZGVsdGFTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSb3dTaXplKGRlbHRhU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZUNvbXBvbmVudC51c2VSb3dDb250cm9scygpO1xuICAgICAgICB0aGlzLnRhYmxlQ29tcG9uZW50LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5SGFuZGxlU2l6ZUFuZE9mZnNldCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXlGb3JIYW5kbGUoKTogT3ZlcmxheVJlZiB7XG4gICAgICAgIC8vIFVzZSBvZiBvdmVybGF5cyBhbGxvd3MgdXMgdG8gcHJvcGVybHkgY2FwdHVyZSBjbGljayBldmVudHMgc3Bhbm5pbmcgcGFydHNcbiAgICAgICAgLy8gb2YgdHdvIHRhYmxlIGNlbGxzIGFuZCBpcyBhbHNvIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBhIHJlc2l6ZSB0aHVtYlxuICAgICAgICAvLyBvdmVyIGJvdGggY2VsbHMgYW5kIGV4dGVuZGluZyBpdCBkb3duIHRoZSB0YWJsZSBhcyBuZWVkZWQuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlPcHRpb24gPSB0aGlzLmlzWEF4aXNIb3ZlclxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogT1ZFUkxBWV9JTklUX1NJWkUgKyAncHgnLFxuICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogJ3RoZS1jb2x1bW4tcmVzaXplLWhhbmRsZS1wYW5lbCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IE9WRVJMQVlfSU5JVF9TSVpFICsgJ3B4JyxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IHRoaXMucm93UmVzaXplQ2xhc3NcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgICAgICAgLy8gQWx3YXlzIHBvc2l0aW9uIHRoZSBvdmVybGF5IGJhc2VkIG9uIGxlZnQtaW5kZXhlZCBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIC4uLm92ZXJsYXlPcHRpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkge1xuICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKTtcbiAgICAgICAgbGV0IG9mZnNldFggPSB0aGlzLmNhbGN1bGF0ZU92ZXJsYXlIYW5kbGVPZmZzZXRYKCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHRoaXMuaXNYQXhpc0hvdmVyXG4gICAgICAgICAgICA/IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WSB9XG4gICAgICAgICAgICA6IHsgLi4uUE9TSVRJT05fTUFQW3RoaXMuaG92ZXJkRGlyZWN0aW9uXSwgb2Zmc2V0WCB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgICAgICAgIC53aXRoR3Jvd0FmdGVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUHVzaChmYWxzZSlcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtwb3NpdGlvbl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFkoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudFRvcCA9IHRoaXMudGFibGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgaWYgKHRhYmxlRWxlbWVudFRvcCA8IHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRUb3ApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGFibGVFbGVtZW50VG9wIC0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRWxlbWVudFRvcCAtIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT3ZlcmxheUhhbmRsZU9mZnNldFgoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxFbGVtZW50TGVmdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudExlZnQgPSB0aGlzLnRhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgICAgICByZXR1cm4gdGFibGVFbGVtZW50TGVmdCAtIGNlbGxFbGVtZW50TGVmdCArIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnRMZWZ0O1xuICAgIH1cblxuICAgIGFwcGx5Q29sdW1uU2l6ZShkZWx0YVg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NvbGdyb3VwJykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZUNvbEVsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVXaWR0aChjb2xzKTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLmluaXREaXJlY3Rpb24oZGVsdGFYKTtcbiAgICAgICAgbGV0IGNlbGxJbmRleCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNlbGxJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJkRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNlbGxJbmRleCA9IGNlbGxJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sc3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJykgfHwgMTtcbiAgICAgICAgY2VsbEluZGV4ID0gY2VsbEluZGV4ICsgKGNvbHNwYW4gYXMgbnVtYmVyKSAvIDEgLSAxO1xuICAgICAgICBpZiAoZGVsdGFYID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseVJpZ2h0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCArIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXppbmdTdG9yZS5pc1Jlc3RvcmluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVMZWZ0Q29scyhkZWx0YVgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhWCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShjb2xzW2NlbGxJbmRleF0uc3R5bGUud2lkdGgpICsgZGVsdGFYKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDb2wgPSBjb2xzW2NlbGxJbmRleCArIDFdO1xuICAgICAgICAgICAgaWYgKG5leHRDb2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdERlbHRhWCA9IHRoaXMucmVzaXppbmdTdG9yZS5nZXRTY3JvbGxXaWR0aChkZWx0YVgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFYKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBub3QgcmVzaXplXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gZGVsdGFYIC0gX2RlbHRhO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXN0b3JpbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnREZWx0YVggPSB0aGlzLnJlc2l6aW5nU3RvcmUucmVzdG9yZVJpZ2h0Q29scyhsZWZ0RGVsdGFYKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdERlbHRhWCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGxlZnREZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRDb2wuc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGdldEVsZW1lbnRXaWR0aChuZXh0Q29sKSArIE1hdGguYWJzKGRlbHRhWCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgodGhpcy50YWJsZUVsZW1lbnQpIC0gdGhpcy50aGVUYWJsZVdyYXBwZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsV2lkdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGxXaWR0aCA+IE1hdGguYWJzKGRlbHRhWCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlMZWZ0Q29scyhjb2xzLCBkZWx0YVgsIGNlbGxJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5TGVmdENvbHMoY29scywgLXNjcm9sbFdpZHRoLCBjZWxsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlMZWZ0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgd2hpbGUgKGRlbHRhWCA8IDAgJiYgY29sc1tjb2xJbmRleF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGdldEVsZW1lbnRXaWR0aChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoID4gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nU3RvcmUuaXNSZXNpemluZyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5zdG9yZVJlc2l6aW5nQ29sKGNvbHNbY29sSW5kZXhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHggKyBNYXRoLmFicyhkZWx0YVgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBNYXRoLmFicyhkZWx0YVgpKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggKz0gY3VycmVudFdpZHRoIC0gdGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeDtcbiAgICAgICAgICAgICAgICAgICAgY29sc1tjb2xJbmRleF0uc3R5bGUud2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbHRhWDtcbiAgICB9XG5cbiAgICBhcHBseVJpZ2h0Q29scyhjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10sIGRlbHRhWDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHdoaWxlIChkZWx0YVggPiAwICYmIGNvbHNbY29sSW5kZXhdKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sc1tjb2xJbmRleF0pO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IHRoaXMudGFibGVPcHRpb25zLm1pbldpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFYKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6aW5nU3RvcmUuc3RvcmVSZXNpemluZ0NvbChjb2xzW2NvbEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50V2lkdGggPiBkZWx0YVggKyB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHNbY29sSW5kZXhdLnN0eWxlLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjdXJyZW50V2lkdGggLSBkZWx0YVgpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWCAtPSBjdXJyZW50V2lkdGggLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5XaWR0aFB4O1xuICAgICAgICAgICAgICAgICAgICBjb2xzW2NvbEluZGV4XS5zdHlsZS53aWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy50YWJsZU9wdGlvbnMubWluV2lkdGhQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFYO1xuICAgIH1cblxuICAgIGFwcGx5Um93U2l6ZShkZWx0YVk6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuY2hpbGRyZW5dIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlVGFibGVIZWlnaHQocm93cyk7XG4gICAgICAgIHRoaXMucmVzaXppbmdTdG9yZS5pbml0RGlyZWN0aW9uKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpO1xuICAgICAgICBsZXQgcm93SW5kZXggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJvd0luZGV4IC0gMTsgLy8gc3VidHJhY3QgdGhlYWQncyB0clxuICAgICAgICBpZiAodGhpcy5ob3ZlcmREaXJlY3Rpb24gPT09IFBvc2l0aW9uLnRvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93U3BhbiA9ICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCkucm93U3BhbjtcbiAgICAgICAgY29uc3QgYm90dG9tUm93SW5kZXggPSByb3dJbmRleCArIChyb3dTcGFuIC0gMSkgKyAxO1xuICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUJvdHRvbVJvd3Mocm93cywgZGVsdGFZLCBib3R0b21Sb3dJbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVUb3BSb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBpbml0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShpbml0SGVpZ2h0ICsgZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhZGREZWx0YVkgPSB0aGlzLnJlc2l6aW5nU3RvcmUuZ2V0QWRkVGFibGVIZWlnaHQoZGVsdGFZKTtcbiAgICAgICAgICAgIGNvbnN0IF9kZWx0YSA9IHRoaXMuYXBwbHlUb3BSb3dzKHJvd3MsIGRlbHRhWSwgcm93SW5kZXgpO1xuICAgICAgICAgICAgaWYgKF9kZWx0YSA9PT0gZGVsdGFZKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCByZXNpemVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWx0YVkgPSBkZWx0YVkgLSBfZGVsdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzdG9yaW5nKGRlbHRhWSwgdGhpcy5pc1hBeGlzSG92ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZERlbHRhWSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gdGhpcy5yZXNpemluZ1N0b3JlLnJlc3RvcmVCb3R0b21Sb3dzKGRlbHRhWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUb3BSb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAoZGVsdGFZIDwgMCAmJiByb3dzW3Jvd0luZGV4XSkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHggKyBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3Nbcm93SW5kZXhdLnN0eWxlLmhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUocm93T2Zmc2V0SGVpZ2h0IC0gTWF0aC5hYnMoZGVsdGFZKSk7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFZICs9IHJvd09mZnNldEhlaWdodCAtIHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4O1xuICAgICAgICAgICAgICAgICAgICByb3dzW3Jvd0luZGV4XS5zdHlsZS5oZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMudGFibGVPcHRpb25zLm1pbkhlaWdodFB4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dJbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWx0YVk7XG4gICAgfVxuXG4gICAgYXBwbHlCb3R0b21Sb3dzKHJvd3M6IEhUTUxUYWJsZVJvd0VsZW1lbnRbXSwgZGVsdGFZOiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICB3aGlsZSAocm93c1tyb3dJbmRleF0gJiYgZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93T2Zmc2V0SGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3dzW3Jvd0luZGV4XSk7XG4gICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNpemluZ1N0b3JlLmlzUmVzaXppbmcoZGVsdGFZLCB0aGlzLmlzWEF4aXNIb3ZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemluZ1N0b3JlLnN0b3JlUmVzaXppbmdSb3cocm93c1tyb3dJbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm93T2Zmc2V0SGVpZ2h0ID4gZGVsdGFZICsgdGhpcy50YWJsZU9wdGlvbnMubWluSGVpZ2h0UHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShyb3dPZmZzZXRIZWlnaHQgLSBkZWx0YVkpO1xuICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSByb3dPZmZzZXRIZWlnaHQgLSB0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeDtcbiAgICAgICAgICAgICAgICAgICAgcm93c1tyb3dJbmRleF0uc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLnRhYmxlT3B0aW9ucy5taW5IZWlnaHRQeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsdGFZO1xuICAgIH1cblxuICAgIC8vI3JlZ2lvblxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgI2NlbGxJbm5lcj5cbiAgICA8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+PC9zbGF0ZS1jaGlsZHJlbj5cbjwvZGl2PlxuIl19
|