@carto/kepler.gl 0.0.85 → 0.0.86-alpha.deck9.1
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.js +36 -41
- package/dist/actions/actions.js +15 -21
- package/dist/actions/identity-actions.js +14 -20
- package/dist/actions/index.js +16 -16
- package/dist/actions/map-state-actions.js +12 -18
- package/dist/actions/map-style-actions.js +30 -46
- package/dist/actions/provider-actions.js +49 -73
- package/dist/actions/ui-state-actions.js +73 -113
- package/dist/actions/vis-state-actions.js +152 -148
- package/dist/cloud-providers/index.js +6 -7
- package/dist/cloud-providers/provider.js +189 -279
- package/dist/components/bottom-widget.js +105 -117
- package/dist/components/common/action-panel.js +122 -74
- package/dist/components/common/animation-control/animation-control.js +69 -54
- package/dist/components/common/animation-control/animation-controller.js +134 -160
- package/dist/components/common/animation-control/animation-speed-slider.js +47 -54
- package/dist/components/common/animation-control/floating-time-display.js +120 -100
- package/dist/components/common/animation-control/playback-controls.js +147 -144
- package/dist/components/common/animation-control/speed-control.js +31 -23
- package/dist/components/common/checkbox.js +56 -70
- package/dist/components/common/color-legend.js +83 -110
- package/dist/components/common/data-table/button.js +31 -23
- package/dist/components/common/data-table/canvas.js +11 -5
- package/dist/components/common/data-table/cell-size.js +51 -61
- package/dist/components/common/data-table/grid.js +40 -59
- package/dist/components/common/data-table/index.js +464 -348
- package/dist/components/common/data-table/option-dropdown.js +50 -33
- package/dist/components/common/dataset-label.js +17 -13
- package/dist/components/common/error-boundary.js +27 -45
- package/dist/components/common/field-selector.js +99 -139
- package/dist/components/common/field-token.js +24 -9
- package/dist/components/common/file-uploader/file-drop.js +96 -115
- package/dist/components/common/file-uploader/file-upload-progress.js +68 -45
- package/dist/components/common/file-uploader/file-upload.js +215 -187
- package/dist/components/common/file-uploader/upload-button.js +35 -22
- package/dist/components/common/histogram-plot.js +47 -58
- package/dist/components/common/icons/add.js +14 -27
- package/dist/components/common/icons/anchor_window.js +16 -18
- package/dist/components/common/icons/arrow-down-alt.js +14 -27
- package/dist/components/common/icons/arrow-down-solid.js +14 -27
- package/dist/components/common/icons/arrow-down.js +14 -27
- package/dist/components/common/icons/arrow-left.js +17 -30
- package/dist/components/common/icons/arrow-right.js +14 -27
- package/dist/components/common/icons/arrow-up-alt.js +15 -28
- package/dist/components/common/icons/arrow-up-solid.js +14 -27
- package/dist/components/common/icons/arrow-up.js +14 -27
- package/dist/components/common/icons/base.js +39 -57
- package/dist/components/common/icons/bug.js +16 -29
- package/dist/components/common/icons/cancel.js +14 -27
- package/dist/components/common/icons/checkmark.js +18 -31
- package/dist/components/common/icons/chevron-right.js +20 -33
- package/dist/components/common/icons/clipboard.js +15 -28
- package/dist/components/common/icons/clock.js +16 -29
- package/dist/components/common/icons/close.js +19 -32
- package/dist/components/common/icons/code-alt.js +16 -29
- package/dist/components/common/icons/copy.js +18 -31
- package/dist/components/common/icons/crosshairs.js +16 -29
- package/dist/components/common/icons/cube-3d.js +18 -31
- package/dist/components/common/icons/cursor-click.js +18 -31
- package/dist/components/common/icons/data-table.js +15 -28
- package/dist/components/common/icons/db.js +15 -28
- package/dist/components/common/icons/delete.js +16 -29
- package/dist/components/common/icons/docs.js +30 -43
- package/dist/components/common/icons/drag-n-drop.js +16 -29
- package/dist/components/common/icons/draw-polygon.js +33 -46
- package/dist/components/common/icons/email.js +18 -31
- package/dist/components/common/icons/expand.js +16 -29
- package/dist/components/common/icons/eye-seen.js +16 -29
- package/dist/components/common/icons/eye-unseen.js +16 -29
- package/dist/components/common/icons/file-type.js +35 -19
- package/dist/components/common/icons/file.js +14 -27
- package/dist/components/common/icons/files.js +14 -26
- package/dist/components/common/icons/filter-funnel.js +14 -27
- package/dist/components/common/icons/free-window.js +16 -18
- package/dist/components/common/icons/gear.js +16 -29
- package/dist/components/common/icons/hash.js +14 -27
- package/dist/components/common/icons/histogram.js +15 -27
- package/dist/components/common/icons/index.js +156 -156
- package/dist/components/common/icons/info.js +25 -38
- package/dist/components/common/icons/layers.js +14 -27
- package/dist/components/common/icons/left-arrow.js +16 -29
- package/dist/components/common/icons/legend.js +14 -27
- package/dist/components/common/icons/line-chart.js +14 -27
- package/dist/components/common/icons/login.js +17 -30
- package/dist/components/common/icons/logout.js +16 -29
- package/dist/components/common/icons/map-icon.js +18 -32
- package/dist/components/common/icons/map.js +18 -32
- package/dist/components/common/icons/messages.js +14 -27
- package/dist/components/common/icons/minus.js +14 -27
- package/dist/components/common/icons/order-by-dataset.js +15 -17
- package/dist/components/common/icons/order-by-list.js +7 -9
- package/dist/components/common/icons/pause.js +14 -27
- package/dist/components/common/icons/picture.js +14 -26
- package/dist/components/common/icons/pin.js +17 -30
- package/dist/components/common/icons/play.js +14 -27
- package/dist/components/common/icons/polygon.js +35 -48
- package/dist/components/common/icons/rectangle.js +36 -49
- package/dist/components/common/icons/reduce.js +17 -30
- package/dist/components/common/icons/reset.js +14 -27
- package/dist/components/common/icons/rocket.js +14 -27
- package/dist/components/common/icons/save.js +16 -29
- package/dist/components/common/icons/save2.js +20 -33
- package/dist/components/common/icons/search.js +16 -29
- package/dist/components/common/icons/settings.js +16 -29
- package/dist/components/common/icons/share.js +14 -27
- package/dist/components/common/icons/split.js +42 -55
- package/dist/components/common/icons/square-select.js +16 -29
- package/dist/components/common/icons/swap-horizontal.js +18 -31
- package/dist/components/common/icons/table.js +14 -27
- package/dist/components/common/icons/trash.js +16 -29
- package/dist/components/common/icons/upload.js +14 -27
- package/dist/components/common/icons/vert-dots.js +52 -65
- package/dist/components/common/icons/vert-three-dots.js +27 -40
- package/dist/components/common/icons/warning.js +26 -39
- package/dist/components/common/image-preview.js +71 -33
- package/dist/components/common/info-helper.js +36 -29
- package/dist/components/common/item-selector/accessor.js +7 -13
- package/dist/components/common/item-selector/chickleted-input.js +72 -56
- package/dist/components/common/item-selector/dropdown-list.js +182 -214
- package/dist/components/common/item-selector/item-selector-submenu.js +34 -55
- package/dist/components/common/item-selector/item-selector.js +183 -194
- package/dist/components/common/item-selector/typeahead.js +236 -248
- package/dist/components/common/line-chart.js +80 -58
- package/dist/components/common/loading-spinner.js +46 -31
- package/dist/components/common/logo.js +61 -48
- package/dist/components/common/map-layer-selector.js +31 -25
- package/dist/components/common/modal.js +167 -106
- package/dist/components/common/portaled.js +169 -189
- package/dist/components/common/progress-bar.js +27 -24
- package/dist/components/common/range-brush.js +176 -215
- package/dist/components/common/range-plot.js +52 -63
- package/dist/components/common/range-slider.js +206 -231
- package/dist/components/common/slider/mouse-event.js +59 -66
- package/dist/components/common/slider/slider-bar-handle.js +51 -61
- package/dist/components/common/slider/slider-handle.js +127 -102
- package/dist/components/common/slider/slider.js +143 -162
- package/dist/components/common/styled-components.js +518 -256
- package/dist/components/common/switch.js +11 -11
- package/dist/components/common/time-range-slider-time-title.js +49 -32
- package/dist/components/common/time-range-slider.js +56 -45
- package/dist/components/common/time-slider-marker.js +71 -52
- package/dist/components/common/tippy-tooltip.js +89 -59
- package/dist/components/common/toolbar-item.js +53 -45
- package/dist/components/common/toolbar.js +24 -18
- package/dist/components/common/vertical-toolbar.js +13 -6
- package/dist/components/container.js +87 -119
- package/dist/components/context.js +6 -8
- package/dist/components/editor/constants.js +4 -4
- package/dist/components/editor/editor.js +122 -157
- package/dist/components/editor/feature-action-panel.js +52 -59
- package/dist/components/editor/feature-styles.js +46 -29
- package/dist/components/editor/handle-style.js +38 -29
- package/dist/components/filters/components.js +8 -4
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +33 -43
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/new-filter-panel.js +24 -31
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +26 -31
- package/dist/components/filters/filter-panels/range-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +28 -31
- package/dist/components/filters/index.js +10 -10
- package/dist/components/filters/multi-select-filter.js +11 -9
- package/dist/components/filters/polygon-filter.js +26 -41
- package/dist/components/filters/range-filter.js +9 -7
- package/dist/components/filters/single-select-filter.js +11 -13
- package/dist/components/filters/time-range-filter.js +16 -14
- package/dist/components/filters/time-widget.js +125 -84
- package/dist/components/geocoder/geocoder.js +158 -177
- package/dist/components/geocoder-panel.js +66 -87
- package/dist/components/index.js +328 -329
- package/dist/components/injector.js +44 -63
- package/dist/components/kepler-gl.js +325 -361
- package/dist/components/map/coordinate-info.js +18 -16
- package/dist/components/map/layer-hover-info.js +108 -86
- package/dist/components/map/layer-selector-panel.js +50 -48
- package/dist/components/map/locale-panel.js +38 -44
- package/dist/components/map/map-control-panel.js +70 -47
- package/dist/components/map/map-control-toolbar.js +9 -6
- package/dist/components/map/map-control-tooltip.js +10 -8
- package/dist/components/map/map-control.js +35 -27
- package/dist/components/map/map-draw-panel.js +38 -48
- package/dist/components/map/map-legend-panel.js +47 -50
- package/dist/components/map/map-legend.js +133 -116
- package/dist/components/map/map-popover.js +155 -100
- package/dist/components/map/split-map-button.js +30 -34
- package/dist/components/map/toggle-3d-button.js +25 -27
- package/dist/components/map-container.js +313 -359
- package/dist/components/maps-layout.js +16 -26
- package/dist/components/modal-container.js +359 -355
- package/dist/components/modals/add-map-style-modal.js +233 -194
- package/dist/components/modals/cloud-tile.js +96 -67
- package/dist/components/modals/data-table-modal.js +155 -152
- package/dist/components/modals/delete-data-modal.js +20 -20
- package/dist/components/modals/error-display.js +9 -7
- package/dist/components/modals/export-data-modal.js +118 -140
- package/dist/components/modals/export-image-modal.js +82 -69
- package/dist/components/modals/export-map-modal/components.js +20 -18
- package/dist/components/modals/export-map-modal/export-html-map.js +82 -74
- package/dist/components/modals/export-map-modal/export-json-map.js +65 -45
- package/dist/components/modals/export-map-modal/export-map-modal.js +42 -47
- package/dist/components/modals/image-modal-container.js +20 -21
- package/dist/components/modals/load-data-modal.js +28 -30
- package/dist/components/modals/load-storage-map.js +277 -178
- package/dist/components/modals/loading-dialog.js +41 -19
- package/dist/components/modals/modal-dialog.js +4 -6
- package/dist/components/modals/modal-tabs.js +83 -48
- package/dist/components/modals/overwrite-map-modal.js +41 -30
- package/dist/components/modals/provider-modal-container.js +23 -42
- package/dist/components/modals/save-map-modal.js +107 -83
- package/dist/components/modals/share-map-modal.js +101 -95
- package/dist/components/modals/status-panel.js +63 -43
- package/dist/components/modals/storage-map-viewer.js +133 -70
- package/dist/components/notification-panel/notification-item.js +94 -97
- package/dist/components/notification-panel.js +35 -43
- package/dist/components/performance.js +49 -53
- package/dist/components/plot-container.js +151 -169
- package/dist/components/side-panel/cloud-storage-dropdown.js +13 -15
- package/dist/components/side-panel/common/dataset-info.js +16 -12
- package/dist/components/side-panel/common/dataset-tag.js +48 -27
- package/dist/components/side-panel/common/dataset-title.js +119 -116
- package/dist/components/side-panel/common/source-data-catalog.js +31 -32
- package/dist/components/side-panel/common/source-data-selector.js +52 -77
- package/dist/components/side-panel/custom-panel.js +6 -8
- package/dist/components/side-panel/filter-manager.js +48 -62
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +35 -25
- package/dist/components/side-panel/filter-panel/filter-panel.js +46 -64
- package/dist/components/side-panel/interaction-manager.js +20 -18
- package/dist/components/side-panel/interaction-panel/brush-config.js +17 -17
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +76 -95
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +118 -143
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +95 -76
- package/dist/components/side-panel/layer-manager.js +105 -115
- package/dist/components/side-panel/layer-panel/add-layer-button.js +92 -54
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +5 -5
- package/dist/components/side-panel/layer-panel/color-palette.js +50 -37
- package/dist/components/side-panel/layer-panel/color-range-selector.js +196 -207
- package/dist/components/side-panel/layer-panel/color-selector.js +104 -110
- package/dist/components/side-panel/layer-panel/column-selector.js +34 -22
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +4 -4
- package/dist/components/side-panel/layer-panel/custom-palette.js +248 -205
- package/dist/components/side-panel/layer-panel/custom-picker.js +51 -69
- package/dist/components/side-panel/layer-panel/dataset-layer-group.js +37 -42
- package/dist/components/side-panel/layer-panel/dataset-layer-section.js +31 -27
- package/dist/components/side-panel/layer-panel/dataset-section.js +45 -35
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +14 -13
- package/dist/components/side-panel/layer-panel/hex-column-config.js +32 -55
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +5 -5
- package/dist/components/side-panel/layer-panel/layer-column-config.js +42 -46
- package/dist/components/side-panel/layer-panel/layer-config-group.js +178 -144
- package/dist/components/side-panel/layer-panel/layer-configurator.js +826 -830
- package/dist/components/side-panel/layer-panel/layer-list.js +101 -94
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +124 -82
- package/dist/components/side-panel/layer-panel/layer-panel.js +111 -105
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +67 -58
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +47 -32
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -41
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +42 -43
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +55 -57
- package/dist/components/side-panel/layer-panel/single-color-palette.js +48 -33
- package/dist/components/side-panel/layer-panel/text-label-panel.js +81 -116
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +88 -102
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +99 -85
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +38 -29
- package/dist/components/side-panel/map-manager.js +70 -89
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +72 -60
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +64 -42
- package/dist/components/side-panel/panel-dropdown.js +21 -37
- package/dist/components/side-panel/panel-header-action.js +60 -65
- package/dist/components/side-panel/panel-header.js +165 -184
- package/dist/components/side-panel/panel-tab.js +35 -29
- package/dist/components/side-panel/panel-title.js +15 -18
- package/dist/components/side-panel/panel-toggle.js +30 -31
- package/dist/components/side-panel/side-bar.js +100 -91
- package/dist/components/side-panel.js +108 -123
- package/dist/connect/keplergl-connect.js +17 -26
- package/dist/connect/with-local-selector.js +31 -63
- package/dist/constants/action-types.js +113 -115
- package/dist/constants/color-palette.js +14 -16
- package/dist/constants/color-ranges.js +23 -28
- package/dist/constants/custom-color-ranges.js +12 -12
- package/dist/constants/default-settings.js +323 -254
- package/dist/constants/index.js +63 -63
- package/dist/constants/keyevent.js +4 -4
- package/dist/constants/tooltip.js +5 -5
- package/dist/constants/user-feedbacks.js +9 -5
- package/dist/constants/user-guides.js +10 -10
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +37 -63
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +52 -56
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +165 -168
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +24 -43
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.d.ts +2 -2
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +27 -40
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +27 -40
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +60 -68
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.d.ts +4 -4
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +281 -282
- package/dist/deckgl-layers/layer-utils/shader-utils.js +2 -2
- package/dist/deckgl-layers/line-layer/line-layer.js +62 -70
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +37 -51
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +65 -85
- package/dist/index.js +15 -16
- package/dist/layers/aggregation-layer.js +299 -331
- package/dist/layers/arc-layer/arc-layer-icon.js +27 -41
- package/dist/layers/arc-layer/arc-layer.js +174 -201
- package/dist/layers/base-layer.d.ts +1 -1
- package/dist/layers/base-layer.js +1371 -1544
- package/dist/layers/cluster-layer/cluster-layer-icon.js +30 -44
- package/dist/layers/cluster-layer/cluster-layer.js +89 -103
- package/dist/layers/default-layer-icon.js +39 -53
- package/dist/layers/geojson-layer/geojson-layer-icon.js +42 -55
- package/dist/layers/geojson-layer/geojson-layer.js +292 -353
- package/dist/layers/geojson-layer/geojson-utils.js +31 -36
- package/dist/layers/grid-layer/grid-layer-icon.js +87 -100
- package/dist/layers/grid-layer/grid-layer.js +51 -61
- package/dist/layers/grid-layer/grid-utils.js +13 -9
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +21 -35
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +225 -260
- package/dist/layers/h3-hexagon-layer/h3-utils.js +16 -16
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +39 -52
- package/dist/layers/heatmap-layer/heatmap-layer.js +140 -171
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +51 -64
- package/dist/layers/hexagon-layer/hexagon-layer.js +49 -63
- package/dist/layers/hexagon-layer/hexagon-utils.js +15 -14
- package/dist/layers/icon-layer/icon-info-modal.js +82 -75
- package/dist/layers/icon-layer/icon-layer-icon.js +24 -37
- package/dist/layers/icon-layer/icon-layer.js +274 -303
- package/dist/layers/index.js +43 -29
- package/dist/layers/layer-factory.js +25 -41
- package/dist/layers/layer-text-label.js +21 -23
- package/dist/layers/layer-update.js +16 -18
- package/dist/layers/line-layer/line-layer-icon.js +30 -43
- package/dist/layers/line-layer/line-layer.js +123 -142
- package/dist/layers/mapbox-utils.js +61 -62
- package/dist/layers/mapboxgl-layer.js +124 -169
- package/dist/layers/point-layer/point-layer-icon.js +45 -59
- package/dist/layers/point-layer/point-layer.d.ts +2 -2
- package/dist/layers/point-layer/point-layer.js +355 -386
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +208 -238
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +21 -35
- package/dist/layers/s2-geometry-layer/s2-utils.js +9 -8
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +24 -25
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +102 -115
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +148 -172
- package/dist/layers/trip-layer/trip-info-modal.js +50 -30
- package/dist/layers/trip-layer/trip-layer-icon.js +40 -53
- package/dist/layers/trip-layer/trip-layer.js +239 -307
- package/dist/layers/trip-layer/trip-utils.js +34 -50
- package/dist/layers/types.js +2 -2
- package/dist/localization/formatted-message.js +8 -10
- package/dist/localization/index.js +7 -7
- package/dist/localization/locales.js +6 -9
- package/dist/localization/messages.js +13 -10
- package/dist/localization/translations/ca.js +11 -13
- package/dist/localization/translations/cn.js +11 -13
- package/dist/localization/translations/en.js +11 -13
- package/dist/localization/translations/es.js +11 -13
- package/dist/localization/translations/fi.js +11 -13
- package/dist/localization/translations/ja.js +11 -13
- package/dist/localization/translations/pt.js +11 -13
- package/dist/localization/translations/ru.js +11 -13
- package/dist/middleware/index.js +3 -5
- package/dist/processors/data-processor.js +164 -201
- package/dist/processors/file-handler.js +111 -233
- package/dist/processors/index.js +4 -4
- package/dist/reducers/combined-updaters.js +41 -41
- package/dist/reducers/composer-helpers.js +20 -45
- package/dist/reducers/composers.js +9 -8
- package/dist/reducers/core.js +31 -35
- package/dist/reducers/index.js +21 -22
- package/dist/reducers/map-state-updaters.js +65 -47
- package/dist/reducers/map-state.js +23 -15
- package/dist/reducers/map-style-updaters.js +233 -159
- package/dist/reducers/map-style.js +30 -16
- package/dist/reducers/provider-state-updaters.js +217 -229
- package/dist/reducers/provider-state.js +29 -17
- package/dist/reducers/root.js +86 -58
- package/dist/reducers/ui-state-updaters.js +337 -218
- package/dist/reducers/ui-state.js +45 -16
- package/dist/reducers/vis-state-merger.js +205 -209
- package/dist/reducers/vis-state-selectors.js +5 -19
- package/dist/reducers/vis-state-updaters.js +1003 -876
- package/dist/reducers/vis-state.js +75 -16
- package/dist/schemas/dataset-schema.js +84 -108
- package/dist/schemas/index.js +28 -29
- package/dist/schemas/map-state-schema.js +21 -18
- package/dist/schemas/map-style-schema.js +47 -55
- package/dist/schemas/schema-manager.js +147 -161
- package/dist/schemas/schema-utils.js +8 -9
- package/dist/schemas/schema.js +72 -87
- package/dist/schemas/versions.js +3 -3
- package/dist/schemas/vis-state-schema.js +441 -583
- package/dist/styles/base.js +1217 -1021
- package/dist/styles/index.js +3 -3
- package/dist/styles/media-breakpoints.js +23 -18
- package/dist/tasks/tasks.js +36 -39
- package/dist/templates/export-map-html.js +233 -4
- package/dist/utils/aggregate-utils.js +13 -16
- package/dist/utils/color-utils.js +29 -37
- package/dist/utils/custom-scales.js +3 -3
- package/dist/utils/data-scale-utils.js +6 -13
- package/dist/utils/data-utils.js +60 -83
- package/dist/utils/dataset-utils.js +48 -77
- package/dist/utils/dom-to-image.js +108 -163
- package/dist/utils/dom-utils.js +88 -105
- package/dist/utils/export-utils.js +116 -103
- package/dist/utils/filter-utils.js +379 -374
- package/dist/utils/gl-utils.js +16 -15
- package/dist/utils/gpu-filter-utils.js +54 -73
- package/dist/utils/index.js +47 -48
- package/dist/utils/interaction-utils.js +53 -46
- package/dist/utils/layer-utils.js +89 -78
- package/dist/utils/locale-utils.js +24 -16
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +67 -76
- package/dist/utils/map-style-utils/mapbox-utils.js +4 -3
- package/dist/utils/mapbox-utils.js +3 -4
- package/dist/utils/notifications-utils.js +33 -38
- package/dist/utils/observe-dimensions.js +42 -54
- package/dist/utils/projection-utils.js +14 -11
- package/dist/utils/split-map-utils.js +30 -33
- package/dist/utils/table-utils/data-container-utils.js +15 -14
- package/dist/utils/table-utils/data-row.js +58 -65
- package/dist/utils/table-utils/index.js +2 -2
- package/dist/utils/table-utils/indexed-data-container.js +105 -173
- package/dist/utils/table-utils/kepler-table.js +362 -386
- package/dist/utils/table-utils/row-data-container.js +99 -164
- package/dist/utils/utils.js +29 -30
- package/package.json +21 -21
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +2 -2
- package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +21 -11
- package/src/layers/base-layer.ts +17 -10
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports
|
|
7
|
+
exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports.default = exports.DECK_AGGREGATION_MAP = void 0;
|
|
8
8
|
exports.getAggregatedData = getAggregatedData;
|
|
9
9
|
exports.getDimensionScale = getDimensionScale;
|
|
10
10
|
exports.getDimensionSortedBins = getDimensionSortedBins;
|
|
@@ -12,16 +12,12 @@ exports.getDimensionValueDomain = getDimensionValueDomain;
|
|
|
12
12
|
exports.getGetValue = getGetValue;
|
|
13
13
|
exports.getScaleFunctor = getScaleFunctor;
|
|
14
14
|
exports.getValueFunc = getValueFunc;
|
|
15
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
16
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
17
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
18
15
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
16
|
var _aggregationLayers = require("@deck.gl/aggregation-layers");
|
|
20
17
|
var _window = require("global/window");
|
|
21
18
|
var _aggregateUtils = require("../../utils/aggregate-utils");
|
|
22
19
|
var _defaultSettings = require("../../constants/default-settings");
|
|
23
|
-
|
|
24
|
-
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.
|
|
20
|
+
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
25
21
|
//
|
|
26
22
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
27
23
|
// of this software and associated documentation files (the "Software"), to deal
|
|
@@ -40,59 +36,78 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
40
36
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
41
37
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
42
38
|
// THE SOFTWARE.
|
|
39
|
+
|
|
43
40
|
/* eslint-disable guard-for-in */
|
|
44
|
-
|
|
41
|
+
|
|
42
|
+
/* @ts-expect-error BinSorter has been removed in deck.gl 9.1 so this entire file will no longer work */
|
|
43
|
+
|
|
44
|
+
const DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = {
|
|
45
|
+
SUM: _defaultSettings.AGGREGATION_TYPES.sum,
|
|
46
|
+
MEAN: _defaultSettings.AGGREGATION_TYPES.average,
|
|
47
|
+
MIN: _defaultSettings.AGGREGATION_TYPES.minimum,
|
|
48
|
+
MAX: _defaultSettings.AGGREGATION_TYPES.maximum
|
|
49
|
+
};
|
|
45
50
|
function getValueFunc(aggregation, accessor) {
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
const op = aggregation.toUpperCase();
|
|
52
|
+
if (!aggregation || !DECK_AGGREGATION_MAP[aggregation.toUpperCase()]) {
|
|
53
|
+
_window.console.warn(`Aggregation ${aggregation} is not supported`);
|
|
48
54
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return function (pts) {
|
|
52
|
-
return (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
|
|
53
|
-
};
|
|
55
|
+
const keplerOp = DECK_AGGREGATION_MAP[op || 'SUM'];
|
|
56
|
+
return pts => (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
|
|
54
57
|
}
|
|
55
58
|
function getScaleFunctor(scaleType) {
|
|
56
59
|
if (!scaleType || !_defaultSettings.SCALE_FUNC[scaleType]) {
|
|
57
|
-
_window.console.warn(
|
|
60
|
+
_window.console.warn(`Scale ${scaleType} is not supported`);
|
|
58
61
|
}
|
|
59
62
|
return _defaultSettings.SCALE_FUNC[scaleType] || _defaultSettings.SCALE_FUNC.quantize;
|
|
60
63
|
}
|
|
61
64
|
function nop() {}
|
|
62
65
|
function getGetValue(step, props, dimensionUpdater) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
const {
|
|
67
|
+
key
|
|
68
|
+
} = dimensionUpdater;
|
|
69
|
+
const {
|
|
70
|
+
value,
|
|
71
|
+
weight,
|
|
72
|
+
aggregation
|
|
73
|
+
} = step.triggers;
|
|
74
|
+
let getValue = props[value.prop];
|
|
69
75
|
if (getValue === null) {
|
|
70
76
|
// If `getValue` is not provided from props, build it with aggregation and weight.
|
|
71
77
|
getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
|
|
72
78
|
}
|
|
73
79
|
if (getValue) {
|
|
74
80
|
this._setDimensionState(key, {
|
|
75
|
-
getValue
|
|
81
|
+
getValue
|
|
76
82
|
});
|
|
77
83
|
}
|
|
78
84
|
}
|
|
79
85
|
function getDimensionSortedBins(step, props, dimensionUpdater) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
86
|
+
const {
|
|
87
|
+
key
|
|
88
|
+
} = dimensionUpdater;
|
|
89
|
+
const {
|
|
90
|
+
getValue
|
|
91
|
+
} = this.state.dimensions[key];
|
|
92
|
+
const sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
|
|
93
|
+
getValue,
|
|
84
94
|
filterData: props._filterData
|
|
85
95
|
});
|
|
86
96
|
this._setDimensionState(key, {
|
|
87
|
-
sortedBins
|
|
97
|
+
sortedBins
|
|
88
98
|
});
|
|
89
99
|
}
|
|
90
100
|
function getDimensionValueDomain(step, props, dimensionUpdater) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
const {
|
|
102
|
+
key
|
|
103
|
+
} = dimensionUpdater;
|
|
104
|
+
const {
|
|
105
|
+
triggers: {
|
|
106
|
+
lowerPercentile,
|
|
107
|
+
upperPercentile,
|
|
108
|
+
scaleType
|
|
109
|
+
}
|
|
110
|
+
} = step;
|
|
96
111
|
if (!this.state.dimensions[key].sortedBins) {
|
|
97
112
|
// the previous step should set sortedBins, if not, something went wrong
|
|
98
113
|
return;
|
|
@@ -100,37 +115,42 @@ function getDimensionValueDomain(step, props, dimensionUpdater) {
|
|
|
100
115
|
|
|
101
116
|
// for log and sqrt scale, returns linear domain by default
|
|
102
117
|
// TODO: support other scale function domain in bin sorter
|
|
103
|
-
|
|
118
|
+
const valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
|
|
104
119
|
this._setDimensionState(key, {
|
|
105
120
|
// By default sortedBins order by ascending frecuency but if we've an ordinal scale we want to order by descending frecuency
|
|
106
121
|
valueDomain: props[scaleType.prop] === _defaultSettings.SCALE_TYPES.ordinal ? valueDomain.reverse() : valueDomain
|
|
107
122
|
});
|
|
108
123
|
}
|
|
109
124
|
function getDimensionScale(step, props, dimensionUpdater) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
125
|
+
const {
|
|
126
|
+
key
|
|
127
|
+
} = dimensionUpdater;
|
|
128
|
+
const {
|
|
129
|
+
domain,
|
|
130
|
+
range,
|
|
131
|
+
scaleType
|
|
132
|
+
} = step.triggers;
|
|
133
|
+
const {
|
|
134
|
+
onSet
|
|
135
|
+
} = step;
|
|
116
136
|
if (!this.state.dimensions[key].valueDomain) {
|
|
117
137
|
// the previous step should set valueDomain, if not, something went wrong
|
|
118
138
|
return;
|
|
119
139
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (
|
|
140
|
+
const dimensionRange = props[range.prop];
|
|
141
|
+
const dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
|
|
142
|
+
const scaleTypeProp = scaleType && props[scaleType.prop];
|
|
143
|
+
const scaleFunctor = getScaleFunctor(scaleTypeProp)();
|
|
144
|
+
const scaleFunc = scaleFunctor.domain(scaleTypeProp === _defaultSettings.SCALE_TYPES.ordinal ? dimensionDomain.slice(0, dimensionRange.length) : dimensionDomain).range(dimensionRange).unknown(_defaultSettings.UNKNOWN_COLOR);
|
|
145
|
+
if (typeof onSet === 'object' && typeof props[onSet.props] === 'function') {
|
|
126
146
|
props[onSet.props](this.state.dimensions[key].valueDomain);
|
|
127
147
|
}
|
|
128
148
|
this._setDimensionState(key, {
|
|
129
|
-
scaleFunc
|
|
149
|
+
scaleFunc
|
|
130
150
|
});
|
|
131
151
|
}
|
|
132
152
|
function normalizeResult() {
|
|
133
|
-
|
|
153
|
+
let result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
134
154
|
// support previous hexagonAggregator API
|
|
135
155
|
if (result.hexagons) {
|
|
136
156
|
return Object.assign({
|
|
@@ -144,17 +164,21 @@ function normalizeResult() {
|
|
|
144
164
|
return result;
|
|
145
165
|
}
|
|
146
166
|
function getAggregatedData(step, props, aggregation, aggregationParams) {
|
|
147
|
-
|
|
148
|
-
|
|
167
|
+
const {
|
|
168
|
+
triggers: {
|
|
169
|
+
aggregator: aggr
|
|
170
|
+
}
|
|
171
|
+
} = step;
|
|
172
|
+
const aggregator = props[aggr.prop];
|
|
149
173
|
|
|
150
174
|
// result should contain a data array and other props
|
|
151
175
|
// result = {data: [], ...other props}
|
|
152
|
-
|
|
176
|
+
const result = aggregator(props, aggregationParams);
|
|
153
177
|
this.setState({
|
|
154
178
|
layerData: normalizeResult(result)
|
|
155
179
|
});
|
|
156
180
|
}
|
|
157
|
-
|
|
181
|
+
const defaultAggregation = exports.defaultAggregation = {
|
|
158
182
|
key: 'position',
|
|
159
183
|
updateSteps: [{
|
|
160
184
|
key: 'aggregate',
|
|
@@ -174,15 +198,17 @@ var defaultAggregation = exports.defaultAggregation = {
|
|
|
174
198
|
}]
|
|
175
199
|
};
|
|
176
200
|
function getSubLayerAccessor(dimensionState, dimension, layerProps) {
|
|
177
|
-
return
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
201
|
+
return cell => {
|
|
202
|
+
const {
|
|
203
|
+
sortedBins,
|
|
204
|
+
scaleFunc
|
|
205
|
+
} = dimensionState;
|
|
206
|
+
const bin = sortedBins.binMap[cell.index];
|
|
181
207
|
if (bin && bin.counts === 0) {
|
|
182
208
|
// no points left in bin after filtering
|
|
183
209
|
return dimension.nullValue;
|
|
184
210
|
}
|
|
185
|
-
|
|
211
|
+
const cv = bin && bin.value;
|
|
186
212
|
// const domain = scaleFunc.domain();
|
|
187
213
|
|
|
188
214
|
// const isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];
|
|
@@ -192,14 +218,16 @@ function getSubLayerAccessor(dimensionState, dimension, layerProps) {
|
|
|
192
218
|
return scaleFunc(cv);
|
|
193
219
|
};
|
|
194
220
|
}
|
|
195
|
-
|
|
221
|
+
const defaultColorDimension = exports.defaultColorDimension = {
|
|
196
222
|
key: 'fillColor',
|
|
197
223
|
accessor: 'getFillColor',
|
|
198
|
-
getPickingInfo:
|
|
199
|
-
|
|
200
|
-
|
|
224
|
+
getPickingInfo: (dimensionState, cell) => {
|
|
225
|
+
const {
|
|
226
|
+
sortedBins
|
|
227
|
+
} = dimensionState;
|
|
228
|
+
const colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
|
|
201
229
|
return {
|
|
202
|
-
colorValue
|
|
230
|
+
colorValue
|
|
203
231
|
};
|
|
204
232
|
},
|
|
205
233
|
nullValue: [0, 0, 0, 0],
|
|
@@ -260,16 +288,18 @@ var defaultColorDimension = exports.defaultColorDimension = {
|
|
|
260
288
|
},
|
|
261
289
|
updater: getDimensionScale
|
|
262
290
|
}],
|
|
263
|
-
getSubLayerAccessor
|
|
291
|
+
getSubLayerAccessor
|
|
264
292
|
};
|
|
265
|
-
|
|
293
|
+
const defaultElevationDimension = exports.defaultElevationDimension = {
|
|
266
294
|
key: 'elevation',
|
|
267
295
|
accessor: 'getElevation',
|
|
268
|
-
getPickingInfo:
|
|
269
|
-
|
|
270
|
-
|
|
296
|
+
getPickingInfo: (dimensionState, cell) => {
|
|
297
|
+
const {
|
|
298
|
+
sortedBins
|
|
299
|
+
} = dimensionState;
|
|
300
|
+
const elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
|
|
271
301
|
return {
|
|
272
|
-
elevationValue
|
|
302
|
+
elevationValue
|
|
273
303
|
};
|
|
274
304
|
},
|
|
275
305
|
nullValue: -1,
|
|
@@ -330,14 +360,16 @@ var defaultElevationDimension = exports.defaultElevationDimension = {
|
|
|
330
360
|
},
|
|
331
361
|
updater: getDimensionScale
|
|
332
362
|
}],
|
|
333
|
-
getSubLayerAccessor
|
|
363
|
+
getSubLayerAccessor
|
|
334
364
|
};
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
(0,
|
|
340
|
-
this
|
|
365
|
+
const defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
|
|
366
|
+
class CPUAggregator {
|
|
367
|
+
constructor() {
|
|
368
|
+
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
369
|
+
(0, _defineProperty2.default)(this, "state", void 0);
|
|
370
|
+
(0, _defineProperty2.default)(this, "dimensionUpdaters", void 0);
|
|
371
|
+
(0, _defineProperty2.default)(this, "aggregationUpdater", void 0);
|
|
372
|
+
this.state = {
|
|
341
373
|
layerData: {},
|
|
342
374
|
dimensions: {
|
|
343
375
|
// color: {
|
|
@@ -352,234 +384,201 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
352
384
|
// sortedBins: null,
|
|
353
385
|
// scaleFunc: nop
|
|
354
386
|
// }
|
|
355
|
-
}
|
|
356
|
-
|
|
387
|
+
},
|
|
388
|
+
...opts.initialState
|
|
389
|
+
};
|
|
357
390
|
this.dimensionUpdaters = {};
|
|
358
391
|
this.aggregationUpdater = opts.aggregation || defaultAggregation;
|
|
359
|
-
this._addDimension(opts.dimensions ||
|
|
392
|
+
this._addDimension(opts.dimensions || defaultDimensions);
|
|
360
393
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
dimensionChanges.forEach(function (f) {
|
|
371
|
-
return typeof f === 'function' && f();
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
}, {
|
|
375
|
-
key: "updateAggregation",
|
|
376
|
-
value: function updateAggregation(props, aggregationParams) {
|
|
377
|
-
var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
|
|
378
|
-
updaters.forEach(function (f) {
|
|
379
|
-
return typeof f === 'function' && f(aggregationParams);
|
|
380
|
-
});
|
|
394
|
+
static defaultDimensions() {
|
|
395
|
+
return defaultDimensions;
|
|
396
|
+
}
|
|
397
|
+
updateAllDimensions(props) {
|
|
398
|
+
let dimensionChanges = [];
|
|
399
|
+
// update all dimensions
|
|
400
|
+
for (const dim in this.dimensionUpdaters) {
|
|
401
|
+
const updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
|
|
402
|
+
dimensionChanges = dimensionChanges.concat(updaters);
|
|
381
403
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
if
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
return typeof f === 'function' && f(aggregationParams);
|
|
400
|
-
});
|
|
401
|
-
this.updateAllDimensions(props);
|
|
402
|
-
} else {
|
|
403
|
-
// only update dimensions
|
|
404
|
-
dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
|
|
405
|
-
dimensionChanges.forEach(function (f) {
|
|
406
|
-
return typeof f === 'function' && f();
|
|
407
|
-
});
|
|
408
|
-
}
|
|
404
|
+
dimensionChanges.forEach(f => typeof f === 'function' && f());
|
|
405
|
+
}
|
|
406
|
+
updateAggregation(props, aggregationParams) {
|
|
407
|
+
const updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
|
|
408
|
+
updaters.forEach(f => typeof f === 'function' && f(aggregationParams));
|
|
409
|
+
}
|
|
410
|
+
updateState(opts, aggregationParams) {
|
|
411
|
+
const {
|
|
412
|
+
oldProps,
|
|
413
|
+
props,
|
|
414
|
+
changeFlags
|
|
415
|
+
} = opts;
|
|
416
|
+
let dimensionChanges = [];
|
|
417
|
+
if (changeFlags.dataChanged) {
|
|
418
|
+
// if data changed update everything
|
|
419
|
+
this.updateAggregation(props, aggregationParams);
|
|
420
|
+
this.updateAllDimensions(props);
|
|
409
421
|
return this.state;
|
|
410
422
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
423
|
+
const aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
|
|
424
|
+
if (aggregationChanges && aggregationChanges.length) {
|
|
425
|
+
// get aggregatedData
|
|
426
|
+
aggregationChanges.forEach(f => typeof f === 'function' && f(aggregationParams));
|
|
427
|
+
this.updateAllDimensions(props);
|
|
428
|
+
} else {
|
|
429
|
+
// only update dimensions
|
|
430
|
+
dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
|
|
431
|
+
dimensionChanges.forEach(f => typeof f === 'function' && f());
|
|
417
432
|
}
|
|
433
|
+
return this.state;
|
|
434
|
+
}
|
|
418
435
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
}
|
|
454
|
-
// fallback to direct comparison
|
|
455
|
-
return oldProps[item.prop] !== props[item.prop];
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
}, {
|
|
459
|
-
key: "_accumulateUpdaters",
|
|
460
|
-
value: function _accumulateUpdaters(step, props, dimension) {
|
|
461
|
-
var updaters = [];
|
|
462
|
-
for (var i = step; i < dimension.updateSteps.length; i++) {
|
|
463
|
-
var updater = dimension.updateSteps[i].updater;
|
|
464
|
-
if (typeof updater === 'function') {
|
|
465
|
-
updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
|
|
466
|
-
}
|
|
436
|
+
// Update private state
|
|
437
|
+
setState(updateObject) {
|
|
438
|
+
this.state = Object.assign({}, this.state, updateObject);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Update private state.dimensions
|
|
442
|
+
_setDimensionState(key, updateObject) {
|
|
443
|
+
this.setState({
|
|
444
|
+
dimensions: Object.assign({}, this.state.dimensions, {
|
|
445
|
+
[key]: Object.assign({}, this.state.dimensions[key], updateObject)
|
|
446
|
+
})
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
_addAggregation(aggregation) {
|
|
450
|
+
this.aggregationUpdater = aggregation;
|
|
451
|
+
}
|
|
452
|
+
_addDimension() {
|
|
453
|
+
let dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
454
|
+
dimensions.forEach(dimension => {
|
|
455
|
+
const {
|
|
456
|
+
key
|
|
457
|
+
} = dimension;
|
|
458
|
+
this.dimensionUpdaters[key] = dimension;
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
_needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
|
|
462
|
+
// whether need to update current dimension step
|
|
463
|
+
// dimension step is the value, domain, scaleFunction of each dimension
|
|
464
|
+
// each step is an object with properties links to layer prop and whether the prop is
|
|
465
|
+
// controlled by updateTriggers
|
|
466
|
+
return Object.values(dimensionStep.triggers).some(item => {
|
|
467
|
+
if (item.updateTrigger) {
|
|
468
|
+
// check based on updateTriggers change first
|
|
469
|
+
return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
|
|
467
470
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
if (needUpdateStep > -1) {
|
|
479
|
-
updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
|
|
471
|
+
// fallback to direct comparison
|
|
472
|
+
return oldProps[item.prop] !== props[item.prop];
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
_accumulateUpdaters(step, props, dimension) {
|
|
476
|
+
const updaters = [];
|
|
477
|
+
for (let i = step; i < dimension.updateSteps.length; i++) {
|
|
478
|
+
const updater = dimension.updateSteps[i].updater;
|
|
479
|
+
if (typeof updater === 'function') {
|
|
480
|
+
updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
|
|
480
481
|
}
|
|
481
|
-
return updaters;
|
|
482
482
|
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
483
|
+
return updaters;
|
|
484
|
+
}
|
|
485
|
+
_getAllUpdaters(dimension, oldProps, props, changeFlags) {
|
|
486
|
+
let updaters = [];
|
|
487
|
+
const needUpdateStep = dimension.updateSteps.findIndex(step => this._needUpdateStep(step, oldProps, props, changeFlags));
|
|
488
|
+
if (needUpdateStep > -1) {
|
|
489
|
+
updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
|
|
488
490
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
491
|
+
return updaters;
|
|
492
|
+
}
|
|
493
|
+
_getAggregationChanges(oldProps, props, changeFlags) {
|
|
494
|
+
const updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
|
|
495
|
+
return updaters.length ? updaters : null;
|
|
496
|
+
}
|
|
497
|
+
_getDimensionChanges(oldProps, props, changeFlags) {
|
|
498
|
+
let updaters = [];
|
|
493
499
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
}
|
|
501
|
-
return updaters.length ? updaters : null;
|
|
500
|
+
// get dimension to be updated
|
|
501
|
+
for (const key in this.dimensionUpdaters) {
|
|
502
|
+
// return the first triggered updater for each dimension
|
|
503
|
+
const dimension = this.dimensionUpdaters[key];
|
|
504
|
+
const dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
|
|
505
|
+
updaters = updaters.concat(dimensionUpdaters);
|
|
502
506
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
// if prop is not based on updateTrigger
|
|
532
|
-
updateTriggers[accessor][prop] = props[prop];
|
|
507
|
+
return updaters.length ? updaters : null;
|
|
508
|
+
}
|
|
509
|
+
getUpdateTriggers(props) {
|
|
510
|
+
const _updateTriggers = props.updateTriggers || {};
|
|
511
|
+
const updateTriggers = {};
|
|
512
|
+
for (const key in this.dimensionUpdaters) {
|
|
513
|
+
const {
|
|
514
|
+
accessor,
|
|
515
|
+
updateSteps
|
|
516
|
+
} = this.dimensionUpdaters[key];
|
|
517
|
+
// fold dimension triggers into each accessor
|
|
518
|
+
updateTriggers[accessor] = {};
|
|
519
|
+
updateSteps.forEach(step => {
|
|
520
|
+
Object.values(step.triggers || []).forEach(_ref => {
|
|
521
|
+
let {
|
|
522
|
+
prop,
|
|
523
|
+
updateTrigger
|
|
524
|
+
} = _ref;
|
|
525
|
+
if (updateTrigger) {
|
|
526
|
+
// if prop is based on updateTrigger e.g. getColorValue, getColorWeight
|
|
527
|
+
// and updateTriggers is passed in from layer prop
|
|
528
|
+
// fold the updateTriggers into accessor
|
|
529
|
+
const fromProp = _updateTriggers[updateTrigger];
|
|
530
|
+
if (typeof fromProp === 'object' && !Array.isArray(fromProp)) {
|
|
531
|
+
// if updateTrigger is an object spread it
|
|
532
|
+
Object.assign(updateTriggers[accessor], fromProp);
|
|
533
|
+
} else if (fromProp !== undefined) {
|
|
534
|
+
updateTriggers[accessor][prop] = fromProp;
|
|
533
535
|
}
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
for (var key in this.dimensionUpdaters) {
|
|
538
|
-
_loop();
|
|
539
|
-
}
|
|
540
|
-
return updateTriggers;
|
|
541
|
-
}
|
|
542
|
-
}, {
|
|
543
|
-
key: "getPickingInfo",
|
|
544
|
-
value: function getPickingInfo(_ref2, layerProps) {
|
|
545
|
-
var info = _ref2.info;
|
|
546
|
-
var isPicked = info.picked && info.index > -1;
|
|
547
|
-
var object = null;
|
|
548
|
-
if (isPicked) {
|
|
549
|
-
var cell = this.state.layerData.data[info.index];
|
|
550
|
-
var binInfo = {};
|
|
551
|
-
for (var key in this.dimensionUpdaters) {
|
|
552
|
-
var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
|
|
553
|
-
if (typeof _getPickingInfo === 'function') {
|
|
554
|
-
binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
|
|
536
|
+
} else {
|
|
537
|
+
// if prop is not based on updateTrigger
|
|
538
|
+
updateTriggers[accessor][prop] = props[prop];
|
|
555
539
|
}
|
|
556
|
-
}
|
|
557
|
-
object = Object.assign(binInfo, cell, {
|
|
558
|
-
points: cell.filteredPoints || cell.points
|
|
559
540
|
});
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
// add bin and to info
|
|
563
|
-
return Object.assign(info, {
|
|
564
|
-
picked: Boolean(object),
|
|
565
|
-
// override object with picked cell
|
|
566
|
-
object: object
|
|
567
541
|
});
|
|
568
542
|
}
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
543
|
+
return updateTriggers;
|
|
544
|
+
}
|
|
545
|
+
getPickingInfo(_ref2, layerProps) {
|
|
546
|
+
let {
|
|
547
|
+
info
|
|
548
|
+
} = _ref2;
|
|
549
|
+
const isPicked = info.picked && info.index > -1;
|
|
550
|
+
let object = null;
|
|
551
|
+
if (isPicked) {
|
|
552
|
+
const cell = this.state.layerData.data[info.index];
|
|
553
|
+
let binInfo = {};
|
|
554
|
+
for (const key in this.dimensionUpdaters) {
|
|
555
|
+
const {
|
|
556
|
+
getPickingInfo
|
|
557
|
+
} = this.dimensionUpdaters[key];
|
|
558
|
+
if (typeof getPickingInfo === 'function') {
|
|
559
|
+
binInfo = Object.assign({}, binInfo, getPickingInfo(this.state.dimensions[key], cell, layerProps));
|
|
560
|
+
}
|
|
574
561
|
}
|
|
575
|
-
|
|
562
|
+
object = Object.assign(binInfo, cell, {
|
|
563
|
+
points: cell.filteredPoints || cell.points
|
|
564
|
+
});
|
|
576
565
|
}
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
566
|
+
|
|
567
|
+
// add bin and to info
|
|
568
|
+
return Object.assign(info, {
|
|
569
|
+
picked: Boolean(object),
|
|
570
|
+
// override object with picked cell
|
|
571
|
+
object
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
getAccessor(dimensionKey, layerProps) {
|
|
575
|
+
if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
|
|
576
|
+
return nop;
|
|
581
577
|
}
|
|
582
|
-
|
|
583
|
-
}
|
|
578
|
+
return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
exports.default = CPUAggregator;
|
|
582
|
+
(0, _defineProperty2.default)(CPUAggregator, "getDimensionScale", void 0);
|
|
584
583
|
CPUAggregator.getDimensionScale = getDimensionScale;
|
|
585
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiZXhwb3J0cyIsIkFHR1JFR0FUSU9OX09QRVJBVElPTiIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0Iiwib3AiLCJrZXBsZXJPcCIsInB0cyIsImFnZ3JlZ2F0ZSIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsIl9zdGVwJHRyaWdnZXJzIiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwiX3N0ZXAkdHJpZ2dlcnMyIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJyZXZlcnNlIiwiZ2V0RGltZW5zaW9uU2NhbGUiLCJfc3RlcCR0cmlnZ2VyczMiLCJkb21haW4iLCJyYW5nZSIsIm9uU2V0IiwiZGltZW5zaW9uUmFuZ2UiLCJkaW1lbnNpb25Eb21haW4iLCJzY2FsZVR5cGVQcm9wIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwic2xpY2UiLCJ1bmtub3duIiwiVU5LTk9XTl9DT0xPUiIsIl90eXBlb2YyIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdnciIsImFnZ3JlZ2F0b3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwib3B0cyIsIl9jbGFzc0NhbGxDaGVjazIiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJfY3JlYXRlQ2xhc3MyIiwidXBkYXRlQWxsRGltZW5zaW9ucyIsImRpbWVuc2lvbkNoYW5nZXMiLCJkaW0iLCJ1cGRhdGVycyIsIl9hY2N1bXVsYXRlVXBkYXRlcnMiLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl9hZGRBZ2dyZWdhdGlvbiIsIl90aGlzIiwiX25lZWRVcGRhdGVTdGVwIiwiZGltZW5zaW9uU3RlcCIsInZhbHVlcyIsInNvbWUiLCJpdGVtIiwidXBkYXRlVHJpZ2dlcnNDaGFuZ2VkIiwiYWxsIiwiaSIsImJpbmQiLCJfZ2V0QWxsVXBkYXRlcnMiLCJfdGhpczIiLCJuZWVkVXBkYXRlU3RlcCIsImZpbmRJbmRleCIsImdldFVwZGF0ZVRyaWdnZXJzIiwiX3RoaXMzIiwiX3VwZGF0ZVRyaWdnZXJzIiwidXBkYXRlVHJpZ2dlcnMiLCJfbG9vcCIsIl90aGlzMyRkaW1lbnNpb25VcGRhdCIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB7QUdHUkVHQVRJT05fT1BFUkFUSU9OLCBfQmluU29ydGVyIGFzIEJpblNvcnRlcn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJy4uLy4uL3V0aWxzL2FnZ3JlZ2F0ZS11dGlscyc7XG5pbXBvcnQge0FHR1JFR0FUSU9OX1RZUEVTLCBTQ0FMRV9GVU5DLCBTQ0FMRV9UWVBFUywgVU5LTk9XTl9DT0xPUn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtSR0JBQ29sb3J9IGZyb20gJy4uLy4uL3JlZHVjZXJzJztcblxuZXhwb3J0IHR5cGUgVXBkYXRlclR5cGUgPSAodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBCaW5kZWRVcGRhdGVyVHlwZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVkVXBkYXRlclR5cGUgPSAoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChhZ2dyZWdhdGlvblBhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIG9uU2V0Pzoge1xuICAgIHByb3BzOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZXI6IFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRGltZW5zaW9uVHlwZTxWYWx1ZVR5cGUgPSBhbnk+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgYWNjZXNzb3I6IHN0cmluZztcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcz8pID0+IGFueTtcbiAgbnVsbFZhbHVlOiBWYWx1ZVR5cGU7XG4gIHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXTtcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIHVwZGF0ZXI6IEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHVwZGF0ZVN0ZXBzOiBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IERFQ0tfQUdHUkVHQVRJT05fTUFQID0ge1xuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTV06IEFHR1JFR0FUSU9OX1RZUEVTLnN1bSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NRUFOXTogQUdHUkVHQVRJT05fVFlQRVMuYXZlcmFnZSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NSU5dOiBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1BWF06IEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZ1bmMoYWdncmVnYXRpb24sIGFjY2Vzc29yKSB7XG4gIGlmICghYWdncmVnYXRpb24gfHwgIUFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBBR0dSRUdBVElPTl9PUEVSQVRJT05bYWdncmVnYXRpb24udG9VcHBlckNhc2UoKV0gfHwgQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTTtcbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcF07XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGEgfHwgW10sIHtcbiAgICBnZXRWYWx1ZSxcbiAgICBmaWx0ZXJEYXRhOiBwcm9wcy5fZmlsdGVyRGF0YVxuICB9KTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c29ydGVkQmluc30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHtsb3dlclBlcmNlbnRpbGUsIHVwcGVyUGVyY2VudGlsZSwgc2NhbGVUeXBlfVxuICB9ID0gc3RlcDtcblxuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMpIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHNvcnRlZEJpbnMsIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNjYWxlIGZ1bmN0aW9uIGRvbWFpbiBpbiBiaW4gc29ydGVyXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucy5nZXRWYWx1ZURvbWFpbkJ5U2NhbGUoXG4gICAgcHJvcHNbc2NhbGVUeXBlLnByb3BdLFxuICAgIFtwcm9wc1tsb3dlclBlcmNlbnRpbGUucHJvcF0sIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXV1cbiAgKTtcblxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtcbiAgICAvLyBCeSBkZWZhdWx0IHNvcnRlZEJpbnMgb3JkZXIgYnkgYXNjZW5kaW5nIGZyZWN1ZW5jeSAgYnV0IGlmIHdlJ3ZlIGFuIG9yZGluYWwgc2NhbGUgd2Ugd2FudCB0byBvcmRlciBieSBkZXNjZW5kaW5nIGZyZWN1ZW5jeVxuICAgIHZhbHVlRG9tYWluOiBwcm9wc1tzY2FsZVR5cGUucHJvcF0gPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgPyB2YWx1ZURvbWFpbi5yZXZlcnNlKCkgOiB2YWx1ZURvbWFpblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNjYWxlKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge2RvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZX0gPSBzdGVwLnRyaWdnZXJzO1xuICBjb25zdCB7b25TZXR9ID0gc3RlcDtcbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbikge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgdmFsdWVEb21haW4sIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaW1lbnNpb25SYW5nZSA9IHByb3BzW3JhbmdlLnByb3BdO1xuICBjb25zdCBkaW1lbnNpb25Eb21haW4gPSBwcm9wc1tkb21haW4ucHJvcF0gfHwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW47XG5cbiAgY29uc3Qgc2NhbGVUeXBlUHJvcCA9IHNjYWxlVHlwZSAmJiBwcm9wc1tzY2FsZVR5cGUucHJvcF07XG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGVQcm9wKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3RvclxuICAgIC5kb21haW4oXG4gICAgICBzY2FsZVR5cGVQcm9wID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsXG4gICAgICAgID8gZGltZW5zaW9uRG9tYWluLnNsaWNlKDAsIGRpbWVuc2lvblJhbmdlLmxlbmd0aClcbiAgICAgICAgOiBkaW1lbnNpb25Eb21haW5cbiAgICApXG4gICAgLnJhbmdlKGRpbWVuc2lvblJhbmdlKVxuICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuXG4gIGlmICh0eXBlb2Ygb25TZXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9wc1tvblNldC5wcm9wc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9wc1tvblNldC5wcm9wc10odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIC8vIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICAvLyByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhjdik7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7Y29sb3JWYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogWzAsIDAsIDAsIDBdLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvclZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWlnaHQ6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JXZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvcldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnY29sb3JBZ2dyZWdhdGlvbidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEdldFZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRCaW5zJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIF9maWx0ZXJEYXRhOiB7XG4gICAgICAgICAgcHJvcDogJ19maWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnX2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25Tb3J0ZWRCaW5zXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXREb21haW4nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgbG93ZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ2xvd2VyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgdXBwZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ3VwcGVyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdjb2xvckRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdjb2xvclJhbmdlJ30sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldENvbG9yRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxudW1iZXI+ID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCB0eXBlIENQVUFnZ3JlZ2F0b3JTdGF0ZSA9IHtsYXllckRhdGE6IHtkYXRhP307IGRpbWVuc2lvbnM6IHt9fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1BVQWdncmVnYXRvciB7XG4gIHN0YXRpYyBnZXREaW1lbnNpb25TY2FsZTogYW55O1xuICBzdGF0ZTogQ1BVQWdncmVnYXRvclN0YXRlO1xuICBkaW1lbnNpb25VcGRhdGVyczoge1trZXk6IHN0cmluZ106IERpbWVuc2lvblR5cGV9O1xuICBhZ2dyZWdhdGlvblVwZGF0ZXI6IEFnZ3JlZ2F0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRzOiB7XG4gICAgICBpbml0aWFsU3RhdGU/OiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gICAgICBkaW1lbnNpb25zPzogRGltZW5zaW9uVHlwZVtdO1xuICAgICAgYWdncmVnYXRpb24/OiBBZ2dyZWdhdGlvblR5cGU7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXllckRhdGE6IHt9LFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVsZXZhdGlvbjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRzLmluaXRpYWxTdGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzID0ge307XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBvcHRzLmFnZ3JlZ2F0aW9uIHx8IGRlZmF1bHRBZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuX2FkZERpbWVuc2lvbihvcHRzLmRpbWVuc2lvbnMgfHwgZGVmYXVsdERpbWVuc2lvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlKSB7XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBhZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIF9hZGREaW1lbnNpb24oZGltZW5zaW9uczogRGltZW5zaW9uVHlwZVtdID0gW10pIHtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uO1xuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldID0gZGltZW5zaW9uO1xuICAgIH0pO1xuICB9XG5cbiAgX25lZWRVcGRhdGVTdGVwKFxuICAgIGRpbWVuc2lvblN0ZXA6IFVwZGF0ZVN0ZXBzVHlwZSB8IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgc3RlcCxcbiAgICBwcm9wcyxcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIFVwZGF0ZXJUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICB0eXBlIFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQTJHLFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FB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
|
|
584
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJERUNLX0FHR1JFR0FUSU9OX01BUCIsImV4cG9ydHMiLCJTVU0iLCJBR0dSRUdBVElPTl9UWVBFUyIsInN1bSIsIk1FQU4iLCJhdmVyYWdlIiwiTUlOIiwibWluaW11bSIsIk1BWCIsIm1heGltdW0iLCJnZXRWYWx1ZUZ1bmMiLCJhZ2dyZWdhdGlvbiIsImFjY2Vzc29yIiwib3AiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwia2VwbGVyT3AiLCJwdHMiLCJhZ2dyZWdhdGUiLCJtYXAiLCJnZXRTY2FsZUZ1bmN0b3IiLCJzY2FsZVR5cGUiLCJTQ0FMRV9GVU5DIiwicXVhbnRpemUiLCJub3AiLCJnZXRHZXRWYWx1ZSIsInN0ZXAiLCJwcm9wcyIsImRpbWVuc2lvblVwZGF0ZXIiLCJrZXkiLCJ2YWx1ZSIsIndlaWdodCIsInRyaWdnZXJzIiwiZ2V0VmFsdWUiLCJwcm9wIiwiX3NldERpbWVuc2lvblN0YXRlIiwiZ2V0RGltZW5zaW9uU29ydGVkQmlucyIsInN0YXRlIiwiZGltZW5zaW9ucyIsInNvcnRlZEJpbnMiLCJCaW5Tb3J0ZXIiLCJsYXllckRhdGEiLCJkYXRhIiwiZmlsdGVyRGF0YSIsIl9maWx0ZXJEYXRhIiwiZ2V0RGltZW5zaW9uVmFsdWVEb21haW4iLCJsb3dlclBlcmNlbnRpbGUiLCJ1cHBlclBlcmNlbnRpbGUiLCJ2YWx1ZURvbWFpbiIsImdldFZhbHVlRG9tYWluQnlTY2FsZSIsIlNDQUxFX1RZUEVTIiwib3JkaW5hbCIsInJldmVyc2UiLCJnZXREaW1lbnNpb25TY2FsZSIsImRvbWFpbiIsInJhbmdlIiwib25TZXQiLCJkaW1lbnNpb25SYW5nZSIsImRpbWVuc2lvbkRvbWFpbiIsInNjYWxlVHlwZVByb3AiLCJzY2FsZUZ1bmN0b3IiLCJzY2FsZUZ1bmMiLCJzbGljZSIsImxlbmd0aCIsInVua25vd24iLCJVTktOT1dOX0NPTE9SIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdncmVnYXRvciIsImFnZ3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJ1cGRhdGVBbGxEaW1lbnNpb25zIiwiZGltZW5zaW9uQ2hhbmdlcyIsImRpbSIsInVwZGF0ZXJzIiwiX2FjY3VtdWxhdGVVcGRhdGVycyIsImNvbmNhdCIsImZvckVhY2giLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl9hZGRBZ2dyZWdhdGlvbiIsIl9uZWVkVXBkYXRlU3RlcCIsImRpbWVuc2lvblN0ZXAiLCJ2YWx1ZXMiLCJzb21lIiwiaXRlbSIsInVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCIsImFsbCIsImkiLCJwdXNoIiwiYmluZCIsIl9nZXRBbGxVcGRhdGVycyIsIm5lZWRVcGRhdGVTdGVwIiwiZmluZEluZGV4IiwiZ2V0VXBkYXRlVHJpZ2dlcnMiLCJfdXBkYXRlVHJpZ2dlcnMiLCJ1cGRhdGVUcmlnZ2VycyIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB0eXBlIHtBZ2dyZWdhdGlvbk9wZXJhdGlvbn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmluU29ydGVyIGhhcyBiZWVuIHJlbW92ZWQgaW4gZGVjay5nbCA5LjEgc28gdGhpcyBlbnRpcmUgZmlsZSB3aWxsIG5vIGxvbmdlciB3b3JrICovXG5pbXBvcnQge19CaW5Tb3J0ZXIgYXMgQmluU29ydGVyfSBmcm9tICdAZGVjay5nbC9hZ2dyZWdhdGlvbi1sYXllcnMnO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWdncmVnYXRlLXV0aWxzJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1RZUEVTLFxuICBTQ0FMRV9GVU5DLFxuICBTQ0FMRV9UWVBFUyxcbiAgVU5LTk9XTl9DT0xPUlxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge1JHQkFDb2xvciwgVmFsdWVPZn0gZnJvbSAnLi4vLi4vcmVkdWNlcnMnO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyVHlwZSA9ICh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZFVwZGF0ZXJUeXBlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChcbiAgdGhpczogQ1BVQWdncmVnYXRvcixcbiAgc3RlcCxcbiAgcHJvcHMsXG4gIGFnZ3JlZ2F0aW9uLFxuICBhZ2dyZWdhdGlvblBhcmFtc1xuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlID0gKGFnZ3JlZ2F0aW9uUGFyYW1zKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25TZXQ/OiB7XG4gICAgcHJvcHM6IHN0cmluZztcbiAgfTtcbiAgdXBkYXRlcjogVXBkYXRlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEaW1lbnNpb25UeXBlPFZhbHVlVHlwZSA9IGFueT4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsLCBsYXllclByb3BzPykgPT4gYW55O1xuICBudWxsVmFsdWU6IFZhbHVlVHlwZTtcbiAgdXBkYXRlU3RlcHM6IFVwZGF0ZVN0ZXBzVHlwZVtdO1xuICBnZXRTdWJMYXllckFjY2Vzc29yO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgdXBkYXRlcjogQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdXBkYXRlU3RlcHM6IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlW107XG59O1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVA6IFBhcnRpYWw8UmVjb3JkPFxuICBBZ2dyZWdhdGlvbk9wZXJhdGlvbixcbiAgVmFsdWVPZjx0eXBlb2YgQUdHUkVHQVRJT05fVFlQRVM+XG4+PiA9IHtcbiAgU1VNOiBBR0dSRUdBVElPTl9UWVBFUy5zdW0sXG4gIE1FQU46IEFHR1JFR0FUSU9OX1RZUEVTLmF2ZXJhZ2UsXG4gIE1JTjogQUdHUkVHQVRJT05fVFlQRVMubWluaW11bSxcbiAgTUFYOiBBR0dSRUdBVElPTl9UWVBFUy5tYXhpbXVtXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGdW5jKGFnZ3JlZ2F0aW9uLCBhY2Nlc3Nvcikge1xuICBjb25zdCBvcDogQWdncmVnYXRpb25PcGVyYXRpb24gPSBhZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWFnZ3JlZ2F0aW9uIHx8ICFERUNLX0FHR1JFR0FUSU9OX01BUFthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcCB8fCAnU1VNJ107XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGEgfHwgW10sIHtcbiAgICBnZXRWYWx1ZSxcbiAgICBmaWx0ZXJEYXRhOiBwcm9wcy5fZmlsdGVyRGF0YVxuICB9KTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c29ydGVkQmluc30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHtsb3dlclBlcmNlbnRpbGUsIHVwcGVyUGVyY2VudGlsZSwgc2NhbGVUeXBlfVxuICB9ID0gc3RlcDtcblxuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMpIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHNvcnRlZEJpbnMsIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNjYWxlIGZ1bmN0aW9uIGRvbWFpbiBpbiBiaW4gc29ydGVyXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucy5nZXRWYWx1ZURvbWFpbkJ5U2NhbGUoXG4gICAgcHJvcHNbc2NhbGVUeXBlLnByb3BdLFxuICAgIFtwcm9wc1tsb3dlclBlcmNlbnRpbGUucHJvcF0sIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXV1cbiAgKTtcblxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtcbiAgICAvLyBCeSBkZWZhdWx0IHNvcnRlZEJpbnMgb3JkZXIgYnkgYXNjZW5kaW5nIGZyZWN1ZW5jeSAgYnV0IGlmIHdlJ3ZlIGFuIG9yZGluYWwgc2NhbGUgd2Ugd2FudCB0byBvcmRlciBieSBkZXNjZW5kaW5nIGZyZWN1ZW5jeVxuICAgIHZhbHVlRG9tYWluOiBwcm9wc1tzY2FsZVR5cGUucHJvcF0gPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgPyB2YWx1ZURvbWFpbi5yZXZlcnNlKCkgOiB2YWx1ZURvbWFpblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNjYWxlKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge2RvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZX0gPSBzdGVwLnRyaWdnZXJzO1xuICBjb25zdCB7b25TZXR9ID0gc3RlcDtcbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbikge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgdmFsdWVEb21haW4sIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaW1lbnNpb25SYW5nZSA9IHByb3BzW3JhbmdlLnByb3BdO1xuICBjb25zdCBkaW1lbnNpb25Eb21haW4gPSBwcm9wc1tkb21haW4ucHJvcF0gfHwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW47XG5cbiAgY29uc3Qgc2NhbGVUeXBlUHJvcCA9IHNjYWxlVHlwZSAmJiBwcm9wc1tzY2FsZVR5cGUucHJvcF07XG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGVQcm9wKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3RvclxuICAgIC5kb21haW4oXG4gICAgICBzY2FsZVR5cGVQcm9wID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsXG4gICAgICAgID8gZGltZW5zaW9uRG9tYWluLnNsaWNlKDAsIGRpbWVuc2lvblJhbmdlLmxlbmd0aClcbiAgICAgICAgOiBkaW1lbnNpb25Eb21haW5cbiAgICApXG4gICAgLnJhbmdlKGRpbWVuc2lvblJhbmdlKVxuICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuXG4gIGlmICh0eXBlb2Ygb25TZXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9wc1tvblNldC5wcm9wc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9wc1tvblNldC5wcm9wc10odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIC8vIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICAvLyByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhjdik7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7Y29sb3JWYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogWzAsIDAsIDAsIDBdLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvclZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWlnaHQ6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JXZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvcldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnY29sb3JBZ2dyZWdhdGlvbidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEdldFZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRCaW5zJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIF9maWx0ZXJEYXRhOiB7XG4gICAgICAgICAgcHJvcDogJ19maWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnX2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25Tb3J0ZWRCaW5zXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXREb21haW4nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgbG93ZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ2xvd2VyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgdXBwZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ3VwcGVyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdjb2xvckRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdjb2xvclJhbmdlJ30sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldENvbG9yRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxudW1iZXI+ID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCB0eXBlIENQVUFnZ3JlZ2F0b3JTdGF0ZSA9IHtsYXllckRhdGE6IHtkYXRhP307IGRpbWVuc2lvbnM6IHt9fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1BVQWdncmVnYXRvciB7XG4gIHN0YXRpYyBnZXREaW1lbnNpb25TY2FsZTogYW55O1xuICBzdGF0ZTogQ1BVQWdncmVnYXRvclN0YXRlO1xuICBkaW1lbnNpb25VcGRhdGVyczoge1trZXk6IHN0cmluZ106IERpbWVuc2lvblR5cGV9O1xuICBhZ2dyZWdhdGlvblVwZGF0ZXI6IEFnZ3JlZ2F0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRzOiB7XG4gICAgICBpbml0aWFsU3RhdGU/OiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gICAgICBkaW1lbnNpb25zPzogRGltZW5zaW9uVHlwZVtdO1xuICAgICAgYWdncmVnYXRpb24/OiBBZ2dyZWdhdGlvblR5cGU7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXllckRhdGE6IHt9LFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVsZXZhdGlvbjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRzLmluaXRpYWxTdGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzID0ge307XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBvcHRzLmFnZ3JlZ2F0aW9uIHx8IGRlZmF1bHRBZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuX2FkZERpbWVuc2lvbihvcHRzLmRpbWVuc2lvbnMgfHwgZGVmYXVsdERpbWVuc2lvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlKSB7XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBhZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIF9hZGREaW1lbnNpb24oZGltZW5zaW9uczogRGltZW5zaW9uVHlwZVtdID0gW10pIHtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uO1xuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldID0gZGltZW5zaW9uO1xuICAgIH0pO1xuICB9XG5cbiAgX25lZWRVcGRhdGVTdGVwKFxuICAgIGRpbWVuc2lvblN0ZXA6IFVwZGF0ZVN0ZXBzVHlwZSB8IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgc3RlcCxcbiAgICBwcm9wcyxcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIFVwZGF0ZXJUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICB0eXBlIFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQStETyxNQUFNSSxvQkFHWCxHQUFBQyxPQUFBLENBQUFELG9CQUFBLEdBQUc7RUFDSEUsR0FBRyxFQUFFQyxrQ0FBaUIsQ0FBQ0MsR0FBRztFQUMxQkMsSUFBSSxFQUFFRixrQ0FBaUIsQ0FBQ0csT0FBTztFQUMvQkMsR0FBRyxFQUFFSixrQ0FBaUIsQ0FBQ0ssT0FBTztFQUM5QkMsR0FBRyxFQUFFTixrQ0FBaUIsQ0FBQ087QUFDekIsQ0FBQztBQUVNLFNBQVNDLFlBQVlBLENBQUNDLFdBQVcsRUFBRUMsUUFBUSxFQUFFO0VBQ2xELE1BQU1DLEVBQXdCLEdBQUdGLFdBQVcsQ0FBQ0csV0FBVyxDQUFD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
|