@colijnit/corecomponents_v12 12.2.20 → 12.2.22
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/bundles/colijnit-corecomponents_v12.umd.js +13656 -13656
- package/colijnit-corecomponents_v12.d.ts +43 -43
- package/esm2015/colijnit-corecomponents_v12.js +43 -43
- package/esm2015/lib/components/article-tile/article-tile.component.js +49 -49
- package/esm2015/lib/components/article-tile/article-tile.module.js +34 -34
- package/esm2015/lib/components/base/base-input.component.js +833 -833
- package/esm2015/lib/components/base/base.module.js +21 -21
- package/esm2015/lib/components/base/commit-buttons/commit-buttons.component.js +85 -85
- package/esm2015/lib/components/base/commit-buttons/commit-buttons.module.js +20 -20
- package/esm2015/lib/components/base/dialog-base.component.js +5 -5
- package/esm2015/lib/components/base-input-date-picker/base-input-date-picker.directive.js +24 -24
- package/esm2015/lib/components/button/button.component.js +73 -73
- package/esm2015/lib/components/button/button.module.js +18 -18
- package/esm2015/lib/components/calendar/calendar-template.component.js +281 -281
- package/esm2015/lib/components/calendar/calendar.component.js +32 -32
- package/esm2015/lib/components/calendar/calendar.module.js +27 -27
- package/esm2015/lib/components/card/card.component.js +50 -50
- package/esm2015/lib/components/card/card.module.js +34 -34
- package/esm2015/lib/components/carousel/carousel.component.js +109 -109
- package/esm2015/lib/components/carousel/carousel.module.js +31 -31
- package/esm2015/lib/components/carousel-3d/carousel-3d.component.js +293 -293
- package/esm2015/lib/components/carousel-3d/carousel-3d.module.js +18 -18
- package/esm2015/lib/components/carousel-3d/carouselItem.js +53 -53
- package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.component.js +72 -72
- package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.module.js +18 -18
- package/esm2015/lib/components/co-dialog/co-dialog.component.js +91 -91
- package/esm2015/lib/components/co-dialog/co-dialog.module.js +18 -18
- package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.component.js +35 -35
- package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.module.js +16 -16
- package/esm2015/lib/components/collapsible/collapsible.component.js +67 -67
- package/esm2015/lib/components/collapsible/collapsible.module.js +18 -18
- package/esm2015/lib/components/color-picker/color-picker.component.js +33 -33
- package/esm2015/lib/components/color-picker/color-picker.module.js +20 -20
- package/esm2015/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.js +46 -46
- package/esm2015/lib/components/core-dialog/core-dialog.module.js +38 -38
- package/esm2015/lib/components/core-dialog/core-dialog.service.js +66 -66
- package/esm2015/lib/components/core-dialog/core-dynamic-component.service.js +92 -92
- package/esm2015/lib/components/double-calendar/double-calendar.component.js +62 -62
- package/esm2015/lib/components/double-calendar/double-calendar.module.js +24 -24
- package/esm2015/lib/components/filter-item/filter-item-viewmodel.js +12 -12
- package/esm2015/lib/components/filter-item/filter-item.component.js +496 -496
- package/esm2015/lib/components/filter-item/filter-item.module.js +42 -42
- package/esm2015/lib/components/filter-item/filter-viewmodel.js +10 -10
- package/esm2015/lib/components/form/form.component.js +181 -181
- package/esm2015/lib/components/form/form.module.js +22 -22
- package/esm2015/lib/components/grid-toolbar/grid-toolbar.component.js +48 -48
- package/esm2015/lib/components/grid-toolbar/grid-toolbar.module.js +22 -22
- package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.component.js +23 -23
- package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.module.js +18 -18
- package/esm2015/lib/components/icon/icon-cache.service.js +51 -51
- package/esm2015/lib/components/icon/icon.component.js +47 -47
- package/esm2015/lib/components/icon/icon.module.js +24 -24
- package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.component.js +56 -56
- package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.module.js +22 -22
- package/esm2015/lib/components/image/image.component.js +31 -31
- package/esm2015/lib/components/image/image.module.js +13 -13
- package/esm2015/lib/components/input-checkbox/input-checkbox.component.js +71 -71
- package/esm2015/lib/components/input-checkbox/input-checkbox.module.js +18 -18
- package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +74 -74
- package/esm2015/lib/components/input-date-picker/input-date-picker.module.js +25 -25
- package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.component.js +107 -107
- package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.module.js +26 -26
- package/esm2015/lib/components/input-number-picker/input-number-picker.component.js +285 -285
- package/esm2015/lib/components/input-number-picker/input-number-picker.module.js +22 -22
- package/esm2015/lib/components/input-radio-button/input-radio-button.component.js +77 -77
- package/esm2015/lib/components/input-radio-button/input-radio-button.module.js +18 -18
- package/esm2015/lib/components/input-scanner/bar-code-scanner.js +22 -22
- package/esm2015/lib/components/input-scanner/input-scanner.component.js +54 -54
- package/esm2015/lib/components/input-scanner/input-scanner.module.js +20 -20
- package/esm2015/lib/components/input-scanner/scanner.service.js +27 -27
- package/esm2015/lib/components/input-search/input-search.component.js +59 -59
- package/esm2015/lib/components/input-search/input-search.module.js +20 -20
- package/esm2015/lib/components/input-text/input-text.component.js +179 -179
- package/esm2015/lib/components/input-text/input-text.module.js +32 -32
- package/esm2015/lib/components/input-textarea/input-textarea.component.js +55 -55
- package/esm2015/lib/components/input-textarea/input-textarea.module.js +26 -26
- package/esm2015/lib/components/level-indicator/level-indicator-level.enum.js +6 -6
- package/esm2015/lib/components/level-indicator/level-indicator.component.js +29 -29
- package/esm2015/lib/components/level-indicator/level-indicator.module.js +14 -14
- package/esm2015/lib/components/list-of-values/list-of-values-multiselect-popup.component.js +87 -87
- package/esm2015/lib/components/list-of-values/list-of-values-popup.component.js +218 -218
- package/esm2015/lib/components/list-of-values/list-of-values.component.js +199 -199
- package/esm2015/lib/components/list-of-values/list-of-values.module.js +37 -37
- package/esm2015/lib/components/loader/loader.component.js +16 -16
- package/esm2015/lib/components/loader/loader.module.js +18 -18
- package/esm2015/lib/components/pagination/paginate.pipe.js +98 -98
- package/esm2015/lib/components/pagination/pagination-instance.js +1 -1
- package/esm2015/lib/components/pagination/pagination.component.js +107 -107
- package/esm2015/lib/components/pagination/pagination.module.js +27 -27
- package/esm2015/lib/components/pagination/pagination.service.js +87 -87
- package/esm2015/lib/components/pagination-bar/pagination-bar.component.js +136 -136
- package/esm2015/lib/components/pagination-bar/pagination-bar.module.js +18 -18
- package/esm2015/lib/components/popup/const/popup-window-token.js +2 -2
- package/esm2015/lib/components/popup/interface/popup-button.js +7 -7
- package/esm2015/lib/components/popup/interface/popup-close-event.js +1 -1
- package/esm2015/lib/components/popup/interface/popup-settings.js +41 -41
- package/esm2015/lib/components/popup/interface/popup.js +1 -1
- package/esm2015/lib/components/popup/model/popup-button-globals.js +10 -10
- package/esm2015/lib/components/popup/model/popup-window.js +37 -37
- package/esm2015/lib/components/popup/popup-buttons.component.js +42 -42
- package/esm2015/lib/components/popup/popup-message-display.component.js +37 -37
- package/esm2015/lib/components/popup/popup-window-shell.component.js +141 -141
- package/esm2015/lib/components/popup/popup.module.js +48 -48
- package/esm2015/lib/components/popup/service/popup-shower.service.js +89 -89
- package/esm2015/lib/components/popup/service/prompt.service.js +126 -126
- package/esm2015/lib/components/popup/text-input-popup.component.js +33 -33
- package/esm2015/lib/components/responsive-text/responsive-text.component.js +17 -17
- package/esm2015/lib/components/responsive-text/responsive-text.module.js +18 -18
- package/esm2015/lib/components/simple-grid/base-simple-grid.component.js +163 -163
- package/esm2015/lib/components/simple-grid/simple-grid-cell.component.js +141 -141
- package/esm2015/lib/components/simple-grid/simple-grid-column.directive.js +110 -110
- package/esm2015/lib/components/simple-grid/simple-grid.component.js +378 -378
- package/esm2015/lib/components/simple-grid/simple-grid.module.js +40 -40
- package/esm2015/lib/components/tile/tile.component.js +44 -44
- package/esm2015/lib/components/tile/tile.module.js +22 -22
- package/esm2015/lib/components/tile-select/tile-select.component.js +26 -26
- package/esm2015/lib/components/tile-select/tile-select.module.js +20 -20
- package/esm2015/lib/components/tooltip/tooltip.component.js +74 -74
- package/esm2015/lib/components/tooltip/tooltip.module.js +18 -18
- package/esm2015/lib/components/validation-error/validation-error.component.js +30 -30
- package/esm2015/lib/components/validation-error/validation-error.module.js +24 -24
- package/esm2015/lib/components/view-mode-buttons/content-view-mode.enum.js +10 -10
- package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.component.js +41 -41
- package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.module.js +20 -20
- package/esm2015/lib/core/constant/default-upper-bound-for-range-components.js +3 -3
- package/esm2015/lib/core/constant/java-max-int.js +1 -1
- package/esm2015/lib/core/constant/number-inputs-key-down-white-list.js +44 -44
- package/esm2015/lib/core/decorator/input-boolean.decorator.js +33 -33
- package/esm2015/lib/core/enum/co-direction.js +8 -8
- package/esm2015/lib/core/enum/co-document-image-display-kind.enum.js +6 -6
- package/esm2015/lib/core/enum/co-document-type.enum.js +10 -10
- package/esm2015/lib/core/enum/co-orientation.js +16 -16
- package/esm2015/lib/core/enum/core-components-icon.enum.js +299 -299
- package/esm2015/lib/core/enum/file-type-internal.enum.js +16 -16
- package/esm2015/lib/core/enum/file-type.enum.js +10 -10
- package/esm2015/lib/core/enum/filterItem-mode.enum.js +42 -42
- package/esm2015/lib/core/enum/input-number-picker-show-mode.enum.js +7 -7
- package/esm2015/lib/core/enum/keyboard-code.enum.js +73 -73
- package/esm2015/lib/core/enum/keyboard-key.enum.js +75 -75
- package/esm2015/lib/core/enum/object-right-type.enum.js +6 -6
- package/esm2015/lib/core/enum/popup-button-type.enum.js +11 -11
- package/esm2015/lib/core/enum/popup-type.enum.js +10 -10
- package/esm2015/lib/core/enum/table-name.enum.js +80 -80
- package/esm2015/lib/core/function/any-nill.function.js +5 -5
- package/esm2015/lib/core/function/is-nill.function.js +4 -4
- package/esm2015/lib/core/function/none-nill.function.js +16 -16
- package/esm2015/lib/core/function/not-nill.function.js +4 -4
- package/esm2015/lib/core/model/bounds-constrained-number-value.js +170 -170
- package/esm2015/lib/core/model/check-precision-and-scale-result.js +1 -1
- package/esm2015/lib/core/model/check-within-stepped-bounds-result.js +1 -1
- package/esm2015/lib/core/model/co-document-right.bo.js +2 -2
- package/esm2015/lib/core/model/co-document.bo.js +120 -120
- package/esm2015/lib/core/model/core-components-icon-svg.js +298 -298
- package/esm2015/lib/core/model/element-position.js +9 -9
- package/esm2015/lib/core/model/event/string-prompt-result-event.js +7 -7
- package/esm2015/lib/core/service/form-input-user-change-listener.service.js +24 -24
- package/esm2015/lib/core/service/form-master.service.js +101 -101
- package/esm2015/lib/core/service/ng-zone-wrapper.service.js +19 -19
- package/esm2015/lib/core/utils/array-utils.js +263 -263
- package/esm2015/lib/core/utils/browser-utils.js +99 -99
- package/esm2015/lib/core/utils/direction-enum-utils.js +13 -13
- package/esm2015/lib/core/utils/event-utils.js +52 -52
- package/esm2015/lib/core/utils/file-utils.js +266 -266
- package/esm2015/lib/core/utils/number-utils.js +308 -308
- package/esm2015/lib/core/utils/object-utils.js +185 -185
- package/esm2015/lib/core/utils/string-utils.js +93 -93
- package/esm2015/lib/core/validator/email.validator.js +5 -5
- package/esm2015/lib/core/validator/equal.validator.js +10 -10
- package/esm2015/lib/core/validator/max-string-length.validator.js +9 -9
- package/esm2015/lib/core/validator/password.validator.js +30 -30
- package/esm2015/lib/core/validator/precision-scale.validator.js +10 -10
- package/esm2015/lib/core/validator/required.validator.js +4 -4
- package/esm2015/lib/directives/clickoutside/click-outside-master.service.js +56 -56
- package/esm2015/lib/directives/clickoutside/click-outside.directive.js +70 -70
- package/esm2015/lib/directives/clickoutside/clickoutside.module.js +18 -18
- package/esm2015/lib/directives/observe-visibility/observe-visibility.directive.js +52 -52
- package/esm2015/lib/directives/observe-visibility/observe-visibility.module.js +14 -14
- package/esm2015/lib/directives/overlay/overlay-parent.directive.js +18 -18
- package/esm2015/lib/directives/overlay/overlay.directive.js +160 -160
- package/esm2015/lib/directives/overlay/overlay.module.js +17 -17
- package/esm2015/lib/directives/ripple/ripple-ref.js +25 -25
- package/esm2015/lib/directives/ripple/ripple-renderer.js +159 -159
- package/esm2015/lib/directives/ripple/ripple.directive.js +79 -79
- package/esm2015/lib/directives/ripple/ripple.module.js +23 -23
- package/esm2015/lib/directives/ripple/scroll-dispatcher.service.js +107 -107
- package/esm2015/lib/directives/ripple/scrollable.directive.js +39 -39
- package/esm2015/lib/directives/ripple/viewport-ruler.service.js +72 -72
- package/esm2015/lib/directives/screen-configuration/screen-configuration.directive.js +157 -157
- package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +18 -18
- package/esm2015/lib/directives/stopclick/stop-click.directive.js +37 -37
- package/esm2015/lib/directives/stopclick/stop-click.module.js +14 -14
- package/esm2015/lib/directives/template-wrapper/template-wrapper.directive.js +67 -67
- package/esm2015/lib/directives/template-wrapper/template-wrapper.module.js +14 -14
- package/esm2015/lib/directives/tooltip/tooltip-directive.module.js +18 -18
- package/esm2015/lib/directives/tooltip/tooltip.directive.js +77 -77
- package/esm2015/lib/interfaces/dialog-response.interface.js +1 -1
- package/esm2015/lib/interfaces/scanner-input.interface.js +1 -1
- package/esm2015/lib/interfaces/screen-config-adapter-component-interface-name.js +3 -3
- package/esm2015/lib/interfaces/screen-config-adapter.component.interface.js +1 -1
- package/esm2015/lib/model/enum/app-button-type.enum.js +10 -10
- package/esm2015/lib/model/enum/app-popup-type.enum.js +7 -7
- package/esm2015/lib/pipes/append.pipe.js +16 -16
- package/esm2015/lib/pipes/append.pipe.module.js +14 -14
- package/esm2015/lib/pipes/filter.pipe.js +15 -15
- package/esm2015/lib/pipes/filter.pipe.module.js +14 -14
- package/esm2015/lib/pipes/prepend.pipe.js +16 -16
- package/esm2015/lib/pipes/prepend.pipe.module.js +14 -14
- package/esm2015/lib/pipes/price-display-pipe.module.js +14 -14
- package/esm2015/lib/pipes/price-display.pipe.js +19 -19
- package/esm2015/lib/service/base-module-screen-config.service.js +204 -204
- package/esm2015/lib/service/base-module.service.js +41 -41
- package/esm2015/lib/service/color-sequence.service.js +22 -22
- package/esm2015/lib/service/overlay.service.js +72 -72
- package/esm2015/lib/translation/core-components-translation.module.js +28 -28
- package/esm2015/lib/translation/core-components-translation.service.js +16 -16
- package/esm2015/lib/translation/core-dictionary.service.js +28 -28
- package/esm2015/lib/translation/core-localize.pipe.js +25 -25
- package/esm2015/public-api.js +129 -129
- package/fesm2015/colijnit-corecomponents_v12.js +12066 -12066
- package/lib/components/article-tile/article-tile.component.d.ts +22 -22
- package/lib/components/article-tile/article-tile.module.d.ts +2 -2
- package/lib/components/base/base-input.component.d.ts +182 -182
- package/lib/components/base/base.module.d.ts +2 -2
- package/lib/components/base/commit-buttons/commit-buttons.component.d.ts +21 -21
- package/lib/components/base/commit-buttons/commit-buttons.module.d.ts +2 -2
- package/lib/components/base/dialog-base.component.d.ts +4 -4
- package/lib/components/base-input-date-picker/base-input-date-picker.directive.d.ts +15 -15
- package/lib/components/button/button.component.d.ts +29 -29
- package/lib/components/button/button.module.d.ts +2 -2
- package/lib/components/calendar/calendar-template.component.d.ts +60 -60
- package/lib/components/calendar/calendar.component.d.ts +13 -13
- package/lib/components/calendar/calendar.module.d.ts +2 -2
- package/lib/components/card/card.component.d.ts +23 -23
- package/lib/components/card/card.module.d.ts +2 -2
- package/lib/components/carousel/carousel.component.d.ts +23 -23
- package/lib/components/carousel/carousel.module.d.ts +6 -6
- package/lib/components/carousel-3d/carousel-3d.component.d.ts +55 -55
- package/lib/components/carousel-3d/carousel-3d.module.d.ts +2 -2
- package/lib/components/carousel-3d/carouselItem.d.ts +13 -13
- package/lib/components/checkmark-overlay/checkmark-overlay.component.d.ts +17 -17
- package/lib/components/checkmark-overlay/checkmark-overlay.module.d.ts +2 -2
- package/lib/components/co-dialog/co-dialog.component.d.ts +23 -23
- package/lib/components/co-dialog/co-dialog.module.d.ts +2 -2
- package/lib/components/co-dialog-wizard/co-dialog-wizard.component.d.ts +9 -9
- package/lib/components/co-dialog-wizard/co-dialog-wizard.module.d.ts +2 -2
- package/lib/components/collapsible/collapsible.component.d.ts +22 -22
- package/lib/components/collapsible/collapsible.module.d.ts +2 -2
- package/lib/components/color-picker/color-picker.component.d.ts +6 -6
- package/lib/components/color-picker/color-picker.module.d.ts +2 -2
- package/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +20 -20
- package/lib/components/core-dialog/core-dialog.module.d.ts +4 -4
- package/lib/components/core-dialog/core-dialog.service.d.ts +15 -15
- package/lib/components/core-dialog/core-dynamic-component.service.d.ts +12 -12
- package/lib/components/double-calendar/double-calendar.component.d.ts +18 -18
- package/lib/components/double-calendar/double-calendar.module.d.ts +2 -2
- package/lib/components/filter-item/filter-item-viewmodel.d.ts +9 -9
- package/lib/components/filter-item/filter-item.component.d.ts +80 -80
- package/lib/components/filter-item/filter-item.module.d.ts +2 -2
- package/lib/components/filter-item/filter-viewmodel.d.ts +8 -8
- package/lib/components/form/form.component.d.ts +39 -39
- package/lib/components/form/form.module.d.ts +2 -2
- package/lib/components/grid-toolbar/grid-toolbar.component.d.ts +19 -19
- package/lib/components/grid-toolbar/grid-toolbar.module.d.ts +2 -2
- package/lib/components/grid-toolbar-button/grid-toolbar-button.component.d.ts +8 -8
- package/lib/components/grid-toolbar-button/grid-toolbar-button.module.d.ts +2 -2
- package/lib/components/icon/icon-cache.service.d.ts +20 -20
- package/lib/components/icon/icon.component.d.ts +17 -17
- package/lib/components/icon/icon.module.d.ts +2 -2
- package/lib/components/icon-collapse-handle/icon-collapse-handle.component.d.ts +21 -21
- package/lib/components/icon-collapse-handle/icon-collapse-handle.module.d.ts +2 -2
- package/lib/components/image/image.component.d.ts +20 -20
- package/lib/components/image/image.module.d.ts +2 -2
- package/lib/components/input-checkbox/input-checkbox.component.d.ts +24 -24
- package/lib/components/input-checkbox/input-checkbox.module.d.ts +2 -2
- package/lib/components/input-date-picker/input-date-picker.component.d.ts +12 -12
- package/lib/components/input-date-picker/input-date-picker.module.d.ts +2 -2
- package/lib/components/input-date-range-picker/input-date-range-picker.component.d.ts +20 -20
- package/lib/components/input-date-range-picker/input-date-range-picker.module.d.ts +2 -2
- package/lib/components/input-number-picker/input-number-picker.component.d.ts +73 -73
- package/lib/components/input-number-picker/input-number-picker.module.d.ts +2 -2
- package/lib/components/input-radio-button/input-radio-button.component.d.ts +19 -19
- package/lib/components/input-radio-button/input-radio-button.module.d.ts +2 -2
- package/lib/components/input-scanner/bar-code-scanner.d.ts +7 -7
- package/lib/components/input-scanner/input-scanner.component.d.ts +23 -23
- package/lib/components/input-scanner/input-scanner.module.d.ts +2 -2
- package/lib/components/input-scanner/scanner.service.d.ts +11 -11
- package/lib/components/input-search/input-search.component.d.ts +18 -18
- package/lib/components/input-search/input-search.module.d.ts +2 -2
- package/lib/components/input-text/input-text.component.d.ts +62 -62
- package/lib/components/input-text/input-text.module.d.ts +2 -2
- package/lib/components/input-textarea/input-textarea.component.d.ts +19 -19
- package/lib/components/input-textarea/input-textarea.module.d.ts +2 -2
- package/lib/components/level-indicator/level-indicator-level.enum.d.ts +5 -5
- package/lib/components/level-indicator/level-indicator.component.d.ts +10 -10
- package/lib/components/level-indicator/level-indicator.module.d.ts +2 -2
- package/lib/components/list-of-values/list-of-values-multiselect-popup.component.d.ts +25 -25
- package/lib/components/list-of-values/list-of-values-popup.component.d.ts +47 -47
- package/lib/components/list-of-values/list-of-values.component.d.ts +37 -37
- package/lib/components/list-of-values/list-of-values.module.d.ts +2 -2
- package/lib/components/list-of-values/style/_layout.scss +4 -0
- package/lib/components/loader/loader.component.d.ts +3 -3
- package/lib/components/loader/loader.module.d.ts +2 -2
- package/lib/components/pagination/paginate.pipe.d.ts +15 -15
- package/lib/components/pagination/pagination-instance.d.ts +14 -14
- package/lib/components/pagination/pagination.component.d.ts +38 -38
- package/lib/components/pagination/pagination.module.d.ts +2 -2
- package/lib/components/pagination/pagination.service.d.ts +24 -24
- package/lib/components/pagination-bar/pagination-bar.component.d.ts +33 -33
- package/lib/components/pagination-bar/pagination-bar.module.d.ts +2 -2
- package/lib/components/popup/const/popup-window-token.d.ts +3 -3
- package/lib/components/popup/interface/popup-button.d.ts +8 -8
- package/lib/components/popup/interface/popup-close-event.d.ts +5 -5
- package/lib/components/popup/interface/popup-settings.d.ts +21 -21
- package/lib/components/popup/interface/popup.d.ts +9 -9
- package/lib/components/popup/model/popup-button-globals.d.ts +9 -9
- package/lib/components/popup/model/popup-window.d.ts +21 -21
- package/lib/components/popup/popup-buttons.component.d.ts +13 -13
- package/lib/components/popup/popup-message-display.component.d.ts +12 -12
- package/lib/components/popup/popup-window-shell.component.d.ts +42 -42
- package/lib/components/popup/popup.module.d.ts +4 -4
- package/lib/components/popup/service/popup-shower.service.d.ts +17 -17
- package/lib/components/popup/service/prompt.service.d.ts +17 -17
- package/lib/components/popup/text-input-popup.component.d.ts +12 -12
- package/lib/components/responsive-text/responsive-text.component.d.ts +4 -4
- package/lib/components/responsive-text/responsive-text.module.d.ts +2 -2
- package/lib/components/simple-grid/base-simple-grid.component.d.ts +52 -52
- package/lib/components/simple-grid/simple-grid-cell.component.d.ts +30 -30
- package/lib/components/simple-grid/simple-grid-column.directive.d.ts +42 -42
- package/lib/components/simple-grid/simple-grid.component.d.ts +64 -64
- package/lib/components/simple-grid/simple-grid.module.d.ts +2 -2
- package/lib/components/tile/tile.component.d.ts +16 -16
- package/lib/components/tile/tile.module.d.ts +2 -2
- package/lib/components/tile-select/tile-select.component.d.ts +8 -8
- package/lib/components/tile-select/tile-select.module.d.ts +2 -2
- package/lib/components/tooltip/tooltip.component.d.ts +18 -18
- package/lib/components/tooltip/tooltip.module.d.ts +2 -2
- package/lib/components/validation-error/validation-error.component.d.ts +12 -12
- package/lib/components/validation-error/validation-error.module.d.ts +2 -2
- package/lib/components/view-mode-buttons/content-view-mode.enum.d.ts +8 -8
- package/lib/components/view-mode-buttons/view-mode-buttons.component.d.ts +17 -17
- package/lib/components/view-mode-buttons/view-mode-buttons.module.d.ts +2 -2
- package/lib/core/constant/default-upper-bound-for-range-components.d.ts +2 -2
- package/lib/core/constant/java-max-int.d.ts +1 -1
- package/lib/core/constant/number-inputs-key-down-white-list.d.ts +2 -2
- package/lib/core/decorator/input-boolean.decorator.d.ts +8 -8
- package/lib/core/enum/co-direction.d.ts +6 -6
- package/lib/core/enum/co-document-image-display-kind.enum.d.ts +5 -5
- package/lib/core/enum/co-document-type.enum.d.ts +5 -5
- package/lib/core/enum/co-orientation.d.ts +6 -6
- package/lib/core/enum/core-components-icon.enum.d.ts +298 -298
- package/lib/core/enum/file-type-internal.enum.d.ts +15 -15
- package/lib/core/enum/file-type.enum.d.ts +5 -5
- package/lib/core/enum/filterItem-mode.enum.d.ts +15 -15
- package/lib/core/enum/input-number-picker-show-mode.enum.d.ts +5 -5
- package/lib/core/enum/keyboard-code.enum.d.ts +71 -71
- package/lib/core/enum/keyboard-key.enum.d.ts +70 -70
- package/lib/core/enum/object-right-type.enum.d.ts +5 -5
- package/lib/core/enum/popup-button-type.enum.d.ts +9 -9
- package/lib/core/enum/popup-type.enum.d.ts +9 -9
- package/lib/core/enum/table-name.enum.d.ts +79 -79
- package/lib/core/function/any-nill.function.d.ts +1 -1
- package/lib/core/function/is-nill.function.d.ts +1 -1
- package/lib/core/function/none-nill.function.d.ts +1 -1
- package/lib/core/function/not-nill.function.d.ts +1 -1
- package/lib/core/model/bounds-constrained-number-value.d.ts +46 -46
- package/lib/core/model/check-precision-and-scale-result.d.ts +4 -4
- package/lib/core/model/check-within-stepped-bounds-result.d.ts +8 -8
- package/lib/core/model/co-document-right.bo.d.ts +6 -6
- package/lib/core/model/co-document.bo.d.ts +61 -61
- package/lib/core/model/core-components-icon-svg.d.ts +4 -4
- package/lib/core/model/element-position.d.ts +7 -7
- package/lib/core/model/event/string-prompt-result-event.d.ts +6 -6
- package/lib/core/service/form-input-user-change-listener.service.d.ts +10 -10
- package/lib/core/service/form-master.service.d.ts +26 -26
- package/lib/core/service/ng-zone-wrapper.service.d.ts +6 -6
- package/lib/core/utils/array-utils.d.ts +85 -85
- package/lib/core/utils/browser-utils.d.ts +15 -15
- package/lib/core/utils/direction-enum-utils.d.ts +5 -5
- package/lib/core/utils/event-utils.d.ts +12 -12
- package/lib/core/utils/file-utils.d.ts +29 -29
- package/lib/core/utils/number-utils.d.ts +89 -89
- package/lib/core/utils/object-utils.d.ts +31 -31
- package/lib/core/utils/string-utils.d.ts +25 -25
- package/lib/core/validator/email.validator.d.ts +2 -2
- package/lib/core/validator/equal.validator.d.ts +2 -2
- package/lib/core/validator/max-string-length.validator.d.ts +2 -2
- package/lib/core/validator/password.validator.d.ts +3 -3
- package/lib/core/validator/precision-scale.validator.d.ts +2 -2
- package/lib/core/validator/required.validator.d.ts +2 -2
- package/lib/directives/clickoutside/click-outside-master.service.d.ts +15 -15
- package/lib/directives/clickoutside/click-outside.directive.d.ts +18 -18
- package/lib/directives/clickoutside/clickoutside.module.d.ts +2 -2
- package/lib/directives/observe-visibility/observe-visibility.directive.d.ts +14 -14
- package/lib/directives/observe-visibility/observe-visibility.module.d.ts +2 -2
- package/lib/directives/overlay/overlay-parent.directive.d.ts +6 -6
- package/lib/directives/overlay/overlay.directive.d.ts +25 -25
- package/lib/directives/overlay/overlay.module.d.ts +2 -2
- package/lib/directives/ripple/ripple-ref.d.ts +21 -21
- package/lib/directives/ripple/ripple-renderer.d.ts +56 -56
- package/lib/directives/ripple/ripple.directive.d.ts +56 -56
- package/lib/directives/ripple/ripple.module.d.ts +2 -2
- package/lib/directives/ripple/scroll-dispatcher.service.d.ts +51 -51
- package/lib/directives/ripple/scrollable.directive.d.ts +20 -20
- package/lib/directives/ripple/viewport-ruler.service.d.ts +29 -29
- package/lib/directives/screen-configuration/screen-configuration.directive.d.ts +32 -32
- package/lib/directives/screen-configuration/screen-configuration.module.d.ts +2 -2
- package/lib/directives/stopclick/stop-click.directive.d.ts +10 -10
- package/lib/directives/stopclick/stop-click.module.d.ts +2 -2
- package/lib/directives/template-wrapper/template-wrapper.directive.d.ts +13 -13
- package/lib/directives/template-wrapper/template-wrapper.module.d.ts +2 -2
- package/lib/directives/tooltip/tooltip-directive.module.d.ts +2 -2
- package/lib/directives/tooltip/tooltip.directive.d.ts +20 -20
- package/lib/interfaces/dialog-response.interface.d.ts +6 -6
- package/lib/interfaces/scanner-input.interface.d.ts +3 -3
- package/lib/interfaces/screen-config-adapter-component-interface-name.d.ts +3 -3
- package/lib/interfaces/screen-config-adapter.component.interface.d.ts +10 -10
- package/lib/model/enum/app-button-type.enum.d.ts +9 -9
- package/lib/model/enum/app-popup-type.enum.d.ts +6 -6
- package/lib/pipes/append.pipe.d.ts +4 -4
- package/lib/pipes/append.pipe.module.d.ts +2 -2
- package/lib/pipes/filter.pipe.d.ts +4 -4
- package/lib/pipes/filter.pipe.module.d.ts +2 -2
- package/lib/pipes/prepend.pipe.d.ts +4 -4
- package/lib/pipes/prepend.pipe.module.d.ts +2 -2
- package/lib/pipes/price-display-pipe.module.d.ts +2 -2
- package/lib/pipes/price-display.pipe.d.ts +4 -4
- package/lib/service/base-module-screen-config.service.d.ts +47 -47
- package/lib/service/base-module.service.d.ts +22 -22
- package/lib/service/color-sequence.service.d.ts +4 -4
- package/lib/service/overlay.service.d.ts +13 -13
- package/lib/translation/core-components-translation.module.d.ts +4 -4
- package/lib/translation/core-components-translation.service.d.ts +6 -6
- package/lib/translation/core-dictionary.service.d.ts +12 -12
- package/lib/translation/core-localize.pipe.d.ts +7 -7
- package/package.json +2 -2
- package/public-api.d.ts +126 -126
|
@@ -1,264 +1,264 @@
|
|
|
1
|
-
import { isNill } from "../function/is-nill.function";
|
|
2
|
-
import { notNill } from "../function/not-nill.function";
|
|
3
|
-
import { StringUtils } from "./string-utils";
|
|
4
|
-
import { NumberUtils } from "./number-utils";
|
|
5
|
-
import { ObjectUtils } from "./object-utils";
|
|
6
|
-
export class ArrayUtils {
|
|
7
|
-
/**
|
|
8
|
-
* Inserts given element into given array, on given index number.
|
|
9
|
-
*
|
|
10
|
-
* @param index The index position for the element to insert, use negatives to count from the arrays end
|
|
11
|
-
* @param element The element to insert
|
|
12
|
-
* @param array The array to insert the element into
|
|
13
|
-
* @returns True if and only if given element is succesfully inserted into given array.
|
|
14
|
-
*/
|
|
15
|
-
static InsertElement(index, element, array) {
|
|
16
|
-
if (!Array.isArray(array) || Math.abs(index) > array.length || isNill(index)) {
|
|
17
|
-
// cannot insert something into nothing, and cannot insert an element into a non-array (via this contract that is), and
|
|
18
|
-
// we will not insert anything beyond the arrays limits (but we can append to the start or end)
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
const lenBefore = array.length;
|
|
22
|
-
array.splice(index, 0, element);
|
|
23
|
-
return (array.length === lenBefore + 1);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' keyword, but truly removes the
|
|
27
|
-
* element using splice(). Also works on associative arrays.
|
|
28
|
-
*
|
|
29
|
-
* @param element The element to remove.
|
|
30
|
-
* @param array The array to remove the element from.
|
|
31
|
-
* @returns True iff given element was truly successfully removed from given array.
|
|
32
|
-
*/
|
|
33
|
-
static RemoveElement(element, array) {
|
|
34
|
-
if (!Array.isArray(array)) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
let index = array.indexOf(element);
|
|
38
|
-
return ArrayUtils.RemoveElementAtIndex(index, array);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Returns a true shallow clone of given array plus all its items. Its first-level members are object-shallow-cloned (optionally with a
|
|
42
|
-
* strongly typed constructor),
|
|
43
|
-
* or just as plain object (see param arrayItemsClass).
|
|
44
|
-
* @param arrayGiven
|
|
45
|
-
* @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
|
|
46
|
-
* it'll be a plain object.
|
|
47
|
-
* @returns a true shallow clone of given array plus all its items
|
|
48
|
-
*/
|
|
49
|
-
static ShallowCloneArrayAndItsItem(arrayGiven, arrayItemsClass) {
|
|
50
|
-
let arrayClone = [];
|
|
51
|
-
if (arrayGiven) {
|
|
52
|
-
for (let i = 0, len = arrayGiven.length; i < len; i++) {
|
|
53
|
-
arrayClone.push(ObjectUtils.GetShallowClone(arrayGiven[i], arrayItemsClass));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
return arrayClone;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Moves given element to given toIndex in given array. Returns whether the element was really moved, thus changing the given array.
|
|
63
|
-
*/
|
|
64
|
-
static MoveElement(element, toIndex, array) {
|
|
65
|
-
if (!Array.isArray(array) || isNill(toIndex)) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
let fromIndex = array.indexOf(element);
|
|
69
|
-
let toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
|
|
70
|
-
if (fromIndex === -1 || array[toIndexCorrected] === element) {
|
|
71
|
-
// element did not exist in given array, or already existed on given toIndex
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
|
|
79
|
-
* @param array
|
|
80
|
-
* @param itemValueFunction The function aplied to each array item that gives it a numerical value. The max num val found is returned.
|
|
81
|
-
*/
|
|
82
|
-
static GetMaxCalculatedValue(array, itemValueFunction) {
|
|
83
|
-
if (!array || !itemValueFunction) {
|
|
84
|
-
return NaN;
|
|
85
|
-
}
|
|
86
|
-
let max = undefined;
|
|
87
|
-
let len = array.length;
|
|
88
|
-
for (let i = 0; i < len; i++) {
|
|
89
|
-
let valueCur = itemValueFunction.call(this);
|
|
90
|
-
if (valueCur > max) {
|
|
91
|
-
max = valueCur;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return max;
|
|
95
|
-
}
|
|
96
|
-
// Checks if given array is defined, and is an array, and has length > 0, and, optionally checks that the first element is of type given clazz.
|
|
97
|
-
static IsArrayWithElements(arrayToCheck, clazz) {
|
|
98
|
-
if (isNill(arrayToCheck)) {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
|
|
102
|
-
if (clazz) {
|
|
103
|
-
return arrayToCheck[0] instanceof clazz;
|
|
104
|
-
}
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
// Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
|
|
110
|
-
static RemoveElementsByFilter(array, filterFunction) {
|
|
111
|
-
if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
let atLeastOneRemoved = false;
|
|
115
|
-
let len = array.length;
|
|
116
|
-
for (let i = len - 1; i >= 0; i--) {
|
|
117
|
-
let item = array[i];
|
|
118
|
-
if (filterFunction.call(this, item) === true) {
|
|
119
|
-
array.splice(i, 1);
|
|
120
|
-
atLeastOneRemoved = true;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return atLeastOneRemoved;
|
|
124
|
-
}
|
|
125
|
-
// Replaces the elementOut with given elementIn.
|
|
126
|
-
static ReplaceElement(elementIn, elementOut, array) {
|
|
127
|
-
if (!array || !Array.isArray(array)) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
const indexOut = array.indexOf(elementOut);
|
|
131
|
-
if (indexOut > -1) {
|
|
132
|
-
ArrayUtils.InsertElement(indexOut, elementIn, array);
|
|
133
|
-
ArrayUtils.RemoveElement(elementOut, array);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// Swaps the elements in given array with each other. Returns whether a real swap was made. From and To elements have to exist in array.
|
|
137
|
-
static SwapElements(elementOne, elementTwo, array) {
|
|
138
|
-
if (!Array.isArray(array)) {
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
const elOneIdx = array.indexOf(elementTwo);
|
|
142
|
-
const elTwoIdx = array.indexOf(elementOne);
|
|
143
|
-
if (elOneIdx === -1 || elTwoIdx === -1) {
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
array[elOneIdx] = array.splice(elTwoIdx, 1, array[elOneIdx])[0];
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
// Inserts or removes given toggle element into given elements array; inserts if not yet exists, and removes if already exists.
|
|
150
|
-
static ToggleElement(toggle, elements) {
|
|
151
|
-
elements.indexOf(toggle) > -1 ? ArrayUtils.RemoveElement(toggle, elements) : elements.push(toggle);
|
|
152
|
-
}
|
|
153
|
-
// Returns the number of elements from given array for which given whereFunction holds true.
|
|
154
|
-
static CountWhere(array, whereFunction) {
|
|
155
|
-
if (!ArrayUtils.IsArrayWithElements(array) || !whereFunction) {
|
|
156
|
-
return 0;
|
|
157
|
-
}
|
|
158
|
-
let count = 0;
|
|
159
|
-
const len = array.length;
|
|
160
|
-
for (let i = 0; i < len; i++) {
|
|
161
|
-
if (whereFunction.call(this, array[i])) {
|
|
162
|
-
count++;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return count;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Returns whether at least one element in given array could be found by given finder function.
|
|
169
|
-
*
|
|
170
|
-
* @param array
|
|
171
|
-
* @param finder A finder function that takes an element of the array and returns a boolean that represents
|
|
172
|
-
* the 'found status' for that element; whether it should have been found or not.
|
|
173
|
-
*/
|
|
174
|
-
static ContainsAnElementFoundBy(array, finder) {
|
|
175
|
-
if (!array || !finder) {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
return notNill(ArrayUtils.Find(array, finder));
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
|
|
182
|
-
* undefined when none was found.
|
|
183
|
-
*
|
|
184
|
-
* Example usage:
|
|
185
|
-
* let foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
|
|
186
|
-
* (return modelItem.getId() === '1')
|
|
187
|
-
* * });
|
|
188
|
-
*
|
|
189
|
-
* @param array The array with items to search in.
|
|
190
|
-
* @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
|
|
191
|
-
*/
|
|
192
|
-
static Find(array, foundBy) {
|
|
193
|
-
if (!array || !foundBy) {
|
|
194
|
-
return undefined;
|
|
195
|
-
}
|
|
196
|
-
for (let i = 0, len = array.length; i < len; i++) {
|
|
197
|
-
let itemCur = array[i];
|
|
198
|
-
if (foundBy(itemCur)) {
|
|
199
|
-
return itemCur;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return undefined;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Sorts all items in the given array alphabetically (A-to-Z) according to the values of their given property.
|
|
206
|
-
* @param theArray
|
|
207
|
-
* @param propertyName = undefined] When not defined, assumes an array of STRINGS is given, instead of array of OBJECTS.
|
|
208
|
-
* @param [reverseOrder = false] Set to true to sort from Z-to-A instead
|
|
209
|
-
*/
|
|
210
|
-
static SortAlphabetically(theArray, propertyName = undefined, reverseOrder = false) {
|
|
211
|
-
if (!theArray || !Array.isArray(theArray)) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
let switcher = reverseOrder ? -1 : 1;
|
|
215
|
-
let stringSort = StringUtils.IsStringWithLength(propertyName);
|
|
216
|
-
theArray.sort((itemOne, itemTwo) => {
|
|
217
|
-
let valOne = stringSort ? itemOne[propertyName] : itemOne;
|
|
218
|
-
let valTwo = stringSort ? itemTwo[propertyName] : itemTwo;
|
|
219
|
-
return (valOne > valTwo ? 1 : (valOne < valTwo ? -1 : 0)) * switcher;
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
static PushIfNotExist(item, array) {
|
|
223
|
-
if (!array) {
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
if (array.indexOf(item) === -1) {
|
|
227
|
-
array.push(item);
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
return false;
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
|
|
234
|
-
* removes the element using splice().
|
|
235
|
-
*
|
|
236
|
-
* @param index
|
|
237
|
-
* @param array
|
|
238
|
-
* @returns True if and only if the element on given index is succesfully removed from given array.
|
|
239
|
-
*/
|
|
240
|
-
static RemoveElementAtIndex(index, array) {
|
|
241
|
-
if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
if (index in array) {
|
|
245
|
-
array.splice(index, 1);
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
// Returns true if and only if given array includes given item. Checked by ===.
|
|
253
|
-
static Includes(array, item) {
|
|
254
|
-
if (Array.isArray(array)) {
|
|
255
|
-
for (let i = 0, len = array.length; i < len; i++) {
|
|
256
|
-
if (array[i] === item) {
|
|
257
|
-
return true;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return false;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
1
|
+
import { isNill } from "../function/is-nill.function";
|
|
2
|
+
import { notNill } from "../function/not-nill.function";
|
|
3
|
+
import { StringUtils } from "./string-utils";
|
|
4
|
+
import { NumberUtils } from "./number-utils";
|
|
5
|
+
import { ObjectUtils } from "./object-utils";
|
|
6
|
+
export class ArrayUtils {
|
|
7
|
+
/**
|
|
8
|
+
* Inserts given element into given array, on given index number.
|
|
9
|
+
*
|
|
10
|
+
* @param index The index position for the element to insert, use negatives to count from the arrays end
|
|
11
|
+
* @param element The element to insert
|
|
12
|
+
* @param array The array to insert the element into
|
|
13
|
+
* @returns True if and only if given element is succesfully inserted into given array.
|
|
14
|
+
*/
|
|
15
|
+
static InsertElement(index, element, array) {
|
|
16
|
+
if (!Array.isArray(array) || Math.abs(index) > array.length || isNill(index)) {
|
|
17
|
+
// cannot insert something into nothing, and cannot insert an element into a non-array (via this contract that is), and
|
|
18
|
+
// we will not insert anything beyond the arrays limits (but we can append to the start or end)
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const lenBefore = array.length;
|
|
22
|
+
array.splice(index, 0, element);
|
|
23
|
+
return (array.length === lenBefore + 1);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' keyword, but truly removes the
|
|
27
|
+
* element using splice(). Also works on associative arrays.
|
|
28
|
+
*
|
|
29
|
+
* @param element The element to remove.
|
|
30
|
+
* @param array The array to remove the element from.
|
|
31
|
+
* @returns True iff given element was truly successfully removed from given array.
|
|
32
|
+
*/
|
|
33
|
+
static RemoveElement(element, array) {
|
|
34
|
+
if (!Array.isArray(array)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
let index = array.indexOf(element);
|
|
38
|
+
return ArrayUtils.RemoveElementAtIndex(index, array);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns a true shallow clone of given array plus all its items. Its first-level members are object-shallow-cloned (optionally with a
|
|
42
|
+
* strongly typed constructor),
|
|
43
|
+
* or just as plain object (see param arrayItemsClass).
|
|
44
|
+
* @param arrayGiven
|
|
45
|
+
* @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
|
|
46
|
+
* it'll be a plain object.
|
|
47
|
+
* @returns a true shallow clone of given array plus all its items
|
|
48
|
+
*/
|
|
49
|
+
static ShallowCloneArrayAndItsItem(arrayGiven, arrayItemsClass) {
|
|
50
|
+
let arrayClone = [];
|
|
51
|
+
if (arrayGiven) {
|
|
52
|
+
for (let i = 0, len = arrayGiven.length; i < len; i++) {
|
|
53
|
+
arrayClone.push(ObjectUtils.GetShallowClone(arrayGiven[i], arrayItemsClass));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
return arrayClone;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Moves given element to given toIndex in given array. Returns whether the element was really moved, thus changing the given array.
|
|
63
|
+
*/
|
|
64
|
+
static MoveElement(element, toIndex, array) {
|
|
65
|
+
if (!Array.isArray(array) || isNill(toIndex)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
let fromIndex = array.indexOf(element);
|
|
69
|
+
let toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
|
|
70
|
+
if (fromIndex === -1 || array[toIndexCorrected] === element) {
|
|
71
|
+
// element did not exist in given array, or already existed on given toIndex
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
|
|
79
|
+
* @param array
|
|
80
|
+
* @param itemValueFunction The function aplied to each array item that gives it a numerical value. The max num val found is returned.
|
|
81
|
+
*/
|
|
82
|
+
static GetMaxCalculatedValue(array, itemValueFunction) {
|
|
83
|
+
if (!array || !itemValueFunction) {
|
|
84
|
+
return NaN;
|
|
85
|
+
}
|
|
86
|
+
let max = undefined;
|
|
87
|
+
let len = array.length;
|
|
88
|
+
for (let i = 0; i < len; i++) {
|
|
89
|
+
let valueCur = itemValueFunction.call(this);
|
|
90
|
+
if (valueCur > max) {
|
|
91
|
+
max = valueCur;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return max;
|
|
95
|
+
}
|
|
96
|
+
// Checks if given array is defined, and is an array, and has length > 0, and, optionally checks that the first element is of type given clazz.
|
|
97
|
+
static IsArrayWithElements(arrayToCheck, clazz) {
|
|
98
|
+
if (isNill(arrayToCheck)) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
|
|
102
|
+
if (clazz) {
|
|
103
|
+
return arrayToCheck[0] instanceof clazz;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
// Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
|
|
110
|
+
static RemoveElementsByFilter(array, filterFunction) {
|
|
111
|
+
if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
let atLeastOneRemoved = false;
|
|
115
|
+
let len = array.length;
|
|
116
|
+
for (let i = len - 1; i >= 0; i--) {
|
|
117
|
+
let item = array[i];
|
|
118
|
+
if (filterFunction.call(this, item) === true) {
|
|
119
|
+
array.splice(i, 1);
|
|
120
|
+
atLeastOneRemoved = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return atLeastOneRemoved;
|
|
124
|
+
}
|
|
125
|
+
// Replaces the elementOut with given elementIn.
|
|
126
|
+
static ReplaceElement(elementIn, elementOut, array) {
|
|
127
|
+
if (!array || !Array.isArray(array)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const indexOut = array.indexOf(elementOut);
|
|
131
|
+
if (indexOut > -1) {
|
|
132
|
+
ArrayUtils.InsertElement(indexOut, elementIn, array);
|
|
133
|
+
ArrayUtils.RemoveElement(elementOut, array);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Swaps the elements in given array with each other. Returns whether a real swap was made. From and To elements have to exist in array.
|
|
137
|
+
static SwapElements(elementOne, elementTwo, array) {
|
|
138
|
+
if (!Array.isArray(array)) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
const elOneIdx = array.indexOf(elementTwo);
|
|
142
|
+
const elTwoIdx = array.indexOf(elementOne);
|
|
143
|
+
if (elOneIdx === -1 || elTwoIdx === -1) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
array[elOneIdx] = array.splice(elTwoIdx, 1, array[elOneIdx])[0];
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
// Inserts or removes given toggle element into given elements array; inserts if not yet exists, and removes if already exists.
|
|
150
|
+
static ToggleElement(toggle, elements) {
|
|
151
|
+
elements.indexOf(toggle) > -1 ? ArrayUtils.RemoveElement(toggle, elements) : elements.push(toggle);
|
|
152
|
+
}
|
|
153
|
+
// Returns the number of elements from given array for which given whereFunction holds true.
|
|
154
|
+
static CountWhere(array, whereFunction) {
|
|
155
|
+
if (!ArrayUtils.IsArrayWithElements(array) || !whereFunction) {
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
let count = 0;
|
|
159
|
+
const len = array.length;
|
|
160
|
+
for (let i = 0; i < len; i++) {
|
|
161
|
+
if (whereFunction.call(this, array[i])) {
|
|
162
|
+
count++;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return count;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Returns whether at least one element in given array could be found by given finder function.
|
|
169
|
+
*
|
|
170
|
+
* @param array
|
|
171
|
+
* @param finder A finder function that takes an element of the array and returns a boolean that represents
|
|
172
|
+
* the 'found status' for that element; whether it should have been found or not.
|
|
173
|
+
*/
|
|
174
|
+
static ContainsAnElementFoundBy(array, finder) {
|
|
175
|
+
if (!array || !finder) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
return notNill(ArrayUtils.Find(array, finder));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
|
|
182
|
+
* undefined when none was found.
|
|
183
|
+
*
|
|
184
|
+
* Example usage:
|
|
185
|
+
* let foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
|
|
186
|
+
* (return modelItem.getId() === '1')
|
|
187
|
+
* * });
|
|
188
|
+
*
|
|
189
|
+
* @param array The array with items to search in.
|
|
190
|
+
* @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
|
|
191
|
+
*/
|
|
192
|
+
static Find(array, foundBy) {
|
|
193
|
+
if (!array || !foundBy) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
for (let i = 0, len = array.length; i < len; i++) {
|
|
197
|
+
let itemCur = array[i];
|
|
198
|
+
if (foundBy(itemCur)) {
|
|
199
|
+
return itemCur;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Sorts all items in the given array alphabetically (A-to-Z) according to the values of their given property.
|
|
206
|
+
* @param theArray
|
|
207
|
+
* @param propertyName = undefined] When not defined, assumes an array of STRINGS is given, instead of array of OBJECTS.
|
|
208
|
+
* @param [reverseOrder = false] Set to true to sort from Z-to-A instead
|
|
209
|
+
*/
|
|
210
|
+
static SortAlphabetically(theArray, propertyName = undefined, reverseOrder = false) {
|
|
211
|
+
if (!theArray || !Array.isArray(theArray)) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
let switcher = reverseOrder ? -1 : 1;
|
|
215
|
+
let stringSort = StringUtils.IsStringWithLength(propertyName);
|
|
216
|
+
theArray.sort((itemOne, itemTwo) => {
|
|
217
|
+
let valOne = stringSort ? itemOne[propertyName] : itemOne;
|
|
218
|
+
let valTwo = stringSort ? itemTwo[propertyName] : itemTwo;
|
|
219
|
+
return (valOne > valTwo ? 1 : (valOne < valTwo ? -1 : 0)) * switcher;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
static PushIfNotExist(item, array) {
|
|
223
|
+
if (!array) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
if (array.indexOf(item) === -1) {
|
|
227
|
+
array.push(item);
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
|
|
234
|
+
* removes the element using splice().
|
|
235
|
+
*
|
|
236
|
+
* @param index
|
|
237
|
+
* @param array
|
|
238
|
+
* @returns True if and only if the element on given index is succesfully removed from given array.
|
|
239
|
+
*/
|
|
240
|
+
static RemoveElementAtIndex(index, array) {
|
|
241
|
+
if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
if (index in array) {
|
|
245
|
+
array.splice(index, 1);
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Returns true if and only if given array includes given item. Checked by ===.
|
|
253
|
+
static Includes(array, item) {
|
|
254
|
+
if (Array.isArray(array)) {
|
|
255
|
+
for (let i = 0, len = array.length; i < len; i++) {
|
|
256
|
+
if (array[i] === item) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
264
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL2NvcmUvdXRpbHMvYXJyYXktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLE9BQU8sVUFBVTtJQUNuQjs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBSSxLQUFhLEVBQUUsT0FBVSxFQUFFLEtBQVU7UUFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxRSx1SEFBdUg7WUFDdkgsK0ZBQStGO1lBQy9GLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxTQUFTLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN2QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBSSxPQUFVLEVBQUUsS0FBVTtRQUNqRCxJQUFJLENBQUMsS0FB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QztZQUNqQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBYSxFQUFFLEtBQVk7UUFDMUQsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RGLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQVksRUFBRSxJQUFTO1FBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxHQUFHLEdBQVcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5RCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ25CLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNOaWxsfSBmcm9tIFwiLi4vZnVuY3Rpb24vaXMtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuLi9mdW5jdGlvbi9ub3QtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tIFwiLi9zdHJpbmctdXRpbHNcIjtcclxuaW1wb3J0IHtOdW1iZXJVdGlsc30gZnJvbSBcIi4vbnVtYmVyLXV0aWxzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuL29iamVjdC11dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFycmF5VXRpbHMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnRzIGdpdmVuIGVsZW1lbnQgaW50byBnaXZlbiBhcnJheSwgb24gZ2l2ZW4gaW5kZXggbnVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggcG9zaXRpb24gZm9yIHRoZSBlbGVtZW50IHRvIGluc2VydCwgdXNlIG5lZ2F0aXZlcyB0byBjb3VudCBmcm9tIHRoZSBhcnJheXMgZW5kXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGludG9cclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgYW5kIG9ubHkgaWYgZ2l2ZW4gZWxlbWVudCBpcyBzdWNjZXNmdWxseSBpbnNlcnRlZCBpbnRvIGdpdmVuIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEluc2VydEVsZW1lbnQ8VD4oaW5kZXg6IG51bWJlciwgZWxlbWVudDogVCwgYXJyYXk6IFRbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgTWF0aC5hYnMoaW5kZXgpID4gYXJyYXkubGVuZ3RoIHx8IGlzTmlsbChpbmRleCkpIHtcclxuICAgICAgICAgICAgLy8gY2Fubm90IGluc2VydCBzb21ldGhpbmcgaW50byBub3RoaW5nLCBhbmQgY2Fubm90IGluc2VydCBhbiBlbGVtZW50IGludG8gYSBub24tYXJyYXkgKHZpYSB0aGlzIGNvbnRyYWN0IHRoYXQgaXMpLCBhbmRcclxuICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgaW5zZXJ0IGFueXRoaW5nIGJleW9uZCB0aGUgYXJyYXlzIGxpbWl0cyAoYnV0IHdlIGNhbiBhcHBlbmQgdG8gdGhlIHN0YXJ0IG9yIGVuZClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbGVuQmVmb3JlOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gKGFycmF5Lmxlbmd0aCA9PT0gbGVuQmVmb3JlICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGVsZW1lbnQgZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScga2V5d29yZCwgYnV0IHRydWx5IHJlbW92ZXMgdGhlXHJcbiAgICAgKiBlbGVtZW50IHVzaW5nIHNwbGljZSgpLiBBbHNvIHdvcmtzIG9uIGFzc29jaWF0aXZlIGFycmF5cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byByZW1vdmUuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tLlxyXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZmYgZ2l2ZW4gZWxlbWVudCB3YXMgdHJ1bHkgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50PFQ+KGVsZW1lbnQ6IFQsIGFycmF5OiBUW10pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50QXRJbmRleChpbmRleCwgYXJyYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHRydWUgc2hhbGxvdyBjbG9uZSBvZiBnaXZlbiBhcnJheSBwbHVzIGFsbCBpdHMgaXRlbXMuIEl0cyBmaXJzdC1sZXZlbCBtZW1iZXJzIGFyZSBvYmplY3Qtc2hhbGxvdy1jbG9uZWQgKG9wdGlvbmFsbHkgd2l0aCBhXHJcbiAgICAgKiBzdHJvbmdseSB0eXBlZCBjb25zdHJ1Y3RvciksXHJcbiAgICAgKiBvciBqdXN0IGFzIHBsYWluIG9iamVjdCAoc2VlIHBhcmFtIGFycmF5SXRlbXNDbGFzcykuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlHaXZlblxyXG4gICAgICogQHBhcmFtIGFycmF5SXRlbXNDbGFzcyBJZiBwcm92aWRlZCwgdGhlIGNsb25lZCBhcnJheSdzIGZpcnN0LWxldmVsIGl0ZW1zIHdpbGwgYmUgc3Ryb25nbHkgdHlwZWQgdG8gLyBjb25zdHJ1Y3RlZCBhcyB0aGlzIGNsYXNzLiBPdGhlcndpc2VcclxuICAgICAqIGl0J2xsIGJlIGEgcGxhaW4gb2JqZWN0LlxyXG4gICAgICogQHJldHVybnMgYSB0cnVlIHNoYWxsb3cgY2xvbmUgb2YgZ2l2ZW4gYXJyYXkgcGx1cyBhbGwgaXRzIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hhbGxvd0Nsb25lQXJyYXlBbmRJdHNJdGVtPFQ+KGFycmF5R2l2ZW46IFRbXSwgYXJyYXlJdGVtc0NsYXNzPzogYW55KTogVFtdIHtcclxuICAgICAgICBsZXQgYXJyYXlDbG9uZTogVFtdID0gW107XHJcblxyXG4gICAgICAgIGlmIChhcnJheUdpdmVuKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXlHaXZlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlDbG9uZS5wdXNoKE9iamVjdFV0aWxzLkdldFNoYWxsb3dDbG9uZShhcnJheUdpdmVuW2ldLCBhcnJheUl0ZW1zQ2xhc3MpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJheUNsb25lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgZ2l2ZW4gZWxlbWVudCB0byBnaXZlbiB0b0luZGV4IGluIGdpdmVuIGFycmF5LiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQgd2FzIHJlYWxseSBtb3ZlZCwgdGh1cyBjaGFuZ2luZyB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTW92ZUVsZW1lbnQ8VD4oZWxlbWVudDogVCwgdG9JbmRleDogbnVtYmVyLCBhcnJheTogVFtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBpc05pbGwodG9JbmRleCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICBsZXQgdG9JbmRleENvcnJlY3RlZDogbnVtYmVyID0gTnVtYmVyVXRpbHMuR2V0TmVhcmVzdE51bWJlcldpdGhpbkJvdW5kcyh0b0luZGV4LCAwLCBhcnJheS5sZW5ndGggLSAxKTtcclxuICAgICAgICBpZiAoZnJvbUluZGV4ID09PSAtMSB8fCBhcnJheVt0b0luZGV4Q29ycmVjdGVkXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBlbGVtZW50IGRpZCBub3QgZXhpc3QgaW4gZ2l2ZW4gYXJyYXksIG9yIGFscmVhZHkgZXhpc3RlZCBvbiBnaXZlbiB0b0luZGV4XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXkuc3BsaWNlKHRvSW5kZXhDb3JyZWN0ZWQsIDAsIGFycmF5LnNwbGljZShmcm9tSW5kZXgsIDEpWzBdKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbWF4IHZhbHVlIGZyb20gYWxsIHJlc3VsdGluZyB2YWx1ZXMgZnJvbSBhcHBseWluZyBnaXZlbiBpdGVtVmFsdWVGdW5jdGlvbiB0byBhbGwgaXRlbXMgb2YgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlcclxuICAgICAqIEBwYXJhbSBpdGVtVmFsdWVGdW5jdGlvbiBUaGUgZnVuY3Rpb24gYXBsaWVkIHRvIGVhY2ggYXJyYXkgaXRlbSB0aGF0IGdpdmVzIGl0IGEgbnVtZXJpY2FsIHZhbHVlLiBUaGUgbWF4IG51bSB2YWwgZm91bmQgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0TWF4Q2FsY3VsYXRlZFZhbHVlPFQ+KGFycmF5OiBUW10sIGl0ZW1WYWx1ZUZ1bmN0aW9uOiAoaXRlbTogVCkgPT4gbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoIWFycmF5IHx8ICFpdGVtVmFsdWVGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gTmFOO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZUN1cjogbnVtYmVyID0gaXRlbVZhbHVlRnVuY3Rpb24uY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlQ3VyID4gbWF4KSB7XHJcbiAgICAgICAgICAgICAgICBtYXggPSB2YWx1ZUN1cjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1heDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVja3MgaWYgZ2l2ZW4gYXJyYXkgaXMgZGVmaW5lZCwgYW5kIGlzIGFuIGFycmF5LCBhbmQgaGFzIGxlbmd0aCA+IDAsIGFuZCwgb3B0aW9uYWxseSBjaGVja3MgdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBpcyBvZiB0eXBlIGdpdmVuIGNsYXp6LlxyXG4gICAgcHVibGljIHN0YXRpYyBJc0FycmF5V2l0aEVsZW1lbnRzPFQ+KGFycmF5VG9DaGVjazogVFtdLCBjbGF6ej86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChpc05pbGwoYXJyYXlUb0NoZWNrKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheVRvQ2hlY2spICYmIGFycmF5VG9DaGVjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGF6eikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9DaGVja1swXSBpbnN0YW5jZW9mIGNsYXp6O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBnaXZlbiBhcnJheSBmb3Igd2hpY2ggZ2l2ZW4gZmlsdGVyIGZ1bmN0aW9uIGhvbGRzIHRydWUuIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgcmVtb3ZlZCwgZWxzZSBmYWxzZS5cclxuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlRWxlbWVudHNCeUZpbHRlcihhcnJheTogYW55W10sIGZpbHRlckZ1bmN0aW9uOiAoaXRlbTogYW55KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheVV0aWxzLklzQXJyYXlXaXRoRWxlbWVudHMoYXJyYXkpIHx8ICFmaWx0ZXJGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXRMZWFzdE9uZVJlbW92ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtOiBhbnkgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckZ1bmN0aW9uLmNhbGwodGhpcywgaXRlbSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF0TGVhc3RPbmVSZW1vdmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlcGxhY2VzIHRoZSBlbGVtZW50T3V0IHdpdGggZ2l2ZW4gZWxlbWVudEluLlxyXG4gICAgcHVibGljIHN0YXRpYyBSZXBsYWNlRWxlbWVudDxUPihlbGVtZW50SW46IFQsIGVsZW1lbnRPdXQ6IFQsIGFycmF5OiBUW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWFycmF5IHx8ICFBcnJheS5pc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpbmRleE91dDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50T3V0KTtcclxuICAgICAgICBpZiAoaW5kZXhPdXQgPiAtMSkge1xyXG4gICAgICAgICAgICBBcnJheVV0aWxzLkluc2VydEVsZW1lbnQoaW5kZXhPdXQsIGVsZW1lbnRJbiwgYXJyYXkpO1xyXG4gICAgICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoZWxlbWVudE91dCwgYXJyYXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTd2FwcyB0aGUgZWxlbWVudHMgaW4gZ2l2ZW4gYXJyYXkgd2l0aCBlYWNoIG90aGVyLiBSZXR1cm5zIHdoZXRoZXIgYSByZWFsIHN3YXAgd2FzIG1hZGUuIEZyb20gYW5kIFRvIGVsZW1lbnRzIGhhdmUgdG8gZXhpc3QgaW4gYXJyYXkuXHJcbiAgICBwdWJsaWMgc3RhdGljIFN3YXBFbGVtZW50czxUPihlbGVtZW50T25lOiBULCBlbGVtZW50VHdvOiBULCBhcnJheTogVFtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbE9uZUlkeDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50VHdvKTtcclxuICAgICAgICBjb25zdCBlbFR3b0lkeDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50T25lKTtcclxuICAgICAgICBpZiAoZWxPbmVJZHggPT09IC0xIHx8IGVsVHdvSWR4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcnJheVtlbE9uZUlkeF0gPSBhcnJheS5zcGxpY2UoZWxUd29JZHgsIDEsIGFycmF5W2VsT25lSWR4XSlbMF07XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5zZXJ0cyBvciByZW1vdmVzIGdpdmVuIHRvZ2dsZSBlbGVtZW50IGludG8gZ2l2ZW4gZWxlbWVudHMgYXJyYXk7IGluc2VydHMgaWYgbm90IHlldCBleGlzdHMsIGFuZCByZW1vdmVzIGlmIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgcHVibGljIHN0YXRpYyBUb2dnbGVFbGVtZW50PFQ+KHRvZ2dsZTogVCwgZWxlbWVudHM6IFRbXSk6IHZvaWQge1xyXG4gICAgICAgIGVsZW1lbnRzLmluZGV4T2YodG9nZ2xlKSA+IC0xID8gQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50KHRvZ2dsZSwgZWxlbWVudHMpIDogZWxlbWVudHMucHVzaCh0b2dnbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmcm9tIGdpdmVuIGFycmF5IGZvciB3aGljaCBnaXZlbiB3aGVyZUZ1bmN0aW9uIGhvbGRzIHRydWUuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvdW50V2hlcmU8VD4oYXJyYXk6IFRbXSwgd2hlcmVGdW5jdGlvbjogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgICAgIGlmICghQXJyYXlVdGlscy5Jc0FycmF5V2l0aEVsZW1lbnRzKGFycmF5KSB8fCAhd2hlcmVGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh3aGVyZUZ1bmN0aW9uLmNhbGwodGhpcywgYXJyYXlbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gZ2l2ZW4gYXJyYXkgY291bGQgYmUgZm91bmQgYnkgZ2l2ZW4gZmluZGVyIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJheVxyXG4gICAgICogQHBhcmFtIGZpbmRlciBBIGZpbmRlciBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5IGFuZCByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IHJlcHJlc2VudHNcclxuICAgICAqIHRoZSAnZm91bmQgc3RhdHVzJyBmb3IgdGhhdCBlbGVtZW50OyB3aGV0aGVyIGl0IHNob3VsZCBoYXZlIGJlZW4gZm91bmQgb3Igbm90LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnRhaW5zQW5FbGVtZW50Rm91bmRCeTxUPihhcnJheTogVFtdLCBmaW5kZXI6IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFhcnJheSB8fCAhZmluZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBub3ROaWxsKEFycmF5VXRpbHMuRmluZDxUPihhcnJheSwgZmluZGVyKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcm9zcy1icm93c2VyIEFycmF5LmZpbmQoKSBmdW5jdGlvbi4gUmV0dXJucyB0aGUgZmlyc3QgaXRlbSBpbiBnaXZlbiBhcnJheSBmb3Igd2hpY2ggdGhlIGZvdW5kQnkgZnVuY3Rpb24gcmV0dXJucyB0cnVlLiBSZXR1cm5zXHJcbiAgICAgKiB1bmRlZmluZWQgd2hlbiBub25lIHdhcyBmb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxyXG4gICAgICogbGV0IGZvdW5kSXRlbTogQnVzaW5lc3NPYmplY3QgPSBBcnJheVV0aWxzLkZpbmQ8QnVzaW5lc3NPYmplY3Q+KG1vZGVsQXJyYXksIChtb2RlbEl0ZW06IEJ1c2luZXNzT2JqZWN0KSA9PiA8YnI+XHJcbiAgICAgKiAgICAgKHJldHVybiBtb2RlbEl0ZW0uZ2V0SWQoKSA9PT0gJzEnKVxyXG4gICAgICogICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2l0aCBpdGVtcyB0byBzZWFyY2ggaW4uXHJcbiAgICAgKiBAcGFyYW0gZm91bmRCeSBUaGUgZmluZGVyIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBpdGVtcyBvZiB0aGUgYXJyYXksIHdoZW4gdGhhdCByZXR1cm5zIHRydWUsIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRmluZDxUPihhcnJheTogVFtdLCBmb3VuZEJ5OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZvdW5kQnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW1DdXI6IFQgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kQnkoaXRlbUN1cikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQ3VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb3J0cyBhbGwgaXRlbXMgaW4gdGhlIGdpdmVuIGFycmF5IGFscGhhYmV0aWNhbGx5IChBLXRvLVopIGFjY29yZGluZyB0byB0aGUgdmFsdWVzIG9mIHRoZWlyIGdpdmVuIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHRoZUFycmF5XHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lID0gdW5kZWZpbmVkXSBXaGVuIG5vdCBkZWZpbmVkLCBhc3N1bWVzIGFuIGFycmF5IG9mIFNUUklOR1MgaXMgZ2l2ZW4sIGluc3RlYWQgb2YgYXJyYXkgb2YgT0JKRUNUUy5cclxuICAgICAqIEBwYXJhbSBbcmV2ZXJzZU9yZGVyID0gZmFsc2VdIFNldCB0byB0cnVlIHRvIHNvcnQgZnJvbSBaLXRvLUEgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNvcnRBbHBoYWJldGljYWxseTxUPih0aGVBcnJheTogVFtdLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyA9IHVuZGVmaW5lZCwgcmV2ZXJzZU9yZGVyOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoZUFycmF5IHx8ICFBcnJheS5pc0FycmF5KHRoZUFycmF5KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3dpdGNoZXI6IG51bWJlciA9IHJldmVyc2VPcmRlciA/IC0xIDogMTtcclxuICAgICAgICBsZXQgc3RyaW5nU29ydDogYm9vbGVhbiA9IFN0cmluZ1V0aWxzLklzU3RyaW5nV2l0aExlbmd0aChwcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIHRoZUFycmF5LnNvcnQoKGl0ZW1PbmU6IFQsIGl0ZW1Ud286IFQpID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbE9uZTogYW55ID0gc3RyaW5nU29ydCA/IGl0ZW1PbmVbcHJvcGVydHlOYW1lXSA6IGl0ZW1PbmU7XHJcbiAgICAgICAgICAgIGxldCB2YWxUd286IGFueSA9IHN0cmluZ1NvcnQgPyBpdGVtVHdvW3Byb3BlcnR5TmFtZV0gOiBpdGVtVHdvO1xyXG4gICAgICAgICAgICByZXR1cm4gKHZhbE9uZSA+IHZhbFR3byA/IDEgOiAodmFsT25lIDwgdmFsVHdvID8gLTEgOiAwKSkgKiBzd2l0Y2hlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hJZk5vdEV4aXN0KGl0ZW06IGFueSwgYXJyYXk6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFhcnJheSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXJyYXkuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgZWxlbWVudCBhdCBnaXZlbiBpbmRleCBmcm9tIGdpdmVuIGFycmF5LiBEb2Vzbid0IGp1c3Qgc2V0IGl0IHRvIG51bGwgbGlrZSBKYXZhU2NyaXB0cyBzdGFuZGFyZCAnZGVsZXRlJyBkb2VzLCBidXQgcmVhbGx5XHJcbiAgICAgKiByZW1vdmVzIHRoZSBlbGVtZW50IHVzaW5nIHNwbGljZSgpLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbmRleFxyXG4gICAgICogQHBhcmFtIGFycmF5XHJcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBlbGVtZW50IG9uIGdpdmVuIGluZGV4IGlzIHN1Y2Nlc2Z1bGx5IHJlbW92ZWQgZnJvbSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50QXRJbmRleChpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoTnVtYmVyVXRpbHMuSXNOYU4oaW5kZXgpIHx8IGluZGV4IDwgMCB8fCAhQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCBpbiBhcnJheSkge1xyXG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBnaXZlbiBhcnJheSBpbmNsdWRlcyBnaXZlbiBpdGVtLiBDaGVja2VkIGJ5ID09PS5cclxuICAgIHB1YmxpYyBzdGF0aWMgSW5jbHVkZXMoYXJyYXk6IGFueVtdLCBpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|