@carto/kepler.gl 0.1.0-alpha.0 → 0.1.0-next.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/dist/actions/action-wrapper.d.ts +115 -115
- package/dist/actions/action-wrapper.js +190 -0
- package/dist/actions/actions.d.ts +195 -195
- package/dist/actions/actions.js +194 -0
- package/dist/actions/identity-actions.d.ts +61 -61
- package/dist/actions/identity-actions.js +101 -0
- package/dist/actions/index.d.ts +9 -9
- package/dist/actions/index.js +144 -0
- package/dist/actions/map-state-actions.d.ts +69 -69
- package/dist/actions/map-state-actions.js +106 -0
- package/dist/actions/map-style-actions.d.ts +146 -146
- package/dist/actions/map-style-actions.js +176 -0
- package/dist/actions/provider-actions.d.ts +153 -153
- package/dist/actions/provider-actions.js +144 -0
- package/dist/actions/ui-state-actions.d.ts +300 -300
- package/dist/actions/ui-state-actions.js +356 -0
- package/dist/actions/vis-state-actions.d.ts +821 -821
- package/dist/actions/vis-state-actions.js +900 -0
- package/dist/cloud-providers/index.d.ts +2 -2
- package/dist/cloud-providers/index.js +22 -0
- package/dist/cloud-providers/provider.d.ts +176 -176
- package/dist/cloud-providers/provider.js +346 -0
- package/dist/components/bottom-widget.d.ts +47 -47
- package/dist/components/bottom-widget.js +217 -0
- package/dist/components/common/action-panel.d.ts +27 -27
- package/dist/components/common/action-panel.js +133 -0
- package/dist/components/common/animation-control/animation-control.d.ts +24 -24
- package/dist/components/common/animation-control/animation-control.js +129 -0
- package/dist/components/common/animation-control/animation-controller.d.ts +16 -16
- package/dist/components/common/animation-control/animation-controller.js +270 -0
- package/dist/components/common/animation-control/animation-speed-slider.d.ts +12 -12
- package/dist/components/common/animation-control/animation-speed-slider.js +88 -0
- package/dist/components/common/animation-control/floating-time-display.d.ts +9 -9
- package/dist/components/common/animation-control/floating-time-display.js +149 -0
- package/dist/components/common/animation-control/playback-controls.d.ts +72 -72
- package/dist/components/common/animation-control/playback-controls.js +261 -0
- package/dist/components/common/animation-control/speed-control.d.ts +13 -13
- package/dist/components/common/animation-control/speed-control.js +70 -0
- package/dist/components/common/checkbox.d.ts +35 -35
- package/dist/components/common/checkbox.js +117 -0
- package/dist/components/common/color-legend.d.ts +43 -43
- package/dist/components/common/color-legend.js +205 -0
- package/dist/components/common/data-table/button.d.ts +8 -8
- package/dist/components/common/data-table/button.js +53 -0
- package/dist/components/common/data-table/canvas.d.ts +2 -2
- package/dist/components/common/data-table/canvas.js +43 -0
- package/dist/components/common/data-table/cell-size.d.ts +36 -36
- package/dist/components/common/data-table/cell-size.js +170 -0
- package/dist/components/common/data-table/grid.d.ts +7 -7
- package/dist/components/common/data-table/grid.js +90 -0
- package/dist/components/common/data-table/index.d.ts +143 -143
- package/dist/components/common/data-table/index.js +469 -0
- package/dist/components/common/data-table/option-dropdown.d.ts +14 -14
- package/dist/components/common/data-table/option-dropdown.js +99 -0
- package/dist/components/common/dataset-label.d.ts +10 -10
- package/dist/components/common/dataset-label.js +44 -0
- package/dist/components/common/error-boundary.d.ts +16 -16
- package/dist/components/common/error-boundary.js +76 -0
- package/dist/components/common/field-selector.d.ts +47 -47
- package/dist/components/common/field-selector.js +214 -0
- package/dist/components/common/field-token.d.ts +45 -45
- package/dist/components/common/field-token.js +47 -0
- package/dist/components/common/file-uploader/file-drop.d.ts +54 -54
- package/dist/components/common/file-uploader/file-drop.js +213 -0
- package/dist/components/common/file-uploader/file-upload-progress.d.ts +8 -8
- package/dist/components/common/file-uploader/file-upload-progress.js +103 -0
- package/dist/components/common/file-uploader/file-upload.d.ts +27 -27
- package/dist/components/common/file-uploader/file-upload.js +263 -0
- package/dist/components/common/file-uploader/upload-button.d.ts +8 -8
- package/dist/components/common/file-uploader/upload-button.js +76 -0
- package/dist/components/common/histogram-plot.d.ts +3 -3
- package/dist/components/common/histogram-plot.js +112 -0
- package/dist/components/common/icons/add.d.ts +9 -9
- package/dist/components/common/icons/add.js +58 -0
- package/dist/components/common/icons/anchor_window.d.ts +11 -11
- package/dist/components/common/icons/anchor_window.js +51 -0
- package/dist/components/common/icons/arrow-down-alt.d.ts +9 -9
- package/dist/components/common/icons/arrow-down-alt.js +58 -0
- package/dist/components/common/icons/arrow-down-solid.d.ts +9 -9
- package/dist/components/common/icons/arrow-down-solid.js +58 -0
- package/dist/components/common/icons/arrow-down.d.ts +9 -9
- package/dist/components/common/icons/arrow-down.js +58 -0
- package/dist/components/common/icons/arrow-left.d.ts +9 -9
- package/dist/components/common/icons/arrow-left.js +61 -0
- package/dist/components/common/icons/arrow-right.d.ts +9 -9
- package/dist/components/common/icons/arrow-right.js +58 -0
- package/dist/components/common/icons/arrow-up-alt.d.ts +9 -9
- package/dist/components/common/icons/arrow-up-alt.js +59 -0
- package/dist/components/common/icons/arrow-up-solid.d.ts +9 -9
- package/dist/components/common/icons/arrow-up-solid.js +58 -0
- package/dist/components/common/icons/arrow-up.d.ts +9 -9
- package/dist/components/common/icons/arrow-up.js +58 -0
- package/dist/components/common/icons/base.d.ts +29 -29
- package/dist/components/common/icons/base.js +94 -0
- package/dist/components/common/icons/bug.d.ts +9 -9
- package/dist/components/common/icons/bug.js +60 -0
- package/dist/components/common/icons/cancel.d.ts +9 -9
- package/dist/components/common/icons/cancel.js +58 -0
- package/dist/components/common/icons/checkmark.d.ts +10 -10
- package/dist/components/common/icons/checkmark.js +64 -0
- package/dist/components/common/icons/chevron-right.js +68 -0
- package/dist/components/common/icons/clipboard.d.ts +9 -9
- package/dist/components/common/icons/clipboard.js +59 -0
- package/dist/components/common/icons/clock.d.ts +9 -9
- package/dist/components/common/icons/clock.js +60 -0
- package/dist/components/common/icons/close.d.ts +9 -9
- package/dist/components/common/icons/close.js +63 -0
- package/dist/components/common/icons/code-alt.d.ts +9 -9
- package/dist/components/common/icons/code-alt.js +61 -0
- package/dist/components/common/icons/copy.d.ts +9 -9
- package/dist/components/common/icons/copy.js +63 -0
- package/dist/components/common/icons/crosshairs.d.ts +9 -9
- package/dist/components/common/icons/crosshairs.js +61 -0
- package/dist/components/common/icons/cube-3d.d.ts +9 -9
- package/dist/components/common/icons/cube-3d.js +62 -0
- package/dist/components/common/icons/cursor-click.d.ts +9 -9
- package/dist/components/common/icons/cursor-click.js +62 -0
- package/dist/components/common/icons/data-table.d.ts +10 -10
- package/dist/components/common/icons/data-table.js +59 -0
- package/dist/components/common/icons/db.d.ts +10 -10
- package/dist/components/common/icons/db.js +59 -0
- package/dist/components/common/icons/delete.d.ts +9 -9
- package/dist/components/common/icons/delete.js +60 -0
- package/dist/components/common/icons/docs.d.ts +9 -9
- package/dist/components/common/icons/docs.js +74 -0
- package/dist/components/common/icons/drag-n-drop.d.ts +9 -9
- package/dist/components/common/icons/drag-n-drop.js +60 -0
- package/dist/components/common/icons/draw-polygon.d.ts +10 -10
- package/dist/components/common/icons/draw-polygon.js +78 -0
- package/dist/components/common/icons/email.d.ts +9 -9
- package/dist/components/common/icons/email.js +62 -0
- package/dist/components/common/icons/expand.d.ts +9 -9
- package/dist/components/common/icons/expand.js +60 -0
- package/dist/components/common/icons/eye-seen.d.ts +9 -9
- package/dist/components/common/icons/eye-seen.js +60 -0
- package/dist/components/common/icons/eye-unseen.d.ts +9 -9
- package/dist/components/common/icons/eye-unseen.js +60 -0
- package/dist/components/common/icons/file-type.d.ts +8 -8
- package/dist/components/common/icons/file-type.js +52 -0
- package/dist/components/common/icons/file.d.ts +9 -9
- package/dist/components/common/icons/file.js +58 -0
- package/dist/components/common/icons/files.d.ts +9 -9
- package/dist/components/common/icons/files.js +58 -0
- package/dist/components/common/icons/filter-funnel.d.ts +9 -9
- package/dist/components/common/icons/filter-funnel.js +58 -0
- package/dist/components/common/icons/free-window.d.ts +11 -11
- package/dist/components/common/icons/free-window.js +51 -0
- package/dist/components/common/icons/gear.d.ts +9 -9
- package/dist/components/common/icons/gear.js +60 -0
- package/dist/components/common/icons/hash.d.ts +9 -9
- package/dist/components/common/icons/hash.js +58 -0
- package/dist/components/common/icons/histogram.d.ts +9 -9
- package/dist/components/common/icons/histogram.js +58 -0
- package/dist/components/common/icons/index.d.ts +78 -78
- package/dist/components/common/icons/index.js +551 -0
- package/dist/components/common/icons/info.d.ts +12 -12
- package/dist/components/common/icons/info.js +71 -0
- package/dist/components/common/icons/layers.d.ts +9 -9
- package/dist/components/common/icons/layers.js +58 -0
- package/dist/components/common/icons/left-arrow.d.ts +9 -9
- package/dist/components/common/icons/left-arrow.js +61 -0
- package/dist/components/common/icons/legend.d.ts +9 -9
- package/dist/components/common/icons/legend.js +58 -0
- package/dist/components/common/icons/line-chart.d.ts +9 -9
- package/dist/components/common/icons/line-chart.js +58 -0
- package/dist/components/common/icons/login.d.ts +9 -9
- package/dist/components/common/icons/login.js +61 -0
- package/dist/components/common/icons/logout.d.ts +9 -9
- package/dist/components/common/icons/logout.js +60 -0
- package/dist/components/common/icons/map-icon.d.ts +11 -11
- package/dist/components/common/icons/map-icon.js +65 -0
- package/dist/components/common/icons/map.d.ts +11 -11
- package/dist/components/common/icons/map.js +65 -0
- package/dist/components/common/icons/messages.d.ts +9 -9
- package/dist/components/common/icons/messages.js +58 -0
- package/dist/components/common/icons/minus.d.ts +9 -9
- package/dist/components/common/icons/minus.js +58 -0
- package/dist/components/common/icons/order-by-dataset.d.ts +12 -12
- package/dist/components/common/icons/order-by-dataset.js +51 -0
- package/dist/components/common/icons/order-by-list.d.ts +12 -12
- package/dist/components/common/icons/order-by-list.js +43 -0
- package/dist/components/common/icons/pause.d.ts +9 -9
- package/dist/components/common/icons/pause.js +58 -0
- package/dist/components/common/icons/picture.d.ts +9 -9
- package/dist/components/common/icons/picture.js +58 -0
- package/dist/components/common/icons/pin.d.ts +9 -9
- package/dist/components/common/icons/pin.js +62 -0
- package/dist/components/common/icons/play.d.ts +9 -9
- package/dist/components/common/icons/play.js +58 -0
- package/dist/components/common/icons/polygon.d.ts +10 -10
- package/dist/components/common/icons/polygon.js +80 -0
- package/dist/components/common/icons/rectangle.d.ts +10 -10
- package/dist/components/common/icons/rectangle.js +81 -0
- package/dist/components/common/icons/reduce.d.ts +9 -9
- package/dist/components/common/icons/reduce.js +61 -0
- package/dist/components/common/icons/reset.d.ts +9 -9
- package/dist/components/common/icons/reset.js +58 -0
- package/dist/components/common/icons/rocket.d.ts +9 -9
- package/dist/components/common/icons/rocket.js +58 -0
- package/dist/components/common/icons/save.d.ts +9 -9
- package/dist/components/common/icons/save.js +60 -0
- package/dist/components/common/icons/save2.d.ts +9 -9
- package/dist/components/common/icons/save2.js +64 -0
- package/dist/components/common/icons/search.d.ts +9 -9
- package/dist/components/common/icons/search.js +60 -0
- package/dist/components/common/icons/settings.d.ts +9 -9
- package/dist/components/common/icons/settings.js +60 -0
- package/dist/components/common/icons/share.d.ts +9 -9
- package/dist/components/common/icons/share.js +58 -0
- package/dist/components/common/icons/split.d.ts +9 -9
- package/dist/components/common/icons/split.js +86 -0
- package/dist/components/common/icons/square-select.d.ts +9 -9
- package/dist/components/common/icons/square-select.js +60 -0
- package/dist/components/common/icons/swap-horizontal.js +66 -0
- package/dist/components/common/icons/table.d.ts +9 -9
- package/dist/components/common/icons/table.js +58 -0
- package/dist/components/common/icons/trash.d.ts +9 -9
- package/dist/components/common/icons/trash.js +60 -0
- package/dist/components/common/icons/upload.d.ts +9 -9
- package/dist/components/common/icons/upload.js +58 -0
- package/dist/components/common/icons/vert-dots.d.ts +9 -9
- package/dist/components/common/icons/vert-dots.js +96 -0
- package/dist/components/common/icons/vert-three-dots.d.ts +9 -9
- package/dist/components/common/icons/vert-three-dots.js +71 -0
- package/dist/components/common/icons/warning.d.ts +10 -10
- package/dist/components/common/icons/warning.js +72 -0
- package/dist/components/common/image-preview.d.ts +15 -15
- package/dist/components/common/image-preview.js +79 -0
- package/dist/components/common/info-helper.d.ts +11 -11
- package/dist/components/common/info-helper.js +79 -0
- package/dist/components/common/item-selector/accessor.d.ts +7 -7
- package/dist/components/common/item-selector/accessor.js +54 -0
- package/dist/components/common/item-selector/chickleted-input.d.ts +21 -21
- package/dist/components/common/item-selector/chickleted-input.js +96 -0
- package/dist/components/common/item-selector/dropdown-list.d.ts +68 -68
- package/dist/components/common/item-selector/dropdown-list.js +279 -0
- package/dist/components/common/item-selector/item-selector-submenu.js +88 -0
- package/dist/components/common/item-selector/item-selector.d.ts +91 -91
- package/dist/components/common/item-selector/item-selector.js +282 -0
- package/dist/components/common/item-selector/typeahead.d.ts +115 -115
- package/dist/components/common/item-selector/typeahead.js +425 -0
- package/dist/components/common/line-chart.d.ts +34 -34
- package/dist/components/common/line-chart.js +127 -0
- package/dist/components/common/loading-spinner.d.ts +9 -9
- package/dist/components/common/loading-spinner.js +64 -0
- package/dist/components/common/logo.d.ts +8 -8
- package/dist/components/common/logo.js +85 -0
- package/dist/components/common/map-layer-selector.d.ts +13 -13
- package/dist/components/common/map-layer-selector.js +56 -0
- package/dist/components/common/modal.d.ts +49 -49
- package/dist/components/common/modal.js +165 -0
- package/dist/components/common/portaled.d.ts +527 -527
- package/dist/components/common/portaled.js +277 -0
- package/dist/components/common/progress-bar.d.ts +12 -12
- package/dist/components/common/progress-bar.js +64 -0
- package/dist/components/common/range-brush.d.ts +19 -19
- package/dist/components/common/range-brush.js +277 -0
- package/dist/components/common/range-plot.d.ts +35 -35
- package/dist/components/common/range-plot.js +130 -0
- package/dist/components/common/range-slider.d.ts +32 -32
- package/dist/components/common/range-slider.js +305 -0
- package/dist/components/common/slider/mouse-event.d.ts +27 -27
- package/dist/components/common/slider/mouse-event.js +115 -0
- package/dist/components/common/slider/slider-bar-handle.d.ts +29 -29
- package/dist/components/common/slider/slider-bar-handle.js +105 -0
- package/dist/components/common/slider/slider-handle.d.ts +33 -33
- package/dist/components/common/slider/slider-handle.js +151 -0
- package/dist/components/common/slider/slider.d.ts +70 -70
- package/dist/components/common/slider/slider.js +221 -0
- package/dist/components/common/styled-components.d.ts +119 -119
- package/dist/components/common/styled-components.js +300 -0
- package/dist/components/common/switch.d.ts +16 -16
- package/dist/components/common/switch.js +38 -0
- package/dist/components/common/time-range-slider-time-title.d.ts +9 -9
- package/dist/components/common/time-range-slider-time-title.js +79 -0
- package/dist/components/common/time-range-slider.d.ts +32 -32
- package/dist/components/common/time-range-slider.js +116 -0
- package/dist/components/common/time-slider-marker.d.ts +21 -21
- package/dist/components/common/time-slider-marker.js +136 -0
- package/dist/components/common/tippy-tooltip.d.ts +4 -4
- package/dist/components/common/tippy-tooltip.js +115 -0
- package/dist/components/common/toolbar-item.d.ts +14 -14
- package/dist/components/common/toolbar-item.js +75 -0
- package/dist/components/common/toolbar.d.ts +5 -5
- package/dist/components/common/toolbar.js +44 -0
- package/dist/components/common/vertical-toolbar.d.ts +3 -3
- package/dist/components/common/vertical-toolbar.js +33 -0
- package/dist/components/container.d.ts +39 -39
- package/dist/components/container.js +203 -0
- package/dist/components/context.d.ts +7 -7
- package/dist/components/context.js +38 -0
- package/dist/components/editor/constants.d.ts +17 -17
- package/dist/components/editor/constants.js +45 -0
- package/dist/components/editor/editor.d.ts +29 -29
- package/dist/components/editor/editor.js +226 -0
- package/dist/components/editor/feature-action-panel.d.ts +27 -27
- package/dist/components/editor/feature-action-panel.js +141 -0
- package/dist/components/editor/feature-styles.d.ts +24 -24
- package/dist/components/editor/feature-styles.js +67 -0
- package/dist/components/editor/handle-style.d.ts +38 -38
- package/dist/components/editor/handle-style.js +78 -0
- package/dist/components/filters/components.d.ts +1 -3
- package/dist/components/filters/components.js +31 -0
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.d.ts +10 -10
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +96 -0
- package/dist/components/filters/filter-panels/multi-select-filter-panel.d.ts +9 -9
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +66 -0
- package/dist/components/filters/filter-panels/new-filter-panel.d.ts +12 -12
- package/dist/components/filters/filter-panels/new-filter-panel.js +85 -0
- package/dist/components/filters/filter-panels/polygon-filter-panel.d.ts +9 -9
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +85 -0
- package/dist/components/filters/filter-panels/range-filter-panel.d.ts +9 -9
- package/dist/components/filters/filter-panels/range-filter-panel.js +66 -0
- package/dist/components/filters/filter-panels/single-select-filter-panel.d.ts +9 -9
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +66 -0
- package/dist/components/filters/filter-panels/time-range-filter-panel.d.ts +8 -8
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +80 -0
- package/dist/components/filters/filter-panels/types.d.ts +36 -36
- package/dist/components/filters/filter-panels/types.js +6 -0
- package/dist/components/filters/index.d.ts +5 -5
- package/dist/components/filters/index.js +42 -0
- package/dist/components/filters/multi-select-filter.d.ts +3 -3
- package/dist/components/filters/multi-select-filter.js +48 -0
- package/dist/components/filters/polygon-filter.d.ts +4 -4
- package/dist/components/filters/polygon-filter.js +85 -0
- package/dist/components/filters/range-filter.d.ts +8 -8
- package/dist/components/filters/range-filter.js +48 -0
- package/dist/components/filters/single-select-filter.d.ts +3 -3
- package/dist/components/filters/single-select-filter.js +57 -0
- package/dist/components/filters/time-range-filter.d.ts +28 -28
- package/dist/components/filters/time-range-filter.js +75 -0
- package/dist/components/filters/time-widget.d.ts +14 -14
- package/dist/components/filters/time-widget.js +162 -0
- package/dist/components/filters/types.d.ts +53 -53
- package/dist/components/filters/types.js +6 -0
- package/dist/components/geocoder/geocoder.d.ts +33 -33
- package/dist/components/geocoder/geocoder.js +282 -0
- package/dist/components/geocoder-panel.d.ts +28 -28
- package/dist/components/geocoder-panel.js +192 -0
- package/dist/components/index.d.ts +165 -165
- package/dist/components/index.js +1474 -0
- package/dist/components/injector.d.ts +25 -25
- package/dist/components/injector.js +162 -0
- package/dist/components/kepler-gl.d.ts +302 -302
- package/dist/components/kepler-gl.js +487 -0
- package/dist/components/map/coordinate-info.d.ts +7 -7
- package/dist/components/map/coordinate-info.js +59 -0
- package/dist/components/map/layer-hover-info.d.ts +13 -13
- package/dist/components/map/layer-hover-info.js +167 -0
- package/dist/components/map/layer-selector-panel.d.ts +22 -22
- package/dist/components/map/layer-selector-panel.js +103 -0
- package/dist/components/map/locale-panel.d.ts +16 -16
- package/dist/components/map/locale-panel.js +103 -0
- package/dist/components/map/map-control-panel.d.ts +14 -14
- package/dist/components/map/map-control-panel.js +97 -0
- package/dist/components/map/map-control-toolbar.d.ts +2 -2
- package/dist/components/map/map-control-toolbar.js +35 -0
- package/dist/components/map/map-control-tooltip.d.ts +7 -7
- package/dist/components/map/map-control-tooltip.js +48 -0
- package/dist/components/map/map-control.d.ts +44 -44
- package/dist/components/map/map-control.js +79 -0
- package/dist/components/map/map-draw-panel.d.ts +21 -21
- package/dist/components/map/map-draw-panel.js +131 -0
- package/dist/components/map/map-legend-panel.d.ts +23 -23
- package/dist/components/map/map-legend-panel.js +152 -0
- package/dist/components/map/map-legend.d.ts +55 -55
- package/dist/components/map/map-legend.js +234 -0
- package/dist/components/map/map-popover.d.ts +37 -37
- package/dist/components/map/map-popover.js +191 -0
- package/dist/components/map/split-map-button.d.ts +19 -19
- package/dist/components/map/split-map-button.js +89 -0
- package/dist/components/map/toggle-3d-button.d.ts +16 -16
- package/dist/components/map/toggle-3d-button.js +79 -0
- package/dist/components/map-container.d.ts +58 -58
- package/dist/components/map-container.js +502 -0
- package/dist/components/maps-layout.d.ts +10 -10
- package/dist/components/maps-layout.js +57 -0
- package/dist/components/modal-container.d.ts +65 -65
- package/dist/components/modal-container.js +459 -0
- package/dist/components/modals/add-map-style-modal.d.ts +17 -17
- package/dist/components/modals/add-map-style-modal.js +250 -0
- package/dist/components/modals/cloud-tile.d.ts +15 -15
- package/dist/components/modals/cloud-tile.js +124 -0
- package/dist/components/modals/data-table-modal.d.ts +29 -29
- package/dist/components/modals/data-table-modal.js +223 -0
- package/dist/components/modals/delete-data-modal.d.ts +10 -10
- package/dist/components/modals/delete-data-modal.js +58 -0
- package/dist/components/modals/error-display.d.ts +6 -6
- package/dist/components/modals/error-display.js +44 -0
- package/dist/components/modals/export-data-modal.d.ts +25 -25
- package/dist/components/modals/export-data-modal.js +194 -0
- package/dist/components/modals/export-image-modal.d.ts +18 -18
- package/dist/components/modals/export-image-modal.js +139 -0
- package/dist/components/modals/export-map-modal/components.d.ts +8 -8
- package/dist/components/modals/export-map-modal/components.js +51 -0
- package/dist/components/modals/export-map-modal/export-html-map.d.ts +12 -12
- package/dist/components/modals/export-map-modal/export-html-map.js +140 -0
- package/dist/components/modals/export-map-modal/export-json-map.d.ts +9 -9
- package/dist/components/modals/export-map-modal/export-json-map.js +98 -0
- package/dist/components/modals/export-map-modal/export-map-modal.d.ts +27 -27
- package/dist/components/modals/export-map-modal/export-map-modal.js +101 -0
- package/dist/components/modals/image-modal-container.d.ts +18 -18
- package/dist/components/modals/image-modal-container.js +83 -0
- package/dist/components/modals/load-data-modal.d.ts +33 -33
- package/dist/components/modals/load-data-modal.js +93 -0
- package/dist/components/modals/load-storage-map.d.ts +26 -26
- package/dist/components/modals/load-storage-map.js +251 -0
- package/dist/components/modals/loading-dialog.d.ts +7 -7
- package/dist/components/modals/loading-dialog.js +54 -0
- package/dist/components/modals/modal-dialog.d.ts +2 -2
- package/dist/components/modals/modal-dialog.js +33 -0
- package/dist/components/modals/modal-tabs.d.ts +27 -27
- package/dist/components/modals/modal-tabs.js +99 -0
- package/dist/components/modals/overwrite-map-modal.d.ts +16 -16
- package/dist/components/modals/overwrite-map-modal.js +81 -0
- package/dist/components/modals/provider-modal-container.d.ts +23 -23
- package/dist/components/modals/provider-modal-container.js +79 -0
- package/dist/components/modals/save-map-modal.d.ts +29 -29
- package/dist/components/modals/save-map-modal.js +201 -0
- package/dist/components/modals/share-map-modal.d.ts +30 -30
- package/dist/components/modals/share-map-modal.js +188 -0
- package/dist/components/modals/status-panel.d.ts +13 -13
- package/dist/components/modals/status-panel.js +82 -0
- package/dist/components/modals/storage-map-viewer.d.ts +21 -21
- package/dist/components/modals/storage-map-viewer.js +115 -0
- package/dist/components/notification-panel/notification-item.d.ts +66 -66
- package/dist/components/notification-panel/notification-item.js +139 -0
- package/dist/components/notification-panel.d.ts +61 -61
- package/dist/components/notification-panel.js +74 -0
- package/dist/components/performance.d.ts +4 -4
- package/dist/components/performance.js +110 -0
- package/dist/components/plot-container.d.ts +24 -24
- package/dist/components/plot-container.js +240 -0
- package/dist/components/side-panel/cloud-storage-dropdown.d.ts +6 -6
- package/dist/components/side-panel/cloud-storage-dropdown.js +57 -0
- package/dist/components/side-panel/common/dataset-info.d.ts +3 -3
- package/dist/components/side-panel/common/dataset-info.js +50 -0
- package/dist/components/side-panel/common/dataset-tag.d.ts +3 -3
- package/dist/components/side-panel/common/dataset-tag.js +75 -0
- package/dist/components/side-panel/common/dataset-title.d.ts +8 -8
- package/dist/components/side-panel/common/dataset-title.js +185 -0
- package/dist/components/side-panel/common/source-data-catalog.d.ts +9 -9
- package/dist/components/side-panel/common/source-data-catalog.js +66 -0
- package/dist/components/side-panel/common/source-data-selector.d.ts +8 -8
- package/dist/components/side-panel/common/source-data-selector.js +119 -0
- package/dist/components/side-panel/common/types.d.ts +58 -58
- package/dist/components/side-panel/common/types.js +6 -0
- package/dist/components/side-panel/custom-panel.d.ts +9 -9
- package/dist/components/side-panel/custom-panel.js +56 -0
- package/dist/components/side-panel/filter-manager.d.ts +20 -20
- package/dist/components/side-panel/filter-manager.js +113 -0
- package/dist/components/side-panel/filter-panel/filter-panel-header.d.ts +21 -21
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +67 -0
- package/dist/components/side-panel/filter-panel/filter-panel.d.ts +23 -23
- package/dist/components/side-panel/filter-panel/filter-panel.js +110 -0
- package/dist/components/side-panel/interaction-manager.d.ts +14 -14
- package/dist/components/side-panel/interaction-manager.js +51 -0
- package/dist/components/side-panel/interaction-panel/brush-config.d.ts +15 -15
- package/dist/components/side-panel/interaction-panel/brush-config.js +58 -0
- package/dist/components/side-panel/interaction-panel/interaction-panel.d.ts +19 -19
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +137 -0
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.d.ts +28 -28
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +204 -0
- package/dist/components/side-panel/interaction-panel/tooltip-config.d.ts +38 -38
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +155 -0
- package/dist/components/side-panel/layer-manager.d.ts +46 -46
- package/dist/components/side-panel/layer-manager.js +185 -0
- package/dist/components/side-panel/layer-panel/add-layer-button.d.ts +10 -10
- package/dist/components/side-panel/layer-panel/add-layer-button.js +147 -0
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.d.ts +8 -8
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +38 -0
- package/dist/components/side-panel/layer-panel/color-palette.d.ts +13 -13
- package/dist/components/side-panel/layer-panel/color-palette.js +79 -0
- package/dist/components/side-panel/layer-panel/color-range-selector.d.ts +129 -129
- package/dist/components/side-panel/layer-panel/color-range-selector.js +329 -0
- package/dist/components/side-panel/layer-panel/color-selector.d.ts +101 -101
- package/dist/components/side-panel/layer-panel/color-selector.js +177 -0
- package/dist/components/side-panel/layer-panel/column-selector.d.ts +22 -22
- package/dist/components/side-panel/layer-panel/column-selector.js +66 -0
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.d.ts +6 -6
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +36 -0
- package/dist/components/side-panel/layer-panel/custom-palette.d.ts +38 -38
- package/dist/components/side-panel/layer-panel/custom-palette.js +278 -0
- package/dist/components/side-panel/layer-panel/custom-picker.d.ts +67 -67
- package/dist/components/side-panel/layer-panel/custom-picker.js +106 -0
- package/dist/components/side-panel/layer-panel/dataset-layer-group.d.ts +24 -24
- package/dist/components/side-panel/layer-panel/dataset-layer-group.js +81 -0
- package/dist/components/side-panel/layer-panel/dataset-layer-section.d.ts +25 -25
- package/dist/components/side-panel/layer-panel/dataset-layer-section.js +74 -0
- package/dist/components/side-panel/layer-panel/dataset-section.d.ts +26 -26
- package/dist/components/side-panel/layer-panel/dataset-section.js +91 -0
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.d.ts +10 -10
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +53 -0
- package/dist/components/side-panel/layer-panel/hex-column-config.d.ts +62 -62
- package/dist/components/side-panel/layer-panel/hex-column-config.js +74 -0
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.d.ts +8 -8
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +18 -0
- package/dist/components/side-panel/layer-panel/layer-column-config.d.ts +20 -20
- package/dist/components/side-panel/layer-panel/layer-column-config.js +86 -0
- package/dist/components/side-panel/layer-panel/layer-config-group.d.ts +37 -37
- package/dist/components/side-panel/layer-panel/layer-config-group.js +209 -0
- package/dist/components/side-panel/layer-panel/layer-configurator.d.ts +415 -415
- package/dist/components/side-panel/layer-panel/layer-configurator.js +977 -0
- package/dist/components/side-panel/layer-panel/layer-list.d.ts +20 -20
- package/dist/components/side-panel/layer-panel/layer-list.js +168 -0
- package/dist/components/side-panel/layer-panel/layer-panel-header.d.ts +43 -43
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +194 -0
- package/dist/components/side-panel/layer-panel/layer-panel.d.ts +40 -40
- package/dist/components/side-panel/layer-panel/layer-panel.js +161 -0
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.d.ts +17 -17
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +95 -0
- package/dist/components/side-panel/layer-panel/layer-type-list-item.d.ts +11 -11
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +75 -0
- package/dist/components/side-panel/layer-panel/layer-type-selector.d.ts +23 -23
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +87 -0
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.d.ts +23 -23
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +106 -0
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.d.ts +36 -36
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +116 -0
- package/dist/components/side-panel/layer-panel/single-color-palette.d.ts +12 -12
- package/dist/components/side-panel/layer-panel/single-color-palette.js +68 -0
- package/dist/components/side-panel/layer-panel/text-label-panel.d.ts +18 -18
- package/dist/components/side-panel/layer-panel/text-label-panel.js +157 -0
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.d.ts +35 -35
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +148 -0
- package/dist/components/side-panel/layer-panel/vis-config-slider.d.ts +20 -20
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +177 -0
- package/dist/components/side-panel/layer-panel/vis-config-switch.d.ts +16 -16
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +73 -0
- package/dist/components/side-panel/map-manager.d.ts +21 -21
- package/dist/components/side-panel/map-manager.js +133 -0
- package/dist/components/side-panel/map-style-panel/map-layer-selector.d.ts +19 -19
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +103 -0
- package/dist/components/side-panel/map-style-panel/map-style-selector.d.ts +16 -16
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +80 -0
- package/dist/components/side-panel/panel-dropdown.d.ts +18 -18
- package/dist/components/side-panel/panel-dropdown.js +71 -0
- package/dist/components/side-panel/panel-header-action.d.ts +20 -20
- package/dist/components/side-panel/panel-header-action.js +103 -0
- package/dist/components/side-panel/panel-header.d.ts +78 -78
- package/dist/components/side-panel/panel-header.js +301 -0
- package/dist/components/side-panel/panel-tab.d.ts +20 -20
- package/dist/components/side-panel/panel-tab.js +72 -0
- package/dist/components/side-panel/panel-title.d.ts +4 -4
- package/dist/components/side-panel/panel-title.js +44 -0
- package/dist/components/side-panel/panel-toggle.d.ts +14 -14
- package/dist/components/side-panel/panel-toggle.js +65 -0
- package/dist/components/side-panel/side-bar.d.ts +76 -76
- package/dist/components/side-panel/side-bar.js +140 -0
- package/dist/components/side-panel.d.ts +134 -134
- package/dist/components/side-panel.js +235 -0
- package/dist/components/types.d.ts +44 -44
- package/dist/components/types.js +6 -0
- package/dist/connect/keplergl-connect.d.ts +5 -5
- package/dist/connect/keplergl-connect.js +59 -0
- package/dist/connect/with-local-selector.d.ts +6 -6
- package/dist/connect/with-local-selector.js +102 -0
- package/dist/constants/action-types.d.ts +111 -111
- package/dist/constants/action-types.js +184 -0
- package/dist/constants/color-palette.d.ts +491 -491
- package/dist/constants/color-palette.js +536 -0
- package/dist/constants/color-ranges.d.ts +24 -24
- package/dist/constants/color-ranges.js +83 -0
- package/dist/constants/custom-color-ranges.d.ts +37 -37
- package/dist/constants/custom-color-ranges.js +410 -0
- package/dist/constants/default-settings.d.ts +773 -773
- package/dist/constants/default-settings.js +832 -0
- package/dist/constants/index.d.ts +9 -9
- package/dist/constants/index.js +387 -0
- package/dist/constants/keyevent.d.ts +2 -2
- package/dist/constants/keyevent.js +43 -0
- package/dist/constants/tooltip.d.ts +165 -165
- package/dist/constants/tooltip.js +202 -0
- package/dist/constants/user-feedbacks.d.ts +5 -5
- package/dist/constants/user-feedbacks.js +32 -0
- package/dist/constants/user-guides.d.ts +9 -9
- package/dist/constants/user-guides.js +36 -0
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.d.ts +13 -13
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +92 -0
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.d.ts +7 -7
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +181 -0
- package/dist/deckgl-layers/3d-building-layer/types.d.ts +37 -0
- package/dist/deckgl-layers/3d-building-layer/types.js +6 -0
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +312 -0
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.d.ts +6 -6
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +75 -0
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.d.ts +13 -13
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +96 -0
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.d.ts +13 -13
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +96 -0
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +107 -0
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.d.ts +91 -91
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +585 -0
- package/dist/deckgl-layers/layer-utils/shader-utils.d.ts +1 -1
- package/dist/deckgl-layers/layer-utils/shader-utils.js +46 -0
- package/dist/deckgl-layers/line-layer/line-layer.d.ts +12 -12
- package/dist/deckgl-layers/line-layer/line-layer.js +106 -0
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.d.ts +8 -8
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +80 -0
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.d.ts +18 -18
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +123 -0
- package/dist/index.d.ts +11 -11
- package/dist/index.js +179 -0
- package/dist/layers/aggregation-layer.d.ts +70 -70
- package/dist/layers/aggregation-layer.js +392 -0
- package/dist/layers/arc-layer/arc-layer-icon.d.ts +16 -16
- package/dist/layers/arc-layer/arc-layer-icon.js +76 -0
- package/dist/layers/arc-layer/arc-layer.d.ts +143 -143
- package/dist/layers/arc-layer/arc-layer.js +252 -0
- package/dist/layers/base-layer.d.ts +436 -436
- package/dist/layers/base-layer.js +1703 -0
- package/dist/layers/cluster-layer/cluster-layer-icon.d.ts +16 -16
- package/dist/layers/cluster-layer/cluster-layer-icon.js +79 -0
- package/dist/layers/cluster-layer/cluster-layer.d.ts +39 -39
- package/dist/layers/cluster-layer/cluster-layer.js +139 -0
- package/dist/layers/default-layer-icon.d.ts +14 -14
- package/dist/layers/default-layer-icon.js +86 -0
- package/dist/layers/geojson-layer/geojson-layer-icon.d.ts +15 -15
- package/dist/layers/geojson-layer/geojson-layer-icon.js +90 -0
- package/dist/layers/geojson-layer/geojson-layer.d.ts +227 -230
- package/dist/layers/geojson-layer/geojson-layer.js +423 -0
- package/dist/layers/geojson-layer/geojson-utils.d.ts +44 -44
- package/dist/layers/geojson-layer/geojson-utils.js +184 -0
- package/dist/layers/grid-layer/grid-layer-icon.d.ts +15 -15
- package/dist/layers/grid-layer/grid-layer-icon.js +135 -0
- package/dist/layers/grid-layer/grid-layer.d.ts +74 -74
- package/dist/layers/grid-layer/grid-layer.js +104 -0
- package/dist/layers/grid-layer/grid-utils.d.ts +24 -24
- package/dist/layers/grid-layer/grid-utils.js +59 -0
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.d.ts +16 -16
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +70 -0
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.d.ts +170 -170
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +321 -0
- package/dist/layers/h3-hexagon-layer/h3-utils.d.ts +20 -20
- package/dist/layers/h3-hexagon-layer/h3-utils.js +86 -0
- package/dist/layers/heatmap-layer/heatmap-layer-icon.d.ts +15 -15
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +87 -0
- package/dist/layers/heatmap-layer/heatmap-layer.d.ts +144 -144
- package/dist/layers/heatmap-layer/heatmap-layer.js +236 -0
- package/dist/layers/hexagon-layer/hexagon-layer-icon.d.ts +15 -15
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +99 -0
- package/dist/layers/hexagon-layer/hexagon-layer.d.ts +78 -78
- package/dist/layers/hexagon-layer/hexagon-layer.js +108 -0
- package/dist/layers/hexagon-layer/hexagon-utils.d.ts +7 -7
- package/dist/layers/hexagon-layer/hexagon-utils.js +62 -0
- package/dist/layers/icon-layer/icon-info-modal.d.ts +3 -3
- package/dist/layers/icon-layer/icon-info-modal.js +115 -0
- package/dist/layers/icon-layer/icon-layer-icon.d.ts +15 -15
- package/dist/layers/icon-layer/icon-layer-icon.js +72 -0
- package/dist/layers/icon-layer/icon-layer.d.ts +119 -119
- package/dist/layers/icon-layer/icon-layer.js +366 -0
- package/dist/layers/index.d.ts +53 -53
- package/dist/layers/index.js +105 -0
- package/dist/layers/layer-factory.d.ts +150 -150
- package/dist/layers/layer-factory.js +517 -0
- package/dist/layers/layer-text-label.d.ts +7 -7
- package/dist/layers/layer-text-label.js +60 -0
- package/dist/layers/layer-update.d.ts +9 -9
- package/dist/layers/layer-update.js +73 -0
- package/dist/layers/line-layer/line-layer-icon.d.ts +15 -15
- package/dist/layers/line-layer/line-layer-icon.js +78 -0
- package/dist/layers/line-layer/line-layer.d.ts +136 -136
- package/dist/layers/line-layer/line-layer.js +191 -0
- package/dist/layers/mapbox-utils.d.ts +57 -57
- package/dist/layers/mapbox-utils.js +186 -0
- package/dist/layers/mapboxgl-layer.d.ts +87 -87
- package/dist/layers/mapboxgl-layer.js +201 -0
- package/dist/layers/point-layer/point-layer-icon.d.ts +15 -15
- package/dist/layers/point-layer/point-layer-icon.js +93 -0
- package/dist/layers/point-layer/point-layer.d.ts +272 -272
- package/dist/layers/point-layer/point-layer.js +457 -0
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.d.ts +189 -189
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +306 -0
- package/dist/layers/s2-geometry-layer/s2-layer-icon.d.ts +15 -15
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +69 -0
- package/dist/layers/s2-geometry-layer/s2-utils.d.ts +7 -7
- package/dist/layers/s2-geometry-layer/s2-utils.js +51 -0
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.d.ts +3 -3
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +54 -0
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.d.ts +15 -15
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +150 -0
- package/dist/layers/scenegraph-layer/scenegraph-layer.d.ts +80 -80
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +230 -0
- package/dist/layers/trip-layer/trip-info-modal.d.ts +3 -3
- package/dist/layers/trip-layer/trip-info-modal.js +59 -0
- package/dist/layers/trip-layer/trip-layer-icon.d.ts +15 -15
- package/dist/layers/trip-layer/trip-layer-icon.js +88 -0
- package/dist/layers/trip-layer/trip-layer.d.ts +157 -157
- package/dist/layers/trip-layer/trip-layer.js +369 -0
- package/dist/layers/trip-layer/trip-utils.d.ts +31 -31
- package/dist/layers/trip-layer/trip-utils.js +180 -0
- package/dist/layers/types.d.ts +15 -15
- package/dist/layers/types.js +44 -0
- package/dist/localization/formatted-message.d.ts +12 -12
- package/dist/localization/formatted-message.js +39 -0
- package/dist/localization/index.d.ts +5 -5
- package/dist/localization/index.js +54 -0
- package/dist/localization/locales.d.ts +27 -27
- package/dist/localization/locales.js +59 -0
- package/dist/localization/messages.d.ts +4 -4
- package/dist/localization/messages.js +37 -0
- package/dist/localization/translations/ca.d.ts +438 -438
- package/dist/localization/translations/ca.js +466 -0
- package/dist/localization/translations/cn.d.ts +441 -441
- package/dist/localization/translations/cn.js +469 -0
- package/dist/localization/translations/en.d.ts +466 -466
- package/dist/localization/translations/en.js +494 -0
- package/dist/localization/translations/es.d.ts +438 -438
- package/dist/localization/translations/es.js +466 -0
- package/dist/localization/translations/fi.d.ts +410 -410
- package/dist/localization/translations/fi.js +438 -0
- package/dist/localization/translations/ja.d.ts +439 -439
- package/dist/localization/translations/ja.js +467 -0
- package/dist/localization/translations/pt.d.ts +410 -410
- package/dist/localization/translations/pt.js +438 -0
- package/dist/localization/translations/ru.d.ts +447 -447
- package/dist/localization/translations/ru.js +475 -0
- package/dist/middleware/index.d.ts +8 -8
- package/dist/middleware/index.js +44 -0
- package/dist/processors/data-processor.d.ts +242 -242
- package/dist/processors/data-processor.js +721 -0
- package/dist/processors/file-handler.d.ts +28 -28
- package/dist/processors/file-handler.js +357 -0
- package/dist/processors/index.d.ts +3 -3
- package/dist/processors/index.js +39 -0
- package/dist/processors/types.d.ts +21 -21
- package/dist/processors/types.js +6 -0
- package/dist/reducers/combined-updaters.d.ts +52 -52
- package/dist/reducers/combined-updaters.js +180 -0
- package/dist/reducers/composer-helpers.d.ts +21 -21
- package/dist/reducers/composer-helpers.js +111 -0
- package/dist/reducers/composers.d.ts +12 -12
- package/dist/reducers/composers.js +40 -0
- package/dist/reducers/core.d.ts +65 -65
- package/dist/reducers/core.js +119 -0
- package/dist/reducers/index.d.ts +19 -19
- package/dist/reducers/index.js +137 -0
- package/dist/reducers/map-state-updaters.d.ts +96 -96
- package/dist/reducers/map-state-updaters.js +220 -0
- package/dist/reducers/map-state.d.ts +4 -4
- package/dist/reducers/map-state.js +52 -0
- package/dist/reducers/map-style-updaters.d.ts +204 -204
- package/dist/reducers/map-style-updaters.js +473 -0
- package/dist/reducers/map-style.d.ts +16 -16
- package/dist/reducers/map-style.js +51 -0
- package/dist/reducers/provider-state-updaters.d.ts +41 -41
- package/dist/reducers/provider-state-updaters.js +421 -0
- package/dist/reducers/provider-state.d.ts +4 -4
- package/dist/reducers/provider-state.js +53 -0
- package/dist/reducers/root.d.ts +24 -24
- package/dist/reducers/root.js +212 -0
- package/dist/reducers/types.d.ts +16 -16
- package/dist/reducers/types.js +6 -0
- package/dist/reducers/ui-state-updaters.d.ts +433 -433
- package/dist/reducers/ui-state-updaters.js +744 -0
- package/dist/reducers/ui-state.d.ts +3 -3
- package/dist/reducers/ui-state.js +54 -0
- package/dist/reducers/vis-state-merger.d.ts +110 -110
- package/dist/reducers/vis-state-merger.js +569 -0
- package/dist/reducers/vis-state-selectors.d.ts +10 -10
- package/dist/reducers/vis-state-selectors.js +47 -0
- package/dist/reducers/vis-state-updaters.d.ts +645 -645
- package/dist/reducers/vis-state-updaters.js +2102 -0
- package/dist/reducers/vis-state.d.ts +4 -4
- package/dist/reducers/vis-state.js +53 -0
- package/dist/schemas/dataset-schema.d.ts +17 -17
- package/dist/schemas/dataset-schema.js +166 -0
- package/dist/schemas/index.d.ts +8 -8
- package/dist/schemas/index.js +125 -0
- package/dist/schemas/map-state-schema.d.ts +23 -23
- package/dist/schemas/map-state-schema.js +53 -0
- package/dist/schemas/map-style-schema.d.ts +38 -38
- package/dist/schemas/map-style-schema.js +106 -0
- package/dist/schemas/schema-manager.d.ts +271 -271
- package/dist/schemas/schema-manager.js +246 -0
- package/dist/schemas/schema-utils.d.ts +11 -11
- package/dist/schemas/schema-utils.js +58 -0
- package/dist/schemas/schema.d.ts +37 -37
- package/dist/schemas/schema.js +119 -0
- package/dist/schemas/versions.d.ts +5 -5
- package/dist/schemas/versions.js +34 -0
- package/dist/schemas/vis-state-schema.d.ts +214 -214
- package/dist/schemas/vis-state-schema.js +886 -0
- package/dist/styles/base.d.ts +1530 -1530
- package/dist/styles/base.js +1301 -0
- package/dist/styles/index.d.ts +2 -2
- package/dist/styles/index.js +28 -0
- package/dist/styles/media-breakpoints.d.ts +13 -13
- package/dist/styles/media-breakpoints.js +70 -0
- package/dist/tasks/tasks.d.ts +15 -15
- package/dist/tasks/tasks.js +94 -0
- package/dist/templates/export-map-html.d.ts +9 -9
- package/dist/templates/export-map-html.js +42 -0
- package/dist/utils/aggregate-utils.d.ts +3 -3
- package/dist/utils/aggregate-utils.js +71 -0
- package/dist/utils/color-utils.d.ts +44 -44
- package/dist/utils/color-utils.js +144 -0
- package/dist/utils/custom-scales.js +22 -0
- package/dist/utils/data-scale-utils.d.ts +23 -23
- package/dist/utils/data-scale-utils.js +70 -0
- package/dist/utils/data-utils.d.ts +115 -115
- package/dist/utils/data-utils.js +441 -0
- package/dist/utils/dataset-utils.d.ts +38 -38
- package/dist/utils/dataset-utils.js +236 -0
- package/dist/utils/dom-to-image.d.ts +73 -73
- package/dist/utils/dom-to-image.js +479 -0
- package/dist/utils/dom-utils.d.ts +20 -20
- package/dist/utils/dom-utils.js +343 -0
- package/dist/utils/export-utils.d.ts +56 -56
- package/dist/utils/export-utils.js +266 -0
- package/dist/utils/filter-utils.d.ts +267 -267
- package/dist/utils/filter-utils.js +1081 -0
- package/dist/utils/gl-utils.d.ts +1 -1
- package/dist/utils/gl-utils.js +43 -0
- package/dist/utils/gpu-filter-utils.d.ts +28 -28
- package/dist/utils/gpu-filter-utils.js +241 -0
- package/dist/utils/index.d.ts +22 -22
- package/dist/utils/index.js +361 -0
- package/dist/utils/interaction-utils.d.ts +36 -36
- package/dist/utils/interaction-utils.js +170 -0
- package/dist/utils/layer-utils.d.ts +54 -54
- package/dist/utils/layer-utils.js +200 -0
- package/dist/utils/locale-utils.d.ts +2 -2
- package/dist/utils/locale-utils.js +56 -0
- package/dist/utils/map-info-utils.d.ts +1 -1
- package/dist/utils/map-info-utils.js +31 -0
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.d.ts +64 -64
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +213 -0
- package/dist/utils/map-style-utils/mapbox-utils.d.ts +3 -3
- package/dist/utils/map-style-utils/mapbox-utils.js +33 -0
- package/dist/utils/mapbox-utils.d.ts +7 -7
- package/dist/utils/mapbox-utils.js +36 -0
- package/dist/utils/notifications-utils.d.ts +54 -54
- package/dist/utils/notifications-utils.js +90 -0
- package/dist/utils/observe-dimensions.d.ts +15 -15
- package/dist/utils/observe-dimensions.js +142 -0
- package/dist/utils/projection-utils.d.ts +12 -12
- package/dist/utils/projection-utils.js +72 -0
- package/dist/utils/searcher-utils.d.ts +1 -1
- package/dist/utils/searcher-utils.js +42 -0
- package/dist/utils/split-map-utils.d.ts +29 -29
- package/dist/utils/split-map-utils.js +112 -0
- package/dist/utils/table-utils/data-container-interface.d.ts +115 -115
- package/dist/utils/table-utils/data-container-interface.js +6 -0
- package/dist/utils/table-utils/data-container-utils.d.ts +29 -29
- package/dist/utils/table-utils/data-container-utils.js +84 -0
- package/dist/utils/table-utils/data-row.d.ts +59 -59
- package/dist/utils/table-utils/data-row.js +124 -0
- package/dist/utils/table-utils/index.d.ts +1 -1
- package/dist/utils/table-utils/index.js +19 -0
- package/dist/utils/table-utils/indexed-data-container.d.ts +34 -34
- package/dist/utils/table-utils/indexed-data-container.js +228 -0
- package/dist/utils/table-utils/kepler-table.d.ts +168 -168
- package/dist/utils/table-utils/kepler-table.js +554 -0
- package/dist/utils/table-utils/row-data-container.d.ts +31 -31
- package/dist/utils/table-utils/row-data-container.js +220 -0
- package/dist/utils/utils.d.ts +98 -98
- package/dist/utils/utils.js +240 -0
- package/package.json +51 -33
- package/src/components/common/portaled.tsx +5 -9
- package/src/constants/action-types.ts +1 -1
- package/src/index.ts +1 -1
- package/src/middleware/index.ts +1 -1
- package/src/reducers/map-style-updaters.ts +1 -1
- package/src/reducers/provider-state-updaters.ts +1 -1
- package/src/reducers/root.ts +1 -1
- package/src/reducers/vis-state-updaters.ts +1 -1
- package/src/schemas/schema.ts +1 -1
- package/src/tasks/tasks.ts +1 -1
- package/dist/bundle.js +0 -54227
- package/dist/bundle.js.map +0 -1
- package/dist/deckgl-layers/layer-utils/cluster-utils.d.ts +0 -12
|
@@ -0,0 +1,1081 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.TimestampStepMap = exports.PLOT_TYPES = exports.LIMITED_FILTER_EFFECT_PROPS = exports.LAYER_FILTERS = exports.FILTER_UPDATER_PROPS = exports.FILTER_ID_LENGTH = exports.FILTER_COMPONENTS = exports.DEFAULT_FILTER_STRUCTURE = void 0;
|
|
9
|
+
exports.adjustValueToFilterDomain = adjustValueToFilterDomain;
|
|
10
|
+
exports.applyFilterFieldName = applyFilterFieldName;
|
|
11
|
+
exports.applyFiltersToDatasets = applyFiltersToDatasets;
|
|
12
|
+
exports.diffFilters = diffFilters;
|
|
13
|
+
exports.featureToFilterValue = exports.enlargedHistogramBins = void 0;
|
|
14
|
+
exports.filterDataByFilterTypes = filterDataByFilterTypes;
|
|
15
|
+
exports.filterDatasetCPU = filterDatasetCPU;
|
|
16
|
+
exports.formatNumberByStep = formatNumberByStep;
|
|
17
|
+
exports.generatePolygonFilter = generatePolygonFilter;
|
|
18
|
+
exports.getDefaultFilter = getDefaultFilter;
|
|
19
|
+
exports.getDefaultFilterPlotType = getDefaultFilterPlotType;
|
|
20
|
+
exports.getFilterFunction = getFilterFunction;
|
|
21
|
+
exports.getFilterIdInFeature = void 0;
|
|
22
|
+
exports.getFilterPlot = getFilterPlot;
|
|
23
|
+
exports.getFilterProps = getFilterProps;
|
|
24
|
+
exports.getFilterRecord = getFilterRecord;
|
|
25
|
+
exports.getHistogram = getHistogram;
|
|
26
|
+
exports.getIntervalBins = getIntervalBins;
|
|
27
|
+
exports.getNumericFieldDomain = getNumericFieldDomain;
|
|
28
|
+
exports.getNumericStepSize = getNumericStepSize;
|
|
29
|
+
exports.getPolygonFilterFunctor = void 0;
|
|
30
|
+
exports.getTimeWidgetHintFormatter = getTimeWidgetHintFormatter;
|
|
31
|
+
exports.getTimeWidgetTitleFormatter = getTimeWidgetTitleFormatter;
|
|
32
|
+
exports.getTimestampFieldDomain = getTimestampFieldDomain;
|
|
33
|
+
exports.histogramBins = void 0;
|
|
34
|
+
exports.histogramConstruct = histogramConstruct;
|
|
35
|
+
exports.isInPolygon = isInPolygon;
|
|
36
|
+
exports.isInRange = isInRange;
|
|
37
|
+
exports.isValidFilterValue = isValidFilterValue;
|
|
38
|
+
exports.isValidTimeDomain = isValidTimeDomain;
|
|
39
|
+
exports.mergeFilterDomainStep = mergeFilterDomainStep;
|
|
40
|
+
exports.shouldApplyFilter = shouldApplyFilter;
|
|
41
|
+
exports.updateFilterDataId = updateFilterDataId;
|
|
42
|
+
exports.validateFilter = validateFilter;
|
|
43
|
+
exports.validateFilterWithData = validateFilterWithData;
|
|
44
|
+
exports.validateFiltersUpdateDatasets = validateFiltersUpdateDatasets;
|
|
45
|
+
exports.validatePolygonFilter = validatePolygonFilter;
|
|
46
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
47
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
48
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
49
|
+
var _d3Array = require("d3-array");
|
|
50
|
+
var _keymirror = _interopRequireDefault(require("keymirror"));
|
|
51
|
+
var _console = require("global/console");
|
|
52
|
+
var _lodash = _interopRequireDefault(require("lodash.get"));
|
|
53
|
+
var _lodash2 = _interopRequireDefault(require("lodash.isequal"));
|
|
54
|
+
var _booleanWithin = _interopRequireDefault(require("@turf/boolean-within"));
|
|
55
|
+
var _helpers = require("@turf/helpers");
|
|
56
|
+
var _decimal = require("decimal.js");
|
|
57
|
+
var _defaultSettings = require("../constants/default-settings");
|
|
58
|
+
var _dataUtils = require("./data-utils");
|
|
59
|
+
var ScaleUtils = _interopRequireWildcard(require("./data-scale-utils"));
|
|
60
|
+
var _types = require("../layers/types");
|
|
61
|
+
var _utils = require("./utils");
|
|
62
|
+
var _h3Utils = require("../layers/h3-hexagon-layer/h3-utils");
|
|
63
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
64
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
65
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
66
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // Copyright (c) 2022 Uber Technologies, Inc.
|
|
67
|
+
//
|
|
68
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
69
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
70
|
+
// in the Software without restriction, including without limitation the rights
|
|
71
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
72
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
73
|
+
// furnished to do so, subject to the following conditions:
|
|
74
|
+
//
|
|
75
|
+
// The above copyright notice and this permission notice shall be included in
|
|
76
|
+
// all copies or substantial portions of the Software.
|
|
77
|
+
//
|
|
78
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
79
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
80
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
81
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
82
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
83
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
84
|
+
// THE SOFTWARE.
|
|
85
|
+
var TimestampStepMap = exports.TimestampStepMap = [{
|
|
86
|
+
max: 1,
|
|
87
|
+
step: 0.05
|
|
88
|
+
}, {
|
|
89
|
+
max: 10,
|
|
90
|
+
step: 0.1
|
|
91
|
+
}, {
|
|
92
|
+
max: 100,
|
|
93
|
+
step: 1
|
|
94
|
+
}, {
|
|
95
|
+
max: 500,
|
|
96
|
+
step: 5
|
|
97
|
+
}, {
|
|
98
|
+
max: 1000,
|
|
99
|
+
step: 10
|
|
100
|
+
}, {
|
|
101
|
+
max: 5000,
|
|
102
|
+
step: 50
|
|
103
|
+
}, {
|
|
104
|
+
max: Number.POSITIVE_INFINITY,
|
|
105
|
+
step: 1000
|
|
106
|
+
}];
|
|
107
|
+
var histogramBins = exports.histogramBins = 30;
|
|
108
|
+
var enlargedHistogramBins = exports.enlargedHistogramBins = 100;
|
|
109
|
+
var durationSecond = 1000;
|
|
110
|
+
var durationMinute = durationSecond * 60;
|
|
111
|
+
var durationHour = durationMinute * 60;
|
|
112
|
+
var durationDay = durationHour * 24;
|
|
113
|
+
var durationWeek = durationDay * 7;
|
|
114
|
+
var durationYear = durationDay * 365;
|
|
115
|
+
var PLOT_TYPES = exports.PLOT_TYPES = (0, _keymirror["default"])({
|
|
116
|
+
histogram: null,
|
|
117
|
+
lineChart: null
|
|
118
|
+
});
|
|
119
|
+
var FILTER_UPDATER_PROPS = exports.FILTER_UPDATER_PROPS = (0, _keymirror["default"])({
|
|
120
|
+
dataId: null,
|
|
121
|
+
name: null,
|
|
122
|
+
layerId: null
|
|
123
|
+
});
|
|
124
|
+
var LIMITED_FILTER_EFFECT_PROPS = exports.LIMITED_FILTER_EFFECT_PROPS = (0, _keymirror["default"])((0, _defineProperty2["default"])({}, FILTER_UPDATER_PROPS.name, null));
|
|
125
|
+
/**
|
|
126
|
+
* Max number of filter value buffers that deck.gl provides
|
|
127
|
+
*/
|
|
128
|
+
|
|
129
|
+
var SupportedPlotType = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _defaultSettings.FILTER_TYPES.timeRange, (0, _defineProperty2["default"])((0, _defineProperty2["default"])({
|
|
130
|
+
"default": 'histogram'
|
|
131
|
+
}, _defaultSettings.ALL_FIELD_TYPES.integer, 'lineChart'), _defaultSettings.ALL_FIELD_TYPES.real, 'lineChart')), _defaultSettings.FILTER_TYPES.range, (0, _defineProperty2["default"])((0, _defineProperty2["default"])({
|
|
132
|
+
"default": 'histogram'
|
|
133
|
+
}, _defaultSettings.ALL_FIELD_TYPES.integer, 'lineChart'), _defaultSettings.ALL_FIELD_TYPES.real, 'lineChart'));
|
|
134
|
+
var FILTER_COMPONENTS = exports.FILTER_COMPONENTS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _defaultSettings.FILTER_TYPES.select, 'SingleSelectFilter'), _defaultSettings.FILTER_TYPES.multiSelect, 'MultiSelectFilter'), _defaultSettings.FILTER_TYPES.timeRange, 'TimeRangeFilter'), _defaultSettings.FILTER_TYPES.range, 'RangeFilter'), _defaultSettings.FILTER_TYPES.polygon, 'PolygonFilter');
|
|
135
|
+
var DEFAULT_FILTER_STRUCTURE = exports.DEFAULT_FILTER_STRUCTURE = {
|
|
136
|
+
dataId: [],
|
|
137
|
+
// [string]
|
|
138
|
+
freeze: false,
|
|
139
|
+
id: null,
|
|
140
|
+
// time range filter specific
|
|
141
|
+
fixedDomain: false,
|
|
142
|
+
enlarged: false,
|
|
143
|
+
isAnimating: false,
|
|
144
|
+
animationWindow: _defaultSettings.ANIMATION_WINDOW.free,
|
|
145
|
+
speed: 1,
|
|
146
|
+
// field specific
|
|
147
|
+
name: [],
|
|
148
|
+
// string
|
|
149
|
+
type: null,
|
|
150
|
+
fieldIdx: [],
|
|
151
|
+
// [integer]
|
|
152
|
+
domain: null,
|
|
153
|
+
value: null,
|
|
154
|
+
// plot
|
|
155
|
+
plotType: PLOT_TYPES.histogram,
|
|
156
|
+
yAxis: null,
|
|
157
|
+
interval: null,
|
|
158
|
+
// mode
|
|
159
|
+
gpu: false
|
|
160
|
+
};
|
|
161
|
+
var FILTER_ID_LENGTH = exports.FILTER_ID_LENGTH = 4;
|
|
162
|
+
var LAYER_FILTERS = exports.LAYER_FILTERS = [_defaultSettings.FILTER_TYPES.polygon];
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Generates a filter with a dataset id as dataId
|
|
166
|
+
*/
|
|
167
|
+
function getDefaultFilter(dataId) {
|
|
168
|
+
return _objectSpread(_objectSpread({}, DEFAULT_FILTER_STRUCTURE), {}, {
|
|
169
|
+
// store it as dataId and it could be one or many
|
|
170
|
+
dataId: (0, _utils.toArray)(dataId),
|
|
171
|
+
id: (0, _utils.generateHashId)(FILTER_ID_LENGTH)
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Check if a filter is valid based on the given dataId
|
|
177
|
+
* @param filter to validate
|
|
178
|
+
* @param datasetId id to validate filter against
|
|
179
|
+
* @return true if a filter is valid, false otherwise
|
|
180
|
+
*/
|
|
181
|
+
function shouldApplyFilter(filter, datasetId) {
|
|
182
|
+
var dataIds = (0, _utils.toArray)(filter.dataId);
|
|
183
|
+
return dataIds.includes(datasetId) && filter.value !== null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Validates and modifies polygon filter structure
|
|
188
|
+
* @param dataset
|
|
189
|
+
* @param filter
|
|
190
|
+
* @param layers
|
|
191
|
+
* @return - {filter, dataset}
|
|
192
|
+
*/
|
|
193
|
+
function validatePolygonFilter(dataset, filter, layers) {
|
|
194
|
+
var failed = {
|
|
195
|
+
dataset: dataset,
|
|
196
|
+
filter: null
|
|
197
|
+
};
|
|
198
|
+
var value = filter.value,
|
|
199
|
+
layerId = filter.layerId,
|
|
200
|
+
type = filter.type,
|
|
201
|
+
dataId = filter.dataId;
|
|
202
|
+
if (!layerId || !isValidFilterValue(type, value)) {
|
|
203
|
+
return failed;
|
|
204
|
+
}
|
|
205
|
+
var isValidDataset = dataId.includes(dataset.id);
|
|
206
|
+
if (!isValidDataset) {
|
|
207
|
+
return failed;
|
|
208
|
+
}
|
|
209
|
+
var layer = layers.find(function (l) {
|
|
210
|
+
return layerId.includes(l.id);
|
|
211
|
+
});
|
|
212
|
+
if (!layer) {
|
|
213
|
+
return failed;
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
filter: _objectSpread(_objectSpread({}, filter), {}, {
|
|
217
|
+
freeze: true,
|
|
218
|
+
fieldIdx: []
|
|
219
|
+
}),
|
|
220
|
+
dataset: dataset
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Custom filter validators
|
|
226
|
+
*/
|
|
227
|
+
var filterValidators = (0, _defineProperty2["default"])({}, _defaultSettings.FILTER_TYPES.polygon, validatePolygonFilter);
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Default validate filter function
|
|
231
|
+
* @param dataset
|
|
232
|
+
* @param filter
|
|
233
|
+
* @return - {filter, dataset}
|
|
234
|
+
*/
|
|
235
|
+
function validateFilter(dataset, filter) {
|
|
236
|
+
// match filter.dataId
|
|
237
|
+
var failed = {
|
|
238
|
+
dataset: dataset,
|
|
239
|
+
filter: null
|
|
240
|
+
};
|
|
241
|
+
var filterDataId = (0, _utils.toArray)(filter.dataId);
|
|
242
|
+
var filterDatasetIndex = filterDataId.indexOf(dataset.id);
|
|
243
|
+
if (filterDatasetIndex < 0) {
|
|
244
|
+
// the current filter is not mapped against the current dataset
|
|
245
|
+
return failed;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// @ts-expect-error
|
|
249
|
+
var initializeFilter = _objectSpread(_objectSpread(_objectSpread({}, getDefaultFilter(filter.dataId)), filter), {}, {
|
|
250
|
+
dataId: filterDataId,
|
|
251
|
+
name: (0, _utils.toArray)(filter.name)
|
|
252
|
+
});
|
|
253
|
+
var fieldName = initializeFilter.name[filterDatasetIndex];
|
|
254
|
+
var _applyFilterFieldName = applyFilterFieldName(initializeFilter, dataset, fieldName, filterDatasetIndex, {
|
|
255
|
+
mergeDomain: true
|
|
256
|
+
}),
|
|
257
|
+
updatedFilter = _applyFilterFieldName.filter,
|
|
258
|
+
updatedDataset = _applyFilterFieldName.dataset;
|
|
259
|
+
if (!updatedFilter) {
|
|
260
|
+
return failed;
|
|
261
|
+
}
|
|
262
|
+
updatedFilter.value = adjustValueToFilterDomain(filter.value, updatedFilter);
|
|
263
|
+
updatedFilter.enlarged = typeof filter.enlarged === 'boolean' ? filter.enlarged : updatedFilter.enlarged;
|
|
264
|
+
if (updatedFilter.value === null) {
|
|
265
|
+
// cannot adjust saved value to filter
|
|
266
|
+
return failed;
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
filter: validateFilterYAxis(updatedFilter, updatedDataset),
|
|
270
|
+
dataset: updatedDataset
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Validate saved filter config with new data,
|
|
276
|
+
* calculate domain and fieldIdx based new fields and data
|
|
277
|
+
*
|
|
278
|
+
* @param dataset
|
|
279
|
+
* @param filter - filter to be validate
|
|
280
|
+
* @param layers - layers
|
|
281
|
+
* @return validated filter
|
|
282
|
+
*/
|
|
283
|
+
function validateFilterWithData(dataset, filter, layers) {
|
|
284
|
+
return filter.type && filterValidators.hasOwnProperty(filter.type) ? filterValidators[filter.type](dataset, filter, layers) : validateFilter(dataset, filter);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Validate YAxis
|
|
289
|
+
* @param filter
|
|
290
|
+
* @param dataset
|
|
291
|
+
* @return {*}
|
|
292
|
+
*/
|
|
293
|
+
function validateFilterYAxis(filter, dataset) {
|
|
294
|
+
// TODO: validate yAxis against other datasets
|
|
295
|
+
|
|
296
|
+
var fields = dataset.fields;
|
|
297
|
+
var _filter = filter,
|
|
298
|
+
yAxis = _filter.yAxis;
|
|
299
|
+
// TODO: validate yAxis against other datasets
|
|
300
|
+
if (yAxis) {
|
|
301
|
+
var matchedAxis = fields.find(function (_ref) {
|
|
302
|
+
var name = _ref.name,
|
|
303
|
+
type = _ref.type;
|
|
304
|
+
return name === yAxis.name && type === yAxis.type;
|
|
305
|
+
});
|
|
306
|
+
filter = matchedAxis ? _objectSpread(_objectSpread({}, filter), {}, {
|
|
307
|
+
yAxis: matchedAxis
|
|
308
|
+
}, getFilterPlot(_objectSpread(_objectSpread({}, filter), {}, {
|
|
309
|
+
yAxis: matchedAxis
|
|
310
|
+
}), dataset)) : filter;
|
|
311
|
+
}
|
|
312
|
+
return filter;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Get default filter prop based on field type
|
|
317
|
+
*
|
|
318
|
+
* @param field
|
|
319
|
+
* @param fieldDomain
|
|
320
|
+
* @returns default filter
|
|
321
|
+
*/
|
|
322
|
+
function getFilterProps(field, fieldDomain) {
|
|
323
|
+
var filterProps = _objectSpread(_objectSpread({}, fieldDomain), {}, {
|
|
324
|
+
fieldType: field.type
|
|
325
|
+
});
|
|
326
|
+
switch (field.type) {
|
|
327
|
+
case _defaultSettings.ALL_FIELD_TYPES.real:
|
|
328
|
+
case _defaultSettings.ALL_FIELD_TYPES.integer:
|
|
329
|
+
return _objectSpread(_objectSpread({}, filterProps), {}, {
|
|
330
|
+
value: fieldDomain.domain,
|
|
331
|
+
type: _defaultSettings.FILTER_TYPES.range,
|
|
332
|
+
// @ts-expect-error
|
|
333
|
+
typeOptions: [_defaultSettings.FILTER_TYPES.range],
|
|
334
|
+
gpu: true
|
|
335
|
+
});
|
|
336
|
+
case _defaultSettings.ALL_FIELD_TYPES["boolean"]:
|
|
337
|
+
return _objectSpread(_objectSpread({}, filterProps), {}, {
|
|
338
|
+
type: _defaultSettings.FILTER_TYPES.select,
|
|
339
|
+
value: true,
|
|
340
|
+
gpu: false
|
|
341
|
+
});
|
|
342
|
+
case _defaultSettings.ALL_FIELD_TYPES.string:
|
|
343
|
+
case _defaultSettings.ALL_FIELD_TYPES.date:
|
|
344
|
+
return _objectSpread(_objectSpread({}, filterProps), {}, {
|
|
345
|
+
type: _defaultSettings.FILTER_TYPES.multiSelect,
|
|
346
|
+
value: [],
|
|
347
|
+
gpu: false
|
|
348
|
+
});
|
|
349
|
+
case _defaultSettings.ALL_FIELD_TYPES.timestamp:
|
|
350
|
+
return _objectSpread(_objectSpread({}, filterProps), {}, {
|
|
351
|
+
type: _defaultSettings.FILTER_TYPES.timeRange,
|
|
352
|
+
enlarged: true,
|
|
353
|
+
fixedDomain: true,
|
|
354
|
+
value: filterProps.domain,
|
|
355
|
+
gpu: true
|
|
356
|
+
});
|
|
357
|
+
default:
|
|
358
|
+
// @ts-expect-error
|
|
359
|
+
return {};
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
var getPolygonFilterFunctor = exports.getPolygonFilterFunctor = function getPolygonFilterFunctor(layer, filter, dataContainer) {
|
|
363
|
+
var getPosition = layer.getPositionAccessor(dataContainer);
|
|
364
|
+
switch (layer.type) {
|
|
365
|
+
case _types.LAYER_TYPES.point:
|
|
366
|
+
case _types.LAYER_TYPES.icon:
|
|
367
|
+
return function (data) {
|
|
368
|
+
var pos = getPosition(data);
|
|
369
|
+
return pos.every(Number.isFinite) && isInPolygon(pos, filter.value);
|
|
370
|
+
};
|
|
371
|
+
case _types.LAYER_TYPES.arc:
|
|
372
|
+
case _types.LAYER_TYPES.line:
|
|
373
|
+
return function (data) {
|
|
374
|
+
var pos = getPosition(data);
|
|
375
|
+
return pos.every(Number.isFinite) && [[pos[0], pos[1]], [pos[3], pos[4]]].every(function (point) {
|
|
376
|
+
return isInPolygon(point, filter.value);
|
|
377
|
+
});
|
|
378
|
+
};
|
|
379
|
+
case _types.LAYER_TYPES.hexagonId:
|
|
380
|
+
if (layer.dataToFeature && layer.dataToFeature.centroids) {
|
|
381
|
+
return function (data) {
|
|
382
|
+
// null or getCentroid({id})
|
|
383
|
+
var centroid = layer.dataToFeature.centroids[data.index];
|
|
384
|
+
return centroid && isInPolygon(centroid, filter.value);
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return function (data) {
|
|
388
|
+
var id = getPosition(data);
|
|
389
|
+
if (!(0, _h3Utils.h3IsValid)(id)) {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
var pos = (0, _h3Utils.getCentroid)({
|
|
393
|
+
id: id
|
|
394
|
+
});
|
|
395
|
+
return pos.every(Number.isFinite) && isInPolygon(pos, filter.value);
|
|
396
|
+
};
|
|
397
|
+
default:
|
|
398
|
+
return function () {
|
|
399
|
+
return true;
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* @param param An object that represents a row record.
|
|
406
|
+
* @param param.index Index of the row in data container.
|
|
407
|
+
* @returns Returns true to keep the element, or false otherwise.
|
|
408
|
+
*/
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* @param field dataset Field
|
|
412
|
+
* @param dataId Dataset id
|
|
413
|
+
* @param filter Filter object
|
|
414
|
+
* @param layers list of layers to filter upon
|
|
415
|
+
* @param dataContainer Data container
|
|
416
|
+
* @return filterFunction
|
|
417
|
+
*/
|
|
418
|
+
function getFilterFunction(field, dataId, filter, layers, dataContainer) {
|
|
419
|
+
// field could be null in polygon filter
|
|
420
|
+
var valueAccessor = field ? field.valueAccessor : function (data) {
|
|
421
|
+
return null;
|
|
422
|
+
};
|
|
423
|
+
var defaultFunc = function defaultFunc(d) {
|
|
424
|
+
return true;
|
|
425
|
+
};
|
|
426
|
+
switch (filter.type) {
|
|
427
|
+
case _defaultSettings.FILTER_TYPES.range:
|
|
428
|
+
return function (data) {
|
|
429
|
+
return isInRange(valueAccessor(data), filter.value);
|
|
430
|
+
};
|
|
431
|
+
case _defaultSettings.FILTER_TYPES.multiSelect:
|
|
432
|
+
return function (data) {
|
|
433
|
+
return filter.value.includes(valueAccessor(data));
|
|
434
|
+
};
|
|
435
|
+
case _defaultSettings.FILTER_TYPES.select:
|
|
436
|
+
return function (data) {
|
|
437
|
+
return valueAccessor(data) === filter.value;
|
|
438
|
+
};
|
|
439
|
+
case _defaultSettings.FILTER_TYPES.timeRange:
|
|
440
|
+
if (!field) {
|
|
441
|
+
return defaultFunc;
|
|
442
|
+
}
|
|
443
|
+
var mappedValue = (0, _lodash["default"])(field, ['filterProps', 'mappedValue']);
|
|
444
|
+
var accessor = Array.isArray(mappedValue) ? function (data) {
|
|
445
|
+
return mappedValue[data.index];
|
|
446
|
+
} : function (data) {
|
|
447
|
+
return (0, _dataUtils.timeToUnixMilli)(valueAccessor(data), field.format);
|
|
448
|
+
};
|
|
449
|
+
return function (data) {
|
|
450
|
+
return isInRange(accessor(data), filter.value);
|
|
451
|
+
};
|
|
452
|
+
case _defaultSettings.FILTER_TYPES.polygon:
|
|
453
|
+
if (!layers || !layers.length || !filter.layerId) {
|
|
454
|
+
return defaultFunc;
|
|
455
|
+
}
|
|
456
|
+
var layerFilterFunctions = filter.layerId.map(function (id) {
|
|
457
|
+
return layers.find(function (l) {
|
|
458
|
+
return l.id === id;
|
|
459
|
+
});
|
|
460
|
+
}).filter(function (l) {
|
|
461
|
+
return l && l.config.dataId === dataId;
|
|
462
|
+
}).map(function (layer) {
|
|
463
|
+
return getPolygonFilterFunctor(layer, filter, dataContainer);
|
|
464
|
+
});
|
|
465
|
+
return function (data) {
|
|
466
|
+
return layerFilterFunctions.every(function (filterFunc) {
|
|
467
|
+
return filterFunc(data);
|
|
468
|
+
});
|
|
469
|
+
};
|
|
470
|
+
default:
|
|
471
|
+
return defaultFunc;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
function updateFilterDataId(dataId) {
|
|
475
|
+
return getDefaultFilter(dataId);
|
|
476
|
+
}
|
|
477
|
+
function filterDataByFilterTypes(_ref2, dataContainer) {
|
|
478
|
+
var dynamicDomainFilters = _ref2.dynamicDomainFilters,
|
|
479
|
+
cpuFilters = _ref2.cpuFilters,
|
|
480
|
+
filterFuncs = _ref2.filterFuncs;
|
|
481
|
+
var filteredIndexForDomain = [];
|
|
482
|
+
var filteredIndex = [];
|
|
483
|
+
var filterContext = {
|
|
484
|
+
index: -1,
|
|
485
|
+
dataContainer: dataContainer
|
|
486
|
+
};
|
|
487
|
+
var filterFuncCaller = function filterFuncCaller(filter) {
|
|
488
|
+
return filterFuncs[filter.id](filterContext);
|
|
489
|
+
};
|
|
490
|
+
var numRows = dataContainer.numRows();
|
|
491
|
+
for (var i = 0; i < numRows; ++i) {
|
|
492
|
+
filterContext.index = i;
|
|
493
|
+
var matchForDomain = dynamicDomainFilters && dynamicDomainFilters.every(filterFuncCaller);
|
|
494
|
+
if (matchForDomain) {
|
|
495
|
+
filteredIndexForDomain.push(filterContext.index);
|
|
496
|
+
}
|
|
497
|
+
var matchForRender = cpuFilters && cpuFilters.every(filterFuncCaller);
|
|
498
|
+
if (matchForRender) {
|
|
499
|
+
filteredIndex.push(filterContext.index);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return _objectSpread(_objectSpread({}, dynamicDomainFilters ? {
|
|
503
|
+
filteredIndexForDomain: filteredIndexForDomain
|
|
504
|
+
} : {}), cpuFilters ? {
|
|
505
|
+
filteredIndex: filteredIndex
|
|
506
|
+
} : {});
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Get a record of filters based on domain type and gpu / cpu
|
|
511
|
+
*/
|
|
512
|
+
function getFilterRecord(dataId, filters) {
|
|
513
|
+
var opt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
514
|
+
var filterRecord = {
|
|
515
|
+
dynamicDomain: [],
|
|
516
|
+
fixedDomain: [],
|
|
517
|
+
cpu: [],
|
|
518
|
+
gpu: []
|
|
519
|
+
};
|
|
520
|
+
filters.forEach(function (f) {
|
|
521
|
+
if (isValidFilterValue(f.type, f.value) && (0, _utils.toArray)(f.dataId).includes(dataId)) {
|
|
522
|
+
(f.fixedDomain || opt.ignoreDomain ? filterRecord.fixedDomain : filterRecord.dynamicDomain).push(f);
|
|
523
|
+
(f.gpu && !opt.cpuOnly ? filterRecord.gpu : filterRecord.cpu).push(f);
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
return filterRecord;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Compare filter records to get what has changed
|
|
531
|
+
*/
|
|
532
|
+
function diffFilters(filterRecord) {
|
|
533
|
+
var oldFilterRecord = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
534
|
+
var filterChanged = {};
|
|
535
|
+
Object.entries(filterRecord).forEach(function (_ref3) {
|
|
536
|
+
var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
|
|
537
|
+
record = _ref4[0],
|
|
538
|
+
items = _ref4[1];
|
|
539
|
+
items.forEach(function (filter) {
|
|
540
|
+
var oldFilter = (oldFilterRecord[record] || []).find(function (f) {
|
|
541
|
+
return f.id === filter.id;
|
|
542
|
+
});
|
|
543
|
+
if (!oldFilter) {
|
|
544
|
+
// added
|
|
545
|
+
filterChanged = (0, _utils.set)([record, filter.id], 'added', filterChanged);
|
|
546
|
+
} else {
|
|
547
|
+
// check what has changed
|
|
548
|
+
['name', 'value', 'dataId'].forEach(function (prop) {
|
|
549
|
+
if (filter[prop] !== oldFilter[prop]) {
|
|
550
|
+
filterChanged = (0, _utils.set)([record, filter.id], "".concat(prop, "_changed"), filterChanged);
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
(oldFilterRecord[record] || []).forEach(function (oldFilter) {
|
|
556
|
+
// deleted
|
|
557
|
+
if (!items.find(function (f) {
|
|
558
|
+
return f.id === oldFilter.id;
|
|
559
|
+
})) {
|
|
560
|
+
filterChanged = (0, _utils.set)([record, oldFilter.id], 'deleted', filterChanged);
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
return _objectSpread(_objectSpread({}, {
|
|
565
|
+
dynamicDomain: null,
|
|
566
|
+
fixedDomain: null,
|
|
567
|
+
cpu: null,
|
|
568
|
+
gpu: null
|
|
569
|
+
}), filterChanged);
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Call by parsing filters from URL
|
|
573
|
+
* Check if value of filter within filter domain, if not adjust it to match
|
|
574
|
+
* filter domain
|
|
575
|
+
*
|
|
576
|
+
* @returns value - adjusted value to match filter or null to remove filter
|
|
577
|
+
*/
|
|
578
|
+
/* eslint-disable complexity */
|
|
579
|
+
function adjustValueToFilterDomain(value, _ref5) {
|
|
580
|
+
var domain = _ref5.domain,
|
|
581
|
+
type = _ref5.type;
|
|
582
|
+
if (!domain || !type) {
|
|
583
|
+
return false;
|
|
584
|
+
}
|
|
585
|
+
switch (type) {
|
|
586
|
+
case _defaultSettings.FILTER_TYPES.range:
|
|
587
|
+
case _defaultSettings.FILTER_TYPES.timeRange:
|
|
588
|
+
if (!Array.isArray(value) || value.length !== 2) {
|
|
589
|
+
return domain.map(function (d) {
|
|
590
|
+
return d;
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
return value.map(function (d, i) {
|
|
594
|
+
return (0, _dataUtils.notNullorUndefined)(d) && isInRange(d, domain) ? d : domain[i];
|
|
595
|
+
});
|
|
596
|
+
case _defaultSettings.FILTER_TYPES.multiSelect:
|
|
597
|
+
if (!Array.isArray(value)) {
|
|
598
|
+
return [];
|
|
599
|
+
}
|
|
600
|
+
var filteredValue = value.filter(function (d) {
|
|
601
|
+
return domain.includes(d);
|
|
602
|
+
});
|
|
603
|
+
return filteredValue.length ? filteredValue : [];
|
|
604
|
+
case _defaultSettings.FILTER_TYPES.select:
|
|
605
|
+
return domain.includes(value) ? value : true;
|
|
606
|
+
default:
|
|
607
|
+
return null;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
/* eslint-enable complexity */
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Calculate numeric domain and suitable step
|
|
614
|
+
*/
|
|
615
|
+
function getNumericFieldDomain(dataContainer, valueAccessor) {
|
|
616
|
+
var domain = [0, 1];
|
|
617
|
+
var step = 0.1;
|
|
618
|
+
var mappedValue = dataContainer.mapIndex(valueAccessor);
|
|
619
|
+
if (dataContainer.numRows() > 1) {
|
|
620
|
+
domain = ScaleUtils.getLinearDomain(mappedValue);
|
|
621
|
+
var diff = domain[1] - domain[0];
|
|
622
|
+
|
|
623
|
+
// in case equal domain, [96, 96], which will break quantize scale
|
|
624
|
+
if (!diff) {
|
|
625
|
+
domain[1] = domain[0] + 1;
|
|
626
|
+
}
|
|
627
|
+
step = getNumericStepSize(diff) || step;
|
|
628
|
+
domain[0] = formatNumberByStep(domain[0], step, 'floor');
|
|
629
|
+
domain[1] = formatNumberByStep(domain[1], step, 'ceil');
|
|
630
|
+
}
|
|
631
|
+
var _getHistogram = getHistogram(domain, mappedValue),
|
|
632
|
+
histogram = _getHistogram.histogram,
|
|
633
|
+
enlargedHistogram = _getHistogram.enlargedHistogram;
|
|
634
|
+
return {
|
|
635
|
+
domain: domain,
|
|
636
|
+
step: step,
|
|
637
|
+
histogram: histogram,
|
|
638
|
+
enlargedHistogram: enlargedHistogram
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Calculate step size for range and timerange filter
|
|
644
|
+
*/
|
|
645
|
+
function getNumericStepSize(diff) {
|
|
646
|
+
diff = Math.abs(diff);
|
|
647
|
+
if (diff > 100) {
|
|
648
|
+
return 1;
|
|
649
|
+
} else if (diff > 3) {
|
|
650
|
+
return 0.01;
|
|
651
|
+
} else if (diff > 1) {
|
|
652
|
+
return 0.001;
|
|
653
|
+
}
|
|
654
|
+
// Try to get at least 1000 steps - and keep the step size below that of
|
|
655
|
+
// the (diff > 1) case.
|
|
656
|
+
var x = diff / 1000;
|
|
657
|
+
// Find the exponent and truncate to 10 to the power of that exponent
|
|
658
|
+
|
|
659
|
+
var exponentialForm = x.toExponential();
|
|
660
|
+
var exponent = parseFloat(exponentialForm.split('e')[1]);
|
|
661
|
+
|
|
662
|
+
// Getting ready for node 12
|
|
663
|
+
// this is why we need decimal.js
|
|
664
|
+
// Math.pow(10, -5) = 0.000009999999999999999
|
|
665
|
+
// the above result shows in browser and node 10
|
|
666
|
+
// node 12 behaves correctly
|
|
667
|
+
return new _decimal.Decimal(10).pow(exponent).toNumber();
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/**
|
|
671
|
+
* Calculate timestamp domain and suitable step
|
|
672
|
+
*/
|
|
673
|
+
function getTimestampFieldDomain(dataContainer, valueAccessor) {
|
|
674
|
+
// to avoid converting string format time to epoch
|
|
675
|
+
// every time we compare we store a value mapped to int in filter domain
|
|
676
|
+
|
|
677
|
+
var mappedValue = dataContainer.mapIndex(valueAccessor);
|
|
678
|
+
var domain = ScaleUtils.getLinearDomain(mappedValue);
|
|
679
|
+
var defaultTimeFormat = getTimeWidgetTitleFormatter(domain);
|
|
680
|
+
var step = 0.01;
|
|
681
|
+
var diff = domain[1] - domain[0];
|
|
682
|
+
var entry = TimestampStepMap.find(function (f) {
|
|
683
|
+
return f.max >= diff;
|
|
684
|
+
});
|
|
685
|
+
if (entry) {
|
|
686
|
+
step = entry.step;
|
|
687
|
+
}
|
|
688
|
+
var _getHistogram2 = getHistogram(domain, mappedValue),
|
|
689
|
+
histogram = _getHistogram2.histogram,
|
|
690
|
+
enlargedHistogram = _getHistogram2.enlargedHistogram;
|
|
691
|
+
return {
|
|
692
|
+
domain: domain,
|
|
693
|
+
step: step,
|
|
694
|
+
mappedValue: mappedValue,
|
|
695
|
+
histogram: histogram,
|
|
696
|
+
enlargedHistogram: enlargedHistogram,
|
|
697
|
+
defaultTimeFormat: defaultTimeFormat
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
function histogramConstruct(domain, mappedValue, bins) {
|
|
701
|
+
return (0, _d3Array.histogram)().thresholds((0, _d3Array.ticks)(domain[0], domain[1], bins)).domain(domain)(mappedValue).map(function (bin) {
|
|
702
|
+
return {
|
|
703
|
+
count: bin.length,
|
|
704
|
+
x0: bin.x0,
|
|
705
|
+
x1: bin.x1
|
|
706
|
+
};
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Calculate histogram from domain and array of values
|
|
711
|
+
*/
|
|
712
|
+
function getHistogram(domain, mappedValue) {
|
|
713
|
+
var histogram = histogramConstruct(domain, mappedValue, histogramBins);
|
|
714
|
+
var enlargedHistogram = histogramConstruct(domain, mappedValue, enlargedHistogramBins);
|
|
715
|
+
return {
|
|
716
|
+
histogram: histogram,
|
|
717
|
+
enlargedHistogram: enlargedHistogram
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* round number based on step
|
|
723
|
+
*
|
|
724
|
+
* @param {Number} val
|
|
725
|
+
* @param {Number} step
|
|
726
|
+
* @param {string} bound
|
|
727
|
+
* @returns {Number} rounded number
|
|
728
|
+
*/
|
|
729
|
+
function formatNumberByStep(val, step, bound) {
|
|
730
|
+
if (bound === 'floor') {
|
|
731
|
+
return Math.floor(val * (1 / step)) / (1 / step);
|
|
732
|
+
}
|
|
733
|
+
return Math.ceil(val * (1 / step)) / (1 / step);
|
|
734
|
+
}
|
|
735
|
+
function isInRange(val, domain) {
|
|
736
|
+
if (!Array.isArray(domain)) {
|
|
737
|
+
return false;
|
|
738
|
+
}
|
|
739
|
+
return val >= domain[0] && val <= domain[1];
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* Determines whether a point is within the provided polygon
|
|
744
|
+
*
|
|
745
|
+
* @param point as input search [lat, lng]
|
|
746
|
+
* @param polygon Points must be within these (Multi)Polygon(s)
|
|
747
|
+
* @return {boolean}
|
|
748
|
+
*/
|
|
749
|
+
function isInPolygon(point, polygon) {
|
|
750
|
+
return (0, _booleanWithin["default"])((0, _helpers.point)(point), polygon);
|
|
751
|
+
}
|
|
752
|
+
function isValidTimeDomain(domain) {
|
|
753
|
+
return Array.isArray(domain) && domain.every(Number.isFinite);
|
|
754
|
+
}
|
|
755
|
+
function getTimeWidgetTitleFormatter(domain) {
|
|
756
|
+
if (!isValidTimeDomain(domain)) {
|
|
757
|
+
return null;
|
|
758
|
+
}
|
|
759
|
+
var diff = domain[1] - domain[0];
|
|
760
|
+
|
|
761
|
+
// Local aware formats
|
|
762
|
+
// https://momentjs.com/docs/#/parsing/string-format
|
|
763
|
+
return diff > durationYear ? 'L' : diff > durationDay ? 'L LT' : 'L LTS';
|
|
764
|
+
}
|
|
765
|
+
function getTimeWidgetHintFormatter(domain) {
|
|
766
|
+
if (!isValidTimeDomain(domain)) {
|
|
767
|
+
return undefined;
|
|
768
|
+
}
|
|
769
|
+
var diff = domain[1] - domain[0];
|
|
770
|
+
return diff > durationWeek ? 'L' : diff > durationDay ? 'L LT' : diff > durationHour ? 'LT' : 'LTS';
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
/**
|
|
774
|
+
* Sanity check on filters to prepare for save
|
|
775
|
+
*/
|
|
776
|
+
/* eslint-disable complexity */
|
|
777
|
+
function isValidFilterValue(type, value) {
|
|
778
|
+
if (!type) {
|
|
779
|
+
return false;
|
|
780
|
+
}
|
|
781
|
+
switch (type) {
|
|
782
|
+
case _defaultSettings.FILTER_TYPES.select:
|
|
783
|
+
return value === true || value === false;
|
|
784
|
+
case _defaultSettings.FILTER_TYPES.range:
|
|
785
|
+
case _defaultSettings.FILTER_TYPES.timeRange:
|
|
786
|
+
return Array.isArray(value) && value.every(function (v) {
|
|
787
|
+
return v !== null && !isNaN(v);
|
|
788
|
+
});
|
|
789
|
+
case _defaultSettings.FILTER_TYPES.multiSelect:
|
|
790
|
+
return Array.isArray(value) && Boolean(value.length);
|
|
791
|
+
case _defaultSettings.FILTER_TYPES.input:
|
|
792
|
+
return Boolean(value.length);
|
|
793
|
+
case _defaultSettings.FILTER_TYPES.polygon:
|
|
794
|
+
var coordinates = (0, _lodash["default"])(value, ['geometry', 'coordinates']);
|
|
795
|
+
return Boolean(value && value.id && coordinates);
|
|
796
|
+
default:
|
|
797
|
+
return true;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
function getFilterPlot(filter, dataset) {
|
|
801
|
+
if (filter.plotType === PLOT_TYPES.histogram || !filter.yAxis) {
|
|
802
|
+
// histogram should be calculated when create filter
|
|
803
|
+
return {};
|
|
804
|
+
}
|
|
805
|
+
var _filter$mappedValue = filter.mappedValue,
|
|
806
|
+
mappedValue = _filter$mappedValue === void 0 ? [] : _filter$mappedValue;
|
|
807
|
+
var yAxis = filter.yAxis;
|
|
808
|
+
var fieldIdx = dataset.getColumnFieldIdx(yAxis.name);
|
|
809
|
+
if (fieldIdx < 0) {
|
|
810
|
+
_console.console.warn("yAxis ".concat(yAxis.name, " does not exist in dataset"));
|
|
811
|
+
return {
|
|
812
|
+
lineChart: {},
|
|
813
|
+
yAxis: yAxis
|
|
814
|
+
};
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// return lineChart
|
|
818
|
+
var series = dataset.dataContainer.map(function (row, rowIndex) {
|
|
819
|
+
return {
|
|
820
|
+
x: mappedValue[rowIndex],
|
|
821
|
+
y: row.valueAt(fieldIdx)
|
|
822
|
+
};
|
|
823
|
+
}, true).filter(function (_ref6) {
|
|
824
|
+
var x = _ref6.x,
|
|
825
|
+
y = _ref6.y;
|
|
826
|
+
return Number.isFinite(x) && Number.isFinite(y);
|
|
827
|
+
}).sort(function (a, b) {
|
|
828
|
+
return (0, _d3Array.ascending)(a.x, b.x);
|
|
829
|
+
});
|
|
830
|
+
var yDomain = (0, _d3Array.extent)(series, function (d) {
|
|
831
|
+
return d.y;
|
|
832
|
+
});
|
|
833
|
+
var xDomain = [series[0].x, series[series.length - 1].x];
|
|
834
|
+
return {
|
|
835
|
+
lineChart: {
|
|
836
|
+
series: series,
|
|
837
|
+
yDomain: yDomain,
|
|
838
|
+
xDomain: xDomain
|
|
839
|
+
},
|
|
840
|
+
yAxis: yAxis
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
function getDefaultFilterPlotType(filter) {
|
|
844
|
+
var filterPlotTypes = filter.type && SupportedPlotType[filter.type];
|
|
845
|
+
if (!filterPlotTypes) {
|
|
846
|
+
return null;
|
|
847
|
+
}
|
|
848
|
+
if (!filter.yAxis) {
|
|
849
|
+
return filterPlotTypes["default"];
|
|
850
|
+
}
|
|
851
|
+
return filterPlotTypes[filter.yAxis.type] || null;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
*
|
|
856
|
+
* @param datasetIds list of dataset ids to be filtered
|
|
857
|
+
* @param datasets all datasets
|
|
858
|
+
* @param filters all filters to be applied to datasets
|
|
859
|
+
* @return datasets - new updated datasets
|
|
860
|
+
*/
|
|
861
|
+
function applyFiltersToDatasets(datasetIds, datasets, filters, layers) {
|
|
862
|
+
var dataIds = (0, _utils.toArray)(datasetIds);
|
|
863
|
+
return dataIds.reduce(function (acc, dataId) {
|
|
864
|
+
var layersToFilter = (layers || []).filter(function (l) {
|
|
865
|
+
return l.config.dataId === dataId;
|
|
866
|
+
});
|
|
867
|
+
var appliedFilters = filters.filter(function (d) {
|
|
868
|
+
return shouldApplyFilter(d, dataId);
|
|
869
|
+
});
|
|
870
|
+
var table = datasets[dataId];
|
|
871
|
+
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, dataId, table.filterTable(appliedFilters, layersToFilter, {})));
|
|
872
|
+
}, datasets);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/**
|
|
876
|
+
* Applies a new field name value to fielter and update both filter and dataset
|
|
877
|
+
* @param filter - to be applied the new field name on
|
|
878
|
+
* @param dataset - dataset the field belongs to
|
|
879
|
+
* @param fieldName - field.name
|
|
880
|
+
* @param filterDatasetIndex - field.name
|
|
881
|
+
* @param option
|
|
882
|
+
* @return - {filter, datasets}
|
|
883
|
+
*/
|
|
884
|
+
function applyFilterFieldName(filter, dataset, fieldName) {
|
|
885
|
+
var filterDatasetIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
|
|
886
|
+
var option = arguments.length > 4 ? arguments[4] : undefined;
|
|
887
|
+
// using filterDatasetIndex we can filter only the specified dataset
|
|
888
|
+
var mergeDomain = option && option.hasOwnProperty('mergeDomain') ? option.mergeDomain : false;
|
|
889
|
+
var fieldIndex = dataset.getColumnFieldIdx(fieldName);
|
|
890
|
+
// if no field with same name is found, move to the next datasets
|
|
891
|
+
if (fieldIndex === -1) {
|
|
892
|
+
// throw new Error(`fieldIndex not found. Dataset must contain a property with name: ${fieldName}`);
|
|
893
|
+
return {
|
|
894
|
+
filter: null,
|
|
895
|
+
dataset: dataset
|
|
896
|
+
};
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
// TODO: validate field type
|
|
900
|
+
var filterProps = dataset.getColumnFilterProps(fieldName);
|
|
901
|
+
var newFilter = _objectSpread(_objectSpread({}, mergeDomain ? mergeFilterDomainStep(filter, filterProps) : _objectSpread(_objectSpread({}, filter), filterProps)), {}, {
|
|
902
|
+
name: Object.assign((0, _toConsumableArray2["default"])((0, _utils.toArray)(filter.name)), (0, _defineProperty2["default"])({}, filterDatasetIndex, fieldName)),
|
|
903
|
+
fieldIdx: Object.assign((0, _toConsumableArray2["default"])((0, _utils.toArray)(filter.fieldIdx)), (0, _defineProperty2["default"])({}, filterDatasetIndex, fieldIndex)),
|
|
904
|
+
// TODO, since we allow to add multiple fields to a filter we can no longer freeze the filter
|
|
905
|
+
freeze: true
|
|
906
|
+
});
|
|
907
|
+
return {
|
|
908
|
+
filter: newFilter,
|
|
909
|
+
dataset: dataset
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
/**
|
|
914
|
+
* Merge one filter with other filter prop domain
|
|
915
|
+
*/
|
|
916
|
+
/* eslint-disable complexity */
|
|
917
|
+
function mergeFilterDomainStep(filter, filterProps) {
|
|
918
|
+
if (!filter) {
|
|
919
|
+
return null;
|
|
920
|
+
}
|
|
921
|
+
if (!filterProps) {
|
|
922
|
+
return filter;
|
|
923
|
+
}
|
|
924
|
+
if (filter.fieldType && filter.fieldType !== filterProps.fieldType || !filterProps.domain) {
|
|
925
|
+
return filter;
|
|
926
|
+
}
|
|
927
|
+
var combinedDomain = !filter.domain ? filterProps.domain : [].concat((0, _toConsumableArray2["default"])(filter.domain || []), (0, _toConsumableArray2["default"])(filterProps.domain || [])).sort(function (a, b) {
|
|
928
|
+
return a - b;
|
|
929
|
+
});
|
|
930
|
+
var newFilter = _objectSpread(_objectSpread(_objectSpread({}, filter), filterProps), {}, {
|
|
931
|
+
domain: [combinedDomain[0], combinedDomain[combinedDomain.length - 1]]
|
|
932
|
+
});
|
|
933
|
+
switch (filterProps.fieldType) {
|
|
934
|
+
case _defaultSettings.ALL_FIELD_TYPES.string:
|
|
935
|
+
case _defaultSettings.ALL_FIELD_TYPES.date:
|
|
936
|
+
return _objectSpread(_objectSpread({}, newFilter), {}, {
|
|
937
|
+
domain: (0, _dataUtils.unique)(combinedDomain).sort()
|
|
938
|
+
});
|
|
939
|
+
case _defaultSettings.ALL_FIELD_TYPES.timestamp:
|
|
940
|
+
var step = filter.step < filterProps.step ? filter.step : filterProps.step;
|
|
941
|
+
return _objectSpread(_objectSpread({}, newFilter), {}, {
|
|
942
|
+
step: step
|
|
943
|
+
});
|
|
944
|
+
case _defaultSettings.ALL_FIELD_TYPES.real:
|
|
945
|
+
case _defaultSettings.ALL_FIELD_TYPES.integer:
|
|
946
|
+
default:
|
|
947
|
+
return newFilter;
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
/* eslint-enable complexity */
|
|
951
|
+
|
|
952
|
+
/**
|
|
953
|
+
* Generates polygon filter
|
|
954
|
+
*/
|
|
955
|
+
var featureToFilterValue = exports.featureToFilterValue = function featureToFilterValue(feature, filterId, properties) {
|
|
956
|
+
return _objectSpread(_objectSpread({}, feature), {}, {
|
|
957
|
+
id: feature.id,
|
|
958
|
+
properties: _objectSpread(_objectSpread(_objectSpread({}, feature.properties), properties), {}, {
|
|
959
|
+
filterId: filterId
|
|
960
|
+
})
|
|
961
|
+
});
|
|
962
|
+
};
|
|
963
|
+
var getFilterIdInFeature = exports.getFilterIdInFeature = function getFilterIdInFeature(f) {
|
|
964
|
+
return (0, _lodash["default"])(f, ['properties', 'filterId']);
|
|
965
|
+
};
|
|
966
|
+
|
|
967
|
+
/**
|
|
968
|
+
* Generates polygon filter
|
|
969
|
+
*/
|
|
970
|
+
function generatePolygonFilter(layers, feature) {
|
|
971
|
+
var dataId = layers.map(function (l) {
|
|
972
|
+
return l.config.dataId;
|
|
973
|
+
}).filter(_dataUtils.notNullorUndefined);
|
|
974
|
+
var layerId = layers.map(function (l) {
|
|
975
|
+
return l.id;
|
|
976
|
+
});
|
|
977
|
+
var name = layers.map(function (l) {
|
|
978
|
+
return l.config.label;
|
|
979
|
+
});
|
|
980
|
+
var filter = getDefaultFilter(dataId);
|
|
981
|
+
return _objectSpread(_objectSpread({}, filter), {}, {
|
|
982
|
+
fixedDomain: true,
|
|
983
|
+
type: _defaultSettings.FILTER_TYPES.polygon,
|
|
984
|
+
name: name,
|
|
985
|
+
layerId: layerId,
|
|
986
|
+
value: featureToFilterValue(feature, filter.id, {
|
|
987
|
+
isVisible: true
|
|
988
|
+
})
|
|
989
|
+
});
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/**
|
|
993
|
+
* Run filter entirely on CPU
|
|
994
|
+
*/
|
|
995
|
+
function filterDatasetCPU(state, dataId) {
|
|
996
|
+
var datasetFilters = state.filters.filter(function (f) {
|
|
997
|
+
return f.dataId.includes(dataId);
|
|
998
|
+
});
|
|
999
|
+
var dataset = state.datasets[dataId];
|
|
1000
|
+
if (!dataset) {
|
|
1001
|
+
return state;
|
|
1002
|
+
}
|
|
1003
|
+
var cpuFilteredDataset = dataset.filterTableCPU(datasetFilters, state.layers);
|
|
1004
|
+
return (0, _utils.set)(['datasets', dataId], cpuFilteredDataset, state);
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
/**
|
|
1008
|
+
* Validate parsed filters with datasets and add filterProps to field
|
|
1009
|
+
*/
|
|
1010
|
+
function validateFiltersUpdateDatasets(state) {
|
|
1011
|
+
var filtersToValidate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
1012
|
+
// TODO Better Typings here
|
|
1013
|
+
var validated = [];
|
|
1014
|
+
var failed = [];
|
|
1015
|
+
var datasets = state.datasets;
|
|
1016
|
+
var updatedDatasets = datasets;
|
|
1017
|
+
|
|
1018
|
+
// merge filters
|
|
1019
|
+
filtersToValidate.forEach(function (filter) {
|
|
1020
|
+
// we can only look for datasets define in the filter dataId
|
|
1021
|
+
var datasetIds = (0, _utils.toArray)(filter.dataId);
|
|
1022
|
+
|
|
1023
|
+
// we can merge a filter only if all datasets in filter.dataId are loaded
|
|
1024
|
+
if (datasetIds.every(function (d) {
|
|
1025
|
+
return datasets[d];
|
|
1026
|
+
})) {
|
|
1027
|
+
// all datasetIds in filter must be present the state datasets
|
|
1028
|
+
var _datasetIds$reduce = datasetIds.reduce(function (acc, datasetId) {
|
|
1029
|
+
var dataset = updatedDatasets[datasetId];
|
|
1030
|
+
var layers = state.layers.filter(function (l) {
|
|
1031
|
+
return l.config.dataId === dataset.id;
|
|
1032
|
+
});
|
|
1033
|
+
var _validateFilterWithDa = validateFilterWithData(acc.augmentedDatasets[datasetId] || dataset, filter, layers),
|
|
1034
|
+
updatedFilter = _validateFilterWithDa.filter,
|
|
1035
|
+
updatedDataset = _validateFilterWithDa.dataset;
|
|
1036
|
+
if (updatedFilter) {
|
|
1037
|
+
return _objectSpread(_objectSpread({}, acc), {}, {
|
|
1038
|
+
// merge filter props
|
|
1039
|
+
filter: acc.filter ? _objectSpread(_objectSpread({}, acc.filter), mergeFilterDomainStep(acc, updatedFilter)) : updatedFilter,
|
|
1040
|
+
applyToDatasets: [].concat((0, _toConsumableArray2["default"])(acc.applyToDatasets), [datasetId]),
|
|
1041
|
+
augmentedDatasets: _objectSpread(_objectSpread({}, acc.augmentedDatasets), {}, (0, _defineProperty2["default"])({}, datasetId, updatedDataset))
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
return acc;
|
|
1045
|
+
}, {
|
|
1046
|
+
filter: null,
|
|
1047
|
+
applyToDatasets: [],
|
|
1048
|
+
augmentedDatasets: {}
|
|
1049
|
+
}),
|
|
1050
|
+
validatedFilter = _datasetIds$reduce.filter,
|
|
1051
|
+
applyToDatasets = _datasetIds$reduce.applyToDatasets,
|
|
1052
|
+
augmentedDatasets = _datasetIds$reduce.augmentedDatasets;
|
|
1053
|
+
if (validatedFilter && (0, _lodash2["default"])(datasetIds, applyToDatasets)) {
|
|
1054
|
+
validated.push(validatedFilter);
|
|
1055
|
+
updatedDatasets = _objectSpread(_objectSpread({}, updatedDatasets), augmentedDatasets);
|
|
1056
|
+
}
|
|
1057
|
+
} else {
|
|
1058
|
+
failed.push(filter);
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
return {
|
|
1062
|
+
validated: validated,
|
|
1063
|
+
failed: failed,
|
|
1064
|
+
updatedDatasets: updatedDatasets
|
|
1065
|
+
};
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
/**
|
|
1069
|
+
* Retrieve interval bins for time filter
|
|
1070
|
+
*/
|
|
1071
|
+
function getIntervalBins(filter) {
|
|
1072
|
+
var _filter$plotType;
|
|
1073
|
+
var bins = filter.bins;
|
|
1074
|
+
var interval = (_filter$plotType = filter.plotType) === null || _filter$plotType === void 0 ? void 0 : _filter$plotType.interval;
|
|
1075
|
+
if (!interval || !bins || Object.keys(bins).length === 0) {
|
|
1076
|
+
return null;
|
|
1077
|
+
}
|
|
1078
|
+
var values = Object.values(bins);
|
|
1079
|
+
return values[0] ? values[0][interval] : null;
|
|
1080
|
+
}
|
|
1081
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZDNBcnJheSIsInJlcXVpcmUiLCJfa2V5bWlycm9yIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zb2xlIiwiX2xvZGFzaCIsIl9sb2Rhc2gyIiwiX2Jvb2xlYW5XaXRoaW4iLCJfaGVscGVycyIsIl9kZWNpbWFsIiwiX2RlZmF1bHRTZXR0aW5ncyIsIl9kYXRhVXRpbHMiLCJTY2FsZVV0aWxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfdHlwZXMiLCJfdXRpbHMiLCJfaDNVdGlscyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlRpbWVzdGFtcFN0ZXBNYXAiLCJleHBvcnRzIiwibWF4Iiwic3RlcCIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiaGlzdG9ncmFtQmlucyIsImVubGFyZ2VkSGlzdG9ncmFtQmlucyIsImR1cmF0aW9uU2Vjb25kIiwiZHVyYXRpb25NaW51dGUiLCJkdXJhdGlvbkhvdXIiLCJkdXJhdGlvbkRheSIsImR1cmF0aW9uV2VlayIsImR1cmF0aW9uWWVhciIsIlBMT1RfVFlQRVMiLCJrZXlNaXJyb3IiLCJoaXN0b2dyYW0iLCJsaW5lQ2hhcnQiLCJGSUxURVJfVVBEQVRFUl9QUk9QUyIsImRhdGFJZCIsIm5hbWUiLCJsYXllcklkIiwiTElNSVRFRF9GSUxURVJfRUZGRUNUX1BST1BTIiwiU3VwcG9ydGVkUGxvdFR5cGUiLCJGSUxURVJfVFlQRVMiLCJ0aW1lUmFuZ2UiLCJBTExfRklFTERfVFlQRVMiLCJpbnRlZ2VyIiwicmVhbCIsInJhbmdlIiwiRklMVEVSX0NPTVBPTkVOVFMiLCJzZWxlY3QiLCJtdWx0aVNlbGVjdCIsInBvbHlnb24iLCJERUZBVUxUX0ZJTFRFUl9TVFJVQ1RVUkUiLCJmcmVlemUiLCJpZCIsImZpeGVkRG9tYWluIiwiZW5sYXJnZWQiLCJpc0FuaW1hdGluZyIsImFuaW1hdGlvbldpbmRvdyIsIkFOSU1BVElPTl9XSU5ET1ciLCJmcmVlIiwic3BlZWQiLCJ0eXBlIiwiZmllbGRJZHgiLCJkb21haW4iLCJ2YWx1ZSIsInBsb3RUeXBlIiwieUF4aXMiLCJpbnRlcnZhbCIsImdwdSIsIkZJTFRFUl9JRF9MRU5HVEgiLCJMQVlFUl9GSUxURVJTIiwiZ2V0RGVmYXVsdEZpbHRlciIsInRvQXJyYXkiLCJnZW5lcmF0ZUhhc2hJZCIsInNob3VsZEFwcGx5RmlsdGVyIiwiZGF0YXNldElkIiwiZGF0YUlkcyIsImluY2x1ZGVzIiwidmFsaWRhdGVQb2x5Z29uRmlsdGVyIiwiZGF0YXNldCIsImxheWVycyIsImZhaWxlZCIsImlzVmFsaWRGaWx0ZXJWYWx1ZSIsImlzVmFsaWREYXRhc2V0IiwibGF5ZXIiLCJmaW5kIiwibCIsImZpbHRlclZhbGlkYXRvcnMiLCJ2YWxpZGF0ZUZpbHRlciIsImZpbHRlckRhdGFJZCIsImZpbHRlckRhdGFzZXRJbmRleCIsImluZGV4T2YiLCJpbml0aWFsaXplRmlsdGVyIiwiZmllbGROYW1lIiwiX2FwcGx5RmlsdGVyRmllbGROYW1lIiwiYXBwbHlGaWx0ZXJGaWVsZE5hbWUiLCJtZXJnZURvbWFpbiIsInVwZGF0ZWRGaWx0ZXIiLCJ1cGRhdGVkRGF0YXNldCIsImFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4iLCJ2YWxpZGF0ZUZpbHRlcllBeGlzIiwidmFsaWRhdGVGaWx0ZXJXaXRoRGF0YSIsImZpZWxkcyIsIl9maWx0ZXIiLCJtYXRjaGVkQXhpcyIsIl9yZWYiLCJnZXRGaWx0ZXJQbG90IiwiZ2V0RmlsdGVyUHJvcHMiLCJmaWVsZCIsImZpZWxkRG9tYWluIiwiZmlsdGVyUHJvcHMiLCJmaWVsZFR5cGUiLCJ0eXBlT3B0aW9ucyIsInN0cmluZyIsImRhdGUiLCJ0aW1lc3RhbXAiLCJnZXRQb2x5Z29uRmlsdGVyRnVuY3RvciIsImRhdGFDb250YWluZXIiLCJnZXRQb3NpdGlvbiIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJMQVlFUl9UWVBFUyIsInBvaW50IiwiaWNvbiIsImRhdGEiLCJwb3MiLCJldmVyeSIsImlzRmluaXRlIiwiaXNJblBvbHlnb24iLCJhcmMiLCJsaW5lIiwiaGV4YWdvbklkIiwiZGF0YVRvRmVhdHVyZSIsImNlbnRyb2lkcyIsImNlbnRyb2lkIiwiaW5kZXgiLCJoM0lzVmFsaWQiLCJnZXRDZW50cm9pZCIsImdldEZpbHRlckZ1bmN0aW9uIiwidmFsdWVBY2Nlc3NvciIsImRlZmF1bHRGdW5jIiwiZCIsImlzSW5SYW5nZSIsIm1hcHBlZFZhbHVlIiwiYWNjZXNzb3IiLCJBcnJheSIsImlzQXJyYXkiLCJ0aW1lVG9Vbml4TWlsbGkiLCJmb3JtYXQiLCJsYXllckZpbHRlckZ1bmN0aW9ucyIsIm1hcCIsImNvbmZpZyIsImZpbHRlckZ1bmMiLCJ1cGRhdGVGaWx0ZXJEYXRhSWQiLCJmaWx0ZXJEYXRhQnlGaWx0ZXJUeXBlcyIsIl9yZWYyIiwiZHluYW1pY0RvbWFpbkZpbHRlcnMiLCJjcHVGaWx0ZXJzIiwiZmlsdGVyRnVuY3MiLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZmlsdGVyZWRJbmRleCIsImZpbHRlckNvbnRleHQiLCJmaWx0ZXJGdW5jQ2FsbGVyIiwibnVtUm93cyIsIm1hdGNoRm9yRG9tYWluIiwibWF0Y2hGb3JSZW5kZXIiLCJnZXRGaWx0ZXJSZWNvcmQiLCJmaWx0ZXJzIiwib3B0IiwidW5kZWZpbmVkIiwiZmlsdGVyUmVjb3JkIiwiZHluYW1pY0RvbWFpbiIsImNwdSIsImYiLCJpZ25vcmVEb21haW4iLCJjcHVPbmx5IiwiZGlmZkZpbHRlcnMiLCJvbGRGaWx0ZXJSZWNvcmQiLCJmaWx0ZXJDaGFuZ2VkIiwiZW50cmllcyIsIl9yZWYzIiwiX3JlZjQiLCJfc2xpY2VkVG9BcnJheTIiLCJyZWNvcmQiLCJpdGVtcyIsIm9sZEZpbHRlciIsInByb3AiLCJjb25jYXQiLCJfcmVmNSIsIm5vdE51bGxvclVuZGVmaW5lZCIsImZpbHRlcmVkVmFsdWUiLCJnZXROdW1lcmljRmllbGREb21haW4iLCJtYXBJbmRleCIsImdldExpbmVhckRvbWFpbiIsImRpZmYiLCJnZXROdW1lcmljU3RlcFNpemUiLCJmb3JtYXROdW1iZXJCeVN0ZXAiLCJfZ2V0SGlzdG9ncmFtIiwiZ2V0SGlzdG9ncmFtIiwiZW5sYXJnZWRIaXN0b2dyYW0iLCJNYXRoIiwiYWJzIiwieCIsImV4cG9uZW50aWFsRm9ybSIsInRvRXhwb25lbnRpYWwiLCJleHBvbmVudCIsInBhcnNlRmxvYXQiLCJzcGxpdCIsIkRlY2ltYWwiLCJwb3ciLCJ0b051bWJlciIsImdldFRpbWVzdGFtcEZpZWxkRG9tYWluIiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJnZXRUaW1lV2lkZ2V0VGl0bGVGb3JtYXR0ZXIiLCJlbnRyeSIsIl9nZXRIaXN0b2dyYW0yIiwiaGlzdG9ncmFtQ29uc3RydWN0IiwiYmlucyIsImQzSGlzdG9ncmFtIiwidGhyZXNob2xkcyIsInRpY2tzIiwiYmluIiwiY291bnQiLCJ4MCIsIngxIiwidmFsIiwiYm91bmQiLCJmbG9vciIsImNlaWwiLCJib29sZWFuV2l0aGluIiwidHVyZlBvaW50IiwiaXNWYWxpZFRpbWVEb21haW4iLCJnZXRUaW1lV2lkZ2V0SGludEZvcm1hdHRlciIsInYiLCJpc05hTiIsIkJvb2xlYW4iLCJpbnB1dCIsImNvb3JkaW5hdGVzIiwiX2ZpbHRlciRtYXBwZWRWYWx1ZSIsImdldENvbHVtbkZpZWxkSWR4IiwiQ29uc29sZSIsIndhcm4iLCJzZXJpZXMiLCJyb3ciLCJyb3dJbmRleCIsInkiLCJ2YWx1ZUF0IiwiX3JlZjYiLCJzb3J0IiwiYiIsImFzY2VuZGluZyIsInlEb21haW4iLCJleHRlbnQiLCJ4RG9tYWluIiwiZ2V0RGVmYXVsdEZpbHRlclBsb3RUeXBlIiwiZmlsdGVyUGxvdFR5cGVzIiwiYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyIsImRhdGFzZXRJZHMiLCJkYXRhc2V0cyIsInJlZHVjZSIsImFjYyIsImxheWVyc1RvRmlsdGVyIiwiYXBwbGllZEZpbHRlcnMiLCJ0YWJsZSIsImZpbHRlclRhYmxlIiwib3B0aW9uIiwiZmllbGRJbmRleCIsImdldENvbHVtbkZpbHRlclByb3BzIiwibmV3RmlsdGVyIiwibWVyZ2VGaWx0ZXJEb21haW5TdGVwIiwiYXNzaWduIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImNvbWJpbmVkRG9tYWluIiwidW5pcXVlIiwiZmVhdHVyZVRvRmlsdGVyVmFsdWUiLCJmZWF0dXJlIiwiZmlsdGVySWQiLCJwcm9wZXJ0aWVzIiwiZ2V0RmlsdGVySWRJbkZlYXR1cmUiLCJnZW5lcmF0ZVBvbHlnb25GaWx0ZXIiLCJsYWJlbCIsImlzVmlzaWJsZSIsImZpbHRlckRhdGFzZXRDUFUiLCJzdGF0ZSIsImRhdGFzZXRGaWx0ZXJzIiwiY3B1RmlsdGVyZWREYXRhc2V0IiwiZmlsdGVyVGFibGVDUFUiLCJ2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyIsImZpbHRlcnNUb1ZhbGlkYXRlIiwidmFsaWRhdGVkIiwidXBkYXRlZERhdGFzZXRzIiwiX2RhdGFzZXRJZHMkcmVkdWNlIiwiX3ZhbGlkYXRlRmlsdGVyV2l0aERhIiwiYXVnbWVudGVkRGF0YXNldHMiLCJhcHBseVRvRGF0YXNldHMiLCJ2YWxpZGF0ZWRGaWx0ZXIiLCJpc0VxdWFsIiwiZ2V0SW50ZXJ2YWxCaW5zIiwiX2ZpbHRlciRwbG90VHlwZSIsInZhbHVlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWx0ZXItdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHthc2NlbmRpbmcsIGV4dGVudCwgaGlzdG9ncmFtIGFzIGQzSGlzdG9ncmFtLCB0aWNrc30gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IGtleU1pcnJvciBmcm9tICdrZXltaXJyb3InO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC9jb25zb2xlJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2guaXNlcXVhbCc7XG5cbmltcG9ydCBib29sZWFuV2l0aGluIGZyb20gJ0B0dXJmL2Jvb2xlYW4td2l0aGluJztcbmltcG9ydCB7cG9pbnQgYXMgdHVyZlBvaW50fSBmcm9tICdAdHVyZi9oZWxwZXJzJztcbmltcG9ydCB7RGVjaW1hbH0gZnJvbSAnZGVjaW1hbC5qcyc7XG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFUywgRklMVEVSX1RZUEVTLCBBTklNQVRJT05fV0lORE9XfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge25vdE51bGxvclVuZGVmaW5lZCwgdW5pcXVlLCB0aW1lVG9Vbml4TWlsbGl9IGZyb20gJy4vZGF0YS11dGlscyc7XG5pbXBvcnQgKiBhcyBTY2FsZVV0aWxzIGZyb20gJy4vZGF0YS1zY2FsZS11dGlscyc7XG5pbXBvcnQge0xBWUVSX1RZUEVTfSBmcm9tICdsYXllcnMvdHlwZXMnO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZCwgc2V0LCB0b0FycmF5fSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7Z2V0Q2VudHJvaWQsIGgzSXNWYWxpZH0gZnJvbSAnbGF5ZXJzL2gzLWhleGFnb24tbGF5ZXIvaDMtdXRpbHMnO1xuXG5pbXBvcnQge1xuICBGaWx0ZXIsXG4gIEZpbHRlckJhc2UsXG4gIFBvbHlnb25GaWx0ZXIsXG4gIERhdGFzZXRzLFxuICBGaWVsZERvbWFpbixcbiAgVGltZVJhbmdlRmllbGREb21haW4sXG4gIEhpc3RvZ3JhbUJpbixcbiAgRmVhdHVyZSxcbiAgRmVhdHVyZVZhbHVlLFxuICBWaXNTdGF0ZSxcbiAgTGluZUNoYXJ0LFxuICBUaW1lUmFuZ2VGaWx0ZXIsXG4gIFJhbmdlRmllbGREb21haW5cbn0gZnJvbSAnLi4vcmVkdWNlcnMvdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCBLZXBsZXJUYWJsZSwge0ZpZWxkLCBGaWx0ZXJSZWNvcmQsIEZpbHRlckRhdGFzZXRPcHR9IGZyb20gJy4vdGFibGUtdXRpbHMva2VwbGVyLXRhYmxlJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ2xheWVycyc7XG5pbXBvcnQge1BhcnNlZEZpbHRlcn0gZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge0RhdGFDb250YWluZXJJbnRlcmZhY2V9IGZyb20gJy4vdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJztcbmltcG9ydCB7TWlsbGlzZWNvbmR9IGZyb20gJ2Nsb3VkLXByb3ZpZGVycyc7XG5pbXBvcnQge0VudHJpZXN9IGZyb20gJ3JlZHVjZXJzJztcblxuZXhwb3J0IHR5cGUgRmlsdGVyUmVzdWx0ID0ge1xuICBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluPzogbnVtYmVyW107XG4gIGZpbHRlcmVkSW5kZXg/OiBudW1iZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlckNoYW5nZWQgPSB7XG4gIFtrZXkgaW4ga2V5b2YgRmlsdGVyUmVjb3JkXToge1xuICAgIFtrZXk6IHN0cmluZ106ICdhZGRlZCcgfCAnZGVsZXRlZCcgfCAnbmFtZV9jaGFuZ2VkJyB8ICd2YWx1ZV9jaGFuZ2VkJyB8ICdkYXRhSWRfY2hhbmdlZCc7XG4gIH0gfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgZGF0YVZhbHVlQWNjZXNzb3IgPSAoZGF0YToge2luZGV4OiBudW1iZXJ9KSA9PiBudW1iZXIgfCBudWxsO1xuXG5leHBvcnQgY29uc3QgVGltZXN0YW1wU3RlcE1hcCA9IFtcbiAge21heDogMSwgc3RlcDogMC4wNX0sXG4gIHttYXg6IDEwLCBzdGVwOiAwLjF9LFxuICB7bWF4OiAxMDAsIHN0ZXA6IDF9LFxuICB7bWF4OiA1MDAsIHN0ZXA6IDV9LFxuICB7bWF4OiAxMDAwLCBzdGVwOiAxMH0sXG4gIHttYXg6IDUwMDAsIHN0ZXA6IDUwfSxcbiAge21heDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBzdGVwOiAxMDAwfVxuXTtcblxuZXhwb3J0IGNvbnN0IGhpc3RvZ3JhbUJpbnMgPSAzMDtcbmV4cG9ydCBjb25zdCBlbmxhcmdlZEhpc3RvZ3JhbUJpbnMgPSAxMDA7XG5cbmNvbnN0IGR1cmF0aW9uU2Vjb25kID0gMTAwMDtcbmNvbnN0IGR1cmF0aW9uTWludXRlID0gZHVyYXRpb25TZWNvbmQgKiA2MDtcbmNvbnN0IGR1cmF0aW9uSG91ciA9IGR1cmF0aW9uTWludXRlICogNjA7XG5jb25zdCBkdXJhdGlvbkRheSA9IGR1cmF0aW9uSG91ciAqIDI0O1xuY29uc3QgZHVyYXRpb25XZWVrID0gZHVyYXRpb25EYXkgKiA3O1xuY29uc3QgZHVyYXRpb25ZZWFyID0gZHVyYXRpb25EYXkgKiAzNjU7XG5cbmV4cG9ydCBjb25zdCBQTE9UX1RZUEVTID0ga2V5TWlycm9yKHtcbiAgaGlzdG9ncmFtOiBudWxsLFxuICBsaW5lQ2hhcnQ6IG51bGxcbn0pO1xuXG5leHBvcnQgY29uc3QgRklMVEVSX1VQREFURVJfUFJPUFMgPSBrZXlNaXJyb3Ioe1xuICBkYXRhSWQ6IG51bGwsXG4gIG5hbWU6IG51bGwsXG4gIGxheWVySWQ6IG51bGxcbn0pO1xuXG5leHBvcnQgY29uc3QgTElNSVRFRF9GSUxURVJfRUZGRUNUX1BST1BTID0ga2V5TWlycm9yKHtcbiAgW0ZJTFRFUl9VUERBVEVSX1BST1BTLm5hbWVdOiBudWxsXG59KTtcbi8qKlxuICogTWF4IG51bWJlciBvZiBmaWx0ZXIgdmFsdWUgYnVmZmVycyB0aGF0IGRlY2suZ2wgcHJvdmlkZXNcbiAqL1xuXG5jb25zdCBTdXBwb3J0ZWRQbG90VHlwZSA9IHtcbiAgW0ZJTFRFUl9UWVBFUy50aW1lUmFuZ2VdOiB7XG4gICAgZGVmYXVsdDogJ2hpc3RvZ3JhbScsXG4gICAgW0FMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyXTogJ2xpbmVDaGFydCcsXG4gICAgW0FMTF9GSUVMRF9UWVBFUy5yZWFsXTogJ2xpbmVDaGFydCdcbiAgfSxcbiAgW0ZJTFRFUl9UWVBFUy5yYW5nZV06IHtcbiAgICBkZWZhdWx0OiAnaGlzdG9ncmFtJyxcbiAgICBbQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJdOiAnbGluZUNoYXJ0JyxcbiAgICBbQUxMX0ZJRUxEX1RZUEVTLnJlYWxdOiAnbGluZUNoYXJ0J1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgRklMVEVSX0NPTVBPTkVOVFMgPSB7XG4gIFtGSUxURVJfVFlQRVMuc2VsZWN0XTogJ1NpbmdsZVNlbGVjdEZpbHRlcicsXG4gIFtGSUxURVJfVFlQRVMubXVsdGlTZWxlY3RdOiAnTXVsdGlTZWxlY3RGaWx0ZXInLFxuICBbRklMVEVSX1RZUEVTLnRpbWVSYW5nZV06ICdUaW1lUmFuZ2VGaWx0ZXInLFxuICBbRklMVEVSX1RZUEVTLnJhbmdlXTogJ1JhbmdlRmlsdGVyJyxcbiAgW0ZJTFRFUl9UWVBFUy5wb2x5Z29uXTogJ1BvbHlnb25GaWx0ZXInXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxURVJfU1RSVUNUVVJFID0ge1xuICBkYXRhSWQ6IFtdLCAvLyBbc3RyaW5nXVxuICBmcmVlemU6IGZhbHNlLFxuICBpZDogbnVsbCxcblxuICAvLyB0aW1lIHJhbmdlIGZpbHRlciBzcGVjaWZpY1xuICBmaXhlZERvbWFpbjogZmFsc2UsXG4gIGVubGFyZ2VkOiBmYWxzZSxcbiAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICBhbmltYXRpb25XaW5kb3c6IEFOSU1BVElPTl9XSU5ET1cuZnJlZSxcbiAgc3BlZWQ6IDEsXG5cbiAgLy8gZmllbGQgc3BlY2lmaWNcbiAgbmFtZTogW10sIC8vIHN0cmluZ1xuICB0eXBlOiBudWxsLFxuICBmaWVsZElkeDogW10sIC8vIFtpbnRlZ2VyXVxuICBkb21haW46IG51bGwsXG4gIHZhbHVlOiBudWxsLFxuXG4gIC8vIHBsb3RcbiAgcGxvdFR5cGU6IFBMT1RfVFlQRVMuaGlzdG9ncmFtLFxuICB5QXhpczogbnVsbCxcbiAgaW50ZXJ2YWw6IG51bGwsXG5cbiAgLy8gbW9kZVxuICBncHU6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgRklMVEVSX0lEX0xFTkdUSCA9IDQ7XG5cbmV4cG9ydCBjb25zdCBMQVlFUl9GSUxURVJTID0gW0ZJTFRFUl9UWVBFUy5wb2x5Z29uXTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmaWx0ZXIgd2l0aCBhIGRhdGFzZXQgaWQgYXMgZGF0YUlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0RmlsdGVyKGRhdGFJZDogc3RyaW5nIHwgbnVsbCB8IHN0cmluZ1tdKTogRmlsdGVyQmFzZSB7XG4gIHJldHVybiB7XG4gICAgLi4uREVGQVVMVF9GSUxURVJfU1RSVUNUVVJFLFxuICAgIC8vIHN0b3JlIGl0IGFzIGRhdGFJZCBhbmQgaXQgY291bGQgYmUgb25lIG9yIG1hbnlcbiAgICBkYXRhSWQ6IHRvQXJyYXkoZGF0YUlkKSxcbiAgICBpZDogZ2VuZXJhdGVIYXNoSWQoRklMVEVSX0lEX0xFTkdUSClcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbHRlciBpcyB2YWxpZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZGF0YUlkXG4gKiBAcGFyYW0gIGZpbHRlciB0byB2YWxpZGF0ZVxuICogQHBhcmFtICBkYXRhc2V0SWQgaWQgdG8gdmFsaWRhdGUgZmlsdGVyIGFnYWluc3RcbiAqIEByZXR1cm4gdHJ1ZSBpZiBhIGZpbHRlciBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRBcHBseUZpbHRlcihmaWx0ZXI6IEZpbHRlciwgZGF0YXNldElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZmlsdGVyLmRhdGFJZCk7XG4gIHJldHVybiBkYXRhSWRzLmluY2x1ZGVzKGRhdGFzZXRJZCkgJiYgZmlsdGVyLnZhbHVlICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgbW9kaWZpZXMgcG9seWdvbiBmaWx0ZXIgc3RydWN0dXJlXG4gKiBAcGFyYW0gZGF0YXNldFxuICogQHBhcmFtIGZpbHRlclxuICogQHBhcmFtIGxheWVyc1xuICogQHJldHVybiAtIHtmaWx0ZXIsIGRhdGFzZXR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBvbHlnb25GaWx0ZXIoXG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICBmaWx0ZXI6IFBvbHlnb25GaWx0ZXIsXG4gIGxheWVyczogTGF5ZXJbXVxuKToge2ZpbHRlcjogUG9seWdvbkZpbHRlciB8IG51bGw7IGRhdGFzZXQ6IEtlcGxlclRhYmxlfSB7XG4gIGNvbnN0IGZhaWxlZCA9IHtkYXRhc2V0LCBmaWx0ZXI6IG51bGx9O1xuICBjb25zdCB7dmFsdWUsIGxheWVySWQsIHR5cGUsIGRhdGFJZH0gPSBmaWx0ZXI7XG5cbiAgaWYgKCFsYXllcklkIHx8ICFpc1ZhbGlkRmlsdGVyVmFsdWUodHlwZSwgdmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhaWxlZDtcbiAgfVxuXG4gIGNvbnN0IGlzVmFsaWREYXRhc2V0ID0gZGF0YUlkLmluY2x1ZGVzKGRhdGFzZXQuaWQpO1xuXG4gIGlmICghaXNWYWxpZERhdGFzZXQpIHtcbiAgICByZXR1cm4gZmFpbGVkO1xuICB9XG5cbiAgY29uc3QgbGF5ZXIgPSBsYXllcnMuZmluZChsID0+IGxheWVySWQuaW5jbHVkZXMobC5pZCkpO1xuXG4gIGlmICghbGF5ZXIpIHtcbiAgICByZXR1cm4gZmFpbGVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaWx0ZXI6IHtcbiAgICAgIC4uLmZpbHRlcixcbiAgICAgIGZyZWV6ZTogdHJ1ZSxcbiAgICAgIGZpZWxkSWR4OiBbXVxuICAgIH0sXG4gICAgZGF0YXNldFxuICB9O1xufVxuXG4vKipcbiAqIEN1c3RvbSBmaWx0ZXIgdmFsaWRhdG9yc1xuICovXG5jb25zdCBmaWx0ZXJWYWxpZGF0b3JzID0ge1xuICBbRklMVEVSX1RZUEVTLnBvbHlnb25dOiB2YWxpZGF0ZVBvbHlnb25GaWx0ZXJcbn07XG5cbi8qKlxuICogRGVmYXVsdCB2YWxpZGF0ZSBmaWx0ZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBkYXRhc2V0XG4gKiBAcGFyYW0gZmlsdGVyXG4gKiBAcmV0dXJuIC0ge2ZpbHRlciwgZGF0YXNldH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmlsdGVyKFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSxcbiAgZmlsdGVyOiBQYXJzZWRGaWx0ZXJcbik6IHtmaWx0ZXI6IEZpbHRlciB8IG51bGw7IGRhdGFzZXQ6IEtlcGxlclRhYmxlfSB7XG4gIC8vIG1hdGNoIGZpbHRlci5kYXRhSWRcbiAgY29uc3QgZmFpbGVkID0ge2RhdGFzZXQsIGZpbHRlcjogbnVsbH07XG4gIGNvbnN0IGZpbHRlckRhdGFJZCA9IHRvQXJyYXkoZmlsdGVyLmRhdGFJZCk7XG5cbiAgY29uc3QgZmlsdGVyRGF0YXNldEluZGV4ID0gZmlsdGVyRGF0YUlkLmluZGV4T2YoZGF0YXNldC5pZCk7XG4gIGlmIChmaWx0ZXJEYXRhc2V0SW5kZXggPCAwKSB7XG4gICAgLy8gdGhlIGN1cnJlbnQgZmlsdGVyIGlzIG5vdCBtYXBwZWQgYWdhaW5zdCB0aGUgY3VycmVudCBkYXRhc2V0XG4gICAgcmV0dXJuIGZhaWxlZDtcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgaW5pdGlhbGl6ZUZpbHRlcjogRmlsdGVyID0ge1xuICAgIC4uLmdldERlZmF1bHRGaWx0ZXIoZmlsdGVyLmRhdGFJZCksXG4gICAgLi4uZmlsdGVyLFxuICAgIGRhdGFJZDogZmlsdGVyRGF0YUlkLFxuICAgIG5hbWU6IHRvQXJyYXkoZmlsdGVyLm5hbWUpXG4gIH07XG5cbiAgY29uc3QgZmllbGROYW1lID0gaW5pdGlhbGl6ZUZpbHRlci5uYW1lW2ZpbHRlckRhdGFzZXRJbmRleF07XG4gIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IHVwZGF0ZWREYXRhc2V0fSA9IGFwcGx5RmlsdGVyRmllbGROYW1lKFxuICAgIGluaXRpYWxpemVGaWx0ZXIsXG4gICAgZGF0YXNldCxcbiAgICBmaWVsZE5hbWUsXG4gICAgZmlsdGVyRGF0YXNldEluZGV4LFxuICAgIHttZXJnZURvbWFpbjogdHJ1ZX1cbiAgKTtcblxuICBpZiAoIXVwZGF0ZWRGaWx0ZXIpIHtcbiAgICByZXR1cm4gZmFpbGVkO1xuICB9XG5cbiAgdXBkYXRlZEZpbHRlci52YWx1ZSA9IGFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4oZmlsdGVyLnZhbHVlLCB1cGRhdGVkRmlsdGVyKTtcbiAgdXBkYXRlZEZpbHRlci5lbmxhcmdlZCA9XG4gICAgdHlwZW9mIGZpbHRlci5lbmxhcmdlZCA9PT0gJ2Jvb2xlYW4nID8gZmlsdGVyLmVubGFyZ2VkIDogdXBkYXRlZEZpbHRlci5lbmxhcmdlZDtcblxuICBpZiAodXBkYXRlZEZpbHRlci52YWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGNhbm5vdCBhZGp1c3Qgc2F2ZWQgdmFsdWUgdG8gZmlsdGVyXG4gICAgcmV0dXJuIGZhaWxlZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmlsdGVyOiB2YWxpZGF0ZUZpbHRlcllBeGlzKHVwZGF0ZWRGaWx0ZXIsIHVwZGF0ZWREYXRhc2V0KSxcbiAgICBkYXRhc2V0OiB1cGRhdGVkRGF0YXNldFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGZpbHRlciBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIGNhbGN1bGF0ZSBkb21haW4gYW5kIGZpZWxkSWR4IGJhc2VkIG5ldyBmaWVsZHMgYW5kIGRhdGFcbiAqXG4gKiBAcGFyYW0gZGF0YXNldFxuICogQHBhcmFtIGZpbHRlciAtIGZpbHRlciB0byBiZSB2YWxpZGF0ZVxuICogQHBhcmFtIGxheWVycyAtIGxheWVyc1xuICogQHJldHVybiB2YWxpZGF0ZWQgZmlsdGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbHRlcldpdGhEYXRhKFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSxcbiAgZmlsdGVyOiBQYXJzZWRGaWx0ZXIsXG4gIGxheWVyczogTGF5ZXJbXVxuKToge2ZpbHRlcjogRmlsdGVyOyBkYXRhc2V0OiBLZXBsZXJUYWJsZX0ge1xuICByZXR1cm4gZmlsdGVyLnR5cGUgJiYgZmlsdGVyVmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShmaWx0ZXIudHlwZSlcbiAgICA/IGZpbHRlclZhbGlkYXRvcnNbZmlsdGVyLnR5cGVdKGRhdGFzZXQsIGZpbHRlciwgbGF5ZXJzKVxuICAgIDogdmFsaWRhdGVGaWx0ZXIoZGF0YXNldCwgZmlsdGVyKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBZQXhpc1xuICogQHBhcmFtIGZpbHRlclxuICogQHBhcmFtIGRhdGFzZXRcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmlsdGVyWUF4aXMoZmlsdGVyLCBkYXRhc2V0KSB7XG4gIC8vIFRPRE86IHZhbGlkYXRlIHlBeGlzIGFnYWluc3Qgb3RoZXIgZGF0YXNldHNcblxuICBjb25zdCB7ZmllbGRzfSA9IGRhdGFzZXQ7XG4gIGNvbnN0IHt5QXhpc30gPSBmaWx0ZXI7XG4gIC8vIFRPRE86IHZhbGlkYXRlIHlBeGlzIGFnYWluc3Qgb3RoZXIgZGF0YXNldHNcbiAgaWYgKHlBeGlzKSB7XG4gICAgY29uc3QgbWF0Y2hlZEF4aXMgPSBmaWVsZHMuZmluZCgoe25hbWUsIHR5cGV9KSA9PiBuYW1lID09PSB5QXhpcy5uYW1lICYmIHR5cGUgPT09IHlBeGlzLnR5cGUpO1xuXG4gICAgZmlsdGVyID0gbWF0Y2hlZEF4aXNcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgICB5QXhpczogbWF0Y2hlZEF4aXMsXG4gICAgICAgICAgLi4uZ2V0RmlsdGVyUGxvdCh7Li4uZmlsdGVyLCB5QXhpczogbWF0Y2hlZEF4aXN9LCBkYXRhc2V0KVxuICAgICAgICB9XG4gICAgICA6IGZpbHRlcjtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXI7XG59XG5cbi8qKlxuICogR2V0IGRlZmF1bHQgZmlsdGVyIHByb3AgYmFzZWQgb24gZmllbGQgdHlwZVxuICpcbiAqIEBwYXJhbSBmaWVsZFxuICogQHBhcmFtIGZpZWxkRG9tYWluXG4gKiBAcmV0dXJucyBkZWZhdWx0IGZpbHRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyUHJvcHMoXG4gIGZpZWxkOiBGaWVsZCxcbiAgZmllbGREb21haW46IEZpZWxkRG9tYWluXG4pOiBQYXJ0aWFsPEZpbHRlcj4gJiB7ZmllbGRUeXBlOiBzdHJpbmd9IHtcbiAgY29uc3QgZmlsdGVyUHJvcHMgPSB7XG4gICAgLi4uZmllbGREb21haW4sXG4gICAgZmllbGRUeXBlOiBmaWVsZC50eXBlXG4gIH07XG5cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZmlsdGVyUHJvcHMsXG4gICAgICAgIHZhbHVlOiBmaWVsZERvbWFpbi5kb21haW4sXG4gICAgICAgIHR5cGU6IEZJTFRFUl9UWVBFUy5yYW5nZSxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICB0eXBlT3B0aW9uczogW0ZJTFRFUl9UWVBFUy5yYW5nZV0sXG4gICAgICAgIGdwdTogdHJ1ZVxuICAgICAgfTtcblxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW46XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5maWx0ZXJQcm9wcyxcbiAgICAgICAgdHlwZTogRklMVEVSX1RZUEVTLnNlbGVjdCxcbiAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgIGdwdTogZmFsc2VcbiAgICAgIH07XG5cbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmc6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuZGF0ZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmZpbHRlclByb3BzLFxuICAgICAgICB0eXBlOiBGSUxURVJfVFlQRVMubXVsdGlTZWxlY3QsXG4gICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgZ3B1OiBmYWxzZVxuICAgICAgfTtcblxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmZpbHRlclByb3BzLFxuICAgICAgICB0eXBlOiBGSUxURVJfVFlQRVMudGltZVJhbmdlLFxuICAgICAgICBlbmxhcmdlZDogdHJ1ZSxcbiAgICAgICAgZml4ZWREb21haW46IHRydWUsXG4gICAgICAgIHZhbHVlOiBmaWx0ZXJQcm9wcy5kb21haW4sXG4gICAgICAgIGdwdTogdHJ1ZVxuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFBvbHlnb25GaWx0ZXJGdW5jdG9yID0gKGxheWVyLCBmaWx0ZXIsIGRhdGFDb250YWluZXIpID0+IHtcbiAgY29uc3QgZ2V0UG9zaXRpb24gPSBsYXllci5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuXG4gIHN3aXRjaCAobGF5ZXIudHlwZSkge1xuICAgIGNhc2UgTEFZRVJfVFlQRVMucG9pbnQ6XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5pY29uOlxuICAgICAgcmV0dXJuIGRhdGEgPT4ge1xuICAgICAgICBjb25zdCBwb3MgPSBnZXRQb3NpdGlvbihkYXRhKTtcbiAgICAgICAgcmV0dXJuIHBvcy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpICYmIGlzSW5Qb2x5Z29uKHBvcywgZmlsdGVyLnZhbHVlKTtcbiAgICAgIH07XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5hcmM6XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5saW5lOlxuICAgICAgcmV0dXJuIGRhdGEgPT4ge1xuICAgICAgICBjb25zdCBwb3MgPSBnZXRQb3NpdGlvbihkYXRhKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBwb3MuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSAmJlxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFtwb3NbMF0sIHBvc1sxXV0sXG4gICAgICAgICAgICBbcG9zWzNdLCBwb3NbNF1dXG4gICAgICAgICAgXS5ldmVyeShwb2ludCA9PiBpc0luUG9seWdvbihwb2ludCwgZmlsdGVyLnZhbHVlKSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5oZXhhZ29uSWQ6XG4gICAgICBpZiAobGF5ZXIuZGF0YVRvRmVhdHVyZSAmJiBsYXllci5kYXRhVG9GZWF0dXJlLmNlbnRyb2lkcykge1xuICAgICAgICByZXR1cm4gZGF0YSA9PiB7XG4gICAgICAgICAgLy8gbnVsbCBvciBnZXRDZW50cm9pZCh7aWR9KVxuICAgICAgICAgIGNvbnN0IGNlbnRyb2lkID0gbGF5ZXIuZGF0YVRvRmVhdHVyZS5jZW50cm9pZHNbZGF0YS5pbmRleF07XG4gICAgICAgICAgcmV0dXJuIGNlbnRyb2lkICYmIGlzSW5Qb2x5Z29uKGNlbnRyb2lkLCBmaWx0ZXIudmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGEgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGdldFBvc2l0aW9uKGRhdGEpO1xuICAgICAgICBpZiAoIWgzSXNWYWxpZChpZCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9zID0gZ2V0Q2VudHJvaWQoe2lkfSk7XG4gICAgICAgIHJldHVybiBwb3MuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSAmJiBpc0luUG9seWdvbihwb3MsIGZpbHRlci52YWx1ZSk7XG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKCkgPT4gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0gcGFyYW0gQW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHJvdyByZWNvcmQuXG4gKiBAcGFyYW0gcGFyYW0uaW5kZXggSW5kZXggb2YgdGhlIHJvdyBpbiBkYXRhIGNvbnRhaW5lci5cbiAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSB0byBrZWVwIHRoZSBlbGVtZW50LCBvciBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnR5cGUgZmlsdGVyRnVuY3Rpb24gPSAoZGF0YToge2luZGV4OiBudW1iZXJ9KSA9PiBib29sZWFuO1xuLyoqXG4gKiBAcGFyYW0gZmllbGQgZGF0YXNldCBGaWVsZFxuICogQHBhcmFtIGRhdGFJZCBEYXRhc2V0IGlkXG4gKiBAcGFyYW0gZmlsdGVyIEZpbHRlciBvYmplY3RcbiAqIEBwYXJhbSBsYXllcnMgbGlzdCBvZiBsYXllcnMgdG8gZmlsdGVyIHVwb25cbiAqIEBwYXJhbSBkYXRhQ29udGFpbmVyIERhdGEgY29udGFpbmVyXG4gKiBAcmV0dXJuIGZpbHRlckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJGdW5jdGlvbihcbiAgZmllbGQ6IEZpZWxkIHwgbnVsbCxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGZpbHRlcjogRmlsdGVyLFxuICBsYXllcnM6IExheWVyW10sXG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2Vcbik6IGZpbHRlckZ1bmN0aW9uIHtcbiAgLy8gZmllbGQgY291bGQgYmUgbnVsbCBpbiBwb2x5Z29uIGZpbHRlclxuICBjb25zdCB2YWx1ZUFjY2Vzc29yID0gZmllbGQgPyBmaWVsZC52YWx1ZUFjY2Vzc29yIDogZGF0YSA9PiBudWxsO1xuICBjb25zdCBkZWZhdWx0RnVuYyA9IGQgPT4gdHJ1ZTtcblxuICBzd2l0Y2ggKGZpbHRlci50eXBlKSB7XG4gICAgY2FzZSBGSUxURVJfVFlQRVMucmFuZ2U6XG4gICAgICByZXR1cm4gZGF0YSA9PiBpc0luUmFuZ2UodmFsdWVBY2Nlc3NvcihkYXRhKSwgZmlsdGVyLnZhbHVlKTtcbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5tdWx0aVNlbGVjdDpcbiAgICAgIHJldHVybiBkYXRhID0+IGZpbHRlci52YWx1ZS5pbmNsdWRlcyh2YWx1ZUFjY2Vzc29yKGRhdGEpKTtcbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5zZWxlY3Q6XG4gICAgICByZXR1cm4gZGF0YSA9PiB2YWx1ZUFjY2Vzc29yKGRhdGEpID09PSBmaWx0ZXIudmFsdWU7XG4gICAgY2FzZSBGSUxURVJfVFlQRVMudGltZVJhbmdlOlxuICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdEZ1bmM7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IGdldChmaWVsZCwgWydmaWx0ZXJQcm9wcycsICdtYXBwZWRWYWx1ZSddKTtcbiAgICAgIGNvbnN0IGFjY2Vzc29yID0gQXJyYXkuaXNBcnJheShtYXBwZWRWYWx1ZSlcbiAgICAgICAgPyBkYXRhID0+IG1hcHBlZFZhbHVlW2RhdGEuaW5kZXhdXG4gICAgICAgIDogZGF0YSA9PiB0aW1lVG9Vbml4TWlsbGkodmFsdWVBY2Nlc3NvcihkYXRhKSwgZmllbGQuZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXRhID0+IGlzSW5SYW5nZShhY2Nlc3NvcihkYXRhKSwgZmlsdGVyLnZhbHVlKTtcbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5wb2x5Z29uOlxuICAgICAgaWYgKCFsYXllcnMgfHwgIWxheWVycy5sZW5ndGggfHwgIWZpbHRlci5sYXllcklkKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0RnVuYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxheWVyRmlsdGVyRnVuY3Rpb25zID0gZmlsdGVyLmxheWVySWRcbiAgICAgICAgLm1hcChpZCA9PiBsYXllcnMuZmluZChsID0+IGwuaWQgPT09IGlkKSlcbiAgICAgICAgLmZpbHRlcihsID0+IGwgJiYgbC5jb25maWcuZGF0YUlkID09PSBkYXRhSWQpXG4gICAgICAgIC5tYXAobGF5ZXIgPT4gZ2V0UG9seWdvbkZpbHRlckZ1bmN0b3IobGF5ZXIsIGZpbHRlciwgZGF0YUNvbnRhaW5lcikpO1xuXG4gICAgICByZXR1cm4gZGF0YSA9PiBsYXllckZpbHRlckZ1bmN0aW9ucy5ldmVyeShmaWx0ZXJGdW5jID0+IGZpbHRlckZ1bmMoZGF0YSkpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGVmYXVsdEZ1bmM7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbHRlckRhdGFJZChkYXRhSWQ6IHN0cmluZyk6IEZpbHRlckJhc2Uge1xuICByZXR1cm4gZ2V0RGVmYXVsdEZpbHRlcihkYXRhSWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRGF0YUJ5RmlsdGVyVHlwZXMoXG4gIHtcbiAgICBkeW5hbWljRG9tYWluRmlsdGVycyxcbiAgICBjcHVGaWx0ZXJzLFxuICAgIGZpbHRlckZ1bmNzXG4gIH06IHtcbiAgICBkeW5hbWljRG9tYWluRmlsdGVyczogRmlsdGVyW10gfCBudWxsO1xuICAgIGNwdUZpbHRlcnM6IEZpbHRlcltdIHwgbnVsbDtcbiAgICBmaWx0ZXJGdW5jczoge1xuICAgICAgW2tleTogc3RyaW5nXTogZmlsdGVyRnVuY3Rpb247XG4gICAgfTtcbiAgfSxcbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZVxuKTogRmlsdGVyUmVzdWx0IHtcbiAgY29uc3QgZmlsdGVyZWRJbmRleEZvckRvbWFpbjogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZmlsdGVyZWRJbmRleDogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdCBmaWx0ZXJDb250ZXh0ID0ge2luZGV4OiAtMSwgZGF0YUNvbnRhaW5lcn07XG4gIGNvbnN0IGZpbHRlckZ1bmNDYWxsZXIgPSAoZmlsdGVyOiBGaWx0ZXIpID0+IGZpbHRlckZ1bmNzW2ZpbHRlci5pZF0oZmlsdGVyQ29udGV4dCk7XG5cbiAgY29uc3QgbnVtUm93cyA9IGRhdGFDb250YWluZXIubnVtUm93cygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJvd3M7ICsraSkge1xuICAgIGZpbHRlckNvbnRleHQuaW5kZXggPSBpO1xuXG4gICAgY29uc3QgbWF0Y2hGb3JEb21haW4gPSBkeW5hbWljRG9tYWluRmlsdGVycyAmJiBkeW5hbWljRG9tYWluRmlsdGVycy5ldmVyeShmaWx0ZXJGdW5jQ2FsbGVyKTtcbiAgICBpZiAobWF0Y2hGb3JEb21haW4pIHtcbiAgICAgIGZpbHRlcmVkSW5kZXhGb3JEb21haW4ucHVzaChmaWx0ZXJDb250ZXh0LmluZGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaEZvclJlbmRlciA9IGNwdUZpbHRlcnMgJiYgY3B1RmlsdGVycy5ldmVyeShmaWx0ZXJGdW5jQ2FsbGVyKTtcbiAgICBpZiAobWF0Y2hGb3JSZW5kZXIpIHtcbiAgICAgIGZpbHRlcmVkSW5kZXgucHVzaChmaWx0ZXJDb250ZXh0LmluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLihkeW5hbWljRG9tYWluRmlsdGVycyA/IHtmaWx0ZXJlZEluZGV4Rm9yRG9tYWlufSA6IHt9KSxcbiAgICAuLi4oY3B1RmlsdGVycyA/IHtmaWx0ZXJlZEluZGV4fSA6IHt9KVxuICB9O1xufVxuXG4vKipcbiAqIEdldCBhIHJlY29yZCBvZiBmaWx0ZXJzIGJhc2VkIG9uIGRvbWFpbiB0eXBlIGFuZCBncHUgLyBjcHVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbHRlclJlY29yZChcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGZpbHRlcnM6IEZpbHRlcltdLFxuICBvcHQ6IEZpbHRlckRhdGFzZXRPcHQgPSB7fVxuKTogRmlsdGVyUmVjb3JkIHtcbiAgY29uc3QgZmlsdGVyUmVjb3JkOiBGaWx0ZXJSZWNvcmQgPSB7XG4gICAgZHluYW1pY0RvbWFpbjogW10sXG4gICAgZml4ZWREb21haW46IFtdLFxuICAgIGNwdTogW10sXG4gICAgZ3B1OiBbXVxuICB9O1xuXG4gIGZpbHRlcnMuZm9yRWFjaChmID0+IHtcbiAgICBpZiAoaXNWYWxpZEZpbHRlclZhbHVlKGYudHlwZSwgZi52YWx1ZSkgJiYgdG9BcnJheShmLmRhdGFJZCkuaW5jbHVkZXMoZGF0YUlkKSkge1xuICAgICAgKGYuZml4ZWREb21haW4gfHwgb3B0Lmlnbm9yZURvbWFpblxuICAgICAgICA/IGZpbHRlclJlY29yZC5maXhlZERvbWFpblxuICAgICAgICA6IGZpbHRlclJlY29yZC5keW5hbWljRG9tYWluXG4gICAgICApLnB1c2goZik7XG5cbiAgICAgIChmLmdwdSAmJiAhb3B0LmNwdU9ubHkgPyBmaWx0ZXJSZWNvcmQuZ3B1IDogZmlsdGVyUmVjb3JkLmNwdSkucHVzaChmKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmaWx0ZXJSZWNvcmQ7XG59XG5cbi8qKlxuICogQ29tcGFyZSBmaWx0ZXIgcmVjb3JkcyB0byBnZXQgd2hhdCBoYXMgY2hhbmdlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkZpbHRlcnMoXG4gIGZpbHRlclJlY29yZDogRmlsdGVyUmVjb3JkLFxuICBvbGRGaWx0ZXJSZWNvcmQ6IEZpbHRlclJlY29yZCB8IHt9ID0ge31cbik6IEZpbHRlckNoYW5nZWQge1xuICBsZXQgZmlsdGVyQ2hhbmdlZDogUGFydGlhbDxGaWx0ZXJDaGFuZ2VkPiA9IHt9O1xuXG4gIChPYmplY3QuZW50cmllcyhmaWx0ZXJSZWNvcmQpIGFzIEVudHJpZXM8RmlsdGVyUmVjb3JkPikuZm9yRWFjaCgoW3JlY29yZCwgaXRlbXNdKSA9PiB7XG4gICAgaXRlbXMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgY29uc3Qgb2xkRmlsdGVyOiBGaWx0ZXIgPSAob2xkRmlsdGVyUmVjb3JkW3JlY29yZF0gfHwgW10pLmZpbmQoXG4gICAgICAgIChmOiBGaWx0ZXIpID0+IGYuaWQgPT09IGZpbHRlci5pZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICAgICAgLy8gYWRkZWRcbiAgICAgICAgZmlsdGVyQ2hhbmdlZCA9IHNldChbcmVjb3JkLCBmaWx0ZXIuaWRdLCAnYWRkZWQnLCBmaWx0ZXJDaGFuZ2VkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNoZWNrICB3aGF0IGhhcyBjaGFuZ2VkXG4gICAgICAgIFsnbmFtZScsICd2YWx1ZScsICdkYXRhSWQnXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgIGlmIChmaWx0ZXJbcHJvcF0gIT09IG9sZEZpbHRlcltwcm9wXSkge1xuICAgICAgICAgICAgZmlsdGVyQ2hhbmdlZCA9IHNldChbcmVjb3JkLCBmaWx0ZXIuaWRdLCBgJHtwcm9wfV9jaGFuZ2VkYCwgZmlsdGVyQ2hhbmdlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIChvbGRGaWx0ZXJSZWNvcmRbcmVjb3JkXSB8fCBbXSkuZm9yRWFjaCgob2xkRmlsdGVyOiBGaWx0ZXIpID0+IHtcbiAgICAgIC8vIGRlbGV0ZWRcbiAgICAgIGlmICghaXRlbXMuZmluZChmID0+IGYuaWQgPT09IG9sZEZpbHRlci5pZCkpIHtcbiAgICAgICAgZmlsdGVyQ2hhbmdlZCA9IHNldChbcmVjb3JkLCBvbGRGaWx0ZXIuaWRdLCAnZGVsZXRlZCcsIGZpbHRlckNoYW5nZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gey4uLntkeW5hbWljRG9tYWluOiBudWxsLCBmaXhlZERvbWFpbjogbnVsbCwgY3B1OiBudWxsLCBncHU6IG51bGx9LCAuLi5maWx0ZXJDaGFuZ2VkfTtcbn1cbi8qKlxuICogQ2FsbCBieSBwYXJzaW5nIGZpbHRlcnMgZnJvbSBVUkxcbiAqIENoZWNrIGlmIHZhbHVlIG9mIGZpbHRlciB3aXRoaW4gZmlsdGVyIGRvbWFpbiwgaWYgbm90IGFkanVzdCBpdCB0byBtYXRjaFxuICogZmlsdGVyIGRvbWFpblxuICpcbiAqIEByZXR1cm5zIHZhbHVlIC0gYWRqdXN0ZWQgdmFsdWUgdG8gbWF0Y2ggZmlsdGVyIG9yIG51bGwgdG8gcmVtb3ZlIGZpbHRlclxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5leHBvcnQgZnVuY3Rpb24gYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbih2YWx1ZTogRmlsdGVyWyd2YWx1ZSddLCB7ZG9tYWluLCB0eXBlfSkge1xuICBpZiAoIWRvbWFpbiB8fCAhdHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRklMVEVSX1RZUEVTLnJhbmdlOlxuICAgIGNhc2UgRklMVEVSX1RZUEVTLnRpbWVSYW5nZTpcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHJldHVybiBkb21haW4ubWFwKGQgPT4gZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGQsIGkpID0+IChub3ROdWxsb3JVbmRlZmluZWQoZCkgJiYgaXNJblJhbmdlKGQsIGRvbWFpbikgPyBkIDogZG9tYWluW2ldKSk7XG5cbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5tdWx0aVNlbGVjdDpcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyZWRWYWx1ZSA9IHZhbHVlLmZpbHRlcihkID0+IGRvbWFpbi5pbmNsdWRlcyhkKSk7XG4gICAgICByZXR1cm4gZmlsdGVyZWRWYWx1ZS5sZW5ndGggPyBmaWx0ZXJlZFZhbHVlIDogW107XG5cbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5zZWxlY3Q6XG4gICAgICByZXR1cm4gZG9tYWluLmluY2x1ZGVzKHZhbHVlKSA/IHZhbHVlIDogdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbi8qKlxuICogQ2FsY3VsYXRlIG51bWVyaWMgZG9tYWluIGFuZCBzdWl0YWJsZSBzdGVwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROdW1lcmljRmllbGREb21haW4oXG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UsXG4gIHZhbHVlQWNjZXNzb3I6IGRhdGFWYWx1ZUFjY2Vzc29yXG4pOiBSYW5nZUZpZWxkRG9tYWluIHtcbiAgbGV0IGRvbWFpbjogW251bWJlciwgbnVtYmVyXSA9IFswLCAxXTtcbiAgbGV0IHN0ZXAgPSAwLjE7XG5cbiAgY29uc3QgbWFwcGVkVmFsdWUgPSBkYXRhQ29udGFpbmVyLm1hcEluZGV4KHZhbHVlQWNjZXNzb3IpO1xuXG4gIGlmIChkYXRhQ29udGFpbmVyLm51bVJvd3MoKSA+IDEpIHtcbiAgICBkb21haW4gPSBTY2FsZVV0aWxzLmdldExpbmVhckRvbWFpbihtYXBwZWRWYWx1ZSk7XG4gICAgY29uc3QgZGlmZiA9IGRvbWFpblsxXSAtIGRvbWFpblswXTtcblxuICAgIC8vIGluIGNhc2UgZXF1YWwgZG9tYWluLCBbOTYsIDk2XSwgd2hpY2ggd2lsbCBicmVhayBxdWFudGl6ZSBzY2FsZVxuICAgIGlmICghZGlmZikge1xuICAgICAgZG9tYWluWzFdID0gZG9tYWluWzBdICsgMTtcbiAgICB9XG5cbiAgICBzdGVwID0gZ2V0TnVtZXJpY1N0ZXBTaXplKGRpZmYpIHx8IHN0ZXA7XG4gICAgZG9tYWluWzBdID0gZm9ybWF0TnVtYmVyQnlTdGVwKGRvbWFpblswXSwgc3RlcCwgJ2Zsb29yJyk7XG4gICAgZG9tYWluWzFdID0gZm9ybWF0TnVtYmVyQnlTdGVwKGRvbWFpblsxXSwgc3RlcCwgJ2NlaWwnKTtcbiAgfVxuXG4gIGNvbnN0IHtoaXN0b2dyYW0sIGVubGFyZ2VkSGlzdG9ncmFtfSA9IGdldEhpc3RvZ3JhbShkb21haW4sIG1hcHBlZFZhbHVlKTtcblxuICByZXR1cm4ge2RvbWFpbiwgc3RlcCwgaGlzdG9ncmFtLCBlbmxhcmdlZEhpc3RvZ3JhbX07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHN0ZXAgc2l6ZSBmb3IgcmFuZ2UgYW5kIHRpbWVyYW5nZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE51bWVyaWNTdGVwU2l6ZShkaWZmOiBudW1iZXIpOiBudW1iZXIge1xuICBkaWZmID0gTWF0aC5hYnMoZGlmZik7XG5cbiAgaWYgKGRpZmYgPiAxMDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmIChkaWZmID4gMykge1xuICAgIHJldHVybiAwLjAxO1xuICB9IGVsc2UgaWYgKGRpZmYgPiAxKSB7XG4gICAgcmV0dXJuIDAuMDAxO1xuICB9XG4gIC8vIFRyeSB0byBnZXQgYXQgbGVhc3QgMTAwMCBzdGVwcyAtIGFuZCBrZWVwIHRoZSBzdGVwIHNpemUgYmVsb3cgdGhhdCBvZlxuICAvLyB0aGUgKGRpZmYgPiAxKSBjYXNlLlxuICBjb25zdCB4ID0gZGlmZiAvIDEwMDA7XG4gIC8vIEZpbmQgdGhlIGV4cG9uZW50IGFuZCB0cnVuY2F0ZSB0byAxMCB0byB0aGUgcG93ZXIgb2YgdGhhdCBleHBvbmVudFxuXG4gIGNvbnN0IGV4cG9uZW50aWFsRm9ybSA9IHgudG9FeHBvbmVudGlhbCgpO1xuICBjb25zdCBleHBvbmVudCA9IHBhcnNlRmxvYXQoZXhwb25lbnRpYWxGb3JtLnNwbGl0KCdlJylbMV0pO1xuXG4gIC8vIEdldHRpbmcgcmVhZHkgZm9yIG5vZGUgMTJcbiAgLy8gdGhpcyBpcyB3aHkgd2UgbmVlZCBkZWNpbWFsLmpzXG4gIC8vIE1hdGgucG93KDEwLCAtNSkgPSAwLjAwMDAwOTk5OTk5OTk5OTk5OTk5OVxuICAvLyB0aGUgYWJvdmUgcmVzdWx0IHNob3dzIGluIGJyb3dzZXIgYW5kIG5vZGUgMTBcbiAgLy8gbm9kZSAxMiBiZWhhdmVzIGNvcnJlY3RseVxuICByZXR1cm4gbmV3IERlY2ltYWwoMTApLnBvdyhleHBvbmVudCkudG9OdW1iZXIoKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGltZXN0YW1wIGRvbWFpbiBhbmQgc3VpdGFibGUgc3RlcFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXN0YW1wRmllbGREb21haW4oXG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UsXG4gIHZhbHVlQWNjZXNzb3I6IGRhdGFWYWx1ZUFjY2Vzc29yXG4pOiBUaW1lUmFuZ2VGaWVsZERvbWFpbiB7XG4gIC8vIHRvIGF2b2lkIGNvbnZlcnRpbmcgc3RyaW5nIGZvcm1hdCB0aW1lIHRvIGVwb2NoXG4gIC8vIGV2ZXJ5IHRpbWUgd2UgY29tcGFyZSB3ZSBzdG9yZSBhIHZhbHVlIG1hcHBlZCB0byBpbnQgaW4gZmlsdGVyIGRvbWFpblxuXG4gIGNvbnN0IG1hcHBlZFZhbHVlID0gZGF0YUNvbnRhaW5lci5tYXBJbmRleCh2YWx1ZUFjY2Vzc29yKTtcbiAgY29uc3QgZG9tYWluID0gU2NhbGVVdGlscy5nZXRMaW5lYXJEb21haW4obWFwcGVkVmFsdWUpO1xuICBjb25zdCBkZWZhdWx0VGltZUZvcm1hdCA9IGdldFRpbWVXaWRnZXRUaXRsZUZvcm1hdHRlcihkb21haW4pO1xuXG4gIGxldCBzdGVwID0gMC4wMTtcblxuICBjb25zdCBkaWZmID0gZG9tYWluWzFdIC0gZG9tYWluWzBdO1xuICBjb25zdCBlbnRyeSA9IFRpbWVzdGFtcFN0ZXBNYXAuZmluZChmID0+IGYubWF4ID49IGRpZmYpO1xuICBpZiAoZW50cnkpIHtcbiAgICBzdGVwID0gZW50cnkuc3RlcDtcbiAgfVxuXG4gIGNvbnN0IHtoaXN0b2dyYW0sIGVubGFyZ2VkSGlzdG9ncmFtfSA9IGdldEhpc3RvZ3JhbShkb21haW4sIG1hcHBlZFZhbHVlKTtcblxuICByZXR1cm4ge1xuICAgIGRvbWFpbixcbiAgICBzdGVwLFxuICAgIG1hcHBlZFZhbHVlLFxuICAgIGhpc3RvZ3JhbSxcbiAgICBlbmxhcmdlZEhpc3RvZ3JhbSxcbiAgICBkZWZhdWx0VGltZUZvcm1hdFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlzdG9ncmFtQ29uc3RydWN0KFxuICBkb21haW46IFtudW1iZXIsIG51bWJlcl0sXG4gIG1hcHBlZFZhbHVlOiAoTWlsbGlzZWNvbmQgfCBudW1iZXIpW10sXG4gIGJpbnM6IG51bWJlclxuKTogSGlzdG9ncmFtQmluW10ge1xuICByZXR1cm4gZDNIaXN0b2dyYW0oKVxuICAgIC50aHJlc2hvbGRzKHRpY2tzKGRvbWFpblswXSwgZG9tYWluWzFdLCBiaW5zKSlcbiAgICAuZG9tYWluKGRvbWFpbikobWFwcGVkVmFsdWUpXG4gICAgLm1hcChiaW4gPT4gKHtcbiAgICAgIGNvdW50OiBiaW4ubGVuZ3RoLFxuICAgICAgeDA6IGJpbi54MCxcbiAgICAgIHgxOiBiaW4ueDFcbiAgICB9KSk7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBoaXN0b2dyYW0gZnJvbSBkb21haW4gYW5kIGFycmF5IG9mIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlzdG9ncmFtKFxuICBkb21haW46IFtudW1iZXIsIG51bWJlcl0sXG4gIG1hcHBlZFZhbHVlOiAoTWlsbGlzZWNvbmQgfCBudW1iZXIpW11cbik6IHtoaXN0b2dyYW06IEhpc3RvZ3JhbUJpbltdOyBlbmxhcmdlZEhpc3RvZ3JhbTogSGlzdG9ncmFtQmluW119IHtcbiAgY29uc3QgaGlzdG9ncmFtID0gaGlzdG9ncmFtQ29uc3RydWN0KGRvbWFpbiwgbWFwcGVkVmFsdWUsIGhpc3RvZ3JhbUJpbnMpO1xuICBjb25zdCBlbmxhcmdlZEhpc3RvZ3JhbSA9IGhpc3RvZ3JhbUNvbnN0cnVjdChkb21haW4sIG1hcHBlZFZhbHVlLCBlbmxhcmdlZEhpc3RvZ3JhbUJpbnMpO1xuXG4gIHJldHVybiB7aGlzdG9ncmFtLCBlbmxhcmdlZEhpc3RvZ3JhbX07XG59XG5cbi8qKlxuICogcm91bmQgbnVtYmVyIGJhc2VkIG9uIHN0ZXBcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gdmFsXG4gKiBAcGFyYW0ge051bWJlcn0gc3RlcFxuICogQHBhcmFtIHtzdHJpbmd9IGJvdW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSByb3VuZGVkIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyQnlTdGVwKHZhbDogbnVtYmVyLCBzdGVwOiBudW1iZXIsIGJvdW5kOiAnZmxvb3InIHwgJ2NlaWwnKTogbnVtYmVyIHtcbiAgaWYgKGJvdW5kID09PSAnZmxvb3InKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodmFsICogKDEgLyBzdGVwKSkgLyAoMSAvIHN0ZXApO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguY2VpbCh2YWwgKiAoMSAvIHN0ZXApKSAvICgxIC8gc3RlcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luUmFuZ2UodmFsOiBhbnksIGRvbWFpbjogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRvbWFpbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdmFsID49IGRvbWFpblswXSAmJiB2YWwgPD0gZG9tYWluWzFdO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHBvaW50IGlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgcG9seWdvblxuICpcbiAqIEBwYXJhbSBwb2ludCBhcyBpbnB1dCBzZWFyY2ggW2xhdCwgbG5nXVxuICogQHBhcmFtIHBvbHlnb24gUG9pbnRzIG11c3QgYmUgd2l0aGluIHRoZXNlIChNdWx0aSlQb2x5Z29uKHMpXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblBvbHlnb24ocG9pbnQ6IG51bWJlcltdLCBwb2x5Z29uOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJvb2xlYW5XaXRoaW4odHVyZlBvaW50KHBvaW50KSwgcG9seWdvbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRpbWVEb21haW4oZG9tYWluKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGRvbWFpbikgJiYgZG9tYWluLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKGRvbWFpbjogW251bWJlciwgbnVtYmVyXSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWlzVmFsaWRUaW1lRG9tYWluKGRvbWFpbikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRpZmYgPSBkb21haW5bMV0gLSBkb21haW5bMF07XG5cbiAgLy8gTG9jYWwgYXdhcmUgZm9ybWF0c1xuICAvLyBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy9zdHJpbmctZm9ybWF0XG4gIHJldHVybiBkaWZmID4gZHVyYXRpb25ZZWFyID8gJ0wnIDogZGlmZiA+IGR1cmF0aW9uRGF5ID8gJ0wgTFQnIDogJ0wgTFRTJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyKGRvbWFpbjogW251bWJlciwgbnVtYmVyXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNWYWxpZFRpbWVEb21haW4oZG9tYWluKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZG9tYWluWzFdIC0gZG9tYWluWzBdO1xuICByZXR1cm4gZGlmZiA+IGR1cmF0aW9uV2Vla1xuICAgID8gJ0wnXG4gICAgOiBkaWZmID4gZHVyYXRpb25EYXlcbiAgICA/ICdMIExUJ1xuICAgIDogZGlmZiA+IGR1cmF0aW9uSG91clxuICAgID8gJ0xUJ1xuICAgIDogJ0xUUyc7XG59XG5cbi8qKlxuICogU2FuaXR5IGNoZWNrIG9uIGZpbHRlcnMgdG8gcHJlcGFyZSBmb3Igc2F2ZVxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEZpbHRlclZhbHVlKHR5cGU6IHN0cmluZyB8IG51bGwsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRklMVEVSX1RZUEVTLnNlbGVjdDpcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG5cbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5yYW5nZTpcbiAgICBjYXNlIEZJTFRFUl9UWVBFUy50aW1lUmFuZ2U6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkodiA9PiB2ICE9PSBudWxsICYmICFpc05hTih2KSk7XG5cbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5tdWx0aVNlbGVjdDpcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBCb29sZWFuKHZhbHVlLmxlbmd0aCk7XG5cbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5pbnB1dDpcbiAgICAgIHJldHVybiBCb29sZWFuKHZhbHVlLmxlbmd0aCk7XG5cbiAgICBjYXNlIEZJTFRFUl9UWVBFUy5wb2x5Z29uOlxuICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXQodmFsdWUsIFsnZ2VvbWV0cnknLCAnY29vcmRpbmF0ZXMnXSk7XG4gICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB2YWx1ZS5pZCAmJiBjb29yZGluYXRlcyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbHRlclBsb3QoXG4gIGZpbHRlcjogRmlsdGVyLFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZVxuKToge2xpbmVDaGFydDogTGluZUNoYXJ0OyB5QXhzOiBGaWVsZH0gfCB7fSB7XG4gIGlmIChmaWx0ZXIucGxvdFR5cGUgPT09IFBMT1RfVFlQRVMuaGlzdG9ncmFtIHx8ICFmaWx0ZXIueUF4aXMpIHtcbiAgICAvLyBoaXN0b2dyYW0gc2hvdWxkIGJlIGNhbGN1bGF0ZWQgd2hlbiBjcmVhdGUgZmlsdGVyXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qge21hcHBlZFZhbHVlID0gW119ID0gZmlsdGVyO1xuICBjb25zdCB7eUF4aXN9ID0gZmlsdGVyO1xuICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZ2V0Q29sdW1uRmllbGRJZHgoeUF4aXMubmFtZSk7XG4gIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICBDb25zb2xlLndhcm4oYHlBeGlzICR7eUF4aXMubmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gZGF0YXNldGApO1xuICAgIHJldHVybiB7bGluZUNoYXJ0OiB7fSwgeUF4aXN9O1xuICB9XG5cbiAgLy8gcmV0dXJuIGxpbmVDaGFydFxuICBjb25zdCBzZXJpZXMgPSBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAubWFwKFxuICAgICAgKHJvdywgcm93SW5kZXgpID0+ICh7XG4gICAgICAgIHg6IG1hcHBlZFZhbHVlW3Jvd0luZGV4XSxcbiAgICAgICAgeTogcm93LnZhbHVlQXQoZmllbGRJZHgpXG4gICAgICB9KSxcbiAgICAgIHRydWVcbiAgICApXG4gICAgLmZpbHRlcigoe3gsIHl9KSA9PiBOdW1iZXIuaXNGaW5pdGUoeCkgJiYgTnVtYmVyLmlzRmluaXRlKHkpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhc2NlbmRpbmcoYS54LCBiLngpKTtcblxuICBjb25zdCB5RG9tYWluID0gZXh0ZW50KHNlcmllcywgZCA9PiBkLnkpO1xuICBjb25zdCB4RG9tYWluID0gW3Nlcmllc1swXS54LCBzZXJpZXNbc2VyaWVzLmxlbmd0aCAtIDFdLnhdO1xuXG4gIHJldHVybiB7bGluZUNoYXJ0OiB7c2VyaWVzLCB5RG9tYWluLCB4RG9tYWlufSwgeUF4aXN9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEZpbHRlclBsb3RUeXBlKGZpbHRlcjogRmlsdGVyKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZpbHRlclBsb3RUeXBlczogdHlwZW9mIFN1cHBvcnRlZFBsb3RUeXBlW2tleW9mIHR5cGVvZiBTdXBwb3J0ZWRQbG90VHlwZV0gfCBudWxsID1cbiAgICBmaWx0ZXIudHlwZSAmJiBTdXBwb3J0ZWRQbG90VHlwZVtmaWx0ZXIudHlwZV07XG4gIGlmICghZmlsdGVyUGxvdFR5cGVzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoIWZpbHRlci55QXhpcykge1xuICAgIHJldHVybiBmaWx0ZXJQbG90VHlwZXMuZGVmYXVsdDtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJQbG90VHlwZXNbZmlsdGVyLnlBeGlzLnR5cGVdIHx8IG51bGw7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0SWRzIGxpc3Qgb2YgZGF0YXNldCBpZHMgdG8gYmUgZmlsdGVyZWRcbiAqIEBwYXJhbSBkYXRhc2V0cyBhbGwgZGF0YXNldHNcbiAqIEBwYXJhbSBmaWx0ZXJzIGFsbCBmaWx0ZXJzIHRvIGJlIGFwcGxpZWQgdG8gZGF0YXNldHNcbiAqIEByZXR1cm4gZGF0YXNldHMgLSBuZXcgdXBkYXRlZCBkYXRhc2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgZGF0YXNldElkczogc3RyaW5nW10sXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgZmlsdGVyczogRmlsdGVyW10sXG4gIGxheWVycz86IExheWVyW11cbik6IERhdGFzZXRzIHtcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZGF0YXNldElkcyk7XG4gIHJldHVybiBkYXRhSWRzLnJlZHVjZSgoYWNjLCBkYXRhSWQpID0+IHtcbiAgICBjb25zdCBsYXllcnNUb0ZpbHRlciA9IChsYXllcnMgfHwgW10pLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCA9PT0gZGF0YUlkKTtcbiAgICBjb25zdCBhcHBsaWVkRmlsdGVycyA9IGZpbHRlcnMuZmlsdGVyKGQgPT4gc2hvdWxkQXBwbHlGaWx0ZXIoZCwgZGF0YUlkKSk7XG4gICAgY29uc3QgdGFibGUgPSBkYXRhc2V0c1tkYXRhSWRdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFjYyxcbiAgICAgIFtkYXRhSWRdOiB0YWJsZS5maWx0ZXJUYWJsZShhcHBsaWVkRmlsdGVycywgbGF5ZXJzVG9GaWx0ZXIsIHt9KVxuICAgIH07XG4gIH0sIGRhdGFzZXRzKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgbmV3IGZpZWxkIG5hbWUgdmFsdWUgdG8gZmllbHRlciBhbmQgdXBkYXRlIGJvdGggZmlsdGVyIGFuZCBkYXRhc2V0XG4gKiBAcGFyYW0gZmlsdGVyIC0gdG8gYmUgYXBwbGllZCB0aGUgbmV3IGZpZWxkIG5hbWUgb25cbiAqIEBwYXJhbSBkYXRhc2V0IC0gZGF0YXNldCB0aGUgZmllbGQgYmVsb25ncyB0b1xuICogQHBhcmFtIGZpZWxkTmFtZSAtIGZpZWxkLm5hbWVcbiAqIEBwYXJhbSBmaWx0ZXJEYXRhc2V0SW5kZXggLSBmaWVsZC5uYW1lXG4gKiBAcGFyYW0gb3B0aW9uXG4gKiBAcmV0dXJuIC0ge2ZpbHRlciwgZGF0YXNldHN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUZpbHRlckZpZWxkTmFtZShcbiAgZmlsdGVyOiBGaWx0ZXIsXG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgZmlsdGVyRGF0YXNldEluZGV4ID0gMCxcbiAgb3B0aW9uPzoge21lcmdlRG9tYWluOiBib29sZWFufVxuKToge1xuICBmaWx0ZXI6IEZpbHRlciB8IG51bGw7XG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlO1xufSB7XG4gIC8vIHVzaW5nIGZpbHRlckRhdGFzZXRJbmRleCB3ZSBjYW4gZmlsdGVyIG9ubHkgdGhlIHNwZWNpZmllZCBkYXRhc2V0XG4gIGNvbnN0IG1lcmdlRG9tYWluID0gb3B0aW9uICYmIG9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnbWVyZ2VEb21haW4nKSA/IG9wdGlvbi5tZXJnZURvbWFpbiA6IGZhbHNlO1xuXG4gIGNvbnN0IGZpZWxkSW5kZXggPSBkYXRhc2V0LmdldENvbHVtbkZpZWxkSWR4KGZpZWxkTmFtZSk7XG4gIC8vIGlmIG5vIGZpZWxkIHdpdGggc2FtZSBuYW1lIGlzIGZvdW5kLCBtb3ZlIHRvIHRoZSBuZXh0IGRhdGFzZXRzXG4gIGlmIChmaWVsZEluZGV4ID09PSAtMSkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihgZmllbGRJbmRleCBub3QgZm91bmQuIERhdGFzZXQgbXVzdCBjb250YWluIGEgcHJvcGVydHkgd2l0aCBuYW1lOiAke2ZpZWxkTmFtZX1gKTtcbiAgICByZXR1cm4ge2ZpbHRlcjogbnVsbCwgZGF0YXNldH07XG4gIH1cblxuICAvLyBUT0RPOiB2YWxpZGF0ZSBmaWVsZCB0eXBlXG4gIGNvbnN0IGZpbHRlclByb3BzID0gZGF0YXNldC5nZXRDb2x1bW5GaWx0ZXJQcm9wcyhmaWVsZE5hbWUpO1xuXG4gIGNvbnN0IG5ld0ZpbHRlciA9IHtcbiAgICAuLi4obWVyZ2VEb21haW4gPyBtZXJnZUZpbHRlckRvbWFpblN0ZXAoZmlsdGVyLCBmaWx0ZXJQcm9wcykgOiB7Li4uZmlsdGVyLCAuLi5maWx0ZXJQcm9wc30pLFxuICAgIG5hbWU6IE9iamVjdC5hc3NpZ24oWy4uLnRvQXJyYXkoZmlsdGVyLm5hbWUpXSwge1tmaWx0ZXJEYXRhc2V0SW5kZXhdOiBmaWVsZE5hbWV9KSxcbiAgICBmaWVsZElkeDogT2JqZWN0LmFzc2lnbihbLi4udG9BcnJheShmaWx0ZXIuZmllbGRJZHgpXSwge1xuICAgICAgW2ZpbHRlckRhdGFzZXRJbmRleF06IGZpZWxkSW5kZXhcbiAgICB9KSxcbiAgICAvLyBUT0RPLCBzaW5jZSB3ZSBhbGxvdyB0byBhZGQgbXVsdGlwbGUgZmllbGRzIHRvIGEgZmlsdGVyIHdlIGNhbiBubyBsb25nZXIgZnJlZXplIHRoZSBmaWx0ZXJcbiAgICBmcmVlemU6IHRydWVcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGZpbHRlcjogbmV3RmlsdGVyLFxuICAgIGRhdGFzZXRcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBvbmUgZmlsdGVyIHdpdGggb3RoZXIgZmlsdGVyIHByb3AgZG9tYWluXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUZpbHRlckRvbWFpblN0ZXAoZmlsdGVyOiBGaWx0ZXIsIGZpbHRlclByb3BzPzogYW55KTogRmlsdGVyIHwgbnVsbCB7XG4gIGlmICghZmlsdGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoIWZpbHRlclByb3BzKSB7XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuXG4gIGlmICgoZmlsdGVyLmZpZWxkVHlwZSAmJiBmaWx0ZXIuZmllbGRUeXBlICE9PSBmaWx0ZXJQcm9wcy5maWVsZFR5cGUpIHx8ICFmaWx0ZXJQcm9wcy5kb21haW4pIHtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgY29uc3QgY29tYmluZWREb21haW4gPSAhZmlsdGVyLmRvbWFpblxuICAgID8gZmlsdGVyUHJvcHMuZG9tYWluXG4gICAgOiBbLi4uKGZpbHRlci5kb21haW4gfHwgW10pLCAuLi4oZmlsdGVyUHJvcHMuZG9tYWluIHx8IFtdKV0uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gIGNvbnN0IG5ld0ZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgLi4uZmlsdGVyUHJvcHMsXG4gICAgZG9tYWluOiBbY29tYmluZWREb21haW5bMF0sIGNvbWJpbmVkRG9tYWluW2NvbWJpbmVkRG9tYWluLmxlbmd0aCAtIDFdXVxuICB9O1xuXG4gIHN3aXRjaCAoZmlsdGVyUHJvcHMuZmllbGRUeXBlKSB7XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuc3RyaW5nOlxuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmRhdGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXdGaWx0ZXIsXG4gICAgICAgIGRvbWFpbjogdW5pcXVlKGNvbWJpbmVkRG9tYWluKS5zb3J0KClcbiAgICAgIH07XG5cbiAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXA6XG4gICAgICBjb25zdCBzdGVwID1cbiAgICAgICAgKGZpbHRlciBhcyBUaW1lUmFuZ2VGaWx0ZXIpLnN0ZXAgPCBmaWx0ZXJQcm9wcy5zdGVwXG4gICAgICAgICAgPyAoZmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcikuc3RlcFxuICAgICAgICAgIDogZmlsdGVyUHJvcHMuc3RlcDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubmV3RmlsdGVyLFxuICAgICAgICBzdGVwXG4gICAgICB9O1xuICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnJlYWw6XG4gICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ld0ZpbHRlcjtcbiAgfVxufVxuLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHBvbHlnb24gZmlsdGVyXG4gKi9cbmV4cG9ydCBjb25zdCBmZWF0dXJlVG9GaWx0ZXJWYWx1ZSA9IChcbiAgZmVhdHVyZTogRmVhdHVyZSxcbiAgZmlsdGVySWQ6IHN0cmluZyxcbiAgcHJvcGVydGllcz86IHt9XG4pOiBGZWF0dXJlVmFsdWUgPT4gKHtcbiAgLi4uZmVhdHVyZSxcbiAgaWQ6IGZlYXR1cmUuaWQsXG4gIHByb3BlcnRpZXM6IHtcbiAgICAuLi5mZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgLi4ucHJvcGVydGllcyxcbiAgICBmaWx0ZXJJZFxuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlcklkSW5GZWF0dXJlID0gKGY6IEZlYXR1cmVWYWx1ZSk6IHN0cmluZyA9PiBnZXQoZiwgWydwcm9wZXJ0aWVzJywgJ2ZpbHRlcklkJ10pO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBwb2x5Z29uIGZpbHRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQb2x5Z29uRmlsdGVyKGxheWVyczogTGF5ZXJbXSwgZmVhdHVyZTogRmVhdHVyZSk6IFBvbHlnb25GaWx0ZXIge1xuICBjb25zdCBkYXRhSWQgPSBsYXllcnMubWFwKGwgPT4gbC5jb25maWcuZGF0YUlkKS5maWx0ZXIobm90TnVsbG9yVW5kZWZpbmVkKTtcbiAgY29uc3QgbGF5ZXJJZCA9IGxheWVycy5tYXAobCA9PiBsLmlkKTtcbiAgY29uc3QgbmFtZSA9IGxheWVycy5tYXAobCA9PiBsLmNvbmZpZy5sYWJlbCk7XG4gIGNvbnN0IGZpbHRlciA9IGdldERlZmF1bHRGaWx0ZXIoZGF0YUlkKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5maWx0ZXIsXG4gICAgZml4ZWREb21haW46IHRydWUsXG4gICAgdHlwZTogRklMVEVSX1RZUEVTLnBvbHlnb24sXG4gICAgbmFtZSxcbiAgICBsYXllcklkLFxuICAgIHZhbHVlOiBmZWF0dXJlVG9GaWx0ZXJWYWx1ZShmZWF0dXJlLCBmaWx0ZXIuaWQsIHtpc1Zpc2libGU6IHRydWV9KVxuICB9O1xufVxuXG4vKipcbiAqIFJ1biBmaWx0ZXIgZW50aXJlbHkgb24gQ1BVXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJEYXRhc2V0Q1BVKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkOiBzdHJpbmcpOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXRGaWx0ZXJzID0gc3RhdGUuZmlsdGVycy5maWx0ZXIoZiA9PiBmLmRhdGFJZC5pbmNsdWRlcyhkYXRhSWQpKTtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgY3B1RmlsdGVyZWREYXRhc2V0ID0gZGF0YXNldC5maWx0ZXJUYWJsZUNQVShkYXRhc2V0RmlsdGVycywgc3RhdGUubGF5ZXJzKTtcblxuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBjcHVGaWx0ZXJlZERhdGFzZXQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBwYXJzZWQgZmlsdGVycyB3aXRoIGRhdGFzZXRzIGFuZCBhZGQgZmlsdGVyUHJvcHMgdG8gZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGZpbHRlcnNUb1ZhbGlkYXRlOiBQYXJzZWRGaWx0ZXJbXSA9IFtdXG4pOiB7XG4gIHZhbGlkYXRlZDogRmlsdGVyW107XG4gIGZhaWxlZDogRmlsdGVyW107XG4gIHVwZGF0ZWREYXRhc2V0czogRGF0YXNldHM7XG59IHtcbiAgLy8gVE9ETyBCZXR0ZXIgVHlwaW5ncyBoZXJlXG4gIGNvbnN0IHZhbGlkYXRlZDogYW55W10gPSBbXTtcbiAgY29uc3QgZmFpbGVkOiBhbnlbXSA9IFtdO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG4gIGxldCB1cGRhdGVkRGF0YXNldHMgPSBkYXRhc2V0cztcblxuICAvLyBtZXJnZSBmaWx0ZXJzXG4gIGZpbHRlcnNUb1ZhbGlkYXRlLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAvLyB3ZSBjYW4gb25seSBsb29rIGZvciBkYXRhc2V0cyBkZWZpbmUgaW4gdGhlIGZpbHRlciBkYXRhSWRcbiAgICBjb25zdCBkYXRhc2V0SWRzID0gdG9BcnJheShmaWx0ZXIuZGF0YUlkKTtcblxuICAgIC8vIHdlIGNhbiBtZXJnZSBhIGZpbHRlciBvbmx5IGlmIGFsbCBkYXRhc2V0cyBpbiBmaWx0ZXIuZGF0YUlkIGFyZSBsb2FkZWRcbiAgICBpZiAoZGF0YXNldElkcy5ldmVyeShkID0+IGRhdGFzZXRzW2RdKSkge1xuICAgICAgLy8gYWxsIGRhdGFzZXRJZHMgaW4gZmlsdGVyIG11c3QgYmUgcHJlc2VudCB0aGUgc3RhdGUgZGF0YXNldHNcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHZhbGlkYXRlZEZpbHRlciwgYXBwbHlUb0RhdGFzZXRzLCBhdWdtZW50ZWREYXRhc2V0c30gPSBkYXRhc2V0SWRzLnJlZHVjZShcbiAgICAgICAgKGFjYywgZGF0YXNldElkKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YXNldCA9IHVwZGF0ZWREYXRhc2V0c1tkYXRhc2V0SWRdO1xuICAgICAgICAgIGNvbnN0IGxheWVycyA9IHN0YXRlLmxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXQuaWQpO1xuICAgICAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IHVwZGF0ZWREYXRhc2V0fSA9IHZhbGlkYXRlRmlsdGVyV2l0aERhdGEoXG4gICAgICAgICAgICBhY2MuYXVnbWVudGVkRGF0YXNldHNbZGF0YXNldElkXSB8fCBkYXRhc2V0LFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgbGF5ZXJzXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgIC8vIG1lcmdlIGZpbHRlciBwcm9wc1xuICAgICAgICAgICAgICBmaWx0ZXI6IGFjYy5maWx0ZXJcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYWNjLmZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgLi4ubWVyZ2VGaWx0ZXJEb21haW5TdGVwKGFjYywgdXBkYXRlZEZpbHRlcilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHVwZGF0ZWRGaWx0ZXIsXG5cbiAgICAgICAgICAgICAgYXBwbHlUb0RhdGFzZXRzOiBbLi4uYWNjLmFwcGx5VG9EYXRhc2V0cywgZGF0YXNldElkXSxcblxuICAgICAgICAgICAgICBhdWdtZW50ZWREYXRhc2V0czoge1xuICAgICAgICAgICAgICAgIC4uLmFjYy5hdWdtZW50ZWREYXRhc2V0cyxcbiAgICAgICAgICAgICAgICBbZGF0YXNldElkXTogdXBkYXRlZERhdGFzZXRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmlsdGVyOiBudWxsLFxuICAgICAgICAgIGFwcGx5VG9EYXRhc2V0czogW10sXG4gICAgICAgICAgYXVnbWVudGVkRGF0YXNldHM6IHt9XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWxpZGF0ZWRGaWx0ZXIgJiYgaXNFcXVhbChkYXRhc2V0SWRzLCBhcHBseVRvRGF0YXNldHMpKSB7XG4gICAgICAgIHZhbGlkYXRlZC5wdXNoKHZhbGlkYXRlZEZpbHRlcik7XG4gICAgICAgIHVwZGF0ZWREYXRhc2V0cyA9IHtcbiAgICAgICAgICAuLi51cGRhdGVkRGF0YXNldHMsXG4gICAgICAgICAgLi4uYXVnbWVudGVkRGF0YXNldHNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbGVkLnB1c2goZmlsdGVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c307XG59XG5cbi8qKlxuICogUmV0cmlldmUgaW50ZXJ2YWwgYmlucyBmb3IgdGltZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVydmFsQmlucyhmaWx0ZXI6IFRpbWVSYW5nZUZpbHRlcikge1xuICBjb25zdCB7Ymluc30gPSBmaWx0ZXI7XG4gIGNvbnN0IGludGVydmFsID0gZmlsdGVyLnBsb3RUeXBlPy5pbnRlcnZhbDtcbiAgaWYgKCFpbnRlcnZhbCB8fCAhYmlucyB8fCBPYmplY3Qua2V5cyhiaW5zKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGJpbnMpO1xuICByZXR1cm4gdmFsdWVzWzBdID8gdmFsdWVzWzBdW2ludGVydmFsXSA6IG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBTSxjQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxRQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxnQkFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsVUFBQSxHQUFBQyx1QkFBQSxDQUFBWixPQUFBO0FBQ0EsSUFBQWEsTUFBQSxHQUFBYixPQUFBO0FBQ0EsSUFBQWMsTUFBQSxHQUFBZCxPQUFBO0FBQ0EsSUFBQWUsUUFBQSxHQUFBZixPQUFBO0FBQXdFLFNBQUFnQix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FB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LGlCQUFpQixXQUFBdFIsZ0JBQUEsaUJBQ3ZCNkQsU0FBUyxFQUFHdUIsY0FBYztZQUM1QjtVQUVMO1VBRUEsT0FBT2lLLEdBQUc7UUFDWixDQUFDLEVBQ0Q7VUFDRTdQLE1BQU0sRUFBRSxJQUFJO1VBQ1orUixlQUFlLEVBQUUsRUFBRTtVQUNuQkQsaUJBQWlCLEVBQUUsQ0FBQztRQUN0QixDQUNGLENBQUM7UUFyQ2NFLGVBQWUsR0FBQUosa0JBQUEsQ0FBdkI1UixNQUFNO1FBQW1CK1IsZUFBZSxHQUFBSCxrQkFBQSxDQUFmRyxlQUFlO1FBQUVELGlCQUFpQixHQUFBRixrQkFBQSxDQUFqQkUsaUJBQWlCO01BdUNsRSxJQUFJRSxlQUFlLElBQUksSUFBQUMsbUJBQU8sRUFBQ3ZDLFVBQVUsRUFBRXFDLGVBQWUsQ0FBQyxFQUFFO1FBQzNETCxTQUFTLENBQUN4UixJQUFJLENBQUM4UixlQUFlLENBQUM7UUFDL0JMLGVBQWUsR0FBQXZSLGFBQUEsQ0FBQUEsYUFBQSxLQUNWdVIsZUFBZSxHQUNmRyxpQkFBaUIsQ0FDckI7TUFDSDtJQUNGLENBQUMsTUFBTTtNQUNMbk4sTUFBTSxDQUFDekUsSUFBSSxDQUFDRixNQUFNLENBQUM7SUFDckI7RUFDRixDQUFDLENBQUM7RUFFRixPQUFPO0lBQUMwUixTQUFTLEVBQVRBLFNBQVM7SUFBRS9NLE1BQU0sRUFBTkEsTUFBTTtJQUFFZ04sZUFBZSxFQUFmQTtFQUFlLENBQUM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBU08sZUFBZUEsQ0FBQ2xTLE1BQXVCLEVBQUU7RUFBQSxJQUFBbVMsZ0JBQUE7RUFDdkQsSUFBT2pGLElBQUksR0FBSWxOLE1BQU0sQ0FBZGtOLElBQUk7RUFDWCxJQUFNckosUUFBUSxJQUFBc08sZ0JBQUEsR0FBR25TLE1BQU0sQ0FBQzJELFFBQVEsY0FBQXdPLGdCQUFBLHVCQUFmQSxnQkFBQSxDQUFpQnRPLFFBQVE7RUFDMUMsSUFBSSxDQUFDQSxRQUFRLElBQUksQ0FBQ3FKLElBQUksSUFBSTlOLE1BQU0sQ0FBQ1MsSUFBSSxDQUFDcU4sSUFBSSxDQUFDLENBQUM1TSxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQ3hELE9BQU8sSUFBSTtFQUNiO0VBQ0EsSUFBTThSLE1BQU0sR0FBR2hULE1BQU0sQ0FBQ2dULE1BQU0sQ0FBQ2xGLElBQUksQ0FBQztFQUNsQyxPQUFPa0YsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHQSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUN2TyxRQUFRLENBQUMsR0FBRyxJQUFJO0FBQy9DIiwiaWdub3JlTGlzdCI6W119
|